From fd0dc4b6d788578d050619eaada7dc72973ce4ca Mon Sep 17 00:00:00 2001 From: MathMan05 Date: Tue, 3 Feb 2026 20:19:17 -0600 Subject: [PATCH] fix threads :3 --- src/gateway/opcodes/LazyRequest.ts | 1 - src/util/util/Permissions.ts | 28 +++++++++++++++++++++------- 2 files changed, 21 insertions(+), 8 deletions(-) diff --git a/src/gateway/opcodes/LazyRequest.ts b/src/gateway/opcodes/LazyRequest.ts index 2096503b9..3a56a0c82 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 6fcf53ba5..989feb40c 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; 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") {