Commit 92d2ce0df09e1192e7914a4633dafef988f392ce
1 parent
4f3e91223c
Exists in
master
auto reconnect on error, close #1
Showing 1 changed file with 10 additions and 1 deletions Inline Diff
index.js
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 |