Commit 3d3a86f54fca8342e524ea7391649057d09df306
0 parents
Exists in
master
first commit
Showing 5 changed files with 180 additions and 0 deletions Side-by-side Diff
.gitignore
README
... | ... | @@ -0,0 +1 @@ |
1 | +YM Center for ST24 |
index.js
... | ... | @@ -0,0 +1,144 @@ |
1 | +var http = require('http'); | |
2 | +var url = require('url'); | |
3 | +var winston = require('winston'); | |
4 | +var strftime = require('strftime'); | |
5 | +var strptime = require('micro-strptime').strptime; | |
6 | +var request = require('request'); | |
7 | +var striptags = require('striptags'); | |
8 | +var fs = require('fs'); | |
9 | +var ini = require('ini'); | |
10 | + | |
11 | +var config = ini.parse(fs.readFileSync(__dirname + '/config.ini', 'utf-8')); | |
12 | + | |
13 | +var keepalive_interval = 60 * 1000; | |
14 | +var last_message_hash = ''; | |
15 | +var log_level = 'info'; | |
16 | + | |
17 | +if (config.globals.log_level) { | |
18 | + log_level = config.globals.log_level; | |
19 | +} | |
20 | + | |
21 | +var logger = new (winston.Logger)({ | |
22 | + transports: [ | |
23 | + new (winston.transports.Console)({ | |
24 | + timestamp: function() { | |
25 | + return strftime('%F %T', new Date()); | |
26 | + }, | |
27 | + level: log_level | |
28 | + }), | |
29 | + new (winston.transports.DailyRotateFile)({ | |
30 | + filename: __dirname + '/logs/log', | |
31 | + timestamp: function() { | |
32 | + return strftime('%F %T', new Date()); | |
33 | + }, | |
34 | + level: log_level | |
35 | + }) | |
36 | + ] | |
37 | +}); | |
38 | + | |
39 | + | |
40 | +var ym = require('yahoomessenger'); | |
41 | +ym.newInstance(); | |
42 | + | |
43 | +function onReady(){ | |
44 | + ym.login(config.globals.username, config.globals.password); | |
45 | +} | |
46 | + | |
47 | +function onLoginSuccessful(data) { | |
48 | + logger.info('Login successful as ' + data.firstname + ' ' + data.lastname + ' (' + data.user_id + ')', {data: data}); | |
49 | +} | |
50 | + | |
51 | +function sendIgnoreResponse(destination, message) { | |
52 | + ym.sendPM(destination, "Pesan anda diabaikan, silahkan diulang beberapa saat lagi jika diperlukan: " + message); | |
53 | +} | |
54 | + | |
55 | +function onPm(data) { | |
56 | + logger.info('onPM()', {data: data}); | |
57 | + | |
58 | + var message = striptags(data.message); | |
59 | + | |
60 | + var message_hash = data.sender + ': ' + data.message; | |
61 | + if (message_hash == last_message_hash) { | |
62 | + logger.info('Ignoring duplicate message', {data: data}); | |
63 | + return; | |
64 | + } | |
65 | + last_message_hash = message_hash; | |
66 | + | |
67 | + var greeting_prefix = "Pesan anda telah diterima dan akan segera diproses:"; | |
68 | + if (config.globals.greeting_prefix) { | |
69 | + greeting_prefix = config.globals.greeting_prefix; | |
70 | + } | |
71 | + | |
72 | + ym.sendPM(data.sender, greeting_prefix + ' ' + message); | |
73 | + | |
74 | + forwardMessageToAAA(data.sender, message); | |
75 | +} | |
76 | + | |
77 | +function onOfflinePM(data) { | |
78 | + logger.verbose('onOfflinePM()', {data: data}); | |
79 | + sendIgnoreResponse(data.sender, data.message); | |
80 | +} | |
81 | + | |
82 | +function onBuddyAddRequest(data) { | |
83 | + logger.info('onBuddyAddRequest()', {data: data}); | |
84 | + ym.acceptAddBuddy(data.username); | |
85 | + logger.info('Accept buddy add request: ' + data.username, {data: data}); | |
86 | +} | |
87 | + | |
88 | +function onHttpIncomingMessage(request, response) { | |
89 | + var qs = url.parse(request.url, true).query; | |
90 | + logger.info("onHttpIncomingMessage()", {qs: qs}); | |
91 | + response.end('OK'); | |
92 | + | |
93 | + logger.info('Sending message to ' + qs.PhoneNumber + ': ' + qs.text); | |
94 | + ym.sendPM(qs.to, qs.msg); | |
95 | + | |
96 | +} | |
97 | + | |
98 | +function formatTimestamp(ts) { | |
99 | + var _ts = strptime(ts, '%A %b %d %Y %H:%M:%S GMT%z'); | |
100 | + return strftime('%F %T', _ts); | |
101 | +} | |
102 | + | |
103 | +function forwardMessageToAAA(sender, message) { | |
104 | + var request_opts = { | |
105 | + url: config.globals.aaa, | |
106 | + qs: { | |
107 | + PhoneNumber: sender, | |
108 | + Text: message, | |
109 | + Res_Port: config.globals.listen_port, | |
110 | + SMSCID: config.globals.smscid | |
111 | + } | |
112 | + }; | |
113 | + | |
114 | + request(request_opts, function(err, response, body) { | |
115 | + if (err) { | |
116 | + logger.info('Request error: ' + err); | |
117 | + return; | |
118 | + } | |
119 | + | |
120 | + logger.info('Response: ' + response); | |
121 | + logger.info('Body: ' + body); | |
122 | + | |
123 | + }); | |
124 | +} | |
125 | + | |
126 | +function createHttpServer() { | |
127 | + logger.verbose('createHttpServer()'); | |
128 | + | |
129 | + var httpServer = http.createServer(onHttpIncomingMessage); | |
130 | + httpServer.listen(config.globals.listen_port, function(){ | |
131 | + logger.info("HTTP server listening on " + config.globals.listen_port); | |
132 | + }); | |
133 | +} | |
134 | + | |
135 | +createHttpServer(); | |
136 | +ym.on('ready', onReady); | |
137 | +ym.on('loginSuccessful', onLoginSuccessful); | |
138 | +ym.on('pm', onPm); | |
139 | +ym.on('buddyAddRequest', onBuddyAddRequest); | |
140 | + | |
141 | +setInterval(function() { | |
142 | + logger.info('Sending keepalive packet'); | |
143 | + ym.keepAlive(); | |
144 | +}, keepalive_interval); |
logs/empty
package.json
... | ... | @@ -0,0 +1,33 @@ |
1 | +{ | |
2 | + "name": "evo-ym-center", | |
3 | + "version": "0.0.1", | |
4 | + "description": "EVO YM Center", | |
5 | + "main": "index.js", | |
6 | + "scripts": { | |
7 | + "test": "mocha test" | |
8 | + }, | |
9 | + "repository": { | |
10 | + "type": "git", | |
11 | + "url": "http://gitlab.kodesumber.com/adhisimon/evo-ym-center.git" | |
12 | + }, | |
13 | + "keywords": [ | |
14 | + "evo", | |
15 | + "guchi", | |
16 | + "gentong", | |
17 | + "yahoo", | |
18 | + "ym", | |
19 | + "ppob" | |
20 | + ], | |
21 | + "author": "Adhidarma Hadiwinoto <gua@adhisimon.org>", | |
22 | + "license": "BSD", | |
23 | + "dependencies": { | |
24 | + "ini": "~1.3.4", | |
25 | + "yahoomessenger": "~0.1.3-Beta", | |
26 | + "url": "~0.11.0", | |
27 | + "winston": "~1.1.1", | |
28 | + "strftime": "~0.9.2", | |
29 | + "micro-strptime": "~0.2.2", | |
30 | + "request": "~2.65.0", | |
31 | + "striptags": "~2.0.4" | |
32 | + } | |
33 | +} |