transport-telegram.js 1.92 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;

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

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

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

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;