Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
17 changes: 12 additions & 5 deletions packages/discord.js/src/client/Client.js
Original file line number Diff line number Diff line change
Expand Up @@ -130,13 +130,13 @@ class Client extends AsyncEventEmitter {
this.status = Status.Idle;

/**
* A set of guild ids this Client expects to receive
* A set of guild ids, sorted into collections by shardId, that this Client expects to receive
*
* @name Client#expectedGuilds
* @type {Set<string>}
* @type {Collection<number, Set<string>>}
* @private
*/
Object.defineProperty(this, 'expectedGuilds', { value: new Set(), writable: true });
Object.defineProperty(this, 'expectedGuilds', { value: new Collection(), writable: true });

/**
* The ready timeout
Expand Down Expand Up @@ -367,7 +367,7 @@ class Client extends AsyncEventEmitter {
hasGuildsIntent
? `Client did not receive any guild packets in ${this.options.waitGuildTimeout} ms.`
: 'Client will not receive anymore guild packets.'
}\nUnavailable guild count: ${this.expectedGuilds.size}`,
}\nUnavailable guild count: ${this.expectedGuilds.reduce((count, guilds) => count + guilds.size, 0)}`,
);

this.readyTimeout = null;
Expand Down Expand Up @@ -421,7 +421,14 @@ class Client extends AsyncEventEmitter {
if (packet.t === GatewayDispatchEvents.Ready) {
await this._checkReady();
} else if (this.status === Status.WaitingForGuilds && WaitingForGuildEvents.includes(packet.t)) {
this.expectedGuilds.delete(packet.d.id);
const expectedGuilds = this.expectedGuilds.get(shardId);
if (expectedGuilds) {
expectedGuilds.delete(packet.d.id);
if (!expectedGuilds.size) {
this.expectedGuilds.delete(shardId);
}
}

await this._checkReady();
}
}
Expand Down
1 change: 1 addition & 0 deletions packages/discord.js/src/client/actions/ActionsManager.js
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@ class ActionsManager {
this.GuildChannelsPositionUpdate = this.load(
require('./GuildChannelsPositionUpdate.js').GuildChannelsPositionUpdateAction,
);
this.GuildDelete = this.load(require('./GuildDelete.js').GuildDeleteAction);
this.GuildEmojiCreate = this.load(require('./GuildEmojiCreate.js').GuildEmojiCreateAction);
this.GuildEmojiDelete = this.load(require('./GuildEmojiDelete.js').GuildEmojiDeleteAction);
this.GuildEmojiUpdate = this.load(require('./GuildEmojiUpdate.js').GuildEmojiUpdateAction);
Expand Down
25 changes: 25 additions & 0 deletions packages/discord.js/src/client/actions/GuildDelete.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
'use strict';

const { Events } = require('../../util/Events.js');
const { Action } = require('./Action.js');

class GuildDeleteAction extends Action {
handle(guild) {
const { client } = this;

for (const channel of guild.channels.cache.values()) client.channels._remove(channel.id);
client.voice.adapters.get(guild.id)?.destroy();

client.guilds.cache.delete(guild.id);

/**
* Emitted whenever a guild kicks the client or the guild is deleted/left.
*
* @event Client#guildDelete
* @param {Guild} guild The guild that was deleted
*/
client.emit(Events.GuildDelete, guild);
}
}

exports.GuildDeleteAction = GuildDeleteAction;
Original file line number Diff line number Diff line change
Expand Up @@ -22,16 +22,5 @@ module.exports = (client, { d: data }) => {
return;
}

for (const channel of guild.channels.cache.values()) client.channels._remove(channel.id);
client.voice.adapters.get(data.id)?.destroy();

client.guilds.cache.delete(guild.id);

/**
* Emitted whenever a guild kicks the client or the guild is deleted/left.
*
* @event Client#guildDelete
* @param {Guild} guild The guild that was deleted
*/
client.emit(Events.GuildDelete, guild);
client.actions.GuildDelete.handle(guild);
};
15 changes: 14 additions & 1 deletion packages/discord.js/src/client/websocket/handlers/READY.js
Original file line number Diff line number Diff line change
Expand Up @@ -14,12 +14,25 @@ module.exports = (client, { d: data }, shardId) => {
client.users.cache.set(client.user.id, client.user);
}

const expectedGuilds = new Set();
for (const guild of data.guilds) {
client.expectedGuilds.add(guild.id);
expectedGuilds.add(guild.id);
guild.shardId = shardId;
client.guilds._add(guild);
}

if (expectedGuilds.size) {
client.expectedGuilds.set(shardId, expectedGuilds);
} else {
client.expectedGuilds.delete(shardId);
}

for (const guild of client.guilds.cache.values()) {
if (guild.shardId === shardId && !expectedGuilds.has(guild.id)) {
Comment thread
Qjuh marked this conversation as resolved.
client.actions.GuildDelete.handle(guild);
}
}

if (client.application) {
client.application._patch(data.application);
} else {
Expand Down
2 changes: 1 addition & 1 deletion packages/discord.js/typings/index.d.ts
Original file line number Diff line number Diff line change
Expand Up @@ -940,7 +940,7 @@ export class Client<Ready extends boolean = boolean>
{
public constructor(options: ClientOptions);
private readonly actions: unknown;
private readonly expectedGuilds: Set<Snowflake>;
private readonly expectedGuilds: Collection<number, Set<Snowflake>>;
private readonly packetQueue: unknown[];
private readonly presence: ClientPresence;
private readonly pings: Collection<number, number>;
Expand Down
Loading