Commit 7c09ca68ee05ff670999d5ecdaac8c6886b77bcd

Authored by Adhidarma Hadiwinoto
1 parent 53b5c5b0e3
Exists in master

relogin fix

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