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

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

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

const isVerbose = !!(config.custom_ping && config.custom_ping.verbose);
logger.verbose(`${MODULE_NAME} CE44F47F: Verbosity initialized`, {
    isVerbose,
});

let bot;

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 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 (isVerbose) {
        logger.verbose(`${MODULE_NAME} F0D18EF4: Responding PING message`, {
            xid, partner, pongMessage,
        });
    }

    sender.send(partner.trim(), pongMessage, null, !isVerbose);
};
exports.sendPong = sendPong;

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

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

    if (bot) {
        const msg = `PING ${xid}`;

        sender.send(config.username, msg, xid, !isVerbose);

        if (
            config.custom_ping
            && config.custom_ping.send_to
            && Array.isArray(config.custom_ping.send_to)
        ) {
            const partnerCount = config.custom_ping.send_to.length;
            for (let i = 0; i < partnerCount; i += 1) {
                const additionalDelay = Math.random() * 1000;

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

                const partner = config.custom_ping.send_to[i];

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

                sender.send(partner, msg, xid, !isVerbose);
            }
        }
    }

    await sleepMs(3 * 1000);
    pingSender();
};

const addBuddiesOnInit = () => {
    if (
        !config.custom_ping || !config.custom_ping.send_to
        || !Array.isArray(config.custom_ping.send_to)
        || !config.custom_ping.send_to.length
    ) {
        return;
    }

    logger.verbose(`${MODULE_NAME} 3BBD9A02: Adding custom ping targets as buddies`, {
        targets: config.custom_ping.send_to,
    });

    config.custom_ping.send_to.forEach((target) => {
        bot.subscribe(target);
    });
};

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

    if (config.custom_ping && config.custom_ping.add_buddies_on_init) {
        addBuddiesOnInit();
    }

    pingSender();
};
exports.setBot = setBot;