From d5dd74fc910bb0ce61ddf1cb3aa8efea0e7e4b1a Mon Sep 17 00:00:00 2001 From: Rory& Date: Wed, 11 Mar 2026 02:23:32 +0100 Subject: [PATCH] requestguildmembers: immediately send data instead of buffering --- src/gateway/opcodes/RequestGuildMembers.ts | 64 +++++++++++----------- 1 file changed, 32 insertions(+), 32 deletions(-) diff --git a/src/gateway/opcodes/RequestGuildMembers.ts b/src/gateway/opcodes/RequestGuildMembers.ts index 490dac758..0e65b6cc6 100644 --- a/src/gateway/opcodes/RequestGuildMembers.ts +++ b/src/gateway/opcodes/RequestGuildMembers.ts @@ -130,13 +130,13 @@ export async function onRequestGuildMembers(this: WebSocket, { d }: Payload) { const memberResultCount = members.length; const chunkSize = 1000; const chunkCount = Math.ceil(members.length / chunkSize); + let sentChunkCount = 0; let notFound: string[] = []; if (user_ids && user_ids.length > 0) notFound = user_ids.filter((id) => !members.some((member) => member.id == id)); const recentlyActiveSince = new DateBuilder().addMinutes(-15).build(); - const chunks: GuildMembersChunkEvent["data"][] = []; while (members.length > 0) { const chunk: Member[] = members.splice(0, chunkSize); @@ -168,41 +168,41 @@ export async function onRequestGuildMembers(this: WebSocket, { d }: Payload) { })); } - chunks.push({ - ...baseData, - members: chunk.map((member) => member.toPublicMember()), - presences: presences ? presenceList : undefined, - chunk_index: chunks.length, - chunk_count: chunkCount, - }); - - console.log( - `[Gateway/${this.user_id}] REQUEST_GUILD_MEMBERS @ ${Date.now() - startTime}ms for guild ${guild_id}: pushed ${chunks.length}/${chunkCount} chunks (${memberResultCount} total members considered)`, - ); - } - - if (chunks.length == 0) { - chunks.push({ - ...baseData, - members: [], - presences: presences ? [] : undefined, - chunk_index: 0, - chunk_count: 1, - }); - } - - if (notFound.length > 0) { - chunks[0].not_found = notFound; - } - - chunks.forEach((chunk) => { - Send(this, { + await Send(this, { op: OPCODES.Dispatch, s: this.sequence++, t: "GUILD_MEMBERS_CHUNK", - d: chunk, + d: { + ...baseData, + members: chunk.map((member) => member.toPublicMember()), + presences: presences ? presenceList : undefined, + chunk_index: sentChunkCount, + chunk_count: chunkCount, + + ...(sentChunkCount == 0 ? { not_found: notFound } : {}), + } satisfies GuildMembersChunkEvent["data"], + }); + sentChunkCount++; + + console.log( + `[Gateway/${this.user_id}] REQUEST_GUILD_MEMBERS @ ${Date.now() - startTime}ms for guild ${guild_id}: pushed ${sentChunkCount}/${chunkCount} chunks (${memberResultCount} total members considered)`, + ); + } + + if (sentChunkCount == 0) + await Send(this, { + op: OPCODES.Dispatch, + s: this.sequence++, + t: "GUILD_MEMBERS_CHUNK", + d: { + ...baseData, + members: [], + presences: presences ? [] : undefined, + chunk_index: 0, + chunk_count: 1, + not_found: notFound, + } satisfies GuildMembersChunkEvent["data"], }); - }); console.log(`[Gateway/${this.user_id}] REQUEST_GUILD_MEMBERS took ${Date.now() - startTime}ms for guild ${guild_id} with ${memberResultCount} (${memberCount}) members`); }