Commit 32b39897aff7788a1e57af3516e1c47b77fd4009

Authored by Adhidarma Hadiwinoto
1 parent d52238d9fb
Exists in master

keluarkan ym dari index.js

Showing 2 changed files with 163 additions and 182 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 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