diff --git a/index.js b/index.js index e69de29..fbc28e6 100644 --- a/index.js +++ b/index.js @@ -0,0 +1,132 @@ +var request = require('request'); +var http = require('http'); +var url = require('url'); +var fs = require('fs'); +var ini = require('ini'); +var strftime = require('strftime'); +var xmpp = require('simple-xmpp'); +var winston = require('winston'); + +var config = ini.parse(fs.readFileSync(__dirname + '/config.ini', 'utf-8')); + +var warming_up = true; + +var log_level = 'info'; +if (config.globals.log_level) { + log_level = config.globals.log_level; +} + +var logger = new (winston.Logger)({ + transports: [ + new (winston.transports.Console)({ + timestamp: function() { + return strftime('%F %T', new Date()); + }, + level: log_level + }), + new (winston.transports.DailyRotateFile)({ + filename: __dirname + '/logs/log', + timestamp: function() { + return strftime('%F %T', new Date()); + }, + level: log_level + }) + ] +}); + +function onHttpIncomingMessage(request, response) { + var qs = url.parse(request.url, true).query; + logger.info("onHttpIncomingMessage()", {qs: qs}); + + logger.info('Sending message to ' + qs.to + ': ' + qs.msg); + ym.sendPM(qs.to, qs.msg); + response.end('OK'); +} + + +function createHttpListener() { + + var httpServer = http.createServer(function(request,response){ + + var qs = url.parse(request.url, true).query; + logger.verbose('Incoming message from EVO', {qs: qs}); + response.end('OK'); + + sendMessage(qs.PhoneNumber, qs.text); + }); + + httpServer.listen(config.globals.listen_port, function(){ + logger.info("HTTP server listening on " + config.globals.listen_port); + }) +} + +function sendMessage(destination, message) { + logger.info('Sending xmpp message', {destination: destination, message: message}); + xmpp.send(destination, message); +} + +function reportToEvo(from, message) { + var opts = { + url: config.globals.evo_url, + qs: { + msg: message, + msisdn: from, + smsc: config.globals.smsc, + ts: strftime('%F %T'), + } + }; + + logger.info("Forwarding message to evo", {request_opts: opts}); + request(opts, function(err, response, body) { + if (err) { + logger.warn('Error forwarding to evo: ' + err); + return; + } + }); + +} + +xmpp.on('online', function(data) { + logger.info('XMPP online', {data: data}); + logger.info('Connected with JID: ' + data.jid.user); + + setTimeout(function() { + warming_up = false; + logger.info('BOT selesai warming up, pesan-pesan selanjutnya akan diproses'); + }, config.globals.warming_up); +}); + +xmpp.on('chat', function(from, message) { + logger.info('Incoming message via XMPP ', {from: from, message: message}); + + if (warming_up) { + logger.info('BOT masih dalam tahap warming up, abaikan pesan'); + var response_message = 'Pesan diabaikan. Silahkan diulang kembali: ' + message; + sendMessage(from, response_message); + return; + } + + var response_message = 'Pesan anda telah diterima dan akan segera diproses: ' + message; + sendMessage(from, response_message); + + reportToEvo(from, message); +}); + +xmpp.on('error', function(err) { + logger.warn('XMPP error', {err: err}); +}); + +xmpp.on('subscribe', function(from) { + logger.warn('XMPP subscribe request from ' + from); + xmpp.acceptSubscription(from); +}); + +xmpp.connect({ + jid: config.globals.jid, + password: config.globals.password, +}); + +// check for incoming subscription requests +xmpp.getRoster(); + +createHttpListener();