diff --git a/src/client/commands/play.js b/src/client/commands/play.js index 3574b45..3361c6d 100644 --- a/src/client/commands/play.js +++ b/src/client/commands/play.js @@ -4,7 +4,6 @@ const { getVoiceConnection, joinVoiceChannel } = require("@discordjs/voice"); -const { createDiscordJSAdapter } = require("../utils/adapter"); module.exports = { name: "play", @@ -99,7 +98,7 @@ module.exports = { joinVoiceChannel({ channelId: voiceChannel.id, guildId: voiceChannel.guild.id, - adapterCreator: createDiscordJSAdapter(voiceChannel) + adapterCreator: voiceChannel.guild.voiceAdapterCreator }); construct.connection = connection; let date = new Date(); diff --git a/src/client/events/voiceStateUpdate.js b/src/client/events/voiceStateUpdate.js index 0cccc22..464f85d 100644 --- a/src/client/events/voiceStateUpdate.js +++ b/src/client/events/voiceStateUpdate.js @@ -2,7 +2,6 @@ const { getVoiceConnection, joinVoiceChannel } = require("@discordjs/voice"); -const { createDiscordJSAdapter } = require("../utils/adapter"); module.exports = { name: "voiceStateUpdate", @@ -16,7 +15,7 @@ module.exports = { if (newState.channel === null) { client.funcs.statisticsUpdate(client, newState.guild, radio); - radio.connection = null; + radio.connection?.destroy(); radio.audioPlayer?.stop(); return client.radio.delete(newState.guild.id); } @@ -29,7 +28,7 @@ module.exports = { radio.connection = joinVoiceChannel({ channelId: oldState.channel.id, guildId: oldState.channel.guild.id, - adapterCreator: createDiscordJSAdapter(oldState.channel) + adapterCreator: oldState.channel.guild.voiceAdapterCreator }) //radio.connection = await oldState.channel.join() ), diff --git a/src/client/utils/adapter.ts b/src/client/utils/adapter.ts deleted file mode 100644 index b008511..0000000 --- a/src/client/utils/adapter.ts +++ /dev/null @@ -1,70 +0,0 @@ -import { DiscordGatewayAdapterCreator, DiscordGatewayAdapterLibraryMethods } from '@discordjs/voice'; -import { VoiceChannel, Snowflake, Client, Constants, WebSocketShard, Guild, StageChannel } from 'discord.js'; -import { GatewayVoiceServerUpdateDispatchData, GatewayVoiceStateUpdateDispatchData } from 'discord-api-types/v9'; - -const adapters = new Map(); -const trackedClients = new Set(); - -/** - * Tracks a Discord.js client, listening to VOICE_SERVER_UPDATE and VOICE_STATE_UPDATE events. - * @param client - The Discord.js Client to track - */ -function trackClient(client: Client) { - if (trackedClients.has(client)) return; - trackedClients.add(client); - client.ws.on(Constants.WSEvents.VOICE_SERVER_UPDATE, (payload: GatewayVoiceServerUpdateDispatchData) => { - adapters.get(payload.guild_id)?.onVoiceServerUpdate(payload); - }); - client.ws.on(Constants.WSEvents.VOICE_STATE_UPDATE, (payload: GatewayVoiceStateUpdateDispatchData) => { - if (payload.guild_id && payload.session_id && payload.user_id === client.user?.id) { - adapters.get(payload.guild_id)?.onVoiceStateUpdate(payload); - } - }); -} - -const trackedGuilds = new Map>(); - -function cleanupGuilds(shard: WebSocketShard) { - const guilds = trackedGuilds.get(shard); - if (guilds) { - for (const guildID of guilds.values()) { - adapters.get(guildID)?.destroy(); - } - } -} - -function trackGuild(guild: Guild) { - let guilds = trackedGuilds.get(guild.shard); - if (!guilds) { - const cleanup = () => cleanupGuilds(guild.shard); - guild.shard.on('close', cleanup); - guild.shard.on('destroyed', cleanup); - guilds = new Set(); - trackedGuilds.set(guild.shard, guilds); - } - guilds.add(guild.id); -} - -/** - * Creates an adapter for a Voice Channel - * @param channel - The channel to create the adapter for - */ -export function createDiscordJSAdapter(channel: VoiceChannel | StageChannel): DiscordGatewayAdapterCreator { - return (methods) => { - adapters.set(channel.guild.id, methods); - trackClient(channel.client); - trackGuild(channel.guild); - return { - sendPayload(data) { - if (channel.guild.shard.status === Constants.Status.READY) { - channel.guild.shard.send(data); - return true; - } - return false; - }, - destroy() { - return adapters.delete(channel.guild.id); - }, - }; - }; -}