From 6c417c09c4ea32761f58d12e81ce6d5c9eb4a34b Mon Sep 17 00:00:00 2001
From: Adhidarma Hadiwinoto <me@adhisimon.org>
Date: Wed, 27 Jul 2016 18:38:53 +0700
Subject: [PATCH] ready to test

---
 .gitignore      |   4 ++
 adaptor-xmpp.js |  50 ++++++++++++++++++++
 index.js        |  30 ++++++++++++
 logs/empty      |   0
 package.json    |  28 ++++++++++++
 partner-xmpp.js | 140 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 6 files changed, 252 insertions(+)
 create mode 100644 .gitignore
 create mode 100644 adaptor-xmpp.js
 create mode 100644 index.js
 create mode 100644 logs/empty
 create mode 100644 package.json
 create mode 100644 partner-xmpp.js

diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..4d16b20
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,4 @@
+node_modules/
+logs/log*
+config.ini
+config.im.json
diff --git a/adaptor-xmpp.js b/adaptor-xmpp.js
new file mode 100644
index 0000000..84bd317
--- /dev/null
+++ b/adaptor-xmpp.js
@@ -0,0 +1,50 @@
+var xmpp = require('simple-xmpp');
+
+var username;
+var password;
+
+var callbacks;
+
+
+function onLoginSuccessful(data) {
+    logger.info('XMPP login successful', {data: data});
+    if (callbacks.onLoginSuccessful) {
+        callbacks.onLoginSuccessful();
+    }
+}
+
+function onPM(sender, msg) {
+    logger.verbose('Got a message', {from: sender, msg: msg})
+    if (callbacks.onPM) {
+        callbacks.onPM(sender, msg);
+    }
+}
+
+function onSubscribe(sender) {
+    xmpp.acceptSubscription(sender);
+}
+
+function init(_username, _password, _logger, _callbacks) {
+    username = _username;
+    password = _password;
+    logger = _logger;
+    callbacks = _callbacks;
+
+    xmpp.on('online', onLoginSuccessful);
+    xmpp.on('chat', onPM);
+    xmpp.on('error', onError);
+    xmpp.on('subscribe', onSubscribe)
+
+    xmpp.connect({
+        jid: username,
+        password: password
+    });
+}
+
+function sendMessage(destination, msg) {
+    logger.verbose('Sending message', {from: username, destination: destination, msg: msg});
+    xmpp.send(destination, msg);
+}
+
+exports.init = init;
+exports.sendMessage = sendMessage;
diff --git a/index.js b/index.js
new file mode 100644
index 0000000..1e3ede5
--- /dev/null
+++ b/index.js
@@ -0,0 +1,30 @@
+var fs = require('fs');
+var ini = require('ini');
+var expresso = require('sate24-expresso');
+var partner = require('./partner-xmpp');
+var config = ini.parse(fs.readFileSync(__dirname + '/config.ini', 'utf-8'));
+
+process.chdir(__dirname);
+
+var logger = require('sate24/logger.js').start();
+var HttpServer = require('sate24/httpserver.js');
+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,
+    'partner': partner,
+}
+
+var httpServer = HttpServer.start(config, options);
+
+aaa.pause();
+
+partner.start(options);
+aaa.start(config, partner, options);
+expresso.start(options);
diff --git a/logs/empty b/logs/empty
new file mode 100644
index 0000000..e69de29
diff --git a/package.json b/package.json
new file mode 100644
index 0000000..e46ac20
--- /dev/null
+++ b/package.json
@@ -0,0 +1,28 @@
+{
+  "name": "sate24-to-xmpp",
+  "version": "1.0.0",
+  "description": "ST24 Jabber/XMPP H2H-Out",
+  "main": "index.js",
+  "scripts": {
+    "test": "mocha"
+  },
+  "repository": {
+    "type": "git",
+    "url": "git@gitlab.kodesumber.com:reload97/sate24-to-xmpp.git"
+  },
+  "keywords": [
+    "jabber",
+    "xmpp",
+    "st24",
+    "ppob",
+    "reload97",
+    "r97"
+  ],
+  "author": "Adhidarma Hadiwinoto <me@adhisimon.org>",
+  "license": "ISC",
+  "dependencies": {
+    "sate24": "git+http://gitlab.kodesumber.com/reload97/node-sate24.git",
+    "sate24-expresso": "git+http://gitlab.kodesumber.com/reload97/sate24-expresso.git",
+    "simple-xmpp": "^1.3.0"
+  }
+}
diff --git a/partner-xmpp.js b/partner-xmpp.js
new file mode 100644
index 0000000..a65c8ba
--- /dev/null
+++ b/partner-xmpp.js
@@ -0,0 +1,140 @@
+var im = require('sate24/im.js')
+var imAdaptor = require('./adaptor-xmpp');
+
+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);
+        }
+
+        if (rc != '68') {
+            im.cancelResendDelay(task);
+        }
+
+        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() {
+        im.registerResendDelay(task);
+
+        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');
+        im.cancelResendDelay(task);
+        return;
+    }
+
+    im.checkForSameDayDuplicate(task, _topupRequest, onSameDayDupe, _topupRequest);
+}
+
+exports.start = start;
+exports.topupRequest = topupRequest;
-- 
1.9.0