Commit bb4825f3bcf1ff68cab526e5787986548b6b66e8

Authored by Adhidarma Hadiwinoto
1 parent 20336b2900
Exists in master

debug log

Showing 1 changed file with 5 additions and 0 deletions Inline Diff

1 var http = require('http'); 1 var http = require('http');
2 var url = require('url'); 2 var url = require('url');
3 var winston = require('winston'); 3 var winston = require('winston');
4 var strftime = require('strftime'); 4 var strftime = require('strftime');
5 //var strptime = require('micro-strptime').strptime; 5 //var strptime = require('micro-strptime').strptime;
6 var request = require('request'); 6 var request = require('request');
7 var striptags = require('striptags'); 7 var striptags = require('striptags');
8 var moment = require('moment'); 8 var moment = require('moment');
9 var fs = require('fs'); 9 var fs = require('fs');
10 var ini = require('ini'); 10 var ini = require('ini');
11 11
12 var config = ini.parse(fs.readFileSync(__dirname + '/config.ini', 'utf-8')); 12 var config = ini.parse(fs.readFileSync(__dirname + '/config.ini', 'utf-8'));
13 13
14 var keepalive_interval = 60 * 1000; 14 var keepalive_interval = 60 * 1000;
15 var last_message_hash = ''; 15 var last_message_hash = '';
16 var log_level = 'info'; 16 var log_level = 'info';
17 17
18 if (config.globals.log_level) { 18 if (config.globals.log_level) {
19 log_level = config.globals.log_level; 19 log_level = config.globals.log_level;
20 } 20 }
21 21
22 var logger = new (winston.Logger)({ 22 var logger = new (winston.Logger)({
23 transports: [ 23 transports: [
24 new (winston.transports.Console)({ 24 new (winston.transports.Console)({
25 timestamp: function() { 25 timestamp: function() {
26 return strftime('%F %T', new Date()); 26 return strftime('%F %T', new Date());
27 }, 27 },
28 level: log_level 28 level: log_level
29 }), 29 }),
30 new (winston.transports.DailyRotateFile)({ 30 new (winston.transports.DailyRotateFile)({
31 filename: __dirname + '/logs/log', 31 filename: __dirname + '/logs/log',
32 timestamp: function() { 32 timestamp: function() {
33 return strftime('%F %T', new Date()); 33 return strftime('%F %T', new Date());
34 }, 34 },
35 level: log_level 35 level: log_level
36 }) 36 })
37 ] 37 ]
38 }); 38 });
39 39
40 40
41 var ym = require('yahoomessenger'); 41 var ym = require('yahoomessenger');
42 ym.newInstance(); 42 ym.newInstance();
43 43
44 function onReady(){ 44 function onReady(){
45 ym.login(config.globals.username, config.globals.password); 45 ym.login(config.globals.username, config.globals.password);
46 } 46 }
47 47
48 function onLoginSuccessful(data) { 48 function onLoginSuccessful(data) {
49 logger.info('Login successful as ' + data.firstname + ' ' + data.lastname + ' (' + data.user_id + ')', {data: data}); 49 logger.info('Login successful as ' + data.firstname + ' ' + data.lastname + ' (' + data.user_id + ')', {data: data});
50 } 50 }
51 51
52 function sendMessage(destination, message) { 52 function sendMessage(destination, message) {
53 logger.info('Sending YM message', {from: config.globals.username, to: destination, message: message}); 53 logger.info('Sending YM message', {from: config.globals.username, to: destination, message: message});
54 ym.sendPM(destination, message); 54 ym.sendPM(destination, message);
55 } 55 }
56 56
57 function sendIgnoreResponse(destination, message) { 57 function sendIgnoreResponse(destination, message) {
58 sendMessage(destination, "Pesan anda diabaikan, silahkan diulang beberapa saat lagi jika diperlukan: " + message); 58 sendMessage(destination, "Pesan anda diabaikan, silahkan diulang beberapa saat lagi jika diperlukan: " + message);
59 } 59 }
60 60
61 function onPm(data) { 61 function onPm(data) {
62 logger.info('Incoming message via YM', {data: data}); 62 logger.info('Incoming message via YM', {data: data});
63 var message = striptags(data.message); 63 var message = striptags(data.message);
64 64
65 var message_hash = data.sender + ': ' + data.message; 65 var message_hash = data.sender + ': ' + data.message;
66 if (message_hash == last_message_hash) { 66 if (message_hash == last_message_hash) {
67 logger.warn('Ignoring duplicate message', {data: data}); 67 logger.warn('Ignoring duplicate message', {data: data});
68 return; 68 return;
69 } 69 }
70 last_message_hash = message_hash; 70 last_message_hash = message_hash;
71 71
72 var greeting_prefix = "Pesan anda telah diterima dan akan segera diproses:"; 72 var greeting_prefix = "Pesan anda telah diterima dan akan segera diproses:";
73 if (config.globals.greeting_prefix) { 73 if (config.globals.greeting_prefix) {
74 greeting_prefix = config.globals.greeting_prefix; 74 greeting_prefix = config.globals.greeting_prefix;
75 } 75 }
76 76
77 ym.sendPM(data.sender, greeting_prefix + ' ' + message); 77 ym.sendPM(data.sender, greeting_prefix + ' ' + message);
78 78
79 forwardMessageToEvo(data.sender, message, formatTimestamp(data.time)); 79 forwardMessageToEvo(data.sender, message, formatTimestamp(data.time));
80 } 80 }
81 81
82 function onOfflinePM(data) { 82 function onOfflinePM(data) {
83 logger.info('Offline YM message', {data: data}); 83 logger.info('Offline YM message', {data: data});
84 sendIgnoreResponse(data.sender, data.message); 84 sendIgnoreResponse(data.sender, data.message);
85 } 85 }
86 86
87 function onBuddyAddRequest(data) { 87 function onBuddyAddRequest(data) {
88 logger.info('onBuddyAddRequest()', {data: data}); 88 logger.info('onBuddyAddRequest()', {data: data});
89 ym.acceptAddBuddy(data.username); 89 ym.acceptAddBuddy(data.username);
90 logger.info('Accept buddy add request: ' + data.username, {data: data}); 90 logger.info('Accept buddy add request: ' + data.username, {data: data});
91 } 91 }
92 92
93 function onHttpIncomingMessage(request, response) { 93 function onHttpIncomingMessage(request, response) {
94 var qs = url.parse(request.url, true).query; 94 var qs = url.parse(request.url, true).query;
95 logger.verbose("onHttpIncomingMessage()", {qs: qs}); 95 logger.verbose("onHttpIncomingMessage()", {qs: qs});
96 96
97 // abaikan balikan ping 97 // abaikan balikan ping
98 if (qs.to == config.globals.ping_ym_id) { 98 if (qs.to == config.globals.ping_ym_id) {
99 return; 99 return;
100 } 100 }
101 101
102 var destination = qs.to.replace(config.globals.msisdn_suffix, ''); 102 var destination = qs.to.replace(config.globals.msisdn_suffix, '');
103 logger.info('Sending YM message from ' + config.globals.username + ' to ' + destination + ': ' + qs.msg); 103 logger.info('Sending YM message from ' + config.globals.username + ' to ' + destination + ': ' + qs.msg);
104 sendMessage(destination, qs.msg); 104 sendMessage(destination, qs.msg);
105 response.end('OK'); 105 response.end('OK');
106 } 106 }
107 107
108 function formatTimestamp(ts) { 108 function formatTimestamp(ts) {
109 /* 109 /*
110 var _ts = strptime(ts, '%A %b %d %Y %H:%M:%S GMT%z'); 110 var _ts = strptime(ts, '%A %b %d %Y %H:%M:%S GMT%z');
111 return strftime('%F %T', _ts); 111 return strftime('%F %T', _ts);
112 */ 112 */
113 return moment(ts, 'ddd MMM D YYYY HH:mm:ss Z').format('YYYY-MM-DD HH:mm:ss') 113 return moment(ts, 'ddd MMM D YYYY HH:mm:ss Z').format('YYYY-MM-DD HH:mm:ss')
114 } 114 }
115 115
116 function forwardMessageToEvo(sender, message, ts) { 116 function forwardMessageToEvo(sender, message, ts) {
117 var msisdn = sender + config.globals.msisdn_suffix; 117 var msisdn = sender + config.globals.msisdn_suffix;
118 var opts = { 118 var opts = {
119 url: config.globals.evo_url, 119 url: config.globals.evo_url,
120 qs: { 120 qs: {
121 msg: message, 121 msg: message,
122 msisdn: msisdn, 122 msisdn: msisdn,
123 smsc: config.globals.smsc, 123 smsc: config.globals.smsc,
124 ts: ts 124 ts: ts
125 } 125 }
126 }; 126 };
127 127
128 logger.verbose("Forwarding message to evo", {request_opts: opts}); 128 logger.verbose("Forwarding message to evo", {request_opts: opts});
129 request(opts, function(err, response, body) { 129 request(opts, function(err, response, body) {
130 if (err) { 130 if (err) {
131 logger.warn('Error forwarding to evo: ' + err); 131 logger.warn('Error forwarding to evo: ' + err);
132 return; 132 return;
133 } 133 }
134
135 if (response.statusCode == 200) {
136 logger.warn('HTTP Status from evo: ' + response.statusCode, {status: response.statusCode, body: body});
137 }
138 logger.verbose('Got response from evo', {body: body});
134 }); 139 });
135 140
136 141
137 // kirim ping 1 detik setelah pesan agar segera diproses 142 // kirim ping 1 detik setelah pesan agar segera diproses
138 if (config.globals.send_ping_to_evo == '1') { 143 if (config.globals.send_ping_to_evo == '1') {
139 setTimeout(function() { 144 setTimeout(function() {
140 145
141 var pingOpts = { 146 var pingOpts = {
142 url: config.globals.evo_url, 147 url: config.globals.evo_url,
143 qs: { 148 qs: {
144 msg: 'S.' + config.globals.ping_pin, 149 msg: 'S.' + config.globals.ping_pin,
145 msisdn: config.globals.ping_ym_id + config.globals.msisdn_suffix, 150 msisdn: config.globals.ping_ym_id + config.globals.msisdn_suffix,
146 smsc: config.globals.smsc, 151 smsc: config.globals.smsc,
147 ts: strftime('%F %T') 152 ts: strftime('%F %T')
148 } 153 }
149 }; 154 };
150 155
151 logger.verbose('Sending ping message', {opts: pingOpts}); 156 logger.verbose('Sending ping message', {opts: pingOpts});
152 157
153 request(pingOpts, function(err, response, body) { 158 request(pingOpts, function(err, response, body) {
154 if (err) { 159 if (err) {
155 logger.warn('Error send PING to evo: ' + err); 160 logger.warn('Error send PING to evo: ' + err);
156 return; 161 return;
157 } 162 }
158 }); 163 });
159 }, 1000); 164 }, 1000);
160 } 165 }
161 } 166 }
162 167
163 function createHttpServer() { 168 function createHttpServer() {
164 logger.verbose('createHttpServer()'); 169 logger.verbose('createHttpServer()');
165 170
166 var httpServer = http.createServer(onHttpIncomingMessage); 171 var httpServer = http.createServer(onHttpIncomingMessage);
167 httpServer.listen(config.globals.listen_port, function(){ 172 httpServer.listen(config.globals.listen_port, function(){
168 logger.info("HTTP server listening on " + config.globals.listen_port); 173 logger.info("HTTP server listening on " + config.globals.listen_port);
169 }); 174 });
170 } 175 }
171 176
172 createHttpServer(); 177 createHttpServer();
173 ym.on('ready', onReady); 178 ym.on('ready', onReady);
174 ym.on('loginSuccessful', onLoginSuccessful); 179 ym.on('loginSuccessful', onLoginSuccessful);
175 ym.on('pm', onPm); 180 ym.on('pm', onPm);
176 ym.on('buddyAddRequest', onBuddyAddRequest); 181 ym.on('buddyAddRequest', onBuddyAddRequest);
177 182
178 setInterval(function() { 183 setInterval(function() {
179 logger.verbose('Sending keepalive packet'); 184 logger.verbose('Sending keepalive packet');
180 ym.keepAlive(); 185 ym.keepAlive();
181 }, keepalive_interval); 186 }, keepalive_interval);
182 187