Commit 3d3a86f54fca8342e524ea7391649057d09df306
0 parents
Exists in
master
first commit
Showing 5 changed files with 180 additions and 0 deletions Inline Diff
.gitignore
File was created | 1 | node_modules/ | |
2 | logs/log.* | ||
3 |
README
File was created | 1 | YM Center for ST24 | |
2 |
index.js
File was created | 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); | ||
145 |
logs/empty
package.json
File was created | 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 | } | ||
34 |