summary refs log tree commit diff
diff options
context:
space:
mode:
authorMathMan05 <mathmanrm@gmail.com>2026-02-03 14:52:10 -0600
committerMathMan05 <mathmanrm@gmail.com>2026-02-03 14:52:10 -0600
commit049f7620d301c78239933331b25ab9eb59b68d6e (patch)
treefa040567d02258d5a85de18c2ba932ac7b29b196
parentschemas (diff)
downloadserver-ts-049f7620d301c78239933331b25ab9eb59b68d6e.tar.xz
some thread fixes
-rw-r--r--src/api/routes/channels/#channel_id/thread-members.ts3
-rw-r--r--src/gateway/opcodes/Identify.ts27
-rw-r--r--src/util/entities/Channel.ts2
-rw-r--r--src/util/interfaces/Event.ts2
4 files changed, 28 insertions, 6 deletions
diff --git a/src/api/routes/channels/#channel_id/thread-members.ts b/src/api/routes/channels/#channel_id/thread-members.ts

index 3e42f307..8c3de28a 100644 --- a/src/api/routes/channels/#channel_id/thread-members.ts +++ b/src/api/routes/channels/#channel_id/thread-members.ts
@@ -81,6 +81,7 @@ router.post( } const member = await Member.findOneOrFail({ where: { id: user_id, guild_id: thread.guild_id! } }); + if (await ThreadMember.existsBy({ member_idx: member.index, id: channel_id })) { return res.status(204).send(); } @@ -100,7 +101,7 @@ router.post( guild_id: thread.guild_id!, id: thread.id, member_count: thread.member_count, - added_member_ids: [user_id], + added_members: [{ user_id: user_id, ...threadMember.toJSON() }], }, channel_id: thread.id, } as ThreadMembersUpdateEvent); diff --git a/src/gateway/opcodes/Identify.ts b/src/gateway/opcodes/Identify.ts
index e9b91a3d..44e02f97 100644 --- a/src/gateway/opcodes/Identify.ts +++ b/src/gateway/opcodes/Identify.ts
@@ -47,6 +47,7 @@ import { SessionsReplace, Sticker, Stopwatch, + ThreadMember, timeFunction, timePromise, TraceNode, @@ -206,7 +207,7 @@ export async function onIdentify(this: WebSocket, data: Payload) { where: { id: this.user_id }, select: { // We only want some member props - ...Object.fromEntries(MemberPrivateProjection.map((x) => [x, true])), + ...Object.fromEntries(["index", ...MemberPrivateProjection].map((x) => [x, true])), settings: true, // guild settings roles: { id: true }, // the full role is fetched from the `guild` relation guild: { id: true }, @@ -298,7 +299,7 @@ export async function onIdentify(this: WebSocket, data: Payload) { Channel.find({ where: { guild_id: In(guildIds), - type: Not(ChannelType.GUILD_PUBLIC_THREAD), + type: Not(In([ChannelType.GUILD_PUBLIC_THREAD, ChannelType.GUILD_PRIVATE_THREAD, ChannelType.GUILD_NEWS_THREAD])), }, order: { guild_id: "ASC" }, }), @@ -412,9 +413,17 @@ export async function onIdentify(this: WebSocket, data: Payload) { ]; }); const mergedMembersTime = taskSw.getElapsedAndReset(); + const member_idx = members.map(({ index }) => index); + + const threadMembers = await ThreadMember.find({ + where: { member_idx: In(member_idx) }, + relations: { channel: { recipients: { user: true } } }, + }); + const threadMemberTime = taskSw.getElapsedAndReset(); // Populated with guilds 'unavailable' currently // Just for bots + const pending_guilds: Guild[] = []; // Generate guilds list ( make them unavailable if user is bot ) @@ -445,12 +454,23 @@ export async function onIdentify(this: WebSocket, data: Payload) { pending_guilds.push(member.guild); return { id: member.guild.id, unavailable: true }; } + const threads = threadMembers + .filter(({ channel }) => channel.guild_id === member.guild.id) + .map((_) => { + return { + member: { + ..._.toJSON(), + channel: undefined, + }, + ..._.channel.toJSON(), + }; + }); return { ...member.guild.toJSON(), joined_at: member.joined_at, - threads: member.guild.channels.filter((x) => x.isThread()), + threads, }; }); const generateGuildsListTime = taskSw.getElapsedAndReset(); @@ -665,6 +685,7 @@ export async function onIdentify(this: WebSocket, data: Payload) { emitPresenceUpdateTime, remapReadStateIdsTime, buildReadyEventDataTime, + threadMemberTime, }; for (const [key, value] of Object.entries(times)) { if (value) { diff --git a/src/util/entities/Channel.ts b/src/util/entities/Channel.ts
index a387f313..e3c9c8e8 100644 --- a/src/util/entities/Channel.ts +++ b/src/util/entities/Channel.ts
@@ -676,7 +676,7 @@ export class Channel extends BaseClass { user_limit: this.user_limit || undefined, rate_limit_per_user: this.rate_limit_per_user || undefined, owner_id: this.owner_id || undefined, - ...(this.type === ChannelType.GUILD_PUBLIC_THREAD && this.recipients ? { member_ids_preview: this.recipients.map((_) => _.user.id) } : {}), + ...(this.isThread() && this.recipients ? { member_ids_preview: this.recipients.map((_) => _.user.id) } : {}), }; } } diff --git a/src/util/interfaces/Event.ts b/src/util/interfaces/Event.ts
index b1ed1fdf..6ddf6b29 100644 --- a/src/util/interfaces/Event.ts +++ b/src/util/interfaces/Event.ts
@@ -645,7 +645,7 @@ export interface ThreadMembersUpdateEvent extends Event { id: string; guild_id: string; member_count: number; - added_members?: ThreadMember[]; + added_members?: (ThreadMember & { user_id: string })[]; removed_member_ids?: string[]; }; }