const {extend: createGotClient} = require('got'); const {ChatClient} = require('dank-twitch-irc'); const chalk = require('chalk'); const Config = require('./config.json'); const clients = []; let banChunks = []; let lastIndex = 0; const uuidRegex = /^[0-9A-F]{8}-[0-9A-F]{4}-[4][0-9A-F]{3}-[89AB][0-9A-F]{3}-[0-9A-F]{12}$/i; const pnslClient = createGotClient({ prefixUrl: 'https://bot.tetyys.com/api/v1', throwHttpErrors: false, headers: { 'Authorization': `Bearer ${Config.PNSLToken}`, }, }); const sleep = (ms) => { return new Promise((resolve) => setTimeout(resolve, ms)); }; const createTwitchClient = () => { return new ChatClient({ username: Config.Username, password: `oauth:${Config.Password}`, rateLimits: 'verifiedBot', }); }; const sendPong = () => { for (const [i, client] of Object.entries(clients)) { client.say(Config.Username, `Pong from client ${i}`); } }; const getConnection = () => { return clients[++lastIndex % clients.length]; }; (() => { [...Array(Config.MaxConnections)].map((_, i) => { clients[i] = createTwitchClient(); clients[i].connect(); clients[i].on('ready', async () => { console.log(`${chalk.green('[CONNECTED]')} || Client ${i} Connected to twitch.`); await clients[i].join(Config.Username); }); }); clients[0].on('PRIVMSG', async (msg) => { if (msg.messageText === '=mbping' && msg.senderUserID === Config.AdminID) { sendPong(); } else if (msg.messageText.startsWith('=mbrun') && msg.senderUserID === Config.AdminID) { const listID = msg.messageText.split(' ')[1]; const channel = msg.messageText.split(' ')[2]; if (!uuidRegex.test(listID)) { return clients[1].say(msg.channelName, 'Invalid List ID!'); } const {body, statusCode} = await pnslClient(`BotLists/${listID}`); if (statusCode === 404) { return clients[1].say(msg.channelName, 'List was not found.'); } if (statusCode === 401) { return clients[1].say(msg.channelName, 'Authorization token is invalid'); } if (statusCode !== 200) { return clients[1].say(msg.channelName, 'Unexpected error occurred.'); } const banArr = body.split('\n'); if (banArr.length > Config.MaxChunkSize) { while (banArr.length > 0) { banChunks.push(banArr.splice(0, Config.MaxChunkSize)); } for (const chunk of banChunks) { for (const entry of chunk) { getConnection().privmsg(channel || msg.channelName, entry); } await sleep(Config.DelayPerChunk); } banChunks = []; } else { for (const entry of banArr) { getConnection().privmsg(channel || msg.channelName, entry); } } } }); })();