const tmi = require('tmi.js'); const axios = require('axios'); let client; function sendMessage(message) { client.say(settings.TWITCH.CHANNEL_NAME, message).catch(console.error); } client = new tmi.Client({ options: { skipUpdatingEmotesets: true, }, identity: { username: settings.TWITCH.USERNAME, password: settings.TWITCH.OAUTH_TOKEN, }, channels: [settings.TWITCH.CHANNEL_NAME], }); client .connect() .then((data) => {}) .catch(console.error); function ping(element) { let value = document.body.querySelector(element); client .ping() .then((data) => { value.classList.add('success'); value.innerText = 'Success!'; }) .catch((e) => { value.classList.add('error'); value.innerText = 'Failed!'; }); } function displayTwitchMessage(logoUrl, username, messageObject, fileteredMessage) { const article = document.createElement('article'); article.className = 'msg-container msg-remote'; article.innerHTML = messageTemplates.twitchTemplate; const userImg = article.querySelector('.icon-container > .user-img'); if (userImg) { userImg.src = logoUrl; } const usernameHtml = article.querySelector('.username'); if (usernameHtml) { usernameHtml.innerText = username; } const postTime = document.createElement('span'); postTime.classList.add('post-time'); if (postTime) { postTime.innerText = getPostTime(); } const msg = article.querySelector('.msg-box'); if (msg) { messageObject.forEach((entry) => { if (entry.text) { msg.innerHTML += entry.text; } else { msg.innerHTML += entry.html; } }); msg.appendChild(postTime); } // Appends the message to the main chat box (shows the message) showChatMessage(article); if (fileteredMessage) { sound.playVoice(fileteredMessage, logoUrl, username, msg); } window.article = article; } function getProfileImage(userid, username, message, fileteredMessage) { // Get user Logo with access token options = { method: 'GET', url: `https://api.twitch.tv/helix/users?id=${userid}`, headers: { 'Client-ID': settings.TWITCH.CLIENT_ID, Authorization: `Bearer ${settings.TWITCH.OAUTH_TOKEN}` }, }; axios .request(options) .then((responseLogoUrl) => { const logoUrl = responseLogoUrl.data.data[0].profile_image_url; displayTwitchMessage(logoUrl, username, message, fileteredMessage); }) .catch((error) => { console.error(error); }); } function parseString(inputString) { const regex = /()|([^<]+)/g; const matches = inputString.match(regex) || []; const result = []; for (let i = 0; i < matches.length; i++) { const match = matches[i].trim(); if (match.startsWith(' { if (self) { return; } const emotes = tags.emotes || {}; const emoteValues = Object.entries(emotes); let fileteredMessage = message; let emoteMessage = message; emoteValues.forEach((entry) => { entry[1].forEach((lol) => { const [start, end] = lol.split('-'); let emote = ``; emoteMessage = emoteMessage.replaceAll(message.slice(parseInt(start), parseInt(end) + 1), emote); fileteredMessage = fileteredMessage.replaceAll(message.slice(parseInt(start), parseInt(end) + 1), ''); }); }); let messageObject = parseString(emoteMessage); getProfileImage(tags['user-id'], tags['display-name'], messageObject, fileteredMessage); }); module.exports = { sendMessage, ping, client };