Commit d52503ab48f7a45f186725bc4f1b867f30b24e39

Authored by Adhidarma Hadiwinoto
1 parent 3a60c3b70a
Exists in master

ready to test

Showing 2 changed files with 39 additions and 3 deletions Inline Diff

1 var http = require('http'); 1 var http = require('http');
2 var url = require('url'); 2 var url = require('url');
3 var winston = require('winston'); 3 var winston = require('winston');
4 var strftime = require('strftime'); 4 var strftime = require('strftime');
5 var strptime = require('micro-strptime').strptime; 5 var strptime = require('micro-strptime').strptime;
6 var request = require('request');
7 var striptags = require('striptags');
6 var fs = require('fs'); 8 var fs = require('fs');
7 var ini = require('ini'); 9 var ini = require('ini');
10
8 var config = ini.parse(fs.readFileSync(__dirname + '/config.ini', 'utf-8')); 11 var config = ini.parse(fs.readFileSync(__dirname + '/config.ini', 'utf-8'));
9 12
10 var last_message_hash; 13 var last_message_hash;
11 14
12 var logger = new (winston.Logger)({ 15 var logger = new (winston.Logger)({
13 transports: [ 16 transports: [
14 new (winston.transports.Console)({ 17 new (winston.transports.Console)({
15 timestamp: function() { 18 timestamp: function() {
16 return strftime('%F %T', new Date()); 19 return strftime('%F %T', new Date());
17 } 20 }
18 }), 21 }),
19 new (winston.transports.DailyRotateFile)({ 22 new (winston.transports.DailyRotateFile)({
20 filename: __dirname + '/logs/log', 23 filename: __dirname + '/logs/log',
21 timestamp: function() { 24 timestamp: function() {
22 return strftime('%F %T', new Date()); 25 return strftime('%F %T', new Date());
23 } 26 }
24 }) 27 })
25 ] 28 ]
26 }); 29 });
27 30
28 31
29 var ym = require('yahoomessenger'); 32 var ym = require('yahoomessenger');
30 ym.newInstance(); 33 ym.newInstance();
31 34
32 function onReady(){ 35 function onReady(){
33 ym.login(config.globals.username, config.globals.password); 36 ym.login(config.globals.username, config.globals.password);
34 } 37 }
35 38
36 function onLoginSuccessful(data) { 39 function onLoginSuccessful(data) {
37 logger.info('Login successful as ' + data.firstname + ' ' + data.lastname + ' (' + data.user_id + ')', {data: data}); 40 logger.info('Login successful as ' + data.firstname + ' ' + data.lastname + ' (' + data.user_id + ')', {data: data});
38 } 41 }
39 42
40 function sendIgnoreResponse(destination, message) { 43 function sendIgnoreResponse(destination, message) {
41 ym.sendPM(destination, "Pesan anda diabaikan, silahkan diulang beberapa saat lagi jika diperlukan: " + message); 44 ym.sendPM(destination, "Pesan anda diabaikan, silahkan diulang beberapa saat lagi jika diperlukan: " + message);
42 } 45 }
43 46
44 function onPm(data) { 47 function onPm(data) {
45 logger.info('onPM()', {data: data}); 48 logger.info('onPM()', {data: data});
46 49
47 var new_message_hash = data.sender + ': ' + data.message; 50 var message = striptags(data.message);
51 var new_message_hash = data.sender + ': ' + message;
48 52
49 if (last_message_hash == new_message_hash) { 53 if (last_message_hash == new_message_hash) {
50 return; 54 return;
51 } 55 }
52 56
53 last_message_hash = new_message_hash; 57 last_message_hash = new_message_hash;
54 ym.sendPM(data.sender, "Pesan anda telah diterima dan akan segera diproses: " + data.message); 58 ym.sendPM(data.sender, "Pesan anda telah diterima dan akan segera diproses: " + message);
59
60 forwardMessageToEvo(data.sender, message, formatTimestamp(data.time));
55 } 61 }
56 62
57 function onOfflinePM(data) { 63 function onOfflinePM(data) {
58 logger.info('onOfflinePM()', {data: data}); 64 logger.info('onOfflinePM()', {data: data});
59 sendIgnoreResponse(data.sender, data.message); 65 sendIgnoreResponse(data.sender, data.message);
60 } 66 }
61 67
62 function onBuddyAddRequest(data) { 68 function onBuddyAddRequest(data) {
63 logger.info('onBuddyAddRequest()', {data: data}); 69 logger.info('onBuddyAddRequest()', {data: data});
64 ym.acceptAddBuddy(data.username); 70 ym.acceptAddBuddy(data.username);
65 logger.info('Accept buddy add request: ' + data.username, {data: data}); 71 logger.info('Accept buddy add request: ' + data.username, {data: data});
66 } 72 }
67 73
68 function onHttpIncomingMessage(request, response) { 74 function onHttpIncomingMessage(request, response) {
69 var qs = url.parse(request.url, true).query; 75 var qs = url.parse(request.url, true).query;
70 logger.info("onHttpIncomingMessage()", {qs: qs}); 76 logger.info("onHttpIncomingMessage()", {qs: qs});
77
78 ym.sendPM(qs.to, qs.msg);
79 response.end('OK');
80 }
81
82 function formatTimestamp(ts) {
83 var _ts = strptime(ts, '%A %b %d %Y %H:%M:%S GMT%z');
84 return strftime('%F %T', _ts);
85 }
86
87 function forwardMessageToEvo(sender, message, ts) {
88 var opts = {
89 url: config.globals.evo_url,
90 qs: {
91 msg: message,
92 msisdn: sender,
93 smsc: config.globals.smsc,
94 ts: ts
95 }
96 };
97
98 logger.info("Forwarding message to evo", {request_opts: opts});
99 request(opts, function(err, response, body) {
100 if (err) {
101 logger.warn('Error forwarding to evo: ' + err);
102 return;
103 }
104 });
71 } 105 }
72 106
73 function createHttpServer() { 107 function createHttpServer() {
74 logger.verbose('createHttpServer()'); 108 logger.verbose('createHttpServer()');
75 109
76 var httpServer = http.createServer(onHttpIncomingMessage); 110 var httpServer = http.createServer(onHttpIncomingMessage);
77 httpServer.listen(config.globals.listen_port, function(){ 111 httpServer.listen(config.globals.listen_port, function(){
78 logger.info("HTTP server listening on " + config.globals.listen_port); 112 logger.info("HTTP server listening on " + config.globals.listen_port);
79 }); 113 });
80 } 114 }
81 115
82 ym.on('ready', onReady); 116 ym.on('ready', onReady);
83 ym.on('loginSuccessful', onLoginSuccessful); 117 ym.on('loginSuccessful', onLoginSuccessful);
84 ym.on('pm', onPm); 118 ym.on('pm', onPm);
85 ym.on('buddyAddRequest', onBuddyAddRequest); 119 ym.on('buddyAddRequest', onBuddyAddRequest);
86 120
1 { 1 {
2 "name": "evo-ym-center", 2 "name": "evo-ym-center",
3 "version": "0.0.1", 3 "version": "0.0.1",
4 "description": "EVO YM Center", 4 "description": "EVO YM Center",
5 "main": "index.js", 5 "main": "index.js",
6 "scripts": { 6 "scripts": {
7 "test": "mocha test" 7 "test": "mocha test"
8 }, 8 },
9 "repository": { 9 "repository": {
10 "type": "git", 10 "type": "git",
11 "url": "http://gitlab.kodesumber.com/adhisimon/evo-ym-center.git" 11 "url": "http://gitlab.kodesumber.com/adhisimon/evo-ym-center.git"
12 }, 12 },
13 "keywords": [ 13 "keywords": [
14 "evo", 14 "evo",
15 "guchi", 15 "guchi",
16 "gentong", 16 "gentong",
17 "yahoo", 17 "yahoo",
18 "ym", 18 "ym",
19 "ppob" 19 "ppob"
20 ], 20 ],
21 "author": "Adhidarma Hadiwinoto <gua@adhisimon.org>", 21 "author": "Adhidarma Hadiwinoto <gua@adhisimon.org>",
22 "license": "BSD", 22 "license": "BSD",
23 "dependencies": { 23 "dependencies": {
24 "ini": "~1.3.4", 24 "ini": "~1.3.4",
25 "yahoomessenger": "~0.1.3-Beta", 25 "yahoomessenger": "~0.1.3-Beta",
26 "url": "~0.11.0", 26 "url": "~0.11.0",
27 "winston": "~1.1.1", 27 "winston": "~1.1.1",
28 "strftime": "~0.9.2", 28 "strftime": "~0.9.2",
29 "micro-strptime": "~0.2.2" 29 "micro-strptime": "~0.2.2",
30 "request": "~2.65.0",
31 "striptags": "~2.0.4"
30 } 32 }
31 } 33 }
32 34