index.js 2.91 KB
var telegram = require('node-telegram-bot-api');
var logger = require('./logger.js').start();
var http = require('http');
var evo = require('./evo-im.js');

var config = require('./config.json');

var chat_ids = {};

var options = {
  webHook: {
    port: config.webhook_port,
    key: __dirname+'/key.pem',
    cert: __dirname+'/crt.pem'
  }
};

var bot = new telegram(config.token, options);
bot.setWebHook(config.webhook_prefix + config.token, __dirname+'/crt.pem');

function sendMessage(destination, message, retry) {
    if (retry === null || retry === undefined) {
        retry = 10;
    }

    var chat_id = getChatId(destination);

    if (!chat_id) {
        logger.warn('Can not find approriate chat id for ' + destination + '. Abort sending message.');
        return;
    }

    logger.info('Sending reply to ' + destination + '(' + chat_id + '): ' + message);

    try {
        bot.sendMessage(chat_id, message);
    }
    catch(e) {
        logger.warn('Exception on sendMessage ' + e, {destination: destination, message: message, retry: retry, error: e});
        if (retry) {
            setTimeout(sendMessage, 10000, destination, message, --retry);
        }
    }
}


evo.start({
    config: config,
    logger: logger,
    sendMessage: sendMessage
});


function deleteChatId(from) {
	delete chat_ids[from];
}

function updateChatId(from, chat_id) {
    chat_ids[from.toLowerCase()] = chat_id;
    logger.verbose('Chat id ' + chat_id + ' ' + from);
}

function getChatId(partner) {
    try {
        return chat_ids[partner.toLowerCase()];
    }
    catch(e) {
        return;
    }

}

bot.getMe().then(function (me) {
  logger.info('Hi my name is %s!', me.username);
});

bot.on('text', function (msg) {
	logger.info('Incoming message (' + msg.chat.id + '): ' + msg.text, {message: msg});

    var from = msg.from.username.toUpperCase() + config.msisdn_suffix;
    updateChatId(from, msg.chat.id);

	var now = Math.floor(new Date().getTime()/1000);
    var age = now - msg.date;

	if (now - msg.date > config.message_max_age){
		var message = "Pesan anda diabaikan, silahkan diulang beberapa saat lagi jika diperlukan: " + msg.text;
		logger.info(message, {msg: msg, age: age, max_age: config.message_max_age});
		//bot.sendMessage(msg.chat.id, message);
        sendMessage(from, message);
		return;
	}

    var greeting_prefix = "Pesan anda telah diterima:";
    if (config.greeting_prefix) {
        greeting_prefix = config.greeting_prefix;
    }

	bot.sendMessage(msg.chat.id, greeting_prefix + ' ' + msg.text);
    setTimeout(
        evo.onMessage,
        300,
        from, msg.text, msg.date * 1000, sendMessage
    );
});

function  dumpChatIds() {
    var i = 0;
    for (var key in chat_ids) {
        logger.verbose('DUMPED CHAT IDS #' + ++i + ' ' + key + ': ' + chat_ids[key])
    }

    logger.verbose('TOTAL ' + i + ' chat ids');
}

if (config.dump_chat_ids_interval) {
    setInterval(dumpChatIds, config.dump_chat_ids_interval * 1000);
}