Commit 21a7e4dca449019ef01e9f9b9238a349399829cc

Authored by Adhidarma Hadiwinoto
1 parent 2192e8e086
Exists in master

efficient keepalive

Showing 1 changed file with 7 additions and 6 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 pollingTimer;
11
12 var loggedPM = []; 10 var loggedPM = [];
13 11
14 var logger = require('winston'); 12 var logger = require('winston');
15 logger.remove(logger.transports.Console); 13 logger.remove(logger.transports.Console);
16 logger.add(logger.transports.Console, { timestamp: function() { return (strftime('%F %T')); }}); 14 logger.add(logger.transports.Console, { timestamp: function() { return (strftime('%F %T')); }});
17 15
18 var db = require('./db.js'); 16 var db = require('./db.js');
19 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);
20 18
21 function isAdmin(user) { 19 function isAdmin(user) {
22 var admins = config.yahoomessenger.admin.split(','); 20 var admins = config.yahoomessenger.admin.split(',');
23 21
24 return (admins.indexOf(user) >= 0); 22 return (admins.indexOf(user) >= 0);
25 } 23 }
26 24
27 function broadcast(destinations, message) { 25 function broadcast(destinations, message) {
28 var destinations = destinations.split(','); 26 var destinations = destinations.split(',');
29 var destinationCount = destinations.length; 27 var destinationCount = destinations.length;
30 28
31 for (var i=0; i < destinationCount; i++) { 29 for (var i=0; i < destinationCount; i++) {
32 destination = destinations[i] 30 destination = destinations[i]
33 logger.info('Sending message to ' + destination); 31 logger.info('Sending message to ' + destination);
34 YahooMessenger.sendPM(destination, message); 32 YahooMessenger.sendPM(destination, message);
35 } 33 }
36 } 34 }
37 35
38 var keepAliveLoop = function() { 36 var _keepAliveLoop = function() {
39 logger.info('Keep alive loop'); 37 logger.info('Keep alive loop');
40 38
41 YahooMessenger.keepAlive(); 39 YahooMessenger.keepAlive();
42 pollingTimer = setTimeout(keepAliveLoop, config.yahoomessenger.keepalive_interval * 1000); 40 keepAliveLoop();
41
42 }
43
44 function keepAliveLoop() {
45 setTimeout(_keepAliveLoop, config.yahoomessenger.keepalive_interval * 1000);
43 } 46 }
44 47
45 function insertMessages(db_connection, logger_id, direction, partner, message, sentdate) { 48 function insertMessages(db_connection, logger_id, direction, partner, message, sentdate) {
46 49
47 db_connection.query( 50 db_connection.query(
48 'INSERT INTO messages SET ?', 51 'INSERT INTO messages SET ?',
49 { 52 {
50 transport: 'YAHOO', 53 transport: 'YAHOO',
51 logger: logger_id, 54 logger: logger_id,
52 direction: direction, 55 direction: direction,
53 partner: partner, 56 partner: partner,
54 message: message, 57 message: message,
55 sentdate: sentdate, 58 sentdate: sentdate,
56 }, 59 },
57 60
58 function(err) { 61 function(err) {
59 if (err != null) { 62 if (err != null) {
60 logger.error("Error on inserting messages to DB, error: " + err); 63 logger.error("Error on inserting messages to DB, error: " + err);
61 } 64 }
62 } 65 }
63 ); 66 );
64 } 67 }
65 68
66 var striptags = require('striptags'); 69 var striptags = require('striptags');
67 70
68 var YahooMessenger = require("yahoomessenger"); 71 var YahooMessenger = require("yahoomessenger");
69 YahooMessenger.newInstance(); 72 YahooMessenger.newInstance();
70 73
71 function onYmLoginSuccesful(data){ 74 function onYmLoginSuccesful(data){
72 logger.info('Online on YM as ' + data.user_id + ' (' + data.firstname + ' ' + data.lastname + ')'); 75 logger.info('Online on YM as ' + data.user_id + ' (' + data.firstname + ' ' + data.lastname + ')');
73 76
74 if (config.yahoomessenger.status) { 77 if (config.yahoomessenger.status) {
75 logger.info('Set status to: ' + config.yahoomessenger.status); 78 logger.info('Set status to: ' + config.yahoomessenger.status);
76 YahooMessenger.setCustomAwayStatus(config.yahoomessenger.status); 79 YahooMessenger.setCustomAwayStatus(config.yahoomessenger.status);
77 }; 80 };
78 81
79 broadcast(config.yahoomessenger.report_to, config.yahoomessenger.report_message); 82 broadcast(config.yahoomessenger.report_to, config.yahoomessenger.report_message);
80 83
81 keepAliveLoop(); 84 keepAliveLoop();
82 } 85 }
83 86
84 function onYmPM(data) { 87 function onYmPM(data) {
85 88
86 if (config.globals.debug == 1) { 89 if (config.globals.debug == 1) {
87 console.log(data); 90 console.log(data);
88 } 91 }
89 92
90 // check duplicate message 93 // check duplicate message
91 if (loggedPM.indexOf(data.message_id) >= 0) { 94 if (loggedPM.indexOf(data.message_id) >= 0) {
92 return; 95 return;
93 } 96 }
94 97
95 loggedPM.unshift(data.message_id); 98 loggedPM.unshift(data.message_id);
96 if (loggedPM.length > 30) { 99 if (loggedPM.length > 30) {
97 loggedPM = loggedPM.slice(0, 10); 100 loggedPM = loggedPM.slice(0, 10);
98 } 101 }
99 102
100 lastDataOnPM = data;
101
102 direction = 'IN'; 103 direction = 'IN';
103 104
104 partner = data.sender; 105 partner = data.sender;
105 if (partner = data.sender) { 106 if (partner = data.sender) {
106 partner = data.target_user; 107 partner = data.target_user;
107 direction = 'OUT'; 108 direction = 'OUT';
108 } 109 }
109 110
110 var message = striptags(data.message) 111 var message = striptags(data.message)
111 112
112 logger.info('New ' + direction + ' message from ' + data.sender + ' to ' + data.target_user + ': ' + message); 113 logger.info('New ' + direction + ' message from ' + data.sender + ' to ' + data.target_user + ': ' + message);
113 114
114 if (isAdmin(data.sender)) { 115 if (isAdmin(data.sender)) {
115 logger.info('Sender (' + data.sender + ') is an admin'); 116 logger.info('Sender (' + data.sender + ') is an admin');
116 } 117 }
117 118
118 var sentdate = Date.parse(data.time); 119 var sentdate = Date.parse(data.time);
119 var strftime = require('strftime'); 120 var strftime = require('strftime');
120 sentdate = strftime('%Y-%m-%d %H:%M:%S', sentdate); 121 sentdate = strftime('%Y-%m-%d %H:%M:%S', sentdate);
121 122
122 insertMessages( 123 insertMessages(
123 db_connection, 124 db_connection,
124 data.user_id, 125 data.user_id,
125 direction, 126 direction,
126 partner, 127 partner,
127 message, 128 message,
128 sentdate 129 sentdate
129 ); 130 );
130 131
131 broadcast(config.yahoomessenger.report_to, data.sender + '-> ' + message); 132 broadcast(config.yahoomessenger.report_to, data.sender + '-> ' + message);
132 } 133 }
133 134
134 function onYmBuddyAddRequest(data) { 135 function onYmBuddyAddRequest(data) {
135 logger.info("Got request to add buddy from " + data.username); 136 logger.info("Got request to add buddy from " + data.username);
136 YahooMessenger.acceptAddBuddy(data.username); 137 YahooMessenger.acceptAddBuddy(data.username);
137 } 138 }
138 139
139 function onYmReady(){ 140 function onYmReady(){
140 logger.info("Going to online on YM") 141 logger.info("Going to online on YM")
141 YahooMessenger.login(config.yahoomessenger.username, config.yahoomessenger.password); 142 YahooMessenger.login(config.yahoomessenger.username, config.yahoomessenger.password);
142 } 143 }
143 144
144 YahooMessenger.on('ready', onYmReady); 145 YahooMessenger.on('ready', onYmReady);
145 YahooMessenger.on('loginSuccessful', onYmLoginSuccesful); 146 YahooMessenger.on('loginSuccessful', onYmLoginSuccesful);
146 YahooMessenger.on('pm', onYmPM); 147 YahooMessenger.on('pm', onYmPM);
147 YahooMessenger.on('buddyAddRequest', onYmBuddyAddRequest); 148 YahooMessenger.on('buddyAddRequest', onYmBuddyAddRequest);
148 149
149 var http = require('http'); 150 var http = require('http');
150 var url = require('url'); 151 var url = require('url');
151 152
152 function onHttpRequest(request, response) { 153 function onHttpRequest(request, response) {
153 var pathname = url.parse(request.url).pathname; 154 var pathname = url.parse(request.url).pathname;
154 logger.info('Got HTTP request on ' + pathname); 155 logger.info('Got HTTP request on ' + pathname);
155 156
156 var queries = url.parse(request.url, true).query; 157 var queries = url.parse(request.url, true).query;
157 console.log(queries); 158 console.log(queries);
158 159
159 response.writeHead(200, {"Content-Type": "text/html"}); 160 response.writeHead(200, {"Content-Type": "text/html"});
160 response.write("Hello"); 161 response.write("Hello");
161 response.end(); 162 response.end();
162 } 163 }