mirror of
https://github.com/discordjs/discord.js.git
synced 2026-03-10 16:43:31 +01:00
70 lines
2.2 KiB
TypeScript
70 lines
2.2 KiB
TypeScript
import { DiscordGatewayAdapterCreator, DiscordGatewayAdapterLibraryMethods } from '../../';
|
|
import { VoiceChannel, Snowflake, Client, Constants, Guild } from 'discord.js';
|
|
import { GatewayVoiceServerUpdateDispatchData, GatewayVoiceStateUpdateDispatchData } from 'discord-api-types/v10';
|
|
|
|
const adapters = new Map<Snowflake, DiscordGatewayAdapterLibraryMethods>();
|
|
const trackedClients = new Set<Client>();
|
|
|
|
/**
|
|
* 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);
|
|
}
|
|
});
|
|
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<number, Set<Snowflake>>();
|
|
|
|
function trackGuild(guild: 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
|
|
*/
|
|
export function createDiscordJSAdapter(channel: VoiceChannel): 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);
|
|
},
|
|
};
|
|
};
|
|
}
|