index.js 4.39 KB
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 webadmin = require('./webadmin');

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 pingMySelf() {
    if (warming_up) {
        return;
    }

    sendMessage(config.globals.jid.replace(/\/.*/, ''), "PING " + strftime('%F %T', new Date()));
}

function xmppConnect() {
    logger.info('Connecting to XMPP server');

    xmpp.connect({
            jid: config.globals.jid,
            password: config.globals.password,
    });

    // check for incoming subscription requests
    xmpp.getRoster();
}

function onHttpIncomingMessage(request, response) {
    var qs = url.parse(request.url, true).query;
    logger.verbose("onHttpIncomingMessage()", {qs: qs});

    //logger.info('Sending xmpp message from ' + config.globals.jid + ' to ' + qs.to + ': ' + qs.msg);
    sendMessage(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.to, qs.msg);
    });

    httpServer.listen(config.globals.listen_port, function(){
        logger.info("HTTP server listening on " + config.globals.listen_port);
    })
}

function sendMessage(destination, message) {
    if (destination != config.globals.jid.replace(/\/.*/, '')) {
        logger.info('Sending xmpp message', {from: config.globals.jid, to: 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.verbose("Forwarding message to evo", {request_opts: opts});
    request(opts, function(err, response, body) {
        if (err) {
            sendMessage(from, 'Gagal meneruskan pesan ke server. Silahkan diulang beberapa saat lagi: ' + message);
            logger.warn('Error forwarding to evo: ' + err);
            return;
        }
    });
}

xmpp.on('close', function() {
    logger.warn(config.globals.jid + ' disconected from XMPP server');
    setTimeout(xmppConnect, 10 * 1000);
});

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) {
    if (from == config.globals.jid.replace(/\/.*/, '')) {
        return;
    }

    logger.info('Incoming message via XMPP ', {to: config.globals.jid, 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, terminating in 3 secs', {err: err});
    setTimeout(process.exit, 3000, 1);
});

xmpp.on('subscribe', function(from) {
    logger.warn('XMPP subscribe request from ' + from);
    xmpp.acceptSubscription(from);
});

createHttpListener();
webadmin.init({config: config, logger: logger});
xmppConnect();

setInterval(pingMySelf, 60000);