transport-telegram.js 2.17 KB
"use strict";

const TelegramBot = require('node-telegram-bot-api');
const LRU = require('lru-cache');

const config = require('komodo-sdk/config');
const logger = require('komodo-sdk/logger');

let bot;
let _callback;

let isReady = false;

const chats = LRU({
    max: config.max_chats || 200,
    maxAge: 1000 * 3600
});

function onMessage(msg) {
    //console.log(msg);

    if (!isReady) {
        logger.info('Pesan diabaikan karena center belum siap (masih melakukan pemanasan)');
        return;
    }

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

	if (now - msg.date > (config.message_max_age || 120 * 1000)){
		logger.info('Pesan diabaikan');
		return;
	}

    const partner = ( msg.from.username + ( config.transport.username_suffix || '@telegram.org') ).toLowerCase();
    const incomingMessage = msg.text.trim();

    chats.set(partner, msg.chat.id);
    logger.info('Incoming message', {partner: partner, msg: incomingMessage, msgObj: msg, chat_id: chats.get(partner)});

    if (_callback && _callback.onIncomingMessage) {
        _callback.onIncomingMessage({
            me: "TELEGRAM",
            partner: partner,
            msg: incomingMessage
        })
    }
}

function init(cb) {
    if (!cb) {
        logger.warn('Callback is not defined');
        console.trace();
        process.exit(1);
        return;
    }

    _callback = cb;
    bot = new TelegramBot(config.transport.token, {polling: true});

    bot.on('message', onMessage);

    setTimeout(
        function() {
            isReady = true;
        },
        60 * 1000
    );
}

function send(partner, msg) {
    if (!partner) {
        logger.warn('Invalid partner');
        return;
    }

    if (!msg || (typeof msg !== 'string')) {
        logger.warn('Invalid message', {msg: msg});
        return;
    }

    const chat_id = chats.get(partner.toLowerCase());
    if (!chat_id) {
        logger.warn('Unknown chat id for partner:' + partner.toLowerCase());
        return;
    }

    logger.verbose('Sending message via transport', {transport: 'telegram', chat_id: chat_id, partner: partner, msg: msg});

    bot.sendMessage(chat_id, msg);
}

exports.init = init;
exports.send = send;