Commit 92d2ce0df09e1192e7914a4633dafef988f392ce

Authored by Adhidarma Hadiwinoto
1 parent 4f3e91223c
Exists in master

auto reconnect on error, close #1

Showing 1 changed file with 10 additions and 1 deletions Inline Diff

1 var iniparser = require('iniparser'); 1 var iniparser = require('iniparser');
2 var config = iniparser.parseSync('./config.ini'); 2 var config = iniparser.parseSync('./config.ini');
3 3
4 if (config.yahoomessenger.keepalive_interval == null) { 4 if (config.yahoomessenger.keepalive_interval == null) {
5 config.yahoomessenger.keepalive_interval = 60; 5 config.yahoomessenger.keepalive_interval = 60;
6 } 6 }
7 7
8 var strftime = require('strftime'); 8 var strftime = require('strftime');
9 9
10 var loggedPM = []; 10 var loggedPM = [];
11 11
12 var logger = require('winston'); 12 var logger = require('winston');
13 logger.remove(logger.transports.Console); 13 logger.remove(logger.transports.Console);
14 logger.add(logger.transports.Console, { timestamp: function() { return (strftime('%F %T')); }}); 14 logger.add(logger.transports.Console, { timestamp: function() { return (strftime('%F %T')); }});
15 15
16 var db = require('./db.js'); 16 var db = require('./db.js');
17 db_connection = db.start(config.db.host, config.db.username, config.db.password, config.db.name, logger); 17 db_connection = db.start(config.db.host, config.db.username, config.db.password, config.db.name, logger);
18 18
19 function isAdmin(user) { 19 function isAdmin(user) {
20 var admins = config.yahoomessenger.admin.split(','); 20 var admins = config.yahoomessenger.admin.split(',');
21 21
22 return (admins.indexOf(user) >= 0); 22 return (admins.indexOf(user) >= 0);
23 } 23 }
24 24
25 function broadcast(destinations, message, exclude) { 25 function broadcast(destinations, message, exclude) {
26 var destinations = destinations.split(','); 26 var destinations = destinations.split(',');
27 var destinationCount = destinations.length; 27 var destinationCount = destinations.length;
28 28
29 for (var i=0; i < destinationCount; i++) { 29 for (var i=0; i < destinationCount; i++) {
30 destination = destinations[i]; 30 destination = destinations[i];
31 if (destination == exclude) { 31 if (destination == exclude) {
32 continue; 32 continue;
33 } 33 }
34 34
35 logger.info('Sending message to ' + destination); 35 logger.info('Sending message to ' + destination);
36 YahooMessenger.sendPM(destination, message); 36 YahooMessenger.sendPM(destination, message);
37 } 37 }
38 } 38 }
39 39
40 var _keepAliveLoop = function() { 40 var _keepAliveLoop = function() {
41 logger.info('Keep alive loop'); 41 logger.info('Keep alive loop');
42 42
43 YahooMessenger.keepAlive(); 43 try {
44 YahooMessenger.keepAlive();
45 }
46 catch(e) {
47 logger.error("Something wrong");
48 logger.error(e);
49 logger.info("Try to reconnecting to yahoo messenger");
50 YahooMessenger.login(config.yahoomessenger.username, config.yahoomessenger.password);
51 }
44 keepAliveLoop(); 52 keepAliveLoop();
45 53
46 } 54 }
47 55
48 function keepAliveLoop() { 56 function keepAliveLoop() {
49 setTimeout(_keepAliveLoop, config.yahoomessenger.keepalive_interval * 1000); 57 setTimeout(_keepAliveLoop, config.yahoomessenger.keepalive_interval * 1000);
50 } 58 }
51 59
52 function insertMessages(db_connection, logger_id, direction, partner, message, sentdate) { 60 function insertMessages(db_connection, logger_id, direction, partner, message, sentdate) {
53 61
54 db_connection.query( 62 db_connection.query(
55 'INSERT INTO messages SET ?', 63 'INSERT INTO messages SET ?',
56 { 64 {
57 transport: 'YAHOO', 65 transport: 'YAHOO',
58 logger: logger_id, 66 logger: logger_id,
59 direction: direction, 67 direction: direction,
60 partner: partner, 68 partner: partner,
61 message: message, 69 message: message,
62 sentdate: sentdate, 70 sentdate: sentdate,
63 }, 71 },
64 72
65 function(err) { 73 function(err) {
66 if (err != null) { 74 if (err != null) {
67 logger.error("Error on inserting messages to DB, error: " + err); 75 logger.error("Error on inserting messages to DB, error: " + err);
68 } 76 }
69 } 77 }
70 ); 78 );
71 } 79 }
72 80
73 var striptags = require('striptags'); 81 var striptags = require('striptags');
74 82
75 var YahooMessenger = require("yahoomessenger"); 83 var YahooMessenger = require("yahoomessenger");
76 YahooMessenger.newInstance(); 84 YahooMessenger.newInstance();
77 85
78 function onYmLoginSuccesful(data){ 86 function onYmLoginSuccesful(data){
79 logger.info('Online on YM as ' + data.user_id + ' (' + data.firstname + ' ' + data.lastname + ')'); 87 logger.info('Online on YM as ' + data.user_id + ' (' + data.firstname + ' ' + data.lastname + ')');
80 88
81 if (config.yahoomessenger.status) { 89 if (config.yahoomessenger.status) {
82 logger.info('Set status to: ' + config.yahoomessenger.status); 90 logger.info('Set status to: ' + config.yahoomessenger.status);
83 YahooMessenger.setCustomAwayStatus(config.yahoomessenger.status); 91 YahooMessenger.setCustomAwayStatus(config.yahoomessenger.status);
84 }; 92 };
85 93
86 broadcast(config.yahoomessenger.report_to, config.yahoomessenger.report_message); 94 broadcast(config.yahoomessenger.report_to, config.yahoomessenger.report_message);
87 95
88 keepAliveLoop(); 96 keepAliveLoop();
89 } 97 }
90 98
91 function onYmPM(data) { 99 function onYmPM(data) {
92 var direction = 'IN'; 100 var direction = 'IN';
93 101
94 if (config.globals.debug == 1) { 102 if (config.globals.debug == 1) {
95 console.log(data); 103 console.log(data);
96 } 104 }
97 105
98 // check duplicate message 106 // check duplicate message
99 if (loggedPM.indexOf(data.message_id) >= 0) { 107 if (loggedPM.indexOf(data.message_id) >= 0) {
100 return; 108 return;
101 } 109 }
102 110
103 loggedPM.unshift(data.message_id); 111 loggedPM.unshift(data.message_id);
104 if (loggedPM.length > 30) { 112 if (loggedPM.length > 30) {
105 loggedPM = loggedPM.slice(0, 10); 113 loggedPM = loggedPM.slice(0, 10);
106 } 114 }
107 115
108 partner = data.sender; 116 partner = data.sender;
109 if (partner == data.user_id) { 117 if (partner == data.user_id) {
110 partner = data.target_user; 118 partner = data.target_user;
111 direction = 'OUT'; 119 direction = 'OUT';
112 } 120 }
113 121
114 var message = striptags(data.message).trim(); 122 var message = striptags(data.message).trim();
115 123
116 logger.info('New ' + direction + ' message from ' + data.sender + ' to ' + data.target_user + ': ' + message); 124 logger.info('New ' + direction + ' message from ' + data.sender + ' to ' + data.target_user + ': ' + message);
117 125
118 if (isAdmin(data.sender)) { 126 if (isAdmin(data.sender)) {
119 logger.info('Sender (' + data.sender + ') is an admin'); 127 logger.info('Sender (' + data.sender + ') is an admin');
120 } 128 }
121 129
122 var sentdate = Date.parse(data.time); 130 var sentdate = Date.parse(data.time);
123 var strftime = require('strftime'); 131 var strftime = require('strftime');
124 sentdate = strftime('%Y-%m-%d %H:%M:%S', sentdate); 132 sentdate = strftime('%Y-%m-%d %H:%M:%S', sentdate);
125 133
126 insertMessages( 134 insertMessages(
127 db_connection, 135 db_connection,
128 data.user_id, 136 data.user_id,
129 direction, 137 direction,
130 partner, 138 partner,
131 message, 139 message,
132 sentdate 140 sentdate
133 ); 141 );
134 142
135 broadcast(config.yahoomessenger.report_to, '@' + data.sender + ': ' + message, partner); 143 broadcast(config.yahoomessenger.report_to, '@' + data.sender + ': ' + message, partner);
136 144
137 if ((direction == 'IN') && (isAdmin(partner))) { 145 if ((direction == 'IN') && (isAdmin(partner))) {
138 if (message.charAt(0) == '@') { 146 if (message.charAt(0) == '@') {
139 target = message.split(' ', 1).join(); 147 target = message.split(' ', 1).join();
140 target = target.slice(1); 148 target = target.slice(1);
141 149
142 var messageToForward = message.replace('@' + target, '').trim(); 150 var messageToForward = message.replace('@' + target, '').trim();
143 if (messageToForward == '') { 151 if (messageToForward == '') {
144 return; 152 return;
145 } 153 }
146 154
147 logger.info('Forward to ' + target + ': ' + messageToForward); 155 logger.info('Forward to ' + target + ': ' + messageToForward);
148 YahooMessenger.sendPM(target, '@' + partner + ': ' + messageToForward); 156 YahooMessenger.sendPM(target, '@' + partner + ': ' + messageToForward);
149 } 157 }
150 158
151 } 159 }
152 } 160 }
153 161
154 function onYmBuddyAddRequest(data) { 162 function onYmBuddyAddRequest(data) {
155 logger.info("Got request to add buddy from " + data.username); 163 logger.info("Got request to add buddy from " + data.username);
156 YahooMessenger.acceptAddBuddy(data.username); 164 YahooMessenger.acceptAddBuddy(data.username);
157 } 165 }
158 166
167
159 function onYmReady(){ 168 function onYmReady(){
160 logger.info("Going to online on YM") 169 logger.info("Going to online on YM")
161 YahooMessenger.login(config.yahoomessenger.username, config.yahoomessenger.password); 170 YahooMessenger.login(config.yahoomessenger.username, config.yahoomessenger.password);
162 } 171 }
163 172
164 YahooMessenger.on('ready', onYmReady); 173 YahooMessenger.on('ready', onYmReady);
165 YahooMessenger.on('loginSuccessful', onYmLoginSuccesful); 174 YahooMessenger.on('loginSuccessful', onYmLoginSuccesful);
166 YahooMessenger.on('pm', onYmPM); 175 YahooMessenger.on('pm', onYmPM);
167 YahooMessenger.on('buddyAddRequest', onYmBuddyAddRequest); 176 YahooMessenger.on('buddyAddRequest', onYmBuddyAddRequest);
168 177
169 var http = require('http'); 178 var http = require('http');
170 var url = require('url'); 179 var url = require('url');
171 180
172 function onHttpRequest(request, response) { 181 function onHttpRequest(request, response) {
173 var pathname = url.parse(request.url).pathname; 182 var pathname = url.parse(request.url).pathname;
174 logger.info('Got HTTP request on ' + pathname); 183 logger.info('Got HTTP request on ' + pathname);
175 184
176 var queries = url.parse(request.url, true).query; 185 var queries = url.parse(request.url, true).query;
177 console.log(queries); 186 console.log(queries);
178 187
179 response.writeHead(200, {"Content-Type": "text/html"}); 188 response.writeHead(200, {"Content-Type": "text/html"});
180 response.write("Hello"); 189 response.write("Hello");
181 response.end(); 190 response.end();
182 } 191 }
183 192
184 http.createServer(onHttpRequest).listen(config.httpserver.listen_port); 193 http.createServer(onHttpRequest).listen(config.httpserver.listen_port);
185 logger.info("HTTP server listening on " + config.httpserver.listen_port); 194 logger.info("HTTP server listening on " + config.httpserver.listen_port);
186 195