@sapphire/framework
Version:
Discord bot framework built for advanced and amazing bots.
137 lines (135 loc) • 5.72 kB
JavaScript
import { Identifiers } from "../lib/errors/Identifiers.mjs";
import { AllFlowsPrecondition } from "../lib/structures/Precondition.mjs";
import { container } from "@sapphire/pieces";
import { isNullish } from "@sapphire/utilities";
import { ChatInputCommandInteraction, ContextMenuCommandInteraction, PermissionFlagsBits, PermissionsBitField } from "discord.js";
//#region src/preconditions/ClientPermissions.ts
var CorePrecondition = class CorePrecondition extends AllFlowsPrecondition {
constructor(..._args) {
super(..._args);
this.dmChannelPermissions = new PermissionsBitField(~new PermissionsBitField([
PermissionFlagsBits.AddReactions,
PermissionFlagsBits.AttachFiles,
PermissionFlagsBits.EmbedLinks,
PermissionFlagsBits.ReadMessageHistory,
PermissionFlagsBits.SendMessages,
PermissionFlagsBits.UseExternalEmojis,
PermissionFlagsBits.ViewChannel
]).bitfield & PermissionsBitField.All).freeze();
}
async messageRun(message, _, context) {
const required = context.permissions ?? new PermissionsBitField();
const { channel } = message;
if (!message.client.id) return this.error({
identifier: Identifiers.PreconditionClientPermissionsNoClient,
message: "There was no client to validate the permissions for."
});
const permissions = await this.getPermissionsForChannel(channel, message);
return this.sharedRun(required, permissions, "message");
}
async chatInputRun(interaction, _, context) {
const required = context.permissions ?? new PermissionsBitField();
const availablePermissions = await this.getAvailablePermissions(interaction);
return this.sharedRun(required, availablePermissions, "chat input");
}
async contextMenuRun(interaction, _, context) {
const required = context.permissions ?? new PermissionsBitField();
const availablePermissions = await this.getAvailablePermissions(interaction);
return this.sharedRun(required, availablePermissions, "context menu");
}
async getPermissionsForChannel(channel, messageOrInteraction) {
let permissions = this.dmChannelPermissions;
if (messageOrInteraction.inGuild() && !channel.isDMBased()) if (isNullish(messageOrInteraction.applicationId)) {
const me = await messageOrInteraction.guild?.members.fetchMe();
if (me) permissions = channel.permissionsFor(me);
} else {
permissions = channel.permissionsFor(messageOrInteraction.applicationId);
if (isNullish(permissions)) {
const me = await messageOrInteraction.guild?.members.fetchMe();
if (me) permissions = channel.permissionsFor(me);
}
}
return permissions;
}
sharedRun(requiredPermissions, availablePermissions, commandType) {
if (!availablePermissions) return this.error({
identifier: Identifiers.PreconditionClientPermissionsNoPermissions,
message: `I was unable to resolve my permissions in the ${commandType} command invocation channel.`
});
const missing = availablePermissions.missing(requiredPermissions);
return missing.length === 0 ? this.ok() : this.error({
identifier: Identifiers.PreconditionClientPermissions,
message: `I am missing the following permissions to run this command: ${missing.map((perm) => CorePrecondition.readablePermissions[perm]).join(", ")}`,
context: { missing }
});
}
async getAvailablePermissions(interaction) {
if (interaction.channel) {
if (interaction.channel.isDMBased()) return this.dmChannelPermissions;
const channel = await this.fetchChannelFromInteraction(interaction);
return this.getPermissionsForChannel(channel, interaction);
}
return interaction.appPermissions;
}
};
CorePrecondition.readablePermissions = {
AddReactions: "Add Reactions",
Administrator: "Administrator",
AttachFiles: "Attach Files",
BanMembers: "Ban Members",
ChangeNickname: "Change Nickname",
Connect: "Connect",
CreateEvents: "Create Events",
CreateGuildExpressions: "Create Expressions",
CreateInstantInvite: "Create Instant Invite",
CreatePrivateThreads: "Create Private Threads",
CreatePublicThreads: "Create Public Threads",
DeafenMembers: "Deafen Members",
EmbedLinks: "Embed Links",
KickMembers: "Kick Members",
ManageChannels: "Manage Channels",
ManageEmojisAndStickers: "Manage Emojis and Stickers",
ManageEvents: "Manage Events",
ManageGuild: "Manage Server",
ManageGuildExpressions: "Manage Guild Expressions",
ManageMessages: "Manage Messages",
ManageNicknames: "Manage Nicknames",
ManageRoles: "Manage Roles",
ManageThreads: "Manage Threads",
ManageWebhooks: "Manage Webhooks",
MentionEveryone: "Mention Everyone",
ModerateMembers: "Moderate Members",
MoveMembers: "Move Members",
MuteMembers: "Mute Members",
PinMessages: "Pin Messages",
PrioritySpeaker: "Priority Speaker",
ReadMessageHistory: "Read Message History",
RequestToSpeak: "Request to Speak",
SendMessages: "Send Messages",
SendMessagesInThreads: "Send Messages in Threads",
SendPolls: "Create Polls",
SendTTSMessages: "Send TTS Messages",
SendVoiceMessages: "Send Voice Messages",
Speak: "Speak",
Stream: "Stream",
UseApplicationCommands: "Use Application Commands",
UseEmbeddedActivities: "Start Activities",
UseExternalApps: "Use External Apps",
UseExternalEmojis: "Use External Emojis",
UseExternalSounds: "Use External Sounds",
UseExternalStickers: "Use External Stickers",
UseSoundboard: "Use Soundboard",
UseVAD: "Use Voice Activity",
ViewAuditLog: "View Audit Log",
ViewChannel: "Read Messages",
ViewCreatorMonetizationAnalytics: "View Creator Monetization Analytics",
ViewGuildInsights: "View Guild Insights"
};
container.stores.loadPiece({
name: "ClientPermissions",
piece: CorePrecondition,
store: "preconditions"
});
//#endregion
export { CorePrecondition };
//# sourceMappingURL=ClientPermissions.mjs.map