Commit 0c2fc922b1fa480347cbc3dd4a6c1e6a057dc2e5

Authored by Adhidarma Hadiwinoto
1 parent f677159157
Exists in master

direction symbol

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