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[];
};
}
|