Commit c18e1ec47550bde7cf91296f7ff54aa9f567c5d2
1 parent
70f1195f5c
Exists in
master
ready to run
Showing 4 changed files with 218 additions and 0 deletions Side-by-side Diff
.gitignore
adaptor-ym.js
... | ... | @@ -0,0 +1,61 @@ |
1 | +var YM = require('yahoomessenger'); | |
2 | + | |
3 | +var username; | |
4 | +var password; | |
5 | + | |
6 | +var callbacks; | |
7 | + | |
8 | +function onReady() { | |
9 | + logger.info('Going to login to YM as ' + username); | |
10 | + YM.login(username, password); | |
11 | +} | |
12 | + | |
13 | +function onLoginSuccessful(data) { | |
14 | + logger.info('YM login successful', {data: data}); | |
15 | + if (callbacks.onLoginSuccessful) { | |
16 | + callbacks.onLoginSuccessful(); | |
17 | + } | |
18 | +} | |
19 | + | |
20 | +function onLoginError(data) { | |
21 | + logger.warn('YM login error', {data: data}); | |
22 | +} | |
23 | + | |
24 | +function onFriendsList(data) { | |
25 | + logger.verbose('Got list of friendlist', {data: data}); | |
26 | +} | |
27 | + | |
28 | +function onPM(data) { | |
29 | + logger.verbose('Got a message', {data: data}) | |
30 | + if (callbacks.onPM) { | |
31 | + callbacks.onPM(data.sender, data.message); | |
32 | + } | |
33 | +} | |
34 | + | |
35 | +function onPing(data) { | |
36 | + logger.verbose('Got ping', {data: data}); | |
37 | +} | |
38 | + | |
39 | +function init(_username, _password, _logger, _callbacks) { | |
40 | + username = _username; | |
41 | + password = _password; | |
42 | + logger = _logger; | |
43 | + callbacks = _callbacks; | |
44 | + | |
45 | + YM.on('ready', onReady); | |
46 | + YM.on('loginSuccessful', onLoginSuccessful); | |
47 | + YM.on('loginError', onLoginError); | |
48 | + YM.on('friendsList', onFriendsList); | |
49 | + YM.on('pm', onPM); | |
50 | + YM.on('offlinePM', onPM); | |
51 | + | |
52 | + YM.newInstance(); | |
53 | +} | |
54 | + | |
55 | +function sendMessage(destination, msg) { | |
56 | + logger.verbose('Sending message', {from: username, destination: destination, msg: msg}); | |
57 | + YM.sendPM(destination, msg); | |
58 | +} | |
59 | + | |
60 | +exports.init = init; | |
61 | +exports.sendMessage = sendMessage; |
index.js
1 | 1 | var fs = require('fs'); |
2 | 2 | var ini = require('ini'); |
3 | 3 | var expresso = require('sate24-expresso'); |
4 | +var partner = require('./partner-ym'); | |
4 | 5 | var config = ini.parse(fs.readFileSync(__dirname + '/config.ini', 'utf-8')); |
6 | + | |
7 | +process.chdir(__dirname); | |
8 | + | |
9 | +var logger = require('sate24/logger.js').start(); | |
10 | +var aaa = require('sate24/aaa.js'); | |
11 | +var partner = require('./partner-ym.js'); | |
12 | + | |
13 | +var matrix = aaa.prepareMatrix(); | |
14 | + | |
15 | +var options = { | |
16 | + 'aaa': aaa, | |
17 | + 'logger': logger, | |
18 | + 'config': config, | |
19 | + 'matrix': matrix, | |
20 | +} | |
21 | + | |
22 | +aaa.pause(); | |
23 | + | |
24 | +partner.start(options); | |
25 | +aaa.start(config, partner, options); | |
26 | +expresso.start(options); |
partner-ym.js
... | ... | @@ -0,0 +1,134 @@ |
1 | +var im = require('sate24/im.js') | |
2 | +var YM = require('yahoomessenger'); | |
3 | +var imAdaptor = require('./adaptor-ym'); | |
4 | + | |
5 | +var config; | |
6 | +var aaa; | |
7 | +var logger; | |
8 | +var callbackReport; | |
9 | + | |
10 | +function onLoginSuccessful() { | |
11 | + logger.info('Login successful, resuming aaa communication'); | |
12 | + aaa.resume(); | |
13 | +} | |
14 | + | |
15 | +function onPM(from, msg) { | |
16 | + | |
17 | + if (!im.isAllowedFrom(from)) { | |
18 | + logger.info('Ignoring message from unknown sender', {from: from, msg: msg}); | |
19 | + return; | |
20 | + } | |
21 | + | |
22 | + var remoteProduct = im.getRemoteProductFromMessage(msg); | |
23 | + var destination = im.getDestinationFromMessage(msg); | |
24 | + | |
25 | + if (!remoteProduct && !destination) { | |
26 | + logger.warn('Missing remote product or destination', {remoteProduct: remoteProduct, destination: destination, msg: msg}); | |
27 | + return; | |
28 | + } | |
29 | + | |
30 | + logger.info('Got report from partner', {remoteProduct: remoteProduct, destination: destination, msg: msg}); | |
31 | + im.getTask(remoteProduct, destination, function(err, task) { | |
32 | + if (err) { | |
33 | + logger.warn('Error getting relevant task'); | |
34 | + return; | |
35 | + } | |
36 | + | |
37 | + if (!task) { | |
38 | + logger.warn('Something wrong, undefined task without error') | |
39 | + return; | |
40 | + } | |
41 | + | |
42 | + logger.verbose('Got relevant task', {task: task, msg: msg}); | |
43 | + var rc = im.getRcFromMessage(msg); | |
44 | + if (rc == '00') { | |
45 | + var sn = im.getSnFromMessage(msg); | |
46 | + if (sn) { | |
47 | + msg = 'SN=' + sn + ';' + msg; | |
48 | + } | |
49 | + } | |
50 | + | |
51 | + if (['00', '55', '68'].indexOf(rc) == -1) { | |
52 | + im.deleteTask(remoteProduct, destination); | |
53 | + } | |
54 | + | |
55 | + callbackReport(task.requestId, rc, msg); | |
56 | + }); | |
57 | +} | |
58 | + | |
59 | +function start(options) { | |
60 | + if (options && options.config) { | |
61 | + config = options.config; | |
62 | + } else { | |
63 | + console.log('Unknown options.config'); | |
64 | + process.exit('1'); | |
65 | + } | |
66 | + | |
67 | + if (options && options.aaa) { | |
68 | + aaa = options.aaa; | |
69 | + } | |
70 | + | |
71 | + if (options && options.aaa && options.aaa.callbackReport) { | |
72 | + callbackReport = options.aaa.callbackReport; | |
73 | + } else { | |
74 | + console.log('Unknown options.aaa.callbackReport') | |
75 | + process.exit(2); | |
76 | + } | |
77 | + | |
78 | + if (options && options.logger) { | |
79 | + logger = options.logger; | |
80 | + } else { | |
81 | + logger = new winston.Logger({ | |
82 | + transports: [ | |
83 | + new (winston.transports.Console)() | |
84 | + ] | |
85 | + }); | |
86 | + } | |
87 | + | |
88 | + var callbacks = { | |
89 | + onLoginSuccessful: onLoginSuccessful, | |
90 | + onPM: onPM, | |
91 | + } | |
92 | + | |
93 | + im.init(options); | |
94 | + imAdaptor.init(config.h2h_out.ym_id, config.h2h_out.ym_password, logger, callbacks); | |
95 | +} | |
96 | + | |
97 | +function onSameDayDupe(task, archivedTask) { | |
98 | + if (task.requestId == archivedTask.requestId) { | |
99 | + logger.info('Mengulang trx untuk advice', {task: task}); | |
100 | + _topupRequest(task); | |
101 | + } else { | |
102 | + logger.info('Terdeteksi trx sama dalam satu hari yang sama', {task: task}); | |
103 | + callbackReport(task.requestId, '55', 'Terdeteksi trx sama dalam satu hari yang sama'); | |
104 | + } | |
105 | +} | |
106 | + | |
107 | +function _topupRequest(task) { | |
108 | + var pattern = config.h2h_out.request_pattern; | |
109 | + | |
110 | + var keywords = { | |
111 | + remoteProduct: task.remoteProduct, | |
112 | + destination: task.destination, | |
113 | + pin: config.h2h_out.pin | |
114 | + } | |
115 | + | |
116 | + im.saveTask(task, function() { | |
117 | + var msg = im.createMessage(pattern, keywords); | |
118 | + imAdaptor.sendMessage(config.h2h_out.partner, msg); | |
119 | + }); | |
120 | + | |
121 | +} | |
122 | + | |
123 | +function topupRequest(task) { | |
124 | + if (!aaa.isTodayTrx(task)) { | |
125 | + logger.warn('Maaf, transaksi beda hari tidak dapat dilakukan'); | |
126 | + callbackReport(task.requestId, '68', 'Maaf, transaksi beda hari tidak dapat dilakukan'); | |
127 | + return; | |
128 | + } | |
129 | + | |
130 | + im.checkForSameDayDuplicate(task, _topupRequest, onSameDayDupe, _topupRequest); | |
131 | +} | |
132 | + | |
133 | +exports.start = start; | |
134 | +exports.topupRequest = topupRequest; |