custom-ping.js 3.33 KB
const MODULE_NAME = 'CUSTOM-PING';

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

let bot;
const mutex = locks.createMutex();

const allowedFromPartnerList = (
    (config.custom_ping && config.custom_ping.allowed_from_partners) || []
)
    .filter((item) => typeof item === 'string')
    .map((item) => (item || '').trim().toUpperCase())
    .filter((item) => item);

const setBot = (botFromCaller) => {
    logger.verbose(`${MODULE_NAME} A063F39F: Bot registered for custom ping`);
    bot = botFromCaller;
};
exports.setBot = setBot;

const isPingMessage = (msg) => {
    if (!msg) return false;
    if (typeof msg !== 'string') return false;

    return ((msg || '').trim().toUpperCase().search(/^PING($| )/) === 0);
};
exports.isPingMessage = isPingMessage;

const isPongMessage = (msg) => {
    if (!msg) return false;
    if (typeof msg !== 'string') return false;

    return ((msg || '').trim().toUpperCase().search(/^PONG($| )/) === 0);
};
exports.isPongMessage = isPongMessage;

const isAllowedPartner = (partner) => {
    if (!config.custom_ping) return false;
    if (config.custom_ping.disable_pong) return false;

    if (config.custom_ping.allowed_from_all) return true;
    return allowedFromPartnerList.indexOf((partner || '').trim().toUpperCase()) >= 0;
};
exports.isAllowedPartner = isAllowedPartner;

const sendPong = (xid, partner, pingMessage) => {
    if (!bot) return;
    if (!partner || typeof partner !== 'string' || !partner.trim()) return;

    const tokens = pingMessage.trim().split(/ +/);

    const pongMessage = [
        'PONG',
        (tokens && tokens[1]) || null,
    ].filter((item) => item)
        .join(' ');

    if (config.custom_ping && config.custom_ping.verbose) {
        logger.verbose(`${MODULE_NAME} F0D18EF4: Responding PING message`, {
            xid, partner, pongMessage,
        });
    }

    bot.send(partner.trim(), pongMessage);
};
exports.sendPong = sendPong;

const sleepMs = (ms) => new Promise((resolve) => {
    setTimeout(() => {
        resolve(true);
    }, ms);
});

const pingSender = async () => {
    const xid = uniqid();

    if (
        !bot
        || !config.custom_ping
        || !config.custom_ping.send_to
        || !Array.isArray(config.custom_ping.send_to)
        || !config.custom_ping.send_to.length
    ) return;

    if (mutex.tryLock()) {
        const msg = `PING ${xid}`;

        const partnerCount = config.custom_ping.send_to.length;
        for (let i = 0; i < partnerCount; i += 1) {
            const partner = config.custom_ping.send_to[i];

            if (config.custom_ping.verbose) {
                logger.verbose(`${MODULE_NAME} 21358F45: Sending custom ping`, {
                    xid,
                    partner,
                    msg,
                });
            }

            bot.send(partner, msg);

            // eslint-disable-next-line no-await-in-loop
            await sleepMs(1000);
        }

        mutex.unlock();
    }
};

if (config.custom_ping && config.custom_ping.send_to) {
    const intervalMs = config.custom_ping.interval_ms || (25 * 1000);
    logger.verbose(`${MODULE_NAME} 324034EE: Registering ping sender`, {
        intervalMs,
        partners: config.custom_ping.send_to,
    });

    setInterval(() => {
        pingSender();
    }, intervalMs);
}