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();