summary refs log tree commit diff
diff options
context:
space:
mode:
authorMathMan05 <mathmanrm@gmail.com>2026-02-03 20:19:17 -0600
committerRory& <root@rory.gay>2026-02-04 03:25:48 +0100
commitfd0dc4b6d788578d050619eaada7dc72973ce4ca (patch)
tree3bd6f70e77e48e5643f7284b816fd8d5afa70244
parentsome fixes (diff)
downloadserver-ts-fd0dc4b6d788578d050619eaada7dc72973ce4ca.tar.xz
fix threads :3
-rw-r--r--src/gateway/opcodes/LazyRequest.ts1
-rw-r--r--src/util/util/Permissions.ts28
2 files changed, 21 insertions, 8 deletions
diff --git a/src/gateway/opcodes/LazyRequest.ts b/src/gateway/opcodes/LazyRequest.ts

index 2096503b..3a56a0c8 100644 --- a/src/gateway/opcodes/LazyRequest.ts +++ b/src/gateway/opcodes/LazyRequest.ts
@@ -218,7 +218,6 @@ export async function onLazyRequest(this: WebSocket, { d }: Payload) { if (!channel_id) return; const permissions = await getPermission(this.user_id, guild_id, channel_id); - console.log(permissions); permissions.hasThrow("VIEW_CHANNEL"); const ranges = channels[channel_id]; diff --git a/src/util/util/Permissions.ts b/src/util/util/Permissions.ts
index 6fcf53ba..989feb40 100644 --- a/src/util/util/Permissions.ts +++ b/src/util/util/Permissions.ts
@@ -5,7 +5,8 @@ import { Channel, Guild, Member, Role, User } from "../entities"; import { BitField, BitFieldResolvable, BitFlag } from "./BitField"; import { HTTPError } from "lambert-server"; -import { ChannelPermissionOverwrite, ChannelPermissionOverwriteType, UserFlags } from "@spacebar/schemas"; +import { ChannelPermissionOverwrite, ChannelPermissionOverwriteType, ChannelType, UserFlags } from "@spacebar/schemas"; +import { FindOneOptions } from "typeorm"; export type PermissionResolvable = bigint | number | Permissions | PermissionResolvable[] | PermissionString; @@ -258,17 +259,30 @@ export async function getPermission( where: { id: user_id }, select: { id: true, flags: true }, }); - + const query = { + relations: ["recipients", "thread_members", "thread_members.member", ...(opts.channel_relations || [])], + select: ["id", "recipients", "permission_overwrites", "owner_id", "guild_id", ...(opts.channel_select || [])], + } as FindOneOptions<Channel>; if (typeof channel_id === "string") { - channel = await Channel.findOneOrFail({ - where: { id: channel_id }, - relations: ["recipients", ...(opts.channel_relations || [])], - select: ["id", "recipients", "permission_overwrites", "owner_id", "guild_id", ...(opts.channel_select || [])], - }); + channel = await Channel.findOneOrFail({ where: { id: channel_id }, ...query }); if (channel.guild_id) guild_id = channel.guild_id; // derive guild_id from the channel } else if (channel_id) { channel = channel_id; } + if (channel?.isThread() && channel.parent_id) { + const parent = await Channel.findOneOrFail({ where: { id: channel.parent_id }, ...query }); + if (channel.type === ChannelType.GUILD_PRIVATE_THREAD) { + if (!parent.thread_members!.find(({ member }) => member.id === user_id)) { + const perms: Permissions = await getPermission(user_id, guild_id, parent, opts); + if (!perms.has("MANAGE_THREADS")) { + return new Permissions(0); + } else { + return perms; + } + } + } + channel = parent; + } if (guild_id) { if (typeof guild_id === "string") {