diff --git a/src/api/routes/channels/#channel_id/messages/index.ts b/src/api/routes/channels/#channel_id/messages/index.ts
index 7f8b4b95..a5913e52 100644
--- a/src/api/routes/channels/#channel_id/messages/index.ts
+++ b/src/api/routes/channels/#channel_id/messages/index.ts
@@ -42,6 +42,10 @@ import {
uploadFile,
User,
Recipient,
+ ThreadMember,
+ ThreadMemberFlags,
+ ThreadMembersUpdateEvent,
+ ThreadCreateEvent,
} from "@spacebar/util";
import { Request, Response, Router } from "express";
import { HTTPError } from "lambert-server";
@@ -315,6 +319,7 @@ router.post(
},
route({
requestBody: "MessageCreateSchema",
+ permission: "VIEW_CHANNEL",
right: "SEND_MESSAGES",
responses: {
200: {
@@ -338,6 +343,43 @@ router.post(
});
if (channel.isThread()) {
req.permission!.hasThrow("SEND_MESSAGES_IN_THREADS");
+ if (channel.recipients && !channel.recipients.find(({ id }) => id === req.user_id)) {
+ const member = await Member.findOneOrFail({ where: { id: req.user_id, guild_id: channel.guild_id! } });
+
+ if (!(await ThreadMember.existsBy({ member_idx: member.index, id: channel_id }))) {
+ const threadMember = ThreadMember.create({
+ member_idx: member.index,
+ id: channel_id,
+ join_timestamp: new Date(),
+ muted: false,
+ flags: ThreadMemberFlags.ALL_MESSAGES,
+ });
+ await threadMember.save();
+
+ // increment member count
+ if (channel.member_count !== null && channel.member_count !== undefined) {
+ channel.member_count++;
+ await channel.save();
+ }
+
+ await emitEvent({
+ event: "THREAD_MEMBERS_UPDATE",
+ data: {
+ guild_id: channel.guild_id!,
+ id: channel.id,
+ member_count: channel.member_count,
+ added_members: [{ user_id: req.user_id, ...threadMember.toJSON() }],
+ },
+ channel_id: channel.id,
+ } as ThreadMembersUpdateEvent);
+
+ await emitEvent({
+ event: "THREAD_CREATE",
+ data: { ...channel.toJSON(), newly_created: false },
+ user_id: req.user_id,
+ } as ThreadCreateEvent);
+ }
+ }
} else {
req.permission!.hasThrow("SEND_MESSAGES");
}
|