Commit d52503ab48f7a45f186725bc4f1b867f30b24e39
1 parent
3a60c3b70a
Exists in
master
ready to test
Showing 2 changed files with 39 additions and 3 deletions Inline Diff
index.js
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 |
package.json
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 |