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 setBot = (botFromCaller) => { logger.verbose(`${MODULE_NAME} A063F39F: Bot registered for custom ping`); bot = botFromCaller; pingSender(); }; exports.setBot = setBot;