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;