import type { RequestClient } from "@buape/carbon"; import type { APIChannel, APIGuild, APIGuildMember, APIRole } from "discord-api-types/v10"; import { ChannelType, PermissionFlagsBits, Routes } from "discord-api-types/v10"; import { resolveDiscordRest } from "./client.js"; import type { DiscordPermissionsSummary, DiscordReactOpts } from "./send.types.js";
async function fetchBotUserId(rest: RequestClient) { const me = (await rest.get(Routes.user("@me"))) as { id?: string }; if (!me?.id) { thrownew Error("Failed to resolve bot user id");
} return me.id;
}
/** *Fetchguild-levelpermissionsforauser.Thisdoesnotincludechannel-specificoverwrites.
*/
export async function fetchMemberGuildPermissionsDiscord(
guildId: string,
userId: string,
opts: DiscordReactOpts,
): Promise<bigint | null> { const rest = resolveDiscordRest(opts); try { const [guild, member] = await Promise.all([
rest.get(Routes.guild(guildId)) as Promise<APIGuild>,
rest.get(Routes.guildMember(guildId, userId)) as Promise<APIGuildMember>,
]); const rolesById = new Map<string, APIRole>((guild.roles ?? []).map((role) => [role.id, role])); const everyoneRole = rolesById.get(guildId);
let permissions = 0n; if (everyoneRole?.permissions) {
permissions = addPermissionBits(permissions, everyoneRole.permissions);
} for (const roleId of member.roles ?? []) { const role = rolesById.get(roleId); if (role?.permissions) {
permissions = addPermissionBits(permissions, role.permissions);
}
} return permissions;
} catch { // Not a guild member, guild not found, or API failure. returnnull;
}
}
const botId = await fetchBotUserId(rest); const [guild, member] = await Promise.all([
rest.get(Routes.guild(guildId)) as Promise<APIGuild>,
rest.get(Routes.guildMember(guildId, botId)) as Promise<APIGuildMember>,
]);
const rolesById = new Map<string, APIRole>((guild.roles ?? []).map((role) => [role.id, role])); const everyoneRole = rolesById.get(guildId);
let base = 0n; if (everyoneRole?.permissions) {
base = addPermissionBits(base, everyoneRole.permissions);
} for (const roleId of member.roles ?? []) { const role = rolesById.get(roleId); if (role?.permissions) {
base = addPermissionBits(base, role.permissions);
}
}
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.