Commit 02655b6bbbeadc4b790b1ded7f5719f9392e2642

Authored by Adhidarma Hadiwinoto
1 parent 776e8a8525
Exists in master

sendPM wrapper

Showing 1 changed file with 22 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 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 sendPM(destination, message) {
26 try {
27 logger.info("Sending to " + destination + ": " + message);
28 YahooMessenger.sendPM(destination, message);
29 }
30 catch (e) {
31 logger.info("Something wrong");
32 logger.info(e);
33 logger.info("Try to reconnecting to yahoo messenger");
34 YahooMessenger.login(config.yahoomessenger.username, config.yahoomessenger.password);
35 return false;
36 }
37
38 return true;
39
40 }
41
25 function broadcast(destinations, message, exclude) { 42 function broadcast(destinations, message, exclude) {
26 var destinations = destinations.split(','); 43 var destinations = destinations.split(',');
27 var destinationCount = destinations.length; 44 var destinationCount = destinations.length;
28 45
29 for (var i=0; i < destinationCount; i++) { 46 for (var i=0; i < destinationCount; i++) {
30 destination = destinations[i]; 47 destination = destinations[i];
31 if (destination == exclude) { 48 if (destination == exclude) {
32 continue; 49 continue;
33 } 50 }
34 51
35 logger.info('Sending message to ' + destination); 52 sendPM(destination, message);
36 YahooMessenger.sendPM(destination, message);
37 } 53 }
38 } 54 }
39 55
40 var _keepAliveLoop = function() { 56 var _keepAliveLoop = function() {
41 logger.info('Keep alive loop'); 57 logger.info('Keep alive loop');
42 58
43 try { 59 try {
44 YahooMessenger.keepAlive(); 60 YahooMessenger.keepAlive();
45 } 61 }
46 catch(e) { 62 catch(e) {
47 logger.error("Something wrong"); 63 logger.info("Something wrong");
48 logger.error(e); 64 logger.info(e);
49 logger.info("Try to reconnecting to yahoo messenger"); 65 logger.info("Try to reconnecting to yahoo messenger");
50 YahooMessenger.login(config.yahoomessenger.username, config.yahoomessenger.password); 66 YahooMessenger.login(config.yahoomessenger.username, config.yahoomessenger.password);
51 return; 67 return;
52 } 68 }
53 69
54 keepAliveLoop(); 70 keepAliveLoop();
55 } 71 }
56 72
57 function keepAliveLoop() { 73 function keepAliveLoop() {
58 setTimeout(_keepAliveLoop, config.yahoomessenger.keepalive_interval * 1000); 74 setTimeout(_keepAliveLoop, config.yahoomessenger.keepalive_interval * 1000);
59 } 75 }
60 76
61 function insertMessages(db_connection, logger_id, direction, partner, message, sentdate) { 77 function insertMessages(db_connection, logger_id, direction, partner, message, sentdate) {
62 78
63 db_connection.query( 79 db_connection.query(
64 'INSERT INTO messages SET ?', 80 'INSERT INTO messages SET ?',
65 { 81 {
66 transport: 'YAHOO', 82 transport: 'YAHOO',
67 logger: logger_id, 83 logger: logger_id,
68 direction: direction, 84 direction: direction,
69 partner: partner, 85 partner: partner,
70 message: message, 86 message: message,
71 sentdate: sentdate, 87 sentdate: sentdate,
72 }, 88 },
73 89
74 function(err) { 90 function(err) {
75 if (err != null) { 91 if (err != null) {
76 logger.error("Error on inserting messages to DB, error: " + err); 92 logger.error("Error on inserting messages to DB, error: " + err);
77 } 93 }
78 } 94 }
79 ); 95 );
80 } 96 }
81 97
82 var striptags = require('striptags'); 98 var striptags = require('striptags');
83 99
84 var YahooMessenger = require("yahoomessenger"); 100 var YahooMessenger = require("yahoomessenger");
85 YahooMessenger.newInstance(); 101 YahooMessenger.newInstance();
86 102
87 function onYmLoginSuccesful(data){ 103 function onYmLoginSuccesful(data){
88 logger.info('Online on YM as ' + data.user_id + ' (' + data.firstname + ' ' + data.lastname + ')'); 104 logger.info('Online on YM as ' + data.user_id + ' (' + data.firstname + ' ' + data.lastname + ')');
89 105
90 if (config.yahoomessenger.status) { 106 if (config.yahoomessenger.status) {
91 logger.info('Set status to: ' + config.yahoomessenger.status); 107 logger.info('Set status to: ' + config.yahoomessenger.status);
92 YahooMessenger.setCustomAwayStatus(config.yahoomessenger.status); 108 YahooMessenger.setCustomAwayStatus(config.yahoomessenger.status);
93 }; 109 };
94 110
95 broadcast(config.yahoomessenger.report_to, config.yahoomessenger.report_message); 111 broadcast(config.yahoomessenger.report_to, config.yahoomessenger.report_message);
96 112
97 keepAliveLoop(); 113 keepAliveLoop();
98 } 114 }
99 115
100 function onYmPM(data) { 116 function onYmPM(data) {
101 var direction = 'IN'; 117 var direction = 'IN';
102 118
103 if (config.globals.debug == 1) { 119 if (config.globals.debug == 1) {
104 console.log(data); 120 console.log(data);
105 } 121 }
106 122
107 // check duplicate message 123 // check duplicate message
108 if (loggedPM.indexOf(data.message_id) >= 0) { 124 if (loggedPM.indexOf(data.message_id) >= 0) {
109 return; 125 return;
110 } 126 }
111 127
112 loggedPM.unshift(data.message_id); 128 loggedPM.unshift(data.message_id);
113 if (loggedPM.length > 30) { 129 if (loggedPM.length > 30) {
114 loggedPM = loggedPM.slice(0, 10); 130 loggedPM = loggedPM.slice(0, 10);
115 } 131 }
116 132
117 partner = data.sender; 133 partner = data.sender;
118 if (partner == data.user_id) { 134 if (partner == data.user_id) {
119 partner = data.target_user; 135 partner = data.target_user;
120 direction = 'OUT'; 136 direction = 'OUT';
121 } 137 }
122 138
123 var message = striptags(data.message).trim(); 139 var message = striptags(data.message).trim();
124 140
125 logger.info('New ' + direction + ' message from ' + data.sender + ' to ' + data.target_user + ': ' + message); 141 logger.info('New ' + direction + ' message from ' + data.sender + ' to ' + data.target_user + ': ' + message);
126 142
127 if (isAdmin(data.sender)) { 143 if (isAdmin(data.sender)) {
128 logger.info('Sender (' + data.sender + ') is an admin'); 144 logger.info('Sender (' + data.sender + ') is an admin');
129 } 145 }
130 146
131 var sentdate = Date.parse(data.time); 147 var sentdate = Date.parse(data.time);
132 var strftime = require('strftime'); 148 var strftime = require('strftime');
133 sentdate = strftime('%Y-%m-%d %H:%M:%S', sentdate); 149 sentdate = strftime('%Y-%m-%d %H:%M:%S', sentdate);
134 150
135 insertMessages( 151 insertMessages(
136 db_connection, 152 db_connection,
137 data.user_id, 153 data.user_id,
138 direction, 154 direction,
139 partner, 155 partner,
140 message, 156 message,
141 sentdate 157 sentdate
142 ); 158 );
143 159
144 broadcast(config.yahoomessenger.report_to, '@' + data.sender + ': ' + message, partner); 160 broadcast(config.yahoomessenger.report_to, '@' + data.sender + ': ' + message, partner);
145 161
146 if ((direction == 'IN') && (isAdmin(partner))) { 162 if ((direction == 'IN') && (isAdmin(partner))) {
147 if (message.charAt(0) == '@') { 163 if (message.charAt(0) == '@') {
148 target = message.split(' ', 1).join(); 164 target = message.split(' ', 1).join();
149 target = target.slice(1); 165 target = target.slice(1);
150 166
151 var messageToForward = message.replace('@' + target, '').trim(); 167 var messageToForward = message.replace('@' + target, '').trim();
152 if (messageToForward == '') { 168 if (messageToForward == '') {
153 return; 169 return;
154 } 170 }
155 171
156 logger.info('Forward to ' + target + ': ' + messageToForward); 172 logger.info('Forward to ' + target + ': ' + messageToForward);
157 YahooMessenger.sendPM(target, '@' + partner + ': ' + messageToForward); 173 sendPM(target, '@' + partner + ': ' + messageToForward);
158 174
159 } else if (message.charAt(0) == '+') { 175 } else if (message.charAt(0) == '+') {
160 target = message.split(' ', 1).join(); 176 target = message.split(' ', 1).join();
161 target = target.slice(1); 177 target = target.slice(1);
162 178
163 var messageToForward = message.replace('+' + target, '').trim(); 179 var messageToForward = message.replace('+' + target, '').trim();
164 if (messageToForward == '') { 180 if (messageToForward == '') {
165 return; 181 return;
166 } 182 }
167 183
168 logger.info('Clean forward to ' + target + ': ' + messageToForward); 184 logger.info('Clean forward to ' + target + ': ' + messageToForward);
169 YahooMessenger.sendPM(target, messageToForward); 185 sendPM(target, messageToForward);
170 } 186 }
171 187
172 } 188 }
173 } 189 }
174 190
175 function onYmBuddyAddRequest(data) { 191 function onYmBuddyAddRequest(data) {
176 logger.info("Got request to add buddy from " + data.username); 192 logger.info("Got request to add buddy from " + data.username);
177 YahooMessenger.acceptAddBuddy(data.username); 193 YahooMessenger.acceptAddBuddy(data.username);
178 } 194 }
179 195
180 196
181 function onYmReady(){ 197 function onYmReady(){
182 logger.info("Going to online on YM") 198 logger.info("Going to online on YM")
183 YahooMessenger.login(config.yahoomessenger.username, config.yahoomessenger.password); 199 YahooMessenger.login(config.yahoomessenger.username, config.yahoomessenger.password);
184 } 200 }
185 201
186 YahooMessenger.on('ready', onYmReady); 202 YahooMessenger.on('ready', onYmReady);
187 YahooMessenger.on('loginSuccessful', onYmLoginSuccesful); 203 YahooMessenger.on('loginSuccessful', onYmLoginSuccesful);
188 YahooMessenger.on('pm', onYmPM); 204 YahooMessenger.on('pm', onYmPM);
189 YahooMessenger.on('buddyAddRequest', onYmBuddyAddRequest); 205 YahooMessenger.on('buddyAddRequest', onYmBuddyAddRequest);
190 206
191 var http = require('http'); 207 var http = require('http');
192 var url = require('url'); 208 var url = require('url');
193 209
194 function onHttpRequest(request, response) { 210 function onHttpRequest(request, response) {
195 var pathname = url.parse(request.url).pathname; 211 var pathname = url.parse(request.url).pathname;
196 logger.info('Got HTTP request on ' + pathname); 212 logger.info('Got HTTP request on ' + pathname);
197 213
198 var queries = url.parse(request.url, true).query; 214 var queries = url.parse(request.url, true).query;
199 console.log(queries); 215 console.log(queries);
200 216
201 response.writeHead(200, {"Content-Type": "text/html"}); 217 response.writeHead(200, {"Content-Type": "text/html"});
202 response.write("Hello"); 218 response.write("Hello");
203 response.end(); 219 response.end();
204 } 220 }
205 221
206 http.createServer(onHttpRequest).listen(config.httpserver.listen_port); 222 http.createServer(onHttpRequest).listen(config.httpserver.listen_port);
207 logger.info("HTTP server listening on " + config.httpserver.listen_port); 223 logger.info("HTTP server listening on " + config.httpserver.listen_port);