Commit 32b39897aff7788a1e57af3516e1c47b77fd4009
1 parent
d52238d9fb
Exists in
master
keluarkan ym dari index.js
Showing 2 changed files with 163 additions and 182 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 | var keepAliveTimer; | ||
5 | |||
6 | if (config.yahoomessenger.keepalive_interval == null) { | 4 | if (config.yahoomessenger.keepalive_interval == null) { |
7 | config.yahoomessenger.keepalive_interval = 60; | 5 | config.yahoomessenger.keepalive_interval = 60; |
8 | } | 6 | } |
9 | 7 | ||
10 | var strftime = require('strftime'); | 8 | var strftime = require('strftime'); |
11 | 9 | ||
12 | var loggedPM = []; | ||
13 | |||
14 | var logger = require('winston'); | 10 | var logger = require('winston'); |
15 | logger.remove(logger.transports.Console); | 11 | logger.remove(logger.transports.Console); |
16 | logger.add(logger.transports.Console, { timestamp: function() { return (strftime('%F %T')); }}); | 12 | logger.add(logger.transports.Console, { timestamp: function() { return (strftime('%F %T')); }}); |
17 | 13 | ||
18 | var db = require('./db.js'); | 14 | var db = require('./db.js'); |
19 | db_connection = db.start(config.db.host, config.db.username, config.db.password, config.db.name, logger); | 15 | db_connection = db.start(config.db.host, config.db.username, config.db.password, config.db.name, logger); |
20 | 16 | ||
21 | function isAdmin(user) { | ||
22 | var admins = config.yahoomessenger.admin.split(','); | ||
23 | |||
24 | return (admins.indexOf(user) >= 0); | ||
25 | } | ||
26 | 17 | ||
27 | function insertMessages(db_connection, logger_id, direction, partner, message, sentdate) { | 18 | function insertMessages(db_connection, logger_id, direction, partner, message, sentdate) { |
28 | 19 | ||
29 | db_connection.query( | 20 | db_connection.query( |
30 | 'INSERT INTO messages SET ?', | 21 | 'INSERT INTO messages SET ?', |
31 | { | 22 | { |
32 | transport: 'YAHOO', | 23 | transport: 'YAHOO', |
33 | logger: logger_id, | 24 | logger: logger_id, |
34 | direction: direction, | 25 | direction: direction, |
35 | partner: partner, | 26 | partner: partner, |
36 | message: message, | 27 | message: message, |
37 | sentdate: sentdate, | 28 | sentdate: sentdate, |
38 | }, | 29 | }, |
39 | 30 | ||
40 | function(err) { | 31 | function(err) { |
41 | if (err != null) { | 32 | if (err != null) { |
42 | logger.error("Error on inserting messages to DB, error: " + err); | 33 | logger.error("Error on inserting messages to DB, error: " + err); |
43 | } | 34 | } |
44 | } | 35 | } |
45 | ); | 36 | ); |
46 | } | 37 | } |
47 | 38 | ||
48 | var striptags = require('striptags'); | 39 | var ym = require('./ym'); |
49 | 40 | var YahooMessenger = ym.start(config, logger); | |
50 | var YahooMessenger = require("yahoomessenger"); | ||
51 | YahooMessenger.newInstance(); | ||
52 | |||
53 | function sendPM(destination, message) { | ||
54 | logger.info("Sending to " + destination + ": " + message); | ||
55 | |||
56 | //try { | ||
57 | YahooMessenger.sendPM(destination, message); | ||
58 | /* | ||
59 | } | ||
60 | catch (e) { | ||
61 | logger.info("Something wrong"); | ||
62 | logger.info(e); | ||
63 | logger.info("Try to reconnecting to yahoo messenger"); | ||
64 | YahooMessenger.login(config.yahoomessenger.username, config.yahoomessenger.password); | ||
65 | return false; | ||
66 | } | ||
67 | |||
68 | return true; | ||
69 | */ | ||
70 | } | ||
71 | |||
72 | function broadcast(destinations, message, exclude) { | ||
73 | var destinations = destinations.split(','); | ||
74 | var destinationCount = destinations.length; | ||
75 | |||
76 | for (var i=0; i < destinationCount; i++) { | ||
77 | destination = destinations[i]; | ||
78 | if (destination == exclude) { | ||
79 | continue; | ||
80 | } | ||
81 | |||
82 | sendPM(destination, message); | ||
83 | } | ||
84 | } | ||
85 | |||
86 | var _keepAliveLoop = function() { | ||
87 | logger.info('Keep alive loop'); | ||
88 | |||
89 | //try { | ||
90 | YahooMessenger.keepAlive(); | ||
91 | /* | ||
92 | } | ||
93 | catch(e) { | ||
94 | logger.info("Something wrong"); | ||
95 | logger.info(e); | ||
96 | logger.info("Try to reconnecting to yahoo messenger"); | ||
97 | YahooMessenger.login(config.yahoomessenger.username, config.yahoomessenger.password); | ||
98 | return; | ||
99 | } | ||
100 | */ | ||
101 | |||
102 | keepAliveLoop(); | ||
103 | } | ||
104 | |||
105 | function keepAliveLoop() { | ||
106 | keepAliveTimer = setTimeout(_keepAliveLoop, config.yahoomessenger.keepalive_interval * 1000); | ||
107 | } | ||
108 | |||
109 | function ymLogin(){ | ||
110 | logger.info("Login to YM as " + config.yahoomessenger.username) | ||
111 | YahooMessenger.login(config.yahoomessenger.username, config.yahoomessenger.password); | ||
112 | } | ||
113 | |||
114 | function onYmLoginSuccesful(data){ | ||
115 | logger.info('Online on YM as ' + data.user_id + ' (' + data.firstname + ' ' + data.lastname + ')'); | ||
116 | |||
117 | if (config.yahoomessenger.status) { | ||
118 | logger.info('Set status to: ' + config.yahoomessenger.status); | ||
119 | YahooMessenger.setCustomAwayStatus(config.yahoomessenger.status); | ||
120 | }; | ||
121 | |||
122 | broadcast(config.yahoomessenger.report_to, config.yahoomessenger.report_message); | ||
123 | |||
124 | keepAliveLoop(); | ||
125 | } | ||
126 | |||
127 | function onYmLoginError(data){ | ||
128 | logger.info("YM login error"); | ||
129 | } | ||
130 | |||
131 | function onYmPM(data) { | ||
132 | var direction = 'IN'; | ||
133 | |||
134 | if (config.globals.debug == 1) { | ||
135 | console.log(data); | ||
136 | } | ||
137 | |||
138 | // check duplicate message | ||
139 | if (loggedPM.indexOf(data.message_id) >= 0) { | ||
140 | return; | ||
141 | } | ||
142 | |||
143 | loggedPM.unshift(data.message_id); | ||
144 | if (loggedPM.length > 30) { | ||
145 | loggedPM = loggedPM.slice(0, 10); | ||
146 | } | ||
147 | |||
148 | partner = data.sender; | ||
149 | if (partner == data.user_id) { | ||
150 | partner = data.target_user; | ||
151 | direction = 'OUT'; | ||
152 | } | ||
153 | |||
154 | var message = striptags(data.message).trim(); | ||
155 | |||
156 | logger.info('New ' + direction + ' message from ' + data.sender + ' to ' + data.target_user + ': ' + message); | ||
157 | |||
158 | if (isAdmin(data.sender)) { | ||
159 | logger.info('Sender (' + data.sender + ') is an admin'); | ||
160 | } | ||
161 | |||
162 | var sentdate = Date.parse(data.time); | ||
163 | var strftime = require('strftime'); | ||
164 | sentdate = strftime('%Y-%m-%d %H:%M:%S', sentdate); | ||
165 | |||
166 | insertMessages( | ||
167 | db_connection, | ||
168 | data.user_id, | ||
169 | direction, | ||
170 | partner, | ||
171 | message, | ||
172 | sentdate | ||
173 | ); | ||
174 | |||
175 | broadcast(config.yahoomessenger.report_to, '@' + data.sender + ': ' + message, partner); | ||
176 | |||
177 | if ((direction == 'IN') && (isAdmin(partner))) { | ||
178 | if (message.charAt(0) == '@') { | ||
179 | target = message.split(' ', 1).join(); | ||
180 | target = target.slice(1); | ||
181 | |||
182 | var messageToForward = message.replace('@' + target, '').trim(); | ||
183 | if (messageToForward == '') { | ||
184 | return; | ||
185 | } | ||
186 | |||
187 | logger.info('Forward to ' + target + ': ' + messageToForward); | ||
188 | sendPM(target, '@' + partner + ': ' + messageToForward); | ||
189 | |||
190 | } else if (message.charAt(0) == '+') { | ||
191 | target = message.split(' ', 1).join(); | ||
192 | target = target.slice(1); | ||
193 | |||
194 | var messageToForward = message.replace('+' + target, '').trim(); | ||
195 | if (messageToForward == '') { | ||
196 | return; | ||
197 | } | ||
198 | |||
199 | logger.info('Clean forward to ' + target + ': ' + messageToForward); | ||
200 | sendPM(target, messageToForward); | ||
201 | } | ||
202 | |||
203 | } | ||
204 | } | ||
205 | |||
206 | function onYmBuddyAddRequest(data) { | ||
207 | logger.info("Got request to add buddy from " + data.username); | ||
208 | YahooMessenger.acceptAddBuddy(data.username); | ||
209 | } | ||
210 | |||
211 | |||
212 | function onYmReady(){ | ||
213 | ymLogin(); | ||
214 | } | ||
215 | |||
216 | YahooMessenger.on('ready', onYmReady); | ||
217 | YahooMessenger.on('loginSuccessful', onYmLoginSuccesful); | ||
218 | YahooMessenger.on('loginError', onYmLoginError); | ||
219 | YahooMessenger.on('pm', onYmPM); | ||
220 | YahooMessenger.on('buddyAddRequest', onYmBuddyAddRequest); | ||
221 | 41 | ||
222 | var http = require('http'); | 42 | var http = require('http'); |
223 | var nsr = require('node-simple-router'); | 43 | var nsr = require('node-simple-router'); |
224 | var router = nsr(); | 44 | var router = nsr(); |
225 | 45 | ||
226 | router.get('/hello', function(request, response) { | 46 | router.get('/hello', function(request, response) { |
227 | response.end('Hello bro'); | 47 | response.end('Hello bro'); |
228 | }); | 48 | }); |
229 | 49 | ||
230 | router.get('/broadcastPing', function(request, response) { | 50 | router.get('/broadcastPing', function(request, response) { |
231 | response.end('Ok'); | 51 | response.end('Ok'); |
232 | broadcast(config.yahoomessenger.report_to, 'PING'); | 52 | broadcast(config.yahoomessenger.report_to, 'PING'); |
233 | }); | 53 | }); |
234 | 54 | ||
235 | router.get('/status', function(request, response) { | 55 | router.get('/status', function(request, response) { |
236 | response.writeHead(200, {"Content-Type": "text/plain"}); | 56 | response.writeHead(200, {"Content-Type": "text/plain"}); |
237 | response.write(config.yahoomessenger.status); | 57 | response.write(config.yahoomessenger.status); |
238 | response.end(); | 58 | response.end(); |
239 | }); | 59 | }); |
240 | 60 | ||
241 | router.post('/status', function(request, response) { | 61 | router.post('/status', function(request, response) { |
242 | var apikey = request.body.apikey; | 62 | var apikey = request.body.apikey; |
243 | if (apikey != config.httpserver.apikey) { | 63 | if (apikey != config.httpserver.apikey) { |
244 | response.end('Invalid APIKEY: ' + apikey); | 64 | response.end('Invalid APIKEY: ' + apikey); |
245 | return; | 65 | return; |
246 | } | 66 | } |
247 | response.end('Ok'); | 67 | response.end('Ok'); |
248 | 68 | ||
249 | config.yahoomessenger.status = request.body.status; | 69 | config.yahoomessenger.status = request.body.status; |
250 | YahooMessenger.setCustomAwayStatus(config.yahoomessenger.status); | 70 | YahooMessenger.setCustomAwayStatus(config.yahoomessenger.status); |
251 | }); | 71 | }); |
252 | 72 | ||
253 | router.get('/relogin/:apikey', function(request, response) { | 73 | router.get('/relogin/:apikey', function(request, response) { |
254 | var apikey = request.params.apikey; | 74 | var apikey = request.params.apikey; |
255 | 75 | ||
256 | if (apikey != config.httpserver.apikey){ | 76 | if (apikey != config.httpserver.apikey){ |
257 | response.end('Invalid APIKEY: ' + apikey); | 77 | response.end('Invalid APIKEY: ' + apikey); |
258 | return; | 78 | return; |
259 | } | 79 | } |
260 | 80 | ||
261 | logger.info("Logging out"); | 81 | logger.info("Logging out"); |
262 | YahooMessenger.logout(); | 82 | YahooMessenger.logout(); |
263 | 83 | ||
264 | logger.info("Logout"); | 84 | logger.info("Logout"); |
265 | clearTimeout(keepAliveTimer); | 85 | clearTimeout(keepAliveTimer); |
266 | 86 | ||
267 | ymLogin(); | 87 | ymLogin(); |
268 | }); | 88 | }); |
269 | 89 | ||
270 | logger.info("Starting http server on port " + config.httpserver.listen_port); | 90 | logger.info("Starting http server on port " + config.httpserver.listen_port); |
271 | var httpServer = http.createServer(router).listen(config.httpserver.listen_port); | 91 | var httpServer = http.createServer(router).listen(config.httpserver.listen_port); |
272 | 92 | ||
273 | 93 |
File was created | 1 | var YahooMessenger = require("yahoomessenger"); | |
2 | var striptags = require('striptags'); | ||
3 | |||
4 | function start(config, logger) { | ||
5 | var oldMessages = []; | ||
6 | |||
7 | var keepAliveTimer; | ||
8 | |||
9 | var _keepAliveLoop = function() { | ||
10 | logger.info('Keep alive loop'); | ||
11 | |||
12 | YahooMessenger.keepAlive(); | ||
13 | keepAliveLoop(); | ||
14 | } | ||
15 | |||
16 | function isAdmin(user) { | ||
17 | var admins = config.yahoomessenger.admin.split(','); | ||
18 | |||
19 | return (admins.indexOf(user) >= 0); | ||
20 | } | ||
21 | |||
22 | function keepAliveLoop() { | ||
23 | keepAliveTimer = setTimeout(_keepAliveLoop, config.yahoomessenger.keepalive_interval * 1000); | ||
24 | } | ||
25 | |||
26 | function login(){ | ||
27 | logger.info("Login to YM as " + config.yahoomessenger.username) | ||
28 | YahooMessenger.login(config.yahoomessenger.username, config.yahoomessenger.password); | ||
29 | } | ||
30 | |||
31 | function pm(destination, message) { | ||
32 | logger.info("Sending to " + destination + ": " + message); | ||
33 | |||
34 | YahooMessenger.sendPM(destination, message); | ||
35 | } | ||
36 | |||
37 | function sendPM(destination, message) { | ||
38 | pm(destination, message); | ||
39 | } | ||
40 | |||
41 | function broadcast(destinations, message, exclude) { | ||
42 | var destinations = destinations.split(','); | ||
43 | var destinationCount = destinations.length; | ||
44 | |||
45 | for (var i=0; i < destinationCount; i++) { | ||
46 | destination = destinations[i]; | ||
47 | if (destination == exclude) { | ||
48 | continue; | ||
49 | } | ||
50 | |||
51 | sendPM(destination, message); | ||
52 | } | ||
53 | } | ||
54 | |||
55 | function onReady() { | ||
56 | login(); | ||
57 | } | ||
58 | |||
59 | function onLoginSuccesful(data) { | ||
60 | logger.info('Online on YM as ' + data.user_id + ' (' + data.firstname + ' ' + data.lastname + ')'); | ||
61 | |||
62 | if (config.yahoomessenger.status) { | ||
63 | logger.info('Set status to: ' + config.yahoomessenger.status); | ||
64 | YahooMessenger.setCustomAwayStatus(config.yahoomessenger.status); | ||
65 | }; | ||
66 | |||
67 | broadcast(config.yahoomessenger.report_to, config.yahoomessenger.report_message); | ||
68 | keepAliveLoop(); | ||
69 | } | ||
70 | |||
71 | function onBuddyAddRequest(data) { | ||
72 | logger.info("Got request to add buddy from " + data.username); | ||
73 | YahooMessenger.acceptAddBuddy(data.username); | ||
74 | } | ||
75 | |||
76 | function onPM(data) { | ||
77 | var direction = 'IN'; | ||
78 | |||
79 | if (config.globals.debug == 1) { | ||
80 | console.log(data); | ||
81 | } | ||
82 | |||
83 | // check duplicate message | ||
84 | if (oldMessages.indexOf(data.message_id) >= 0) { | ||
85 | return; | ||
86 | } | ||
87 | |||
88 | oldMessages.unshift(data.message_id); | ||
89 | if (oldMessages.length > 30) { | ||
90 | oldMessages = oldMessages.slice(0, 10); | ||
91 | } | ||
92 | |||
93 | partner = data.sender; | ||
94 | if (partner == data.user_id) { | ||
95 | partner = data.target_user; | ||
96 | direction = 'OUT'; | ||
97 | } | ||
98 | |||
99 | var message = striptags(data.message).trim(); | ||
100 | |||
101 | logger.info('New ' + direction + ' message from ' + data.sender + ' to ' + data.target_user + ': ' + message); | ||
102 | |||
103 | if (isAdmin(data.sender)) { | ||
104 | logger.info('Sender (' + data.sender + ') is an admin'); | ||
105 | } | ||
106 | |||
107 | var sentdate = Date.parse(data.time); | ||
108 | var strftime = require('strftime'); | ||
109 | sentdate = strftime('%Y-%m-%d %H:%M:%S', sentdate); | ||
110 | |||
111 | /* | ||
112 | insertMessages( | ||
113 | db_connection, | ||
114 | data.user_id, | ||
115 | direction, | ||
116 | partner, | ||
117 | message, | ||
118 | sentdate | ||
119 | ); | ||
120 | */ | ||
121 | |||
122 | broadcast(config.yahoomessenger.report_to, '@' + data.sender + ': ' + message, partner); | ||
123 | |||
124 | if ((direction == 'IN') && (isAdmin(partner))) { | ||
125 | if (message.charAt(0) == '@') { | ||
126 | target = message.split(' ', 1).join(); | ||
127 | target = target.slice(1); | ||
128 | |||
129 | var messageToForward = message.replace('@' + target, '').trim(); | ||
130 | if (messageToForward == '') { | ||
131 | return; | ||
132 | } | ||
133 | |||
134 | logger.info('Forward to ' + target + ': ' + messageToForward); | ||
135 | sendPM(target, '@' + partner + ': ' + messageToForward); | ||
136 | |||
137 | } else if (message.charAt(0) == '+') { | ||
138 | target = message.split(' ', 1).join(); | ||
139 | target = target.slice(1); | ||
140 | |||
141 | var messageToForward = message.replace('+' + target, '').trim(); | ||
142 | if (messageToForward == '') { | ||
143 | return; | ||
144 | } | ||
145 | |||
146 | logger.info('Clean forward to ' + target + ': ' + messageToForward); | ||
147 | sendPM(target, messageToForward); | ||
148 | } | ||
149 | } | ||
150 | } | ||
151 | |||
152 | YahooMessenger.newInstance(); | ||
153 | YahooMessenger.on('ready', onReady); | ||
154 | YahooMessenger.on('loginSuccessful', onLoginSuccesful); | ||
155 | YahooMessenger.on('buddyAddRequest', onBuddyAddRequest); | ||
156 | YahooMessenger.on('pm', onPM); | ||
157 | |||
158 | return YahooMessenger; | ||
159 | } | ||
160 | |||
161 | exports.start = start; | ||
162 |