UNPKG

@sapphire/framework

Version:

Discord bot framework built for advanced and amazing bots.

137 lines (135 loc) 5.72 kB
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