From a455b753d790a23cb4c9f2ee49299f5fc55efaa7 Mon Sep 17 00:00:00 2001 From: ITOH <72305210+itohatweb@users.noreply.github.com> Date: Sun, 4 Apr 2021 17:18:04 +0200 Subject: [PATCH] rere --- src/util/permissions.ts | 25 ++++++++++++++++++------- 1 file changed, 18 insertions(+), 7 deletions(-) diff --git a/src/util/permissions.ts b/src/util/permissions.ts index 62ee90feb..58c800e67 100644 --- a/src/util/permissions.ts +++ b/src/util/permissions.ts @@ -5,15 +5,18 @@ import { Errors } from "../types/misc/errors.ts"; import { DiscordBitwisePermissionFlags } from "../types/permissions/bitwise_permission_flags.ts"; import { PermissionStrings } from "../types/permissions/permission_strings.ts"; -async function getCached(table: "guilds", key: string | Guild): Promise; +async function getCached( + table: "guilds", + key: string | Guild, +): Promise; async function getCached( table: "channels", key: string | Channel, -): Promise; +): Promise; async function getCached( table: "members", key: string | Member, -): Promise; +): Promise; async function getCached( table: "guilds" | "channels" | "members", key: string | Guild | Channel | Member, @@ -28,7 +31,7 @@ async function getCached( ); } - return cached; + return typeof cached === "string" ? undefined : cached; } /** Calculates the permissions this member has in the given guild */ @@ -39,6 +42,8 @@ export async function calculateBasePermissions( guild = await getCached("guilds", guild); member = await getCached("members", member); + if (!guild || !member) return "8"; + let permissions = 0n; // Calculate the role permissions bits, @everyone role is not in memberRoleIds so we need to pass guildId manualy permissions |= [...(member.guilds.get(guild.id)?.roles || []), guild.id] @@ -64,10 +69,12 @@ export async function calculateChannelOverwrites( channel = await getCached("channels", channel); // This is a DM channel so return ADMINISTRATOR permission - if (!channel.guildId) return "8"; + if (!channel || !channel.guildId) return "8"; member = await getCached("members", member); + if (!member) return "8"; + // Get all the role permissions this member already has let permissions = BigInt( await calculateBasePermissions(channel.guildId, member), @@ -285,8 +292,10 @@ export async function highestRole( ) { guild = await getCached("guilds", guild); + if (!guild) throw new Error(Errors.GUILD_NOT_FOUND); + // Get the roles from the member - const memberRoles = (await getCached("members", member)).guilds.get(guild.id) + const memberRoles = (await getCached("members", member))?.guilds.get(guild.id) ?.roles; // This member has no roles so the highest one is the @everyone role if (!memberRoles) return guild.roles.get(guild.id) as Role; @@ -321,6 +330,8 @@ export async function higherRolePosition( ) { guild = await getCached("guilds", guild); + if (!guild) return true; + const role = guild.roles.get(roleId); const otherRole = guild.roles.get(otherRoleId); if (!role || !otherRole) throw new Error(Errors.ROLE_NOT_FOUND); @@ -341,7 +352,7 @@ export async function isHigherPosition( ) { guild = await getCached("guilds", guild); - if (guild.ownerId === memberId) return true; + if (!guild || guild.ownerId === memberId) return true; const memberHighestRole = await highestRole(guild, memberId); return higherRolePosition(guild.id, memberHighestRole.id, compareRoleId);