Commit d45f03c517d0f644fcb00a9923a186903bc86690
1 parent
7458497759
Exists in
master
trim jid
Showing 1 changed file with 2 additions and 2 deletions Inline Diff
index.js
1 | var request = require('request'); | 1 | var request = require('request'); |
2 | var http = require('http'); | 2 | var http = require('http'); |
3 | var url = require('url'); | 3 | var url = require('url'); |
4 | var fs = require('fs'); | 4 | var fs = require('fs'); |
5 | var ini = require('ini'); | 5 | var ini = require('ini'); |
6 | var strftime = require('strftime'); | 6 | var strftime = require('strftime'); |
7 | var xmpp = require('simple-xmpp'); | 7 | var xmpp = require('simple-xmpp'); |
8 | var winston = require('winston'); | 8 | var winston = require('winston'); |
9 | 9 | ||
10 | var config = ini.parse(fs.readFileSync(__dirname + '/config.ini', 'utf-8')); | 10 | var config = ini.parse(fs.readFileSync(__dirname + '/config.ini', 'utf-8')); |
11 | 11 | ||
12 | var warming_up = true; | 12 | var warming_up = true; |
13 | 13 | ||
14 | var log_level = 'info'; | 14 | var log_level = 'info'; |
15 | if (config.globals.log_level) { | 15 | if (config.globals.log_level) { |
16 | log_level = config.globals.log_level; | 16 | log_level = config.globals.log_level; |
17 | }; | 17 | }; |
18 | 18 | ||
19 | var logger = new (winston.Logger)({ | 19 | var logger = new (winston.Logger)({ |
20 | transports: [ | 20 | transports: [ |
21 | new (winston.transports.Console)({ | 21 | new (winston.transports.Console)({ |
22 | timestamp: function() { | 22 | timestamp: function() { |
23 | return strftime('%F %T', new Date()); | 23 | return strftime('%F %T', new Date()); |
24 | }, | 24 | }, |
25 | level: log_level | 25 | level: log_level |
26 | }), | 26 | }), |
27 | new (winston.transports.DailyRotateFile)({ | 27 | new (winston.transports.DailyRotateFile)({ |
28 | filename: __dirname + '/logs/log', | 28 | filename: __dirname + '/logs/log', |
29 | timestamp: function() { | 29 | timestamp: function() { |
30 | return strftime('%F %T', new Date()); | 30 | return strftime('%F %T', new Date()); |
31 | }, | 31 | }, |
32 | level: log_level | 32 | level: log_level |
33 | }) | 33 | }) |
34 | ] | 34 | ] |
35 | }); | 35 | }); |
36 | 36 | ||
37 | function pingMySelf() { | 37 | function pingMySelf() { |
38 | if (warming_up) { | 38 | if (warming_up) { |
39 | return; | 39 | return; |
40 | } | 40 | } |
41 | 41 | ||
42 | sendMessage(config.globals.jid, "PING " + strftime('%F %T', new Date())); | 42 | sendMessage(config.globals.jid, "PING " + strftime('%F %T', new Date())); |
43 | } | 43 | } |
44 | 44 | ||
45 | function xmppConnect() { | 45 | function xmppConnect() { |
46 | logger.info('Connecting to XMPP server'); | 46 | logger.info('Connecting to XMPP server'); |
47 | 47 | ||
48 | xmpp.connect({ | 48 | xmpp.connect({ |
49 | jid: config.globals.jid, | 49 | jid: config.globals.jid, |
50 | password: config.globals.password, | 50 | password: config.globals.password, |
51 | }); | 51 | }); |
52 | 52 | ||
53 | // check for incoming subscription requests | 53 | // check for incoming subscription requests |
54 | xmpp.getRoster(); | 54 | xmpp.getRoster(); |
55 | } | 55 | } |
56 | 56 | ||
57 | function onHttpIncomingMessage(request, response) { | 57 | function onHttpIncomingMessage(request, response) { |
58 | var qs = url.parse(request.url, true).query; | 58 | var qs = url.parse(request.url, true).query; |
59 | logger.verbose("onHttpIncomingMessage()", {qs: qs}); | 59 | logger.verbose("onHttpIncomingMessage()", {qs: qs}); |
60 | 60 | ||
61 | //logger.info('Sending xmpp message from ' + config.globals.jid + ' to ' + qs.to + ': ' + qs.msg); | 61 | //logger.info('Sending xmpp message from ' + config.globals.jid + ' to ' + qs.to + ': ' + qs.msg); |
62 | sendMessage(qs.to, qs.msg); | 62 | sendMessage(qs.to, qs.msg); |
63 | response.end('OK'); | 63 | response.end('OK'); |
64 | } | 64 | } |
65 | 65 | ||
66 | function createHttpListener() { | 66 | function createHttpListener() { |
67 | 67 | ||
68 | var httpServer = http.createServer(function(request,response){ | 68 | var httpServer = http.createServer(function(request,response){ |
69 | 69 | ||
70 | var qs = url.parse(request.url, true).query; | 70 | var qs = url.parse(request.url, true).query; |
71 | logger.verbose('Incoming message from EVO', {qs: qs}); | 71 | logger.verbose('Incoming message from EVO', {qs: qs}); |
72 | response.end('OK'); | 72 | response.end('OK'); |
73 | 73 | ||
74 | sendMessage(qs.to, qs.msg); | 74 | sendMessage(qs.to, qs.msg); |
75 | }); | 75 | }); |
76 | 76 | ||
77 | httpServer.listen(config.globals.listen_port, function(){ | 77 | httpServer.listen(config.globals.listen_port, function(){ |
78 | logger.info("HTTP server listening on " + config.globals.listen_port); | 78 | logger.info("HTTP server listening on " + config.globals.listen_port); |
79 | }) | 79 | }) |
80 | } | 80 | } |
81 | 81 | ||
82 | function sendMessage(destination, message) { | 82 | function sendMessage(destination, message) { |
83 | if (destination != config.globals.jid) { | 83 | if (destination != config.globals.jid.replace(/\/.*/, '')) { |
84 | logger.info('Sending xmpp message', {from: config.globals.jid, to: destination, message: message}); | 84 | logger.info('Sending xmpp message', {from: config.globals.jid, to: destination, message: message}); |
85 | } | 85 | } |
86 | 86 | ||
87 | xmpp.send(destination, message); | 87 | xmpp.send(destination, message); |
88 | } | 88 | } |
89 | 89 | ||
90 | function reportToEvo(from, message) { | 90 | function reportToEvo(from, message) { |
91 | var opts = { | 91 | var opts = { |
92 | url: config.globals.evo_url, | 92 | url: config.globals.evo_url, |
93 | qs: { | 93 | qs: { |
94 | msg: message, | 94 | msg: message, |
95 | msisdn: from, | 95 | msisdn: from, |
96 | smsc: config.globals.smsc, | 96 | smsc: config.globals.smsc, |
97 | ts: strftime('%F %T'), | 97 | ts: strftime('%F %T'), |
98 | } | 98 | } |
99 | }; | 99 | }; |
100 | 100 | ||
101 | logger.verbose("Forwarding message to evo", {request_opts: opts}); | 101 | logger.verbose("Forwarding message to evo", {request_opts: opts}); |
102 | request(opts, function(err, response, body) { | 102 | request(opts, function(err, response, body) { |
103 | if (err) { | 103 | if (err) { |
104 | sendMessage(from, 'Gagal meneruskan pesan ke server. Silahkan diulang beberapa saat lagi: ' + message); | 104 | sendMessage(from, 'Gagal meneruskan pesan ke server. Silahkan diulang beberapa saat lagi: ' + message); |
105 | logger.warn('Error forwarding to evo: ' + err); | 105 | logger.warn('Error forwarding to evo: ' + err); |
106 | return; | 106 | return; |
107 | } | 107 | } |
108 | }); | 108 | }); |
109 | } | 109 | } |
110 | 110 | ||
111 | xmpp.on('close', function() { | 111 | xmpp.on('close', function() { |
112 | logger.warn(config.globals.jid + ' disconected from XMPP server'); | 112 | logger.warn(config.globals.jid + ' disconected from XMPP server'); |
113 | setTimeout(xmppConnect, 10 * 1000); | 113 | setTimeout(xmppConnect, 10 * 1000); |
114 | }); | 114 | }); |
115 | 115 | ||
116 | xmpp.on('online', function(data) { | 116 | xmpp.on('online', function(data) { |
117 | logger.info('XMPP online', {data: data}); | 117 | logger.info('XMPP online', {data: data}); |
118 | logger.info('Connected with JID: ' + data.jid.user); | 118 | logger.info('Connected with JID: ' + data.jid.user); |
119 | 119 | ||
120 | setTimeout(function() { | 120 | setTimeout(function() { |
121 | warming_up = false; | 121 | warming_up = false; |
122 | logger.info('BOT selesai warming up, pesan-pesan selanjutnya akan diproses'); | 122 | logger.info('BOT selesai warming up, pesan-pesan selanjutnya akan diproses'); |
123 | }, config.globals.warming_up); | 123 | }, config.globals.warming_up); |
124 | }); | 124 | }); |
125 | 125 | ||
126 | xmpp.on('chat', function(from, message) { | 126 | xmpp.on('chat', function(from, message) { |
127 | if (from == config.globals.jid) { | 127 | if (from == config.globals.jid.replace(/\/.*/, '')) { |
128 | return; | 128 | return; |
129 | } | 129 | } |
130 | 130 | ||
131 | logger.info('Incoming message via XMPP ', {to: config.globals.jid, from: from, message: message}); | 131 | logger.info('Incoming message via XMPP ', {to: config.globals.jid, from: from, message: message}); |
132 | 132 | ||
133 | if (warming_up) { | 133 | if (warming_up) { |
134 | logger.info('BOT masih dalam tahap warming up, abaikan pesan'); | 134 | logger.info('BOT masih dalam tahap warming up, abaikan pesan'); |
135 | var response_message = 'Pesan diabaikan. Silahkan diulang kembali: ' + message; | 135 | var response_message = 'Pesan diabaikan. Silahkan diulang kembali: ' + message; |
136 | sendMessage(from, response_message); | 136 | sendMessage(from, response_message); |
137 | return; | 137 | return; |
138 | } | 138 | } |
139 | 139 | ||
140 | var response_message = 'Pesan anda telah diterima dan akan segera diproses: ' + message; | 140 | var response_message = 'Pesan anda telah diterima dan akan segera diproses: ' + message; |
141 | sendMessage(from, response_message); | 141 | sendMessage(from, response_message); |
142 | 142 | ||
143 | reportToEvo(from, message); | 143 | reportToEvo(from, message); |
144 | }); | 144 | }); |
145 | 145 | ||
146 | xmpp.on('error', function(err) { | 146 | xmpp.on('error', function(err) { |
147 | logger.warn('XMPP error, terminating in 3 secs', {err: err}); | 147 | logger.warn('XMPP error, terminating in 3 secs', {err: err}); |
148 | setTimeout(process.exit, 3000, 1); | 148 | setTimeout(process.exit, 3000, 1); |
149 | }); | 149 | }); |
150 | 150 | ||
151 | xmpp.on('subscribe', function(from) { | 151 | xmpp.on('subscribe', function(from) { |
152 | logger.warn('XMPP subscribe request from ' + from); | 152 | logger.warn('XMPP subscribe request from ' + from); |
153 | xmpp.acceptSubscription(from); | 153 | xmpp.acceptSubscription(from); |
154 | }); | 154 | }); |
155 | 155 | ||
156 | createHttpListener(); | 156 | createHttpListener(); |
157 | xmppConnect(); | 157 | xmppConnect(); |
158 | 158 | ||
159 | setInterval(pingMySelf, 60000); | 159 | setInterval(pingMySelf, 60000); |
160 | 160 |