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