diff options
| author | Fuwn <[email protected]> | 2021-10-12 14:19:03 -0700 |
|---|---|---|
| committer | Fuwn <[email protected]> | 2021-10-12 14:19:03 -0700 |
| commit | acfed16526cf6265cf3a2fd8373535bdba40a8cb (patch) | |
| tree | 134902df8ea42995b8256bbbd026dc8c3048e546 /adapter.js | |
| parent | fix: force node version (diff) | |
| download | bot-acfed16526cf6265cf3a2fd8373535bdba40a8cb.tar.xz bot-acfed16526cf6265cf3a2fd8373535bdba40a8cb.zip | |
Diffstat (limited to 'adapter.js')
| -rw-r--r-- | adapter.js | 69 |
1 files changed, 69 insertions, 0 deletions
diff --git a/adapter.js b/adapter.js new file mode 100644 index 0000000..5eecb4e --- /dev/null +++ b/adapter.js @@ -0,0 +1,69 @@ +const { DiscordGatewayAdapterCreator, DiscordGatewayAdapterLibraryMethods } = require('@discordjs/voice'); +const { VoiceChannel, Snowflake, Client, Constants, Guild } = require('discord.js'); +const { GatewayVoiceServerUpdateDispatchData, GatewayVoiceStateUpdateDispatchData } = require('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) { + if (trackedClients.has(client)) return; + trackedClients.add(client); + client.ws.on(Constants.WSEvents.VOICE_SERVER_UPDATE, (payload) => { + adapters.get(payload.guild_id)?.onVoiceServerUpdate(payload); + }); + client.ws.on(Constants.WSEvents.VOICE_STATE_UPDATE, (payload) => { + if (payload.guild_id && payload.session_id && payload.user_id === client.user?.id) { + adapters.get(payload.guild_id)?.onVoiceStateUpdate(payload); + } + }); + client.on(Constants.Events.SHARD_DISCONNECT, (_, shardID) => { + const guilds = trackedShards.get(shardID); + if (guilds) { + for (const guildID of guilds.values()) { + adapters.get(guildID)?.destroy(); + } + } + trackedShards.delete(shardID); + }); +} + +const trackedShards = new Map(); + +function trackGuild(guild) { + let guilds = trackedShards.get(guild.shardID); + if (!guilds) { + guilds = new Set(); + trackedShards.set(guild.shardID, guilds); + } + guilds.add(guild.id); +} + +/** + * Creates an adapter for a Voice Channel + * @param channel - The channel to create the adapter for + */ +function createDiscordJSAdapter(channel) { + 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); + }, + }; + }; +} + +module.exports = { createDiscordJSAdapter }
\ No newline at end of file |