Commit 4f3e91223c75ee70705de468ae640c0e12b6a349

Authored by Adhidarma Hadiwinoto
1 parent 4aebdeed4a
Exists in master

relay message from admin

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