diff --git a/src/core/cache.ts b/src/core/cache.ts index b26c97a..37915a8 100644 --- a/src/core/cache.ts +++ b/src/core/cache.ts @@ -22,7 +22,7 @@ interface Cache> { interface CacheEntries { lobbyIds: string[]; - channels: string[]; + onDemandChannels: string[]; quoiFeurChannels: string[]; recurringMessages: { id: string; channelId: string; frequency: Frequency; message: string }[]; } diff --git a/src/modules/voiceOnDemand/voiceOnDemand.helpers.ts b/src/modules/voiceOnDemand/voiceOnDemand.helpers.ts index ad0a7ef..d3225b2 100644 --- a/src/modules/voiceOnDemand/voiceOnDemand.helpers.ts +++ b/src/modules/voiceOnDemand/voiceOnDemand.helpers.ts @@ -15,16 +15,16 @@ type CheckedVoiceState = SetNonNullable newState.channel !== null && newState.channelId !== null && newState.member !== null; -export const isLeaveState = (oldDate: VoiceState): oldDate is CheckedVoiceState => - oldDate.channel !== null && oldDate.channelId !== null && oldDate.member !== null; +export const isLeaveState = (oldState: VoiceState): oldState is CheckedVoiceState => + oldState.channel !== null && oldState.channelId !== null && oldState.member !== null; -export const handleJoin = async (state: CheckedVoiceState): Promise => { +export const handleJoinLobby = async (state: CheckedVoiceState): Promise => { const channel = await createUserVoiceChannel(state.channel.parent, state.member); await state.member.voice.setChannel(channel); }; -export const handleLeave = async (state: CheckedVoiceState): Promise => { - const channels = await cache.get('channels', []); +export const handleLeaveOnDemand = async (state: CheckedVoiceState): Promise => { + const channels = await cache.get('onDemandChannels', []); const { channel } = state; const { id, members, guild } = channel; @@ -34,7 +34,7 @@ export const handleLeave = async (state: CheckedVoiceState): Promise => { guild.channels.cache.delete(id); const filtered = channels.filter((channelId) => channelId !== id); - await cache.set('channels', filtered); + await cache.set('onDemandChannels', filtered); } }; @@ -56,9 +56,9 @@ export const createUserVoiceChannel = async ( const channel = await guild.channels.create(parent === null ? options : { ...options, parent }); - const channels = await cache.get('channels', []); + const channels = await cache.get('onDemandChannels', []); - await cache.set('channels', [...channels, channel.id]); + await cache.set('onDemandChannels', [...channels, channel.id]); return channel.id; }; diff --git a/src/modules/voiceOnDemand/voiceOnDemand.module.ts b/src/modules/voiceOnDemand/voiceOnDemand.module.ts index 6d490f5..db9c32b 100644 --- a/src/modules/voiceOnDemand/voiceOnDemand.module.ts +++ b/src/modules/voiceOnDemand/voiceOnDemand.module.ts @@ -2,7 +2,12 @@ import { ChannelType, Guild, SlashCommandBuilder } from 'discord.js'; import { cache } from '../../core/cache'; import type { BotModule } from '../../types/bot'; -import { handleJoin, handleLeave, isJoinState, isLeaveState } from './voiceOnDemand.helpers'; +import { + handleJoinLobby, + handleLeaveOnDemand, + isJoinState, + isLeaveState, +} from './voiceOnDemand.helpers'; export const voiceOnDemand: BotModule = { slashCommands: [ @@ -56,18 +61,21 @@ export const voiceOnDemand: BotModule = { eventHandlers: { voiceStateUpdate: async (oldState, newState) => { const lobbyIds = await cache.get('lobbyIds', []); - const lobbyId = lobbyIds.find((lobbyId) => newState.channelId === lobbyId); + const onDemandChannels = await cache.get('onDemandChannels', []); - if (lobbyId === undefined) { + const isLobbyChannel = lobbyIds.includes(newState.channelId ?? ''); + const isOnDemandChannel = onDemandChannels.includes(newState.channelId ?? ''); + + if (!isOnDemandChannel && !isLobbyChannel) { return; } - if (isLeaveState(oldState)) { - await handleLeave(oldState); + if (isOnDemandChannel && isLeaveState(oldState)) { + await handleLeaveOnDemand(oldState); } - if (isJoinState(newState)) { - await handleJoin(newState); + if (isLobbyChannel && isJoinState(newState)) { + await handleJoinLobby(newState); } }, channelDelete: async (channel) => { @@ -76,23 +84,26 @@ export const voiceOnDemand: BotModule = { } const lobbyIds = await cache.get('lobbyIds', []); - const { guild, id } = channel; + const onDemandChannels = await cache.get('onDemandChannels', []); - if (lobbyIds.includes(id)) return; + const isLobbyChannel = lobbyIds.includes(channel.id); + const isOnDemandChannel = onDemandChannels.includes(channel.id); + + if (!isOnDemandChannel && !isLobbyChannel) { + return; + } await cache.set( 'lobbyIds', - lobbyIds.filter((lobbyId) => lobbyId !== id), + lobbyIds.filter((lobbyId) => lobbyId !== channel.id), ); - const channels = await cache.get('channels', []); - await Promise.all( - channels.map(async (id) => { - const channel = await guild.channels.fetch(id).catch(() => null); - if (channel !== null) { - await guild.channels.delete(id); - guild.channels.cache.delete(id); + onDemandChannels.map(async (id) => { + const updatedChannel = await channel.guild.channels.fetch(id).catch(() => null); + if (updatedChannel !== null) { + await channel.guild.channels.delete(id); + channel.guild.channels.cache.delete(id); } }), );