Commit 1e27dae2adeea79c7fb813df4d2383f0307d8b0f
1 parent
0533906628
Exists in
master
perbaikan balikan dari smsin
Showing 1 changed file with 1 additions and 1 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'); | 6 | var request = require('request'); |
7 | var striptags = require('striptags'); | 7 | var striptags = require('striptags'); |
8 | var fs = require('fs'); | 8 | var fs = require('fs'); |
9 | var ini = require('ini'); | 9 | var ini = require('ini'); |
10 | 10 | ||
11 | var config = ini.parse(fs.readFileSync(__dirname + '/config.ini', 'utf-8')); | 11 | var config = ini.parse(fs.readFileSync(__dirname + '/config.ini', 'utf-8')); |
12 | 12 | ||
13 | var keepalive_interval = 60 * 1000; | 13 | var keepalive_interval = 60 * 1000; |
14 | var last_message_hash = ''; | 14 | var last_message_hash = ''; |
15 | var log_level = 'info'; | 15 | var log_level = 'info'; |
16 | 16 | ||
17 | if (config.globals.log_level) { | 17 | if (config.globals.log_level) { |
18 | log_level = config.globals.log_level; | 18 | log_level = config.globals.log_level; |
19 | } | 19 | } |
20 | 20 | ||
21 | var logger = new (winston.Logger)({ | 21 | var logger = new (winston.Logger)({ |
22 | transports: [ | 22 | transports: [ |
23 | new (winston.transports.Console)({ | 23 | new (winston.transports.Console)({ |
24 | timestamp: function() { | 24 | timestamp: function() { |
25 | return strftime('%F %T', new Date()); | 25 | return strftime('%F %T', new Date()); |
26 | }, | 26 | }, |
27 | level: log_level | 27 | level: log_level |
28 | }), | 28 | }), |
29 | new (winston.transports.DailyRotateFile)({ | 29 | new (winston.transports.DailyRotateFile)({ |
30 | filename: __dirname + '/logs/log', | 30 | filename: __dirname + '/logs/log', |
31 | timestamp: function() { | 31 | timestamp: function() { |
32 | return strftime('%F %T', new Date()); | 32 | return strftime('%F %T', new Date()); |
33 | }, | 33 | }, |
34 | level: log_level | 34 | level: log_level |
35 | }) | 35 | }) |
36 | ] | 36 | ] |
37 | }); | 37 | }); |
38 | 38 | ||
39 | 39 | ||
40 | var ym = require('yahoomessenger'); | 40 | var ym = require('yahoomessenger'); |
41 | ym.newInstance(); | 41 | ym.newInstance(); |
42 | 42 | ||
43 | function onReady(){ | 43 | function onReady(){ |
44 | ym.login(config.globals.username, config.globals.password); | 44 | ym.login(config.globals.username, config.globals.password); |
45 | } | 45 | } |
46 | 46 | ||
47 | function onLoginSuccessful(data) { | 47 | function onLoginSuccessful(data) { |
48 | logger.info('Login successful as ' + data.firstname + ' ' + data.lastname + ' (' + data.user_id + ')', {data: data}); | 48 | logger.info('Login successful as ' + data.firstname + ' ' + data.lastname + ' (' + data.user_id + ')', {data: data}); |
49 | } | 49 | } |
50 | 50 | ||
51 | function onLoginError(data) { | 51 | function onLoginError(data) { |
52 | logger.warn('Login error', {data: data}); | 52 | logger.warn('Login error', {data: data}); |
53 | } | 53 | } |
54 | 54 | ||
55 | 55 | ||
56 | function sendIgnoreResponse(destination, message) { | 56 | function sendIgnoreResponse(destination, message) { |
57 | ym.sendPM(destination, "Pesan anda diabaikan, silahkan diulang beberapa saat lagi jika diperlukan: " + message); | 57 | ym.sendPM(destination, "Pesan anda diabaikan, silahkan diulang beberapa saat lagi jika diperlukan: " + message); |
58 | } | 58 | } |
59 | 59 | ||
60 | function onPm(data) { | 60 | function onPm(data) { |
61 | logger.info('onPM()', {data: data}); | 61 | logger.info('onPM()', {data: data}); |
62 | 62 | ||
63 | var message = striptags(data.message); | 63 | var message = striptags(data.message); |
64 | 64 | ||
65 | var message_hash = data.sender + ': ' + data.message; | 65 | var message_hash = data.sender + ': ' + data.message; |
66 | if (message_hash == last_message_hash) { | 66 | if (message_hash == last_message_hash) { |
67 | logger.info('Ignoring duplicate message', {data: data}); | 67 | logger.info('Ignoring duplicate message', {data: data}); |
68 | return; | 68 | return; |
69 | } | 69 | } |
70 | last_message_hash = message_hash; | 70 | last_message_hash = message_hash; |
71 | 71 | ||
72 | var greeting_prefix = "Pesan anda telah diterima dan akan segera diproses:"; | 72 | var greeting_prefix = "Pesan anda telah diterima dan akan segera diproses:"; |
73 | if (config.globals.greeting_prefix) { | 73 | if (config.globals.greeting_prefix) { |
74 | greeting_prefix = config.globals.greeting_prefix; | 74 | greeting_prefix = config.globals.greeting_prefix; |
75 | } | 75 | } |
76 | 76 | ||
77 | ym.sendPM(data.sender, greeting_prefix + ' ' + message); | 77 | ym.sendPM(data.sender, greeting_prefix + ' ' + message); |
78 | 78 | ||
79 | forwardMessageToAAA(data.sender, message); | 79 | forwardMessageToAAA(data.sender, message); |
80 | } | 80 | } |
81 | 81 | ||
82 | function onOfflinePM(data) { | 82 | function onOfflinePM(data) { |
83 | logger.verbose('onOfflinePM()', {data: data}); | 83 | logger.verbose('onOfflinePM()', {data: data}); |
84 | sendIgnoreResponse(data.sender, data.message); | 84 | sendIgnoreResponse(data.sender, data.message); |
85 | } | 85 | } |
86 | 86 | ||
87 | function onBuddyAddRequest(data) { | 87 | function onBuddyAddRequest(data) { |
88 | logger.info('onBuddyAddRequest()', {data: data}); | 88 | logger.info('onBuddyAddRequest()', {data: data}); |
89 | ym.acceptAddBuddy(data.username); | 89 | ym.acceptAddBuddy(data.username); |
90 | logger.info('Accept buddy add request: ' + data.username, {data: data}); | 90 | logger.info('Accept buddy add request: ' + data.username, {data: data}); |
91 | } | 91 | } |
92 | 92 | ||
93 | function onHttpIncomingMessage(request, response) { | 93 | function onHttpIncomingMessage(request, response) { |
94 | var qs = url.parse(request.url, true).query; | 94 | var qs = url.parse(request.url, true).query; |
95 | logger.info("onHttpIncomingMessage()", {qs: qs}); | 95 | logger.info("onHttpIncomingMessage()", {qs: qs}); |
96 | response.end('OK'); | 96 | response.end('OK'); |
97 | 97 | ||
98 | logger.info('Sending message to ' + qs.PhoneNumber + ': ' + qs.text); | 98 | logger.info('Sending message to ' + qs.PhoneNumber + ': ' + qs.text); |
99 | ym.sendPM(qs.to, qs.msg); | 99 | ym.sendPM(qs.PhoneNumber, qs.text); |
100 | 100 | ||
101 | } | 101 | } |
102 | 102 | ||
103 | function formatTimestamp(ts) { | 103 | function formatTimestamp(ts) { |
104 | var _ts = strptime(ts, '%A %b %d %Y %H:%M:%S GMT%z'); | 104 | var _ts = strptime(ts, '%A %b %d %Y %H:%M:%S GMT%z'); |
105 | return strftime('%F %T', _ts); | 105 | return strftime('%F %T', _ts); |
106 | } | 106 | } |
107 | 107 | ||
108 | function forwardMessageToAAA(sender, message) { | 108 | function forwardMessageToAAA(sender, message) { |
109 | var request_opts = { | 109 | var request_opts = { |
110 | url: config.globals.aaa, | 110 | url: config.globals.aaa, |
111 | qs: { | 111 | qs: { |
112 | PhoneNumber: sender, | 112 | PhoneNumber: sender, |
113 | Text: message, | 113 | Text: message, |
114 | Res_Port: config.globals.listen_port, | 114 | Res_Port: config.globals.listen_port, |
115 | SMSCID: config.globals.smscid | 115 | SMSCID: config.globals.smscid |
116 | } | 116 | } |
117 | }; | 117 | }; |
118 | logger.verbose('Forward message to AAA', {request_opts: request_opts}); | 118 | logger.verbose('Forward message to AAA', {request_opts: request_opts}); |
119 | 119 | ||
120 | request(request_opts, function(err, response, body) { | 120 | request(request_opts, function(err, response, body) { |
121 | if (err) { | 121 | if (err) { |
122 | logger.info('Request error: ' + err); | 122 | logger.info('Request error: ' + err); |
123 | return; | 123 | return; |
124 | } | 124 | } |
125 | 125 | ||
126 | logger.info('Response: ' + response); | 126 | logger.info('Response: ' + response); |
127 | logger.info('Body: ' + body); | 127 | logger.info('Body: ' + body); |
128 | 128 | ||
129 | }); | 129 | }); |
130 | } | 130 | } |
131 | 131 | ||
132 | function createHttpServer() { | 132 | function createHttpServer() { |
133 | logger.verbose('createHttpServer()'); | 133 | logger.verbose('createHttpServer()'); |
134 | 134 | ||
135 | var httpServer = http.createServer(onHttpIncomingMessage); | 135 | var httpServer = http.createServer(onHttpIncomingMessage); |
136 | httpServer.listen(config.globals.listen_port, function(){ | 136 | httpServer.listen(config.globals.listen_port, function(){ |
137 | logger.info("HTTP server listening on " + config.globals.listen_port); | 137 | logger.info("HTTP server listening on " + config.globals.listen_port); |
138 | }); | 138 | }); |
139 | } | 139 | } |
140 | 140 | ||
141 | createHttpServer(); | 141 | createHttpServer(); |
142 | ym.on('ready', onReady); | 142 | ym.on('ready', onReady); |
143 | ym.on('loginSuccessful', onLoginSuccessful); | 143 | ym.on('loginSuccessful', onLoginSuccessful); |
144 | ym.on('loginError', onLoginError); | 144 | ym.on('loginError', onLoginError); |
145 | ym.on('pm', onPm); | 145 | ym.on('pm', onPm); |
146 | ym.on('buddyAddRequest', onBuddyAddRequest); | 146 | ym.on('buddyAddRequest', onBuddyAddRequest); |
147 | 147 | ||
148 | setInterval(function() { | 148 | setInterval(function() { |
149 | logger.info('Sending keepalive packet'); | 149 | logger.info('Sending keepalive packet'); |
150 | ym.keepAlive(); | 150 | ym.keepAlive(); |
151 | }, keepalive_interval); | 151 | }, keepalive_interval); |
152 | 152 |