Commit 6222f4f937b2cad7b014602737871f1735a6fd3e

Authored by Adhidarma Hadiwinoto
1 parent c8ddf66255
Exists in master

terminate on error

Showing 1 changed file with 12 additions and 13 deletions Inline Diff

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 37
38 function xmppConnect() { 38 function xmppConnect() {
39 logger.info('Connecting to XMPP server'); 39 logger.info('Connecting to XMPP server');
40 40
41 xmpp.connect({ 41 xmpp.connect({
42 jid: config.globals.jid, 42 jid: config.globals.jid,
43 password: config.globals.password, 43 password: config.globals.password,
44 }); 44 });
45 45
46 // check for incoming subscription requests 46 // check for incoming subscription requests
47 xmpp.getRoster(); 47 xmpp.getRoster();
48 } 48 }
49 49
50 function onHttpIncomingMessage(request, response) { 50 function onHttpIncomingMessage(request, response) {
51 var qs = url.parse(request.url, true).query; 51 var qs = url.parse(request.url, true).query;
52 logger.verbose("onHttpIncomingMessage()", {qs: qs}); 52 logger.verbose("onHttpIncomingMessage()", {qs: qs});
53 53
54 //logger.info('Sending xmpp message from ' + config.globals.jid + ' to ' + qs.to + ': ' + qs.msg); 54 //logger.info('Sending xmpp message from ' + config.globals.jid + ' to ' + qs.to + ': ' + qs.msg);
55 sendMessage(qs.to, qs.msg); 55 sendMessage(qs.to, qs.msg);
56 response.end('OK'); 56 response.end('OK');
57 } 57 }
58 58
59
60 function createHttpListener() { 59 function createHttpListener() {
61 60
62 var httpServer = http.createServer(function(request,response){ 61 var httpServer = http.createServer(function(request,response){
63 62
64 var qs = url.parse(request.url, true).query; 63 var qs = url.parse(request.url, true).query;
65 logger.verbose('Incoming message from EVO', {qs: qs}); 64 logger.verbose('Incoming message from EVO', {qs: qs});
66 response.end('OK'); 65 response.end('OK');
67 66
68 sendMessage(qs.to, qs.msg); 67 sendMessage(qs.to, qs.msg);
69 }); 68 });
70 69
71 httpServer.listen(config.globals.listen_port, function(){ 70 httpServer.listen(config.globals.listen_port, function(){
72 logger.info("HTTP server listening on " + config.globals.listen_port); 71 logger.info("HTTP server listening on " + config.globals.listen_port);
73 }) 72 })
74 } 73 }
75 74
76 function sendMessage(destination, message) { 75 function sendMessage(destination, message) {
77 logger.info('Sending xmpp message', {from: config.globals.jid, to: destination, message: message}); 76 logger.info('Sending xmpp message', {from: config.globals.jid, to: destination, message: message});
78 xmpp.send(destination, message); 77 xmpp.send(destination, message);
79 } 78 }
80 79
81 function reportToEvo(from, message) { 80 function reportToEvo(from, message) {
82 var opts = { 81 var opts = {
83 url: config.globals.evo_url, 82 url: config.globals.evo_url,
84 qs: { 83 qs: {
85 msg: message, 84 msg: message,
86 msisdn: from, 85 msisdn: from,
87 smsc: config.globals.smsc, 86 smsc: config.globals.smsc,
88 ts: strftime('%F %T'), 87 ts: strftime('%F %T'),
89 } 88 }
90 }; 89 };
91 90
92 logger.verbose("Forwarding message to evo", {request_opts: opts}); 91 logger.verbose("Forwarding message to evo", {request_opts: opts});
93 request(opts, function(err, response, body) { 92 request(opts, function(err, response, body) {
94 if (err) { 93 if (err) {
95 sendMessage(from, 'Gagal meneruskan pesan ke server. Silahkan diulang beberapa saat lagi: ' + message); 94 sendMessage(from, 'Gagal meneruskan pesan ke server. Silahkan diulang beberapa saat lagi: ' + message);
96 logger.warn('Error forwarding to evo: ' + err); 95 logger.warn('Error forwarding to evo: ' + err);
97 return; 96 return;
98 } 97 }
99 }); 98 });
100
101 } 99 }
102 100
103 xmpp.on('close', function() { 101 xmpp.on('close', function() {
104 logger.warn(config.globals.jid + ' disconected from XMPP server'); 102 logger.warn(config.globals.jid + ' disconected from XMPP server');
105 setTimeout(xmppConnect, 10 * 1000); 103 setTimeout(xmppConnect, 10 * 1000);
106 }); 104 });
107 105
108 xmpp.on('online', function(data) { 106 xmpp.on('online', function(data) {
109 logger.info('XMPP online', {data: data}); 107 logger.info('XMPP online', {data: data});
110 logger.info('Connected with JID: ' + data.jid.user); 108 logger.info('Connected with JID: ' + data.jid.user);
111 109
112 setTimeout(function() { 110 setTimeout(function() {
113 warming_up = false; 111 warming_up = false;
114 logger.info('BOT selesai warming up, pesan-pesan selanjutnya akan diproses'); 112 logger.info('BOT selesai warming up, pesan-pesan selanjutnya akan diproses');
115 }, config.globals.warming_up); 113 }, config.globals.warming_up);
116 }); 114 });
117 115
118 xmpp.on('chat', function(from, message) { 116 xmpp.on('chat', function(from, message) {
119 logger.info('Incoming message via XMPP ', {to: config.globals.jid, from: from, message: message}); 117 logger.info('Incoming message via XMPP ', {to: config.globals.jid, from: from, message: message});
120 118
121 if (warming_up) { 119 if (warming_up) {
122 logger.info('BOT masih dalam tahap warming up, abaikan pesan'); 120 logger.info('BOT masih dalam tahap warming up, abaikan pesan');
123 var response_message = 'Pesan diabaikan. Silahkan diulang kembali: ' + message; 121 var response_message = 'Pesan diabaikan. Silahkan diulang kembali: ' + message;
124 sendMessage(from, response_message); 122 sendMessage(from, response_message);
125 return; 123 return;
126 } 124 }
127 125
128 var response_message = 'Pesan anda telah diterima dan akan segera diproses: ' + message; 126 var response_message = 'Pesan anda telah diterima dan akan segera diproses: ' + message;
129 sendMessage(from, response_message); 127 sendMessage(from, response_message);
130 128
131 reportToEvo(from, message); 129 reportToEvo(from, message);
132 }); 130 });
133 131
134 xmpp.on('error', function(err) { 132 xmpp.on('error', function(err) {
135 logger.warn('XMPP error', {err: err}); 133 logger.warn('XMPP error, terminating in 3 secs', {err: err});
134 setTimeout(process.exit, 3000, 1);
136 }); 135 });
137 136
138 xmpp.on('subscribe', function(from) { 137 xmpp.on('subscribe', function(from) {
139 logger.warn('XMPP subscribe request from ' + from); 138 logger.warn('XMPP subscribe request from ' + from);
140 xmpp.acceptSubscription(from); 139 xmpp.acceptSubscription(from);
141 }); 140 });
142 141
143 createHttpListener(); 142 createHttpListener();
144 xmppConnect(); 143 xmppConnect();