Commit 05fc6bea12e53b0cf34c34a46dedd2cf73d35b35

Authored by Adhidarma Hadiwinoto
1 parent 6a50ae5037
Exists in master

replace string startsWith with indexOf for compability reason

Showing 1 changed file with 2 additions and 2 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 143
144 if (config.globals.debug == 1) { 144 if (config.globals.debug == 1) {
145 console.log(data); 145 console.log(data);
146 } 146 }
147 147
148 // check duplicate message 148 // check duplicate message
149 if (oldMessages.indexOf(data.message_id) >= 0) { 149 if (oldMessages.indexOf(data.message_id) >= 0) {
150 return; 150 return;
151 } 151 }
152 152
153 oldMessages.unshift(data.message_id); 153 oldMessages.unshift(data.message_id);
154 if (oldMessages.length > 30) { 154 if (oldMessages.length > 30) {
155 oldMessages = oldMessages.slice(0, 10); 155 oldMessages = oldMessages.slice(0, 10);
156 } 156 }
157 157
158 partner = data.sender; 158 partner = data.sender;
159 if (partner == data.user_id) { 159 if (partner == data.user_id) {
160 partner = data.target_user; 160 partner = data.target_user;
161 direction = 'OUT'; 161 direction = 'OUT';
162 } 162 }
163 163
164 var message = striptags(data.message).trim(); 164 var message = striptags(data.message).trim();
165 165
166 logger.info('New ' + direction + ' message from ' + data.sender + ' to ' + data.target_user + ': ' + message); 166 logger.info('New ' + direction + ' message from ' + data.sender + ' to ' + data.target_user + ': ' + message);
167 167
168 if (isAdmin(data.sender)) { 168 if (isAdmin(data.sender)) {
169 logger.info('Sender (' + data.sender + ') is an admin'); 169 logger.info('Sender (' + data.sender + ') is an admin');
170 } 170 }
171 171
172 var sentdate = Date.parse(data.time); 172 var sentdate = Date.parse(data.time);
173 var strftime = require('strftime'); 173 var strftime = require('strftime');
174 sentdate = strftime('%Y-%m-%d %H:%M:%S', sentdate); 174 sentdate = strftime('%Y-%m-%d %H:%M:%S', sentdate);
175 175
176 insertMessages( 176 insertMessages(
177 db_connection, 177 db_connection,
178 data.user_id, 178 data.user_id,
179 direction, 179 direction,
180 partner, 180 partner,
181 message, 181 message,
182 sentdate 182 sentdate
183 ); 183 );
184 184
185 broadcast(config.yahoomessenger.report_to, '@' + data.sender + ': ' + message, partner); 185 broadcast(config.yahoomessenger.report_to, '@' + data.sender + ': ' + message, partner);
186 186
187 if ((direction == 'IN') && (isAdmin(partner))) { 187 if ((direction == 'IN') && (isAdmin(partner))) {
188 188
189 if (message.charAt(0) == '@') { 189 if (message.charAt(0) == '@') {
190 190
191 target = message.split(' ', 1).join(); 191 target = message.split(' ', 1).join();
192 target = target.slice(1); 192 target = target.slice(1);
193 193
194 var messageToForward = message.replace('@' + target, '').trim(); 194 var messageToForward = message.replace('@' + target, '').trim();
195 if (messageToForward == '') { 195 if (messageToForward == '') {
196 return; 196 return;
197 } 197 }
198 198
199 logger.info('Forward to ' + target + ': ' + messageToForward); 199 logger.info('Forward to ' + target + ': ' + messageToForward);
200 pm(target, '@' + partner + ': ' + messageToForward); 200 pm(target, '@' + partner + ': ' + messageToForward);
201 201
202 } 202 }
203 else if (message.charAt(0) == '+') { 203 else if (message.charAt(0) == '+') {
204 204
205 target = message.split(' ', 1).join(); 205 target = message.split(' ', 1).join();
206 target = target.slice(1); 206 target = target.slice(1);
207 207
208 var messageToForward = message.replace('+' + target, '').trim(); 208 var messageToForward = message.replace('+' + target, '').trim();
209 if (messageToForward == '') { 209 if (messageToForward == '') {
210 return; 210 return;
211 } 211 }
212 212
213 logger.info('Clean forward to ' + target + ': ' + messageToForward); 213 logger.info('Clean forward to ' + target + ': ' + messageToForward);
214 pm(target, messageToForward); 214 pm(target, messageToForward);
215 215
216 } 216 }
217 else if (message.startsWith('!relogin')) { 217 else if (message.indexOf('!relogin') == 0) {
218 218
219 broadcast(config.yahoomessenger.report_to, 'relogin requested by' + data.sender); 219 broadcast(config.yahoomessenger.report_to, 'relogin requested by' + data.sender);
220 logger.info('Relogin request by pm'); 220 logger.info('Relogin request by pm');
221 relogin(); 221 relogin();
222 222
223 } 223 }
224 else if (message.startsWith('!setstatus ')) { 224 else if (message.indexOf('!setstatus ') == 0) {
225 225
226 logger.info('Set status request by pm'); 226 logger.info('Set status request by pm');
227 227
228 var newStatus = message.replace('!setstatus').trim(); 228 var newStatus = message.replace('!setstatus').trim();
229 229
230 broadcast(config.yahoomessenger.report_to, 'Set new status requested by' + data.sender + ': ' + newStatus); 230 broadcast(config.yahoomessenger.report_to, 'Set new status requested by' + data.sender + ': ' + newStatus);
231 config.yahoomessenger.status = newStatus; 231 config.yahoomessenger.status = newStatus;
232 YahooMessenger.setCustomAwayStatus(config.yahoomessenger.status); 232 YahooMessenger.setCustomAwayStatus(config.yahoomessenger.status);
233 233
234 } 234 }
235 } 235 }
236 } 236 }
237 237
238 db_connection = db.start(config.db.host, config.db.username, config.db.password, config.db.name, logger); 238 db_connection = db.start(config.db.host, config.db.username, config.db.password, config.db.name, logger);
239 239
240 240
241 YahooMessenger.newInstance(); 241 YahooMessenger.newInstance();
242 YahooMessenger.on('ready', onReady); 242 YahooMessenger.on('ready', onReady);
243 YahooMessenger.on('loginSuccessful', onLoginSuccesful); 243 YahooMessenger.on('loginSuccessful', onLoginSuccesful);
244 YahooMessenger.on('loginError', onLoginError); 244 YahooMessenger.on('loginError', onLoginError);
245 YahooMessenger.on('buddyAddRequest', onBuddyAddRequest); 245 YahooMessenger.on('buddyAddRequest', onBuddyAddRequest);
246 YahooMessenger.on('pm', onPM); 246 YahooMessenger.on('pm', onPM);
247 247
248 return YahooMessenger; 248 return YahooMessenger;
249 } 249 }
250 250
251 exports.start = start; 251 exports.start = start;
252 exports.broadcast = broadcast; 252 exports.broadcast = broadcast;
253 exports.pm = pm; 253 exports.pm = pm;
254 exports.logout = logout; 254 exports.logout = logout;
255 exports.relogin = relogin; 255 exports.relogin = relogin;
256 256