From 50afd85201ccc3ad645728e4dc57f378a91bb18f Mon Sep 17 00:00:00 2001 From: DeSqBlocki Date: Sun, 9 Feb 2025 14:37:09 +0100 Subject: [PATCH] Added Twitch Live Notification on all registered guilds --- events/Twitch/Live.js | 79 +++++++++++++++++++++++++++++++++++++++++++ functions.js | 6 +++- 2 files changed, 84 insertions(+), 1 deletion(-) create mode 100644 events/Twitch/Live.js diff --git a/events/Twitch/Live.js b/events/Twitch/Live.js new file mode 100644 index 0000000..46f41c5 --- /dev/null +++ b/events/Twitch/Live.js @@ -0,0 +1,79 @@ +const { EmbedBuilder, escapeMarkdown, MessageFlags } = require("discord.js") +const { mClient, dClient } = require("../..") +const { getStreams } = require('../../functions') + +module.exports = { + name: 'Twitch/Live', + once: false, + async execute(streamer) { + const db = mClient.db('guilds') + const res = await db.listCollections().toArray() + + res.forEach(async (guildColl) => { + const guildId = guildColl.name + const coll = db.collection(guildId) + const res = await coll.findOne({ event: 'Twitch/Live' }) + if(!res){ + console.log('No Live Nofitication Channel') + } + const guild = dClient.guilds.cache.get(guildId) + const channel = guild.channels.cache.get(res.channel) + + try { + const streamData = await getStreams(streamer) + + if (streamData?.data[0]) { + let liveData = { + streamer: streamData.data[0].user_name, + game: streamData.data[0].game_name, + title: streamData.data[0].title, + thumbnail: streamData.data[0].thumbnail_url.replace('-{width}x{height}', ''), + tags: streamData.data[0].tags + } + + const embed = new EmbedBuilder() + .setTitle(`${escapeMarkdown(liveData.streamer)} is live!`) + .setDescription(`They're playing ${liveData.game}`) + .addFields( + { name: '\u200B', value: `${liveData.title}` }) + .setImage(liveData.thumbnail) + .setURL(`https://twitch.tv/${streamer}`) + let footer = "" + liveData.tags.forEach((tag) => { + footer += `#${tag} ` + }) + embed.setFooter({ + text: footer + }) + + return channel.send({ + embeds: [embed], + flags: MessageFlags.Ephemeral + }).then(message => setTimeout(() => { + message.deleteReply() + }, 60000)) + } else { + const embed = new EmbedBuilder() + .setTitle(`${escapeMarkdown(streamer)} is currently offline!`) + .setImage('https://media.discordapp.net/attachments/1061304429724319794/1319800268770250883/no-signal-tv-descendant-network-rainbow-bars-abstract-background-vector.jpg?ex=67674748&is=6765f5c8&hm=d539944a67fccec461b0183a9f0300e19ac485deda7b23090165088567f2c84f&=&format=webp') + .setURL(`https://twitch.tv/${streamer}`) + return channel.send({ + embeds: [embed], + flags: MessageFlags.Ephemeral + }).then(message => setTimeout(() => { + message.deleteReply() + }, 60000)) + } + } catch (error) { + console.error(error) + return channel.send({ + content: `**[ERROR]:** Could not get stream info for *${escapeMarkdown(channelName)}*!\r\n${error}`, + ephemeral: true + }).then(message => setTimeout(() => { + message.deleteReply() + }, 60000)) + } + }) + + } +} \ No newline at end of file diff --git a/functions.js b/functions.js index caf8924..970f97d 100644 --- a/functions.js +++ b/functions.js @@ -161,4 +161,8 @@ async function getChannelInformation(streamer) { return await makeHelixRequest('GET', 'channels', { broadcaster_id }); } -module.exports = { getChannelInformation, updateChatMode, getIDByName, makeHelixRequest, delay, refreshAccessToken } \ No newline at end of file +async function getStreams(user_login){ + return await makeHelixRequest('GET', 'streams', { user_login }); +} + +module.exports = { getChannelInformation, updateChatMode, getIDByName, makeHelixRequest, delay, refreshAccessToken, getStreams } \ No newline at end of file