From b4980b0ba0a11baebd078bdb5578853e64ed6f18 Mon Sep 17 00:00:00 2001 From: ToastedToast Date: Mon, 23 Jun 2025 18:15:45 +0800 Subject: [PATCH 1/3] feat(latest-uploads): split update function --- src/events/ready.ts | 14 ++- src/utils/youtube/fetchLatestUploads.ts | 134 +++++++++++++++++------- 2 files changed, 104 insertions(+), 44 deletions(-) diff --git a/src/events/ready.ts b/src/events/ready.ts index bebe364..6162395 100644 --- a/src/events/ready.ts +++ b/src/events/ready.ts @@ -2,7 +2,10 @@ import { Events } from "discord.js"; import { CronJob } from "cron"; import client from "../index"; -import fetchLatestUploads from "../utils/youtube/fetchLatestUploads"; +import { + fetchLatestUploads, + sendLatestUploads, +} from "../utils/youtube/fetchLatestUploads"; import { config } from "../config"; // import { checkIfStreamersAreLive } from "../utils/twitch/checkIfStreamerIsLive"; import { cronUpdateBotInfo } from "../utils/cronJobs"; @@ -11,16 +14,17 @@ import { cronUpdateBotInfo } from "../utils/cronJobs"; client.once(Events.ClientReady, async (bot) => { console.log(`Ready! Logged in as ${bot.user?.tag}`); - // Set the bot's presence and update it every minute await cronUpdateBotInfo(); - fetchLatestUploads(); - - // Set the bot's presence and update it every minute new CronJob("0 * * * * *", async () => { await cronUpdateBotInfo(); }).start(); + + fetchLatestUploads(); setInterval(fetchLatestUploads, config.updateIntervalYouTube as number); + sendLatestUploads(); + setInterval(sendLatestUploads, config.updateIntervalYouTube as number); + // One at a time // checkIfStreamersAreLive(); // setInterval(checkIfStreamersAreLive, config.updateIntervalTwitch as number); diff --git a/src/utils/youtube/fetchLatestUploads.ts b/src/utils/youtube/fetchLatestUploads.ts index 090292b..1ccb251 100644 --- a/src/utils/youtube/fetchLatestUploads.ts +++ b/src/utils/youtube/fetchLatestUploads.ts @@ -1,15 +1,23 @@ -import type { dbYouTube } from "../../types/database"; +import type { dbDiscordTable, dbYouTube } from "../../types/database"; -import { ChannelType, TextChannel } from "discord.js"; +import { ChannelType, type TextChannel } from "discord.js"; import { env } from "../../config"; import { getGuildsTrackingChannel, updateVideoId } from "../database"; -import client from "../.."; import { dbYouTubeGetAllChannelsToTrack } from "../db/youtube"; +import client from "../.."; import getChannelDetails from "./getChannelDetails"; -export default async function fetchLatestUploads() { +const updates = new Map< + string, + { + channelInfo: Awaited>; + discordGuildsToUpdate: dbDiscordTable[]; + } +>(); + +export async function fetchLatestUploads() { console.log("Fetching latest uploads..."); const channels: dbYouTube[] | [] = await dbYouTubeGetAllChannelsToTrack(); @@ -99,42 +107,90 @@ export default async function fetchLatestUploads() { const channelInfo = await getChannelDetails(channelId); - console.log("Discord guilds to update:", discordGuildsToUpdate); - for (const guild of discordGuildsToUpdate) { - try { - const channelObj = await client.channels.fetch( - guild.guild_channel_id, - ); - - if ( - !channelObj || - (channelObj.type !== ChannelType.GuildText && - channelObj.type !== - ChannelType.GuildAnnouncement) - ) { - console.error( - "Invalid channel or not a text channel in fetchLatestUploads", - ); - continue; - } - - await (channelObj as TextChannel).send({ - content: - guild.guild_ping_role && channelInfo - ? `<@&${guild.guild_ping_role}> New video uploaded for ${channelInfo?.channelName}! https://www.youtube.com/watch?v=${videoId}` - : guild.guild_ping_role - ? `<@&${guild.guild_ping_role}> New video uploaded! https://www.youtube.com/watch?v=${videoId}` - : channelInfo - ? `New video uploaded for ${channelInfo.channelName}! https://www.youtube.com/watch?v=${videoId}` - : `New video uploaded! https://www.youtube.com/watch?v=${videoId}`, - }); - } catch (error) { - console.error( - "Error fetching or sending message to channel in fetchLatestUploads:", - error, - ); - } + updates.set(videoId, { + channelInfo, + discordGuildsToUpdate, + }); + + // console.log("Discord guilds to update:", discordGuildsToUpdate); + // for (const guild of discordGuildsToUpdate) { + // try { + // const channelObj = await client.channels.fetch( + // guild.guild_channel_id, + // ); + + // if ( + // !channelObj || + // (channelObj.type !== ChannelType.GuildText && + // channelObj.type !== + // ChannelType.GuildAnnouncement) + // ) { + // console.error( + // "Invalid channel or not a text channel in fetchLatestUploads", + // ); + // continue; + // } + + // await (channelObj as TextChannel).send({ + // content: + // guild.guild_ping_role && channelInfo + // ? `<@&${guild.guild_ping_role}> New video uploaded for ${channelInfo?.channelName}! https://www.youtube.com/watch?v=${videoId}` + // : guild.guild_ping_role + // ? `<@&${guild.guild_ping_role}> New video uploaded! https://www.youtube.com/watch?v=${videoId}` + // : channelInfo + // ? `New video uploaded for ${channelInfo.channelName}! https://www.youtube.com/watch?v=${videoId}` + // : `New video uploaded! https://www.youtube.com/watch?v=${videoId}`, + // }); + // } catch (error) { + // console.error( + // "Error fetching or sending message to channel in fetchLatestUploads:", + // error, + // ); + // } + // } + } + } + } +} + +export async function sendLatestUploads() { + for (const [videoId, update] of updates.entries()) { + const channelInfo = update.channelInfo; + const discordGuildsToUpdate = update.discordGuildsToUpdate; + + console.log("Discord guilds to update:", discordGuildsToUpdate); + for (const guild of discordGuildsToUpdate) { + try { + const channelObj = await client.channels.fetch( + guild.guild_channel_id, + ); + + if ( + !channelObj || + (channelObj.type !== ChannelType.GuildText && + channelObj.type !== ChannelType.GuildAnnouncement) + ) { + console.error( + "Invalid channel or not a text channel in fetchLatestUploads", + ); + continue; } + + await (channelObj as TextChannel).send({ + content: + guild.guild_ping_role && channelInfo + ? `<@&${guild.guild_ping_role}> New video uploaded for ${channelInfo?.channelName}! https://www.youtube.com/watch?v=${videoId}` + : guild.guild_ping_role + ? `<@&${guild.guild_ping_role}> New video uploaded! https://www.youtube.com/watch?v=${videoId}` + : channelInfo + ? `New video uploaded for ${channelInfo.channelName}! https://www.youtube.com/watch?v=${videoId}` + : `New video uploaded! https://www.youtube.com/watch?v=${videoId}`, + }); + } catch (error) { + console.error( + "Error fetching or sending message to channel in fetchLatestUploads:", + error, + ); } } } From 8a73bf596965a591de33e892da30fcfc6f0fcab1 Mon Sep 17 00:00:00 2001 From: ToastedToast Date: Mon, 23 Jun 2025 18:18:07 +0800 Subject: [PATCH 2/3] chore: cleanup --- src/events/ready.ts | 6 +-- src/utils/youtube/fetchLatestUploads.ts | 50 +------------------------ src/utils/youtube/sendLatestUploads.ts | 48 ++++++++++++++++++++++++ 3 files changed, 52 insertions(+), 52 deletions(-) create mode 100644 src/utils/youtube/sendLatestUploads.ts diff --git a/src/events/ready.ts b/src/events/ready.ts index 6162395..be0747c 100644 --- a/src/events/ready.ts +++ b/src/events/ready.ts @@ -2,13 +2,11 @@ import { Events } from "discord.js"; import { CronJob } from "cron"; import client from "../index"; -import { - fetchLatestUploads, - sendLatestUploads, -} from "../utils/youtube/fetchLatestUploads"; import { config } from "../config"; // import { checkIfStreamersAreLive } from "../utils/twitch/checkIfStreamerIsLive"; import { cronUpdateBotInfo } from "../utils/cronJobs"; +import sendLatestUploads from "../utils/youtube/sendLatestUploads"; +import fetchLatestUploads from "../utils/youtube/fetchLatestUploads"; // Log into the bot client.once(Events.ClientReady, async (bot) => { diff --git a/src/utils/youtube/fetchLatestUploads.ts b/src/utils/youtube/fetchLatestUploads.ts index 1ccb251..0e3c70d 100644 --- a/src/utils/youtube/fetchLatestUploads.ts +++ b/src/utils/youtube/fetchLatestUploads.ts @@ -1,15 +1,12 @@ import type { dbDiscordTable, dbYouTube } from "../../types/database"; -import { ChannelType, type TextChannel } from "discord.js"; - import { env } from "../../config"; import { getGuildsTrackingChannel, updateVideoId } from "../database"; import { dbYouTubeGetAllChannelsToTrack } from "../db/youtube"; -import client from "../.."; import getChannelDetails from "./getChannelDetails"; -const updates = new Map< +export const updates = new Map< string, { channelInfo: Awaited>; @@ -17,7 +14,7 @@ const updates = new Map< } >(); -export async function fetchLatestUploads() { +export default async function fetchLatestUploads() { console.log("Fetching latest uploads..."); const channels: dbYouTube[] | [] = await dbYouTubeGetAllChannelsToTrack(); @@ -152,46 +149,3 @@ export async function fetchLatestUploads() { } } } - -export async function sendLatestUploads() { - for (const [videoId, update] of updates.entries()) { - const channelInfo = update.channelInfo; - const discordGuildsToUpdate = update.discordGuildsToUpdate; - - console.log("Discord guilds to update:", discordGuildsToUpdate); - for (const guild of discordGuildsToUpdate) { - try { - const channelObj = await client.channels.fetch( - guild.guild_channel_id, - ); - - if ( - !channelObj || - (channelObj.type !== ChannelType.GuildText && - channelObj.type !== ChannelType.GuildAnnouncement) - ) { - console.error( - "Invalid channel or not a text channel in fetchLatestUploads", - ); - continue; - } - - await (channelObj as TextChannel).send({ - content: - guild.guild_ping_role && channelInfo - ? `<@&${guild.guild_ping_role}> New video uploaded for ${channelInfo?.channelName}! https://www.youtube.com/watch?v=${videoId}` - : guild.guild_ping_role - ? `<@&${guild.guild_ping_role}> New video uploaded! https://www.youtube.com/watch?v=${videoId}` - : channelInfo - ? `New video uploaded for ${channelInfo.channelName}! https://www.youtube.com/watch?v=${videoId}` - : `New video uploaded! https://www.youtube.com/watch?v=${videoId}`, - }); - } catch (error) { - console.error( - "Error fetching or sending message to channel in fetchLatestUploads:", - error, - ); - } - } - } -} diff --git a/src/utils/youtube/sendLatestUploads.ts b/src/utils/youtube/sendLatestUploads.ts new file mode 100644 index 0000000..931da1f --- /dev/null +++ b/src/utils/youtube/sendLatestUploads.ts @@ -0,0 +1,48 @@ +import { ChannelType, TextChannel } from "discord.js"; + +import client from "../.."; + +import { updates } from "./fetchLatestUploads"; + +export default async function sendLatestUploads() { + for (const [videoId, update] of updates.entries()) { + const channelInfo = update.channelInfo; + const discordGuildsToUpdate = update.discordGuildsToUpdate; + + console.log("Discord guilds to update:", discordGuildsToUpdate); + for (const guild of discordGuildsToUpdate) { + try { + const channelObj = await client.channels.fetch( + guild.guild_channel_id, + ); + + if ( + !channelObj || + (channelObj.type !== ChannelType.GuildText && + channelObj.type !== ChannelType.GuildAnnouncement) + ) { + console.error( + "Invalid channel or not a text channel in fetchLatestUploads", + ); + continue; + } + + await (channelObj as TextChannel).send({ + content: + guild.guild_ping_role && channelInfo + ? `<@&${guild.guild_ping_role}> New video uploaded for ${channelInfo?.channelName}! https://www.youtube.com/watch?v=${videoId}` + : guild.guild_ping_role + ? `<@&${guild.guild_ping_role}> New video uploaded! https://www.youtube.com/watch?v=${videoId}` + : channelInfo + ? `New video uploaded for ${channelInfo.channelName}! https://www.youtube.com/watch?v=${videoId}` + : `New video uploaded! https://www.youtube.com/watch?v=${videoId}`, + }); + } catch (error) { + console.error( + "Error fetching or sending message to channel in fetchLatestUploads:", + error, + ); + } + } + } +} From 397508e4a94d587e92a8605c7de520a353bc2874 Mon Sep 17 00:00:00 2001 From: Galvin Date: Mon, 23 Jun 2025 11:36:40 +0100 Subject: [PATCH 3/3] Update src/utils/youtube/sendLatestUploads.ts Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> --- src/utils/youtube/sendLatestUploads.ts | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/utils/youtube/sendLatestUploads.ts b/src/utils/youtube/sendLatestUploads.ts index 931da1f..9e7c94f 100644 --- a/src/utils/youtube/sendLatestUploads.ts +++ b/src/utils/youtube/sendLatestUploads.ts @@ -44,5 +44,7 @@ export default async function sendLatestUploads() { ); } } + // Remove the processed entry from the updates map + updates.delete(videoId); } }