Commit 37f691bd7a6019075458300a34db614241639b8e

Authored by Adhidarma Hadiwinoto
1 parent 0c2fc922b1
Exists in master

ping request

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

1 var YahooMessenger = require("yahoomessenger"); 1 var YahooMessenger = require("yahoomessenger");
2 var striptags = require('striptags'); 2 var striptags = require('striptags');
3 var sleep = require('sleep'); 3 var sleep = require('sleep');
4 var db = require('./db.js'); 4 var db = require('./db.js');
5 5
6 var oldMessages = []; 6 var oldMessages = [];
7 7
8 var config; 8 var config;
9 var logger; 9 var logger;
10 10
11 function insertMessages(db_connection, logger_id, direction, partner, message, sentdate) { 11 function insertMessages(db_connection, logger_id, direction, partner, message, sentdate) {
12 12
13 db_connection.query( 13 db_connection.query(
14 'INSERT INTO messages SET ?', 14 'INSERT INTO messages SET ?',
15 { 15 {
16 transport: 'YAHOO', 16 transport: 'YAHOO',
17 logger: logger_id, 17 logger: logger_id,
18 direction: direction, 18 direction: direction,
19 partner: partner, 19 partner: partner,
20 message: message, 20 message: message,
21 sentdate: sentdate, 21 sentdate: sentdate,
22 }, 22 },
23 23
24 function(err) { 24 function(err) {
25 if (err != null) { 25 if (err != null) {
26 logger.error("Error on inserting messages to DB, error: " + err); 26 logger.error("Error on inserting messages to DB, error: " + err);
27 } 27 }
28 } 28 }
29 ); 29 );
30 } 30 }
31 31
32 function pm(destination, message) { 32 function pm(destination, message) {
33 logger.info("Sending to " + destination + ": " + message); 33 logger.info("Sending to " + destination + ": " + message);
34 34
35 try { 35 try {
36 YahooMessenger.sendPM(destination, message); 36 YahooMessenger.sendPM(destination, message);
37 } 37 }
38 catch (err) { 38 catch (err) {
39 logger.info("Error sending message: " + err.message); 39 logger.info("Error sending message: " + err.message);
40 relogin(); 40 relogin();
41 } 41 }
42 } 42 }
43 43
44 44
45 function broadcast(destinations, message, exclude) { 45 function broadcast(destinations, message, exclude) {
46 var destinations = destinations.split(','); 46 var destinations = destinations.split(',');
47 var destinationCount = destinations.length; 47 var destinationCount = destinations.length;
48 48
49 for (var i=0; i < destinationCount; i++) { 49 for (var i=0; i < destinationCount; i++) {
50 destination = destinations[i]; 50 destination = destinations[i];
51 if (destination == exclude) { 51 if (destination == exclude) {
52 continue; 52 continue;
53 } 53 }
54 54
55 pm(destination, message); 55 pm(destination, message);
56 } 56 }
57 } 57 }
58 58
59 var keepAliveTimer; 59 var keepAliveTimer;
60 60
61 var _keepAliveLoop = function() { 61 var _keepAliveLoop = function() {
62 logger.info('Keep alive loop'); 62 logger.info('Keep alive loop');
63 63
64 try { 64 try {
65 YahooMessenger.keepAlive(); 65 YahooMessenger.keepAlive();
66 keepAliveLoop(); 66 keepAliveLoop();
67 } 67 }
68 catch (err) { 68 catch (err) {
69 logger.info("Error when sending keepalive: " + err.message); 69 logger.info("Error when sending keepalive: " + err.message);
70 relogin(); 70 relogin();
71 } 71 }
72 } 72 }
73 73
74 function isAdmin(user) { 74 function isAdmin(user) {
75 var admins = config.yahoomessenger.admin.split(','); 75 var admins = config.yahoomessenger.admin.split(',');
76 76
77 return (admins.indexOf(user) >= 0); 77 return (admins.indexOf(user) >= 0);
78 } 78 }
79 79
80 function keepAliveLoop() { 80 function keepAliveLoop() {
81 keepAliveTimer = setTimeout(_keepAliveLoop, config.yahoomessenger.keepalive_interval * 1000); 81 keepAliveTimer = setTimeout(_keepAliveLoop, config.yahoomessenger.keepalive_interval * 1000);
82 } 82 }
83 83
84 function login(){ 84 function login(){
85 logger.info("Login to YM as " + config.yahoomessenger.username + '(' + config.yahoomessenger.password + ')') 85 logger.info("Login to YM as " + config.yahoomessenger.username + '(' + config.yahoomessenger.password + ')')
86 YahooMessenger.login(config.yahoomessenger.username, config.yahoomessenger.password); 86 YahooMessenger.login(config.yahoomessenger.username, config.yahoomessenger.password);
87 } 87 }
88 88
89 function logout() { 89 function logout() {
90 logger.info("Logout from YM"); 90 logger.info("Logout from YM");
91 91
92 clearTimeout(keepAliveTimer); 92 clearTimeout(keepAliveTimer);
93 93
94 try { 94 try {
95 YahooMessenger.logout(); 95 YahooMessenger.logout();
96 } 96 }
97 catch(err) { 97 catch(err) {
98 logger.info("Error on logout: " + err.message); 98 logger.info("Error on logout: " + err.message);
99 } 99 }
100 } 100 }
101 101
102 function relogin() { 102 function relogin() {
103 logger.info("Going to relogin"); 103 logger.info("Going to relogin");
104 logout(); 104 logout();
105 105
106 logger.info("Sleeping 5 seconds before login"); 106 logger.info("Sleeping 5 seconds before login");
107 sleep.sleep(5); 107 sleep.sleep(5);
108 108
109 YahooMessenger.newInstance(); 109 YahooMessenger.newInstance();
110 } 110 }
111 111
112 function start(_config, _logger) { 112 function start(_config, _logger) {
113 config = _config; 113 config = _config;
114 logger = _logger; 114 logger = _logger;
115 115
116 function onReady() { 116 function onReady() {
117 login(); 117 login();
118 } 118 }
119 119
120 function onLoginSuccesful(data) { 120 function onLoginSuccesful(data) {
121 logger.info('Online on YM as ' + data.user_id + ' (' + data.firstname + ' ' + data.lastname + ')'); 121 logger.info('Online on YM as ' + data.user_id + ' (' + data.firstname + ' ' + data.lastname + ')');
122 122
123 if (config.yahoomessenger.status) { 123 if (config.yahoomessenger.status) {
124 logger.info('Set status to: ' + config.yahoomessenger.status); 124 logger.info('Set status to: ' + config.yahoomessenger.status);
125 YahooMessenger.setCustomAwayStatus(config.yahoomessenger.status); 125 YahooMessenger.setCustomAwayStatus(config.yahoomessenger.status);
126 }; 126 };
127 127
128 broadcast(config.yahoomessenger.report_to, config.yahoomessenger.report_message); 128 broadcast(config.yahoomessenger.report_to, config.yahoomessenger.report_message);
129 keepAliveLoop(); 129 keepAliveLoop();
130 } 130 }
131 131
132 function onLoginError(data) { 132 function onLoginError(data) {
133 logger.error('Login error: ' + data.errorCode + ' ' + data.message); 133 logger.error('Login error: ' + data.errorCode + ' ' + data.message);
134 } 134 }
135 135
136 function onBuddyAddRequest(data) { 136 function onBuddyAddRequest(data) {
137 logger.info("Got request to add buddy from " + data.username); 137 logger.info("Got request to add buddy from " + data.username);
138 YahooMessenger.acceptAddBuddy(data.username); 138 YahooMessenger.acceptAddBuddy(data.username);
139 } 139 }
140 140
141 function onPM(data) { 141 function onPM(data) {
142 var direction = 'IN'; 142 var direction = 'IN';
143 var direction_symbol = '=>'; 143 var direction_symbol = '=>';
144 144
145 if (config.globals.debug == 1) { 145 if (config.globals.debug == 1) {
146 console.log(data); 146 console.log(data);
147 } 147 }
148 148
149 // check duplicate message 149 // check duplicate message
150 if (oldMessages.indexOf(data.message_id) >= 0) { 150 if (oldMessages.indexOf(data.message_id) >= 0) {
151 return; 151 return;
152 } 152 }
153 153
154 oldMessages.unshift(data.message_id); 154 oldMessages.unshift(data.message_id);
155 if (oldMessages.length > 30) { 155 if (oldMessages.length > 30) {
156 oldMessages = oldMessages.slice(0, 10); 156 oldMessages = oldMessages.slice(0, 10);
157 } 157 }
158 158
159 partner = data.sender; 159 partner = data.sender;
160 if (partner == data.user_id) { 160 if (partner == data.user_id) {
161 partner = data.target_user; 161 partner = data.target_user;
162 direction = 'OUT'; 162 direction = 'OUT';
163 direction_symbol = '<='; 163 direction_symbol = '<=';
164 } 164 }
165 165
166 var message = striptags(data.message).trim(); 166 var message = striptags(data.message).trim();
167 167
168 logger.info('New ' + direction + ' message from ' + data.sender + ' to ' + data.target_user + ': ' + message); 168 logger.info('New ' + direction + ' message from ' + data.sender + ' to ' + data.target_user + ': ' + message);
169 169
170 if (isAdmin(data.sender)) { 170 if (isAdmin(data.sender)) {
171 logger.info('Sender (' + data.sender + ') is an admin'); 171 logger.info('Sender (' + data.sender + ') is an admin');
172 } 172 }
173 173
174 var sentdate = Date.parse(data.time); 174 var sentdate = Date.parse(data.time);
175 var strftime = require('strftime'); 175 var strftime = require('strftime');
176 sentdate = strftime('%Y-%m-%d %H:%M:%S', sentdate); 176 sentdate = strftime('%Y-%m-%d %H:%M:%S', sentdate);
177 177
178 insertMessages( 178 insertMessages(
179 db_connection, 179 db_connection,
180 data.user_id, 180 data.user_id,
181 direction, 181 direction,
182 partner, 182 partner,
183 message, 183 message,
184 sentdate 184 sentdate
185 ); 185 );
186 186
187 broadcast(config.yahoomessenger.report_to, '@' + data.partner + ' ' + direction_symbol + ' ' + message, partner); 187 broadcast(config.yahoomessenger.report_to, '@' + data.partner + ' ' + direction_symbol + ' ' + message, partner);
188 188
189 if ((direction == 'IN') && (isAdmin(partner))) { 189 if ((direction == 'IN') && (isAdmin(partner))) {
190 190
191 if (message.charAt(0) == '@') { 191 if (message.charAt(0) == '@') {
192 192
193 target = message.split(' ', 1).join(); 193 target = message.split(' ', 1).join();
194 target = target.slice(1); 194 target = target.slice(1);
195 195
196 var messageToForward = message.replace('@' + target, '').trim(); 196 var messageToForward = message.replace('@' + target, '').trim();
197 if (messageToForward == '') { 197 if (messageToForward == '') {
198 return; 198 return;
199 } 199 }
200 200
201 logger.info('Forward to ' + target + ': ' + messageToForward); 201 logger.info('Forward to ' + target + ': ' + messageToForward);
202 pm(target, '@' + partner + ': ' + messageToForward); 202 pm(target, '@' + partner + ': ' + messageToForward);
203 203
204 } 204 }
205 else if (message.charAt(0) == '+') { 205 else if (message.charAt(0) == '+') {
206 206
207 target = message.split(' ', 1).join(); 207 target = message.split(' ', 1).join();
208 target = target.slice(1); 208 target = target.slice(1);
209 209
210 var messageToForward = message.replace('+' + target, '').trim(); 210 var messageToForward = message.replace('+' + target, '').trim();
211 if (messageToForward == '') { 211 if (messageToForward == '') {
212 return; 212 return;
213 } 213 }
214 214
215 logger.info('Clean forward to ' + target + ': ' + messageToForward); 215 logger.info('Clean forward to ' + target + ': ' + messageToForward);
216 pm(target, messageToForward); 216 pm(target, messageToForward);
217 217
218 } 218 }
219 else if (message.indexOf('!relogin') == 0) { 219 else if (message.indexOf('!relogin') == 0) {
220 220
221 broadcast(config.yahoomessenger.report_to, 'relogin requested by ' + data.sender); 221 broadcast(config.yahoomessenger.report_to, 'relogin requested by ' + data.sender);
222 logger.info('Relogin request by pm'); 222 logger.info('Relogin request by pm');
223 relogin(); 223 relogin();
224 224
225 } 225 }
226 else if (message.indexOf('!setstatus ') == 0) { 226 else if (message.indexOf('!setstatus ') == 0) {
227 227
228 logger.info('Set status request by pm'); 228 logger.info('Set status request by pm');
229 229
230 var newStatus = message.replace('!setstatus').trim(); 230 var newStatus = message.replace('!setstatus').trim();
231 231
232 broadcast(config.yahoomessenger.report_to, 'Set new status requested by ' + data.sender + ': ' + newStatus); 232 broadcast(config.yahoomessenger.report_to, 'Set new status requested by ' + data.sender + ': ' + newStatus);
233 config.yahoomessenger.status = newStatus; 233 config.yahoomessenger.status = newStatus;
234 YahooMessenger.setCustomAwayStatus(config.yahoomessenger.status); 234 YahooMessenger.setCustomAwayStatus(config.yahoomessenger.status);
235 235
236 } 236 }
237 else if (message.indexOf('!ping') == 0) {
237 238
239 logger.info("Ping request by pm");
240 pm(data.partner, 'PONG');
241
242 }
238 else if (message.indexOf('!terminate') == 0) { 243 else if (message.indexOf('!terminate') == 0) {
244
239 logger.info("Terminate request by pm"); 245 logger.info("Terminate request by pm");
240 process.exit(code=0); 246 process.exit(code=0);
247
241 } 248 }
242 } 249 }
243 } 250 }
244 251
245 db_connection = db.start(config.db.host, config.db.username, config.db.password, config.db.name, logger); 252 db_connection = db.start(config.db.host, config.db.username, config.db.password, config.db.name, logger);
246 253
247 254
248 YahooMessenger.newInstance(); 255 YahooMessenger.newInstance();
249 YahooMessenger.on('ready', onReady); 256 YahooMessenger.on('ready', onReady);
250 YahooMessenger.on('loginSuccessful', onLoginSuccesful); 257 YahooMessenger.on('loginSuccessful', onLoginSuccesful);
251 YahooMessenger.on('loginError', onLoginError); 258 YahooMessenger.on('loginError', onLoginError);
252 YahooMessenger.on('buddyAddRequest', onBuddyAddRequest); 259 YahooMessenger.on('buddyAddRequest', onBuddyAddRequest);
253 YahooMessenger.on('pm', onPM); 260 YahooMessenger.on('pm', onPM);
254 261
255 return YahooMessenger; 262 return YahooMessenger;
256 } 263 }
257 264
258 exports.start = start; 265 exports.start = start;
259 exports.broadcast = broadcast; 266 exports.broadcast = broadcast;
260 exports.pm = pm; 267 exports.pm = pm;
261 exports.logout = logout; 268 exports.logout = logout;
262 exports.relogin = relogin; 269 exports.relogin = relogin;
263 270