transport.js 3.58 KB
const MODULE_NAME = 'TRANSPORT';

const MAX_LENGTH = 4096;
const DEFAULT_EXPIRED_MS = 60;

const Telegraf = require('telegraf');
const moment = require('moment');
const truncateLine = require('custom-truncate/lib/line');
const messagingService = require('komodo-center-messaging-client-lib');

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

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

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

async function sendMessageViaTelegram(chatId, msg) {
    const [head, tail] = truncateLine(msg, MAX_LENGTH);

    try {
        await bot.telegram.sendMessage(chatId, head);
    } catch (e) {
        logger.warn(`D16D620A ${MODULE_NAME}: Exception on sending message to telegram API server`, {
            chatId,
            msg,
            errCode: e.code,
            errMessage: e.message,
        });
        return;
    }

    if (tail) {
        sendMessageViaTelegram(chatId, tail);
    }
}

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

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


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', { errCode: err.code, errMessage: err.message });
});

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, from, 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, from, msg,
        },
    );

    addressbook.put(from, ctx.chat.id);

    if (messagingService && messagingService.onIncomingMessage) {
        messagingService.onIncomingMessage({ me, partner: from, msg: msg.trim() });
    }
});

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

    if (!partner || !msg) {
        return;
    }

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

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

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

messagingService.setTransport(exports);

exports.send = send;