Commit 45725db9065bdce6f2cf520530bfb9e2b32e7bac
1 parent
205f271b3d
Exists in
master
using sate24/partner-im
Showing 4 changed files with 11 additions and 150 deletions Inline Diff
adaptor-ym.js
1 | var YM = require('yahoomessenger'); | 1 | var YM = require('yahoomessenger'); |
2 | 2 | ||
3 | var username; | 3 | var username; |
4 | var password; | 4 | var password; |
5 | 5 | ||
6 | var callbacks; | 6 | var callbacks; |
7 | 7 | ||
8 | function onReady() { | 8 | function onReady() { |
9 | logger.info('Going to login to YM as ' + username); | 9 | logger.info('Going to login to YM as ' + username); |
10 | YM.login(username, password); | 10 | YM.login(username, password); |
11 | } | 11 | } |
12 | 12 | ||
13 | function onLoginSuccessful(data) { | 13 | function onOnline(data) { |
14 | logger.info('YM login successful', {data: data}); | 14 | logger.info('YM login successful', {data: data}); |
15 | if (callbacks.onLoginSuccessful) { | 15 | if (callbacks.onOnline) { |
16 | callbacks.onLoginSuccessful(); | 16 | callbacks.onOnline(); |
17 | } | 17 | } |
18 | } | 18 | } |
19 | 19 | ||
20 | function onLoginError(data) { | 20 | function onLoginError(data) { |
21 | logger.warn('YM login error', {data: data}); | 21 | logger.warn('YM login error', {data: data}); |
22 | } | 22 | } |
23 | 23 | ||
24 | function onFriendsList(data) { | 24 | function onFriendsList(data) { |
25 | logger.verbose('Got list of friendlist', {data: data}); | 25 | logger.verbose('Got list of friendlist', {data: data}); |
26 | } | 26 | } |
27 | 27 | ||
28 | function onPM(data) { | 28 | function onPM(data) { |
29 | logger.verbose('Got a message', {data: data}) | 29 | logger.verbose('Got a message', {data: data}) |
30 | if (callbacks.onPM) { | 30 | if (callbacks.onPM) { |
31 | callbacks.onPM(data.sender, data.message); | 31 | callbacks.onPM(data.sender, data.message); |
32 | } | 32 | } |
33 | } | 33 | } |
34 | 34 | ||
35 | function onPing(data) { | 35 | function onPing(data) { |
36 | logger.verbose('Got ping', {data: data}); | 36 | logger.verbose('Got ping', {data: data}); |
37 | } | 37 | } |
38 | 38 | ||
39 | function init(_username, _password, _logger, _callbacks) { | 39 | function init(_username, _password, _logger, _callbacks) { |
40 | username = _username; | 40 | username = _username; |
41 | password = _password; | 41 | password = _password; |
42 | logger = _logger; | 42 | logger = _logger; |
43 | callbacks = _callbacks; | 43 | callbacks = _callbacks; |
44 | 44 | ||
45 | YM.on('ready', onReady); | 45 | YM.on('ready', onReady); |
46 | YM.on('loginSuccessful', onLoginSuccessful); | 46 | YM.on('loginSuccessful', onOnline); |
47 | YM.on('loginError', onLoginError); | 47 | YM.on('loginError', onLoginError); |
48 | YM.on('friendsList', onFriendsList); | 48 | YM.on('friendsList', onFriendsList); |
49 | YM.on('pm', onPM); | 49 | YM.on('pm', onPM); |
50 | YM.on('offlinePM', onPM); | 50 | YM.on('offlinePM', onPM); |
51 | 51 | ||
52 | /* | 52 | /* |
53 | setTimeout( | 53 | setTimeout( |
54 | YM.newInstance, | 54 | YM.newInstance, |
55 | 3000 | 55 | 3000 |
56 | ) | 56 | ) |
57 | */ | 57 | */ |
58 | YM.newInstance(); | 58 | YM.newInstance(); |
59 | } | 59 | } |
60 | 60 | ||
61 | function sendMessage(destination, msg) { | 61 | function sendMessage(destination, msg) { |
62 | logger.verbose('Sending message', {from: username, destination: destination, msg: msg}); | 62 | logger.verbose('Sending message', {from: username, destination: destination, msg: msg}); |
63 | YM.sendPM(destination, msg); | 63 | YM.sendPM(destination, msg); |
64 | } | 64 | } |
65 | 65 | ||
66 | exports.init = init; | 66 | exports.init = init; |
67 | exports.sendMessage = sendMessage; | 67 | exports.sendMessage = sendMessage; |
68 | 68 |
index.js
1 | var fs = require('fs'); | 1 | var fs = require('fs'); |
2 | var ini = require('ini'); | 2 | var ini = require('ini'); |
3 | var expresso = require('sate24-expresso'); | 3 | var expresso = require('sate24-expresso'); |
4 | var partner = require('./partner-ym'); | ||
5 | var config = ini.parse(fs.readFileSync(__dirname + '/config.ini', 'utf-8')); | 4 | var config = ini.parse(fs.readFileSync(__dirname + '/config.ini', 'utf-8')); |
6 | 5 | ||
7 | process.chdir(__dirname); | 6 | process.chdir(__dirname); |
8 | 7 | ||
9 | var logger = require('sate24/logger.js').start(); | 8 | var logger = require('sate24/logger.js').start(); |
10 | var HttpServer = require('sate24/httpserver.js'); | 9 | var HttpServer = require('sate24/httpserver.js'); |
11 | var aaa = require('sate24/aaa.js'); | 10 | var aaa = require('sate24/aaa.js'); |
12 | var partner = require('./partner-ym.js'); | 11 | var partner = require('sate24/partner-im.js'); |
12 | var imAdaptor = require('./adaptor-ym'); | ||
13 | |||
13 | 14 | ||
14 | var matrix = aaa.prepareMatrix(); | 15 | var matrix = aaa.prepareMatrix(); |
15 | 16 | ||
16 | var options = { | 17 | var options = { |
17 | 'aaa': aaa, | 18 | 'aaa': aaa, |
18 | 'logger': logger, | 19 | 'logger': logger, |
19 | 'config': config, | 20 | 'config': config, |
20 | 'matrix': matrix, | 21 | 'matrix': matrix, |
21 | 'partner': partner, | 22 | 'partner': partner, |
23 | 'imAdaptor': imAdaptor | ||
22 | } | 24 | } |
23 | 25 | ||
24 | var httpServer = HttpServer.start(config, options); | 26 | var httpServer = HttpServer.start(config, options); |
25 | 27 | ||
26 | aaa.pause(); | 28 | aaa.pause(); |
27 | 29 | ||
28 | partner.start(options); | 30 | partner.start(options); |
29 | aaa.start(config, partner, options); | 31 | aaa.start(config, partner, options); |
30 | expresso.start(options); | 32 | expresso.start(options); |
partner-ym.js
1 | var im = require('sate24/im.js') | File was deleted | |
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 | if (rc != '68') { | ||
56 | im.cancelResendDelay(task); | ||
57 | } | ||
58 | |||
59 | callbackReport(task.requestId, rc, msg); | ||
60 | }); | ||
61 | } | ||
62 | |||
63 | function start(options) { | ||
64 | if (options && options.config) { | ||
65 | config = options.config; | ||
66 | } else { | ||
67 | console.log('Unknown options.config'); | ||
68 | process.exit('1'); | ||
69 | } | ||
70 | |||
71 | if (options && options.aaa) { | ||
72 | aaa = options.aaa; | ||
73 | } | ||
74 | |||
75 | if (options && options.aaa && options.aaa.callbackReport) { | ||
76 | callbackReport = options.aaa.callbackReport; | ||
77 | } else { | ||
78 | console.log('Unknown options.aaa.callbackReport') | ||
79 | process.exit(2); | ||
80 | } | ||
81 | |||
82 | if (options && options.logger) { | ||
83 | logger = options.logger; | ||
84 | } else { | ||
85 | logger = new winston.Logger({ | ||
86 | transports: [ | ||
87 | new (winston.transports.Console)() | ||
88 | ] | ||
89 | }); | ||
90 | } | ||
91 | |||
92 | var callbacks = { | ||
93 | onLoginSuccessful: onLoginSuccessful, | ||
94 | onPM: onPM, | ||
95 | } | ||
96 | |||
97 | im.init(options); | ||
98 | imAdaptor.init(config.h2h_out.ym_id, config.h2h_out.ym_password, logger, callbacks); | ||
99 | } | ||
100 | |||
101 | function onSameDayDupe(task, archivedTask) { | ||
102 | if (task.requestId == archivedTask.requestId) { | ||
103 | logger.info('Mengulang trx untuk advice', {task: task}); | ||
104 | _topupRequest(task); | ||
105 | } else { | ||
106 | logger.info('Terdeteksi trx sama dalam satu hari yang sama', {task: task}); | ||
107 | callbackReport(task.requestId, '55', 'Terdeteksi trx sama dalam satu hari yang sama'); | ||
108 | } | ||
109 | } | ||
110 | |||
111 | function _topupRequest(task) { | ||
112 | var pattern = config.h2h_out.request_pattern; | ||
113 | |||
114 | var keywords = { | ||
115 | remoteProduct: task.remoteProduct, | ||
116 | destination: task.destination, | ||
117 | pin: config.h2h_out.pin | ||
118 | } | ||
119 | |||
120 | im.saveTask(task, function() { | ||
121 | im.registerResendDelay(task); | ||
122 | |||
123 | var msg = im.createMessage(pattern, keywords); | ||
124 | imAdaptor.sendMessage(config.h2h_out.partner, msg); | ||
125 | }); | ||
126 | |||
127 | } | ||
128 | |||
129 | function topupRequest(task) { | ||
130 | if (!aaa.isTodayTrx(task)) { | ||
131 | logger.warn('Maaf, transaksi beda hari tidak dapat dilakukan'); | ||
132 | callbackReport(task.requestId, '68', 'Maaf, transaksi beda hari tidak dapat dilakukan'); | ||
133 | im.cancelResendDelay(task); | ||
134 | return; | ||
135 | } | ||
136 | |||
137 | im.checkForSameDayDuplicate(task, _topupRequest, onSameDayDupe, _topupRequest); | ||
138 | } | ||
139 | |||
140 | exports.start = start; | ||
141 | exports.topupRequest = topupRequest; | ||
142 | 1 | var im = require('sate24/im.js') |
sample.config.ini
1 | [globals] | 1 | [globals] |
2 | products=TST1 | 2 | products=TST1 |
3 | gateway_name=NEOYM1 | 3 | gateway_name=NEOYM1 |
4 | aaa_host=http://127.0.0.1:4250 | 4 | aaa_host=http://127.0.0.1:4250 |
5 | interval=1000 | 5 | interval=1000 |
6 | admin_port=17602 | 6 | admin_port=17602 |
7 | apikey=123497 | 7 | apikey=123497 |
8 | redis_host=localhost | 8 | redis_host=localhost |
9 | redis_port=6379 | 9 | redis_port=6379 |
10 | balance_regex=Saldo: Rp (\d+?)\. | 10 | balance_regex=Saldo: Rp (\d+?)\. |
11 | auto_resend_delay_secs=120 | 11 | auto_resend_delay_secs=300 |
12 | dump_stats_interval_secs=300 | 12 | dump_stats_interval_secs=300 |
13 | 13 | ||
14 | [h2h_out] | 14 | [h2h_out] |
15 | ym_id=myymid | 15 | im_username=myymid |
16 | ym_password=mypassword | 16 | im_password=mypassword |
17 | partner=partnerymid | 17 | partner=partnerymid |
18 | allow_response_from=partnerymid | 18 | allow_response_from=partnerymid |
19 | pin=1234 | 19 | pin=1234 |
20 | request_pattern=[remoteProduct].[destination].[pin] | 20 | request_pattern=[remoteProduct].[destination].[pin] |
21 | 21 | ||
22 | [expresso] | 22 | [expresso] |
23 | listen_port=19602 | 23 | listen_port=19602 |
24 | password=0d6848d79e04dafc91d6d461a765d0558124081c60bdb23b79e2affaa3c452f8 | 24 | password=0d6848d79e04dafc91d6d461a765d0558124081c60bdb23b79e2affaa3c452f8 |
25 | session_name=something.connect.sid | 25 | session_name=something.connect.sid |
26 | 26 | ||
27 | [products] | 27 | [products] |
28 | TST1=SS5 | 28 | TST1=SS5 |
29 | 29 |