From c18e1ec47550bde7cf91296f7ff54aa9f567c5d2 Mon Sep 17 00:00:00 2001
From: Adhidarma Hadiwinoto <me@adhisimon.org>
Date: Tue, 26 Jul 2016 17:55:23 +0700
Subject: [PATCH] ready to run

---
 .gitignore    |   1 +
 adaptor-ym.js |  61 ++++++++++++++++++++++++++
 index.js      |  22 ++++++++++
 partner-ym.js | 134 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 4 files changed, 218 insertions(+)
 create mode 100644 adaptor-ym.js
 create mode 100644 partner-ym.js

diff --git a/.gitignore b/.gitignore
index 39eeedb..4d16b20 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,3 +1,4 @@
 node_modules/
 logs/log*
 config.ini
+config.im.json
diff --git a/adaptor-ym.js b/adaptor-ym.js
new file mode 100644
index 0000000..38677ac
--- /dev/null
+++ b/adaptor-ym.js
@@ -0,0 +1,61 @@
+var YM = require('yahoomessenger');
+
+var username;
+var password;
+
+var callbacks;
+
+function onReady() {
+    logger.info('Going to login to YM as ' + username);
+    YM.login(username, password);
+}
+
+function onLoginSuccessful(data) {
+    logger.info('YM login successful', {data: data});
+    if (callbacks.onLoginSuccessful) {
+        callbacks.onLoginSuccessful();
+    }
+}
+
+function onLoginError(data) {
+    logger.warn('YM login error', {data: data});
+}
+
+function onFriendsList(data) {
+    logger.verbose('Got list of friendlist', {data: data});
+}
+
+function onPM(data) {
+    logger.verbose('Got a message', {data: data})
+    if (callbacks.onPM) {
+        callbacks.onPM(data.sender, data.message);
+    }
+}
+
+function onPing(data) {
+    logger.verbose('Got ping', {data: data});
+}
+
+function init(_username, _password, _logger, _callbacks) {
+    username = _username;
+    password = _password;
+    logger = _logger;
+    callbacks = _callbacks;
+
+    YM.on('ready', onReady);
+    YM.on('loginSuccessful', onLoginSuccessful);
+    YM.on('loginError', onLoginError);
+    YM.on('friendsList', onFriendsList);
+    YM.on('pm', onPM);
+    YM.on('offlinePM', onPM);
+
+    YM.newInstance();
+}
+
+function sendMessage(destination, msg) {
+    logger.verbose('Sending message', {from: username, destination: destination, msg: msg});
+    YM.sendPM(destination, msg);
+}
+
+exports.init = init;
+exports.sendMessage = sendMessage;
diff --git a/index.js b/index.js
index db1ef88..4cd01c6 100644
--- a/index.js
+++ b/index.js
@@ -1,4 +1,26 @@
 var fs = require('fs');
 var ini = require('ini');
 var expresso = require('sate24-expresso');
+var partner = require('./partner-ym');
 var config = ini.parse(fs.readFileSync(__dirname + '/config.ini', 'utf-8'));
+
+process.chdir(__dirname);
+
+var logger = require('sate24/logger.js').start();
+var aaa = require('sate24/aaa.js');
+var partner = require('./partner-ym.js');
+
+var matrix = aaa.prepareMatrix();
+
+var options = {
+    'aaa': aaa,
+    'logger': logger,
+    'config': config,
+    'matrix': matrix,
+}
+
+aaa.pause();
+
+partner.start(options);
+aaa.start(config, partner, options);
+expresso.start(options);
diff --git a/partner-ym.js b/partner-ym.js
new file mode 100644
index 0000000..fc20000
--- /dev/null
+++ b/partner-ym.js
@@ -0,0 +1,134 @@
+var im = require('sate24/im.js')
+var YM = require('yahoomessenger');
+var imAdaptor = require('./adaptor-ym');
+
+var config;
+var aaa;
+var logger;
+var callbackReport;
+
+function onLoginSuccessful() {
+    logger.info('Login successful, resuming aaa communication');
+    aaa.resume();
+}
+
+function onPM(from, msg) {
+
+    if (!im.isAllowedFrom(from)) {
+        logger.info('Ignoring message from unknown sender', {from: from, msg: msg});
+        return;
+    }
+
+    var remoteProduct = im.getRemoteProductFromMessage(msg);
+    var destination = im.getDestinationFromMessage(msg);
+
+    if (!remoteProduct && !destination) {
+        logger.warn('Missing remote product or destination', {remoteProduct: remoteProduct, destination: destination, msg: msg});
+        return;
+    }
+
+    logger.info('Got report from partner', {remoteProduct: remoteProduct, destination: destination, msg: msg});
+    im.getTask(remoteProduct, destination, function(err, task) {
+        if (err) {
+            logger.warn('Error getting relevant task');
+            return;
+        }
+
+        if (!task) {
+            logger.warn('Something wrong, undefined task without error')
+            return;
+        }
+
+        logger.verbose('Got relevant task', {task: task, msg: msg});
+        var rc = im.getRcFromMessage(msg);
+        if (rc == '00') {
+            var sn = im.getSnFromMessage(msg);
+            if (sn) {
+                msg = 'SN=' + sn + ';' + msg;
+            }
+        }
+
+        if (['00', '55', '68'].indexOf(rc) == -1) {
+            im.deleteTask(remoteProduct, destination);
+        }
+
+        callbackReport(task.requestId, rc, msg);
+    });
+}
+
+function start(options) {
+    if (options && options.config) {
+            config = options.config;
+    } else {
+        console.log('Unknown options.config');
+        process.exit('1');
+    }
+
+    if (options && options.aaa) {
+        aaa = options.aaa;
+    }
+
+    if (options && options.aaa && options.aaa.callbackReport) {
+        callbackReport = options.aaa.callbackReport;
+    } else {
+        console.log('Unknown options.aaa.callbackReport')
+        process.exit(2);
+    }
+
+    if (options && options.logger) {
+        logger = options.logger;
+    } else {
+        logger = new winston.Logger({
+            transports: [
+              new (winston.transports.Console)()
+            ]
+        });
+    }
+
+    var callbacks = {
+        onLoginSuccessful: onLoginSuccessful,
+        onPM: onPM,
+    }
+
+    im.init(options);
+    imAdaptor.init(config.h2h_out.ym_id, config.h2h_out.ym_password, logger, callbacks);
+}
+
+function onSameDayDupe(task, archivedTask) {
+    if (task.requestId == archivedTask.requestId) {
+        logger.info('Mengulang trx untuk advice', {task: task});
+        _topupRequest(task);
+    } else {
+        logger.info('Terdeteksi trx sama dalam satu hari yang sama', {task: task});
+        callbackReport(task.requestId, '55', 'Terdeteksi trx sama dalam satu hari yang sama');
+    }
+}
+
+function _topupRequest(task) {
+    var pattern = config.h2h_out.request_pattern;
+
+    var keywords = {
+        remoteProduct: task.remoteProduct,
+        destination: task.destination,
+        pin: config.h2h_out.pin
+    }
+
+    im.saveTask(task, function() {
+        var msg = im.createMessage(pattern, keywords);
+        imAdaptor.sendMessage(config.h2h_out.partner, msg);
+    });
+
+}
+
+function topupRequest(task) {
+    if (!aaa.isTodayTrx(task)) {
+        logger.warn('Maaf, transaksi beda hari tidak dapat dilakukan');
+        callbackReport(task.requestId, '68', 'Maaf, transaksi beda hari tidak dapat dilakukan');
+        return;
+    }
+    
+    im.checkForSameDayDuplicate(task, _topupRequest, onSameDayDupe, _topupRequest);
+}
+
+exports.start = start;
+exports.topupRequest = topupRequest;
-- 
1.9.0