Commit 4ab521322b388c28da3f076cfe7e6f430a887b94

Authored by Adhidarma Hadiwinoto
1 parent d637b42e22
Exists in master

set new status by pm

Showing 1 changed file with 20 additions and 2 deletions Inline Diff

1 var YahooMessenger = require("yahoomessenger"); 1 var YahooMessenger = require("yahoomessenger");
2 var striptags = require('striptags'); 2 var striptags = require('striptags');
3 var sleep = require('sleep'); 3 var sleep = require('sleep');
4 var db = require('./db.js'); 4 var db = require('./db.js');
5 5
6 var oldMessages = []; 6 var oldMessages = [];
7 7
8 var config; 8 var config;
9 var logger; 9 var logger;
10 10
11 function insertMessages(db_connection, logger_id, direction, partner, message, sentdate) { 11 function insertMessages(db_connection, logger_id, direction, partner, message, sentdate) {
12 12
13 db_connection.query( 13 db_connection.query(
14 'INSERT INTO messages SET ?', 14 'INSERT INTO messages SET ?',
15 { 15 {
16 transport: 'YAHOO', 16 transport: 'YAHOO',
17 logger: logger_id, 17 logger: logger_id,
18 direction: direction, 18 direction: direction,
19 partner: partner, 19 partner: partner,
20 message: message, 20 message: message,
21 sentdate: sentdate, 21 sentdate: sentdate,
22 }, 22 },
23 23
24 function(err) { 24 function(err) {
25 if (err != null) { 25 if (err != null) {
26 logger.error("Error on inserting messages to DB, error: " + err); 26 logger.error("Error on inserting messages to DB, error: " + err);
27 } 27 }
28 } 28 }
29 ); 29 );
30 } 30 }
31 31
32 function pm(destination, message) { 32 function pm(destination, message) {
33 logger.info("Sending to " + destination + ": " + message); 33 logger.info("Sending to " + destination + ": " + message);
34 34
35 try { 35 try {
36 YahooMessenger.sendPM(destination, message); 36 YahooMessenger.sendPM(destination, message);
37 } 37 }
38 catch (err) { 38 catch (err) {
39 logger.info("Error sending message: " + err.message); 39 logger.info("Error sending message: " + err.message);
40 relogin(); 40 relogin();
41 } 41 }
42 } 42 }
43 43
44 44
45 function broadcast(destinations, message, exclude) { 45 function broadcast(destinations, message, exclude) {
46 var destinations = destinations.split(','); 46 var destinations = destinations.split(',');
47 var destinationCount = destinations.length; 47 var destinationCount = destinations.length;
48 48
49 for (var i=0; i < destinationCount; i++) { 49 for (var i=0; i < destinationCount; i++) {
50 destination = destinations[i]; 50 destination = destinations[i];
51 if (destination == exclude) { 51 if (destination == exclude) {
52 continue; 52 continue;
53 } 53 }
54 54
55 pm(destination, message); 55 pm(destination, message);
56 } 56 }
57 } 57 }
58 58
59 var keepAliveTimer; 59 var keepAliveTimer;
60 60
61 var _keepAliveLoop = function() { 61 var _keepAliveLoop = function() {
62 logger.info('Keep alive loop'); 62 logger.info('Keep alive loop');
63 63
64 try { 64 try {
65 YahooMessenger.keepAlive(); 65 YahooMessenger.keepAlive();
66 keepAliveLoop(); 66 keepAliveLoop();
67 } 67 }
68 catch (err) { 68 catch (err) {
69 logger.info("Error when sending keepalive: " + err.message); 69 logger.info("Error when sending keepalive: " + err.message);
70 relogin(); 70 relogin();
71 } 71 }
72 } 72 }
73 73
74 function isAdmin(user) { 74 function isAdmin(user) {
75 var admins = config.yahoomessenger.admin.split(','); 75 var admins = config.yahoomessenger.admin.split(',');
76 76
77 return (admins.indexOf(user) >= 0); 77 return (admins.indexOf(user) >= 0);
78 } 78 }
79 79
80 function keepAliveLoop() { 80 function keepAliveLoop() {
81 keepAliveTimer = setTimeout(_keepAliveLoop, config.yahoomessenger.keepalive_interval * 1000); 81 keepAliveTimer = setTimeout(_keepAliveLoop, config.yahoomessenger.keepalive_interval * 1000);
82 } 82 }
83 83
84 function login(){ 84 function login(){
85 logger.info("Login to YM as " + config.yahoomessenger.username) 85 logger.info("Login to YM as " + config.yahoomessenger.username)
86 YahooMessenger.login(config.yahoomessenger.username, config.yahoomessenger.password); 86 YahooMessenger.login(config.yahoomessenger.username, config.yahoomessenger.password);
87 } 87 }
88 88
89 function logout() { 89 function logout() {
90 logger.info("Logout from YM"); 90 logger.info("Logout from YM");
91 91
92 clearTimeout(keepAliveTimer); 92 clearTimeout(keepAliveTimer);
93 93
94 try { 94 try {
95 YahooMessenger.logout(); 95 YahooMessenger.logout();
96 } 96 }
97 catch(err) { 97 catch(err) {
98 logger.info("Error on logout: " + err.message); 98 logger.info("Error on logout: " + err.message);
99 } 99 }
100 } 100 }
101 101
102 function relogin() { 102 function relogin() {
103 logger.info("Going to relogin"); 103 logger.info("Going to relogin");
104 logout(); 104 logout();
105 105
106 logger.info("Sleeping 5 seconds before login"); 106 logger.info("Sleeping 5 seconds before login");
107 sleep.sleep(5); 107 sleep.sleep(5);
108 108
109 YahooMessenger.newInstance(); 109 YahooMessenger.newInstance();
110 } 110 }
111 111
112 function start(_config, _logger) { 112 function start(_config, _logger) {
113 config = _config; 113 config = _config;
114 logger = _logger; 114 logger = _logger;
115 115
116 function onReady() { 116 function onReady() {
117 login(); 117 login();
118 } 118 }
119 119
120 function onLoginSuccesful(data) { 120 function onLoginSuccesful(data) {
121 logger.info('Online on YM as ' + data.user_id + ' (' + data.firstname + ' ' + data.lastname + ')'); 121 logger.info('Online on YM as ' + data.user_id + ' (' + data.firstname + ' ' + data.lastname + ')');
122 122
123 if (config.yahoomessenger.status) { 123 if (config.yahoomessenger.status) {
124 logger.info('Set status to: ' + config.yahoomessenger.status); 124 logger.info('Set status to: ' + config.yahoomessenger.status);
125 YahooMessenger.setCustomAwayStatus(config.yahoomessenger.status); 125 YahooMessenger.setCustomAwayStatus(config.yahoomessenger.status);
126 }; 126 };
127 127
128 broadcast(config.yahoomessenger.report_to, config.yahoomessenger.report_message); 128 broadcast(config.yahoomessenger.report_to, config.yahoomessenger.report_message);
129 keepAliveLoop(); 129 keepAliveLoop();
130 } 130 }
131 131
132 function onBuddyAddRequest(data) { 132 function onBuddyAddRequest(data) {
133 logger.info("Got request to add buddy from " + data.username); 133 logger.info("Got request to add buddy from " + data.username);
134 YahooMessenger.acceptAddBuddy(data.username); 134 YahooMessenger.acceptAddBuddy(data.username);
135 } 135 }
136 136
137 function onPM(data) { 137 function onPM(data) {
138 var direction = 'IN'; 138 var direction = 'IN';
139 139
140 if (config.globals.debug == 1) { 140 if (config.globals.debug == 1) {
141 console.log(data); 141 console.log(data);
142 } 142 }
143 143
144 // check duplicate message 144 // check duplicate message
145 if (oldMessages.indexOf(data.message_id) >= 0) { 145 if (oldMessages.indexOf(data.message_id) >= 0) {
146 return; 146 return;
147 } 147 }
148 148
149 oldMessages.unshift(data.message_id); 149 oldMessages.unshift(data.message_id);
150 if (oldMessages.length > 30) { 150 if (oldMessages.length > 30) {
151 oldMessages = oldMessages.slice(0, 10); 151 oldMessages = oldMessages.slice(0, 10);
152 } 152 }
153 153
154 partner = data.sender; 154 partner = data.sender;
155 if (partner == data.user_id) { 155 if (partner == data.user_id) {
156 partner = data.target_user; 156 partner = data.target_user;
157 direction = 'OUT'; 157 direction = 'OUT';
158 } 158 }
159 159
160 var message = striptags(data.message).trim(); 160 var message = striptags(data.message).trim();
161 161
162 logger.info('New ' + direction + ' message from ' + data.sender + ' to ' + data.target_user + ': ' + message); 162 logger.info('New ' + direction + ' message from ' + data.sender + ' to ' + data.target_user + ': ' + message);
163 163
164 if (isAdmin(data.sender)) { 164 if (isAdmin(data.sender)) {
165 logger.info('Sender (' + data.sender + ') is an admin'); 165 logger.info('Sender (' + data.sender + ') is an admin');
166 } 166 }
167 167
168 var sentdate = Date.parse(data.time); 168 var sentdate = Date.parse(data.time);
169 var strftime = require('strftime'); 169 var strftime = require('strftime');
170 sentdate = strftime('%Y-%m-%d %H:%M:%S', sentdate); 170 sentdate = strftime('%Y-%m-%d %H:%M:%S', sentdate);
171 171
172 insertMessages( 172 insertMessages(
173 db_connection, 173 db_connection,
174 data.user_id, 174 data.user_id,
175 direction, 175 direction,
176 partner, 176 partner,
177 message, 177 message,
178 sentdate 178 sentdate
179 ); 179 );
180 180
181 broadcast(config.yahoomessenger.report_to, '@' + data.sender + ': ' + message, partner); 181 broadcast(config.yahoomessenger.report_to, '@' + data.sender + ': ' + message, partner);
182 182
183 if ((direction == 'IN') && (isAdmin(partner))) { 183 if ((direction == 'IN') && (isAdmin(partner))) {
184
184 if (message.charAt(0) == '@') { 185 if (message.charAt(0) == '@') {
186
185 target = message.split(' ', 1).join(); 187 target = message.split(' ', 1).join();
186 target = target.slice(1); 188 target = target.slice(1);
187 189
188 var messageToForward = message.replace('@' + target, '').trim(); 190 var messageToForward = message.replace('@' + target, '').trim();
189 if (messageToForward == '') { 191 if (messageToForward == '') {
190 return; 192 return;
191 } 193 }
192 194
193 logger.info('Forward to ' + target + ': ' + messageToForward); 195 logger.info('Forward to ' + target + ': ' + messageToForward);
194 pm(target, '@' + partner + ': ' + messageToForward); 196 pm(target, '@' + partner + ': ' + messageToForward);
195 197
196 } else if (message.charAt(0) == '+') { 198 }
199 else if (message.charAt(0) == '+') {
200
197 target = message.split(' ', 1).join(); 201 target = message.split(' ', 1).join();
198 target = target.slice(1); 202 target = target.slice(1);
199 203
200 var messageToForward = message.replace('+' + target, '').trim(); 204 var messageToForward = message.replace('+' + target, '').trim();
201 if (messageToForward == '') { 205 if (messageToForward == '') {
202 return; 206 return;
203 } 207 }
204 208
205 logger.info('Clean forward to ' + target + ': ' + messageToForward); 209 logger.info('Clean forward to ' + target + ': ' + messageToForward);
206 pm(target, messageToForward); 210 pm(target, messageToForward);
207 211
208 } else if (message == '!relogin') { 212 }
213 else if (message.startsWith('!relogin')) {
214
209 broadcast(config.yahoomessenger.report_to, 'relogin requested by' + data.sender); 215 broadcast(config.yahoomessenger.report_to, 'relogin requested by' + data.sender);
210 logger.info('Relogin request by pm'); 216 logger.info('Relogin request by pm');
211 relogin(); 217 relogin();
218
219 }
220 else if (message.startsWith('!setstatus ')) {
221
222 logger.info('Set status request by pm');
223
224 var newStatus = message.replace('!setstatus').trim();
225
226 broadcast(config.yahoomessenger.report_to, 'Set new status requested by' + data.sender + ': ' + newStatus);
227 config.yahoomessenger.status = newStatus;
228 YahooMessenger.setCustomAwayStatus(config.yahoomessenger.status);
229
212 } 230 }
213 } 231 }
214 } 232 }
215 233
216 db_connection = db.start(config.db.host, config.db.username, config.db.password, config.db.name, logger); 234 db_connection = db.start(config.db.host, config.db.username, config.db.password, config.db.name, logger);
217 235
218 236
219 YahooMessenger.newInstance(); 237 YahooMessenger.newInstance();
220 YahooMessenger.on('ready', onReady); 238 YahooMessenger.on('ready', onReady);
221 YahooMessenger.on('loginSuccessful', onLoginSuccesful); 239 YahooMessenger.on('loginSuccessful', onLoginSuccesful);
222 YahooMessenger.on('buddyAddRequest', onBuddyAddRequest); 240 YahooMessenger.on('buddyAddRequest', onBuddyAddRequest);
223 YahooMessenger.on('pm', onPM); 241 YahooMessenger.on('pm', onPM);
224 242
225 return YahooMessenger; 243 return YahooMessenger;
226 } 244 }
227 245
228 exports.start = start; 246 exports.start = start;
229 exports.broadcast = broadcast; 247 exports.broadcast = broadcast;
230 exports.pm = pm; 248 exports.pm = pm;
231 exports.logout = logout; 249 exports.logout = logout;
232 exports.relogin = relogin; 250 exports.relogin = relogin;
233 251