transport.js 2.96 KB
"use strict";

const DEFAULT_EXPIRED_MS = 60;

const Telegraf = require('telegraf');
const moment = require('moment');
const messagingService = require('komodo-center-messaging-client-lib');

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

const addressbook = require('./addressbook');

const bot = new Telegraf(config.telegram.token);

bot.start((ctx) => ctx.reply('Selamat datang. Silahkan ketik "HELP" untuk bantuan.'));

bot.command('help', (ctx) => {
    sendToMessagingService(
        ctx.from.username + ( config.username_suffix || '@telegram.org' ),
        'help'
    )
})

bot.catch((err) => {
    logger.warn('Error catched', {err: err});
})

bot.on('text', async (ctx) => {
    const me = ctx.botInfo.username;
    const from = ctx.from.username + ( config.username_suffix || '@telegram.org' );
    const msg = ctx.message.text;
    const delaySecs = Math.floor(new Date() / 1000 - ctx.message.date);

    if (!from || !msg) {
        logger.verbose('Ignoring messages with empty from / msg');
        return;
    }

    const isExpired = delaySecs > (config.expired_secs || DEFAULT_EXPIRED_MS);
    if (isExpired) {
        logger.verbose(
            'Ignoring expired messages',
            { transport: 'telegram', ts: moment(ctx.date).format('YYYY-MM-DD HH:mm:ss'), delay_secs: delaySecs, is_expired: isExpired, chat_id: ctx.chat.id, me: me, from: from, msg: msg }
        );
        return;

    }

    logger.info(
        'Incoming message from Telegram transport', 
        { transport: 'telegram', ts: moment(ctx.date).format('YYYY-MM-DD HH:mm:ss'), delay_secs: delaySecs, is_expired: isExpired, chat_id: ctx.chat.id, me: me, from: from, msg: msg }
    );

    addressbook.put(from, ctx.chat.id);
    
    if (messagingService && messagingService.onIncomingMessage) {
        messagingService.onIncomingMessage({
                me: me,
                partner: from,
                msg: msg.trim()
        })
    }
})

async function send(partner, msg) {
    const me =  bot.context.botInfo.username;

    const chatId = await addressbook.get(partner);
    if (!chatId) {
        logger.info('Not sending message because partner does not exist on address book', {transport: 'telegram', me: me, partner: partner, msg: msg });
    }

    logger.info('Sending message via Telegram transport', { transport: 'telegram', me: me, partner: partner, msg: msg });
    bot.telegram.sendMessage(chatId, msg);
}

function sendToMessagingService(partner, msg) {
    if (!msg || (typeof msg === 'string' && !msg.trim())) {
        return;
    }

    if (messagingService && messagingService.onIncomingMessage) {
        messagingService.onIncomingMessage({
                me: bot.context.botInfo.username,
                partner: partner,
                msg: msg.trim()
        })
    }
}

bot.launch().then(() => {
    logger.info(`Connected to Telegram Bot API as "@${ bot.context.botInfo.username }"`);
});

messagingService.setTransport(exports);

exports.send = send;