Commit 53b5c5b0e3f733c4f5cf31a2ea8b8bab0cc9bb25

Authored by Adhidarma Hadiwinoto
1 parent 901cf9158a
Exists in master

relogin by http req

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