UNPKG

@sapphire/framework

Version:

Discord bot framework built for advanced and amazing bots.

1 lines • 11.7 kB
{"version":3,"sources":["../../../src/preconditions/ClientPermissions.ts"],"names":[],"mappings":";;;;;;;AAoBO,IAAM,iBAAA,GAAN,MAAM,iBAAA,SAAyB,oBAAqB,CAAA;AAAA,EAApD,WAAA,GAAA;AAAA,IAAA,KAAA,CAAA,GAAA,SAAA,CAAA;AACN,IAAA,IAAA,CAAiB,uBAAuB,IAAI,mBAAA;AAAA,MAC3C,CAAC,IAAI,mBAAoB,CAAA;AAAA;AAAA,QAExB,mBAAoB,CAAA,YAAA;AAAA,QACpB,mBAAoB,CAAA,WAAA;AAAA,QACpB,mBAAoB,CAAA,UAAA;AAAA,QACpB,mBAAoB,CAAA,kBAAA;AAAA,QACpB,mBAAoB,CAAA,YAAA;AAAA,QACpB,mBAAoB,CAAA,iBAAA;AAAA,QACpB,mBAAoB,CAAA;AAAA,OACpB,CAAE,CAAA,QAAA,GAAW,mBAAoB,CAAA;AAAA,MACjC,MAAO,EAAA;AAAA;AAAA,EAET,MAAa,UAAA,CAAW,OAAkB,EAAA,CAAA,EAAY,OAA0E,EAAA;AAC/H,IAAA,MAAM,QAAW,GAAA,OAAA,CAAQ,WAAe,IAAA,IAAI,mBAAoB,EAAA;AAChE,IAAM,MAAA,EAAE,SAAY,GAAA,OAAA;AAEpB,IAAI,IAAA,CAAC,OAAQ,CAAA,MAAA,CAAO,EAAI,EAAA;AACvB,MAAA,OAAO,KAAK,KAAM,CAAA;AAAA,QACjB,YAAY,WAAY,CAAA,qCAAA;AAAA,QACxB,OAAS,EAAA;AAAA,OACT,CAAA;AAAA;AAGF,IAAA,MAAM,WAAc,GAAA,MAAM,IAAK,CAAA,wBAAA,CAAyB,SAAS,OAAO,CAAA;AAExE,IAAA,OAAO,IAAK,CAAA,SAAA,CAAU,QAAU,EAAA,WAAA,EAAa,SAAS,CAAA;AAAA;AACvD,EAEA,MAAa,YAAA,CACZ,WACA,EAAA,CAAA,EACA,OACmC,EAAA;AACnC,IAAA,MAAM,QAAW,GAAA,OAAA,CAAQ,WAAe,IAAA,IAAI,mBAAoB,EAAA;AAEhE,IAAA,MAAM,oBAAuB,GAAA,MAAM,IAAK,CAAA,uBAAA,CAAwB,WAAW,CAAA;AAE3E,IAAA,OAAO,IAAK,CAAA,SAAA,CAAU,QAAU,EAAA,oBAAA,EAAsB,YAAY,CAAA;AAAA;AACnE,EAEA,MAAa,cAAA,CACZ,WACA,EAAA,CAAA,EACA,OACmC,EAAA;AACnC,IAAA,MAAM,QAAW,GAAA,OAAA,CAAQ,WAAe,IAAA,IAAI,mBAAoB,EAAA;AAEhE,IAAA,MAAM,oBAAuB,GAAA,MAAM,IAAK,CAAA,uBAAA,CAAwB,WAAW,CAAA;AAE3E,IAAA,OAAO,IAAK,CAAA,SAAA,CAAU,QAAU,EAAA,oBAAA,EAAsB,cAAc,CAAA;AAAA;AACrE,EAEA,MAAc,wBAAyB,CAAA,OAAA,EAA2B,oBAAiD,EAAA;AAClH,IAAA,IAAI,cAA0C,IAAK,CAAA,oBAAA;AAEnD,IAAA,IAAI,qBAAqB,OAAQ,EAAA,IAAK,CAAC,OAAA,CAAQ,WAAa,EAAA;AAC3D,MAAI,IAAA,SAAA,CAAU,oBAAqB,CAAA,aAAa,CAAG,EAAA;AAClD,QAAA,MAAM,EAAK,GAAA,MAAM,oBAAqB,CAAA,KAAA,EAAO,QAAQ,OAAQ,EAAA;AAC7D,QAAA,IAAI,EAAI,EAAA;AACP,UAAc,WAAA,GAAA,OAAA,CAAQ,eAAe,EAAE,CAAA;AAAA;AACxC,OACM,MAAA;AACN,QAAc,WAAA,GAAA,OAAA,CAAQ,cAAe,CAAA,oBAAA,CAAqB,aAAa,CAAA;AACvE,QAAI,IAAA,SAAA,CAAU,WAAW,CAAG,EAAA;AAC3B,UAAA,MAAM,EAAK,GAAA,MAAM,oBAAqB,CAAA,KAAA,EAAO,QAAQ,OAAQ,EAAA;AAC7D,UAAA,IAAI,EAAI,EAAA;AACP,YAAc,WAAA,GAAA,OAAA,CAAQ,eAAe,EAAE,CAAA;AAAA;AACxC;AACD;AACD;AAGD,IAAO,OAAA,WAAA;AAAA;AACR,EAEQ,SAAA,CAAU,mBAA0C,EAAA,oBAAA,EAAkD,WAAqB,EAAA;AAClI,IAAA,IAAI,CAAC,oBAAsB,EAAA;AAC1B,MAAA,OAAO,KAAK,KAAM,CAAA;AAAA,QACjB,YAAY,WAAY,CAAA,0CAAA;AAAA,QACxB,OAAA,EAAS,iDAAiD,WAAW,CAAA,4BAAA;AAAA,OACrE,CAAA;AAAA;AAGF,IAAM,MAAA,OAAA,GAAU,oBAAqB,CAAA,OAAA,CAAQ,mBAAmB,CAAA;AAChE,IAAA,OAAO,QAAQ,MAAW,KAAA,CAAA,GACvB,KAAK,EAAG,EAAA,GACR,KAAK,KAAM,CAAA;AAAA,MACX,YAAY,WAAY,CAAA,6BAAA;AAAA,MACxB,OAAS,EAAA,CAAA,4DAAA,EAA+D,OACtE,CAAA,GAAA,CAAI,CAAC,IAAA,KAAS,iBAAiB,CAAA,mBAAA,CAAoB,IAAI,CAAC,CACxD,CAAA,IAAA,CAAK,IAAI,CAAC,CAAA,CAAA;AAAA,MACZ,OAAA,EAAS,EAAE,OAAQ;AAAA,KACnB,CAAA;AAAA;AACJ,EAEA,MAAc,wBAAwB,WAA0E,EAAA;AAC/G,IAAA,IAAI,YAAY,OAAS,EAAA;AACxB,MAAA,IAAI,WAAY,CAAA,OAAA,CAAQ,SAAU,EAAA,SAAU,IAAK,CAAA,oBAAA;AAEjD,MAAA,MAAM,OAAU,GAAA,MAAM,IAAK,CAAA,2BAAA,CAA4B,WAAW,CAAA;AAClE,MAAO,OAAA,IAAA,CAAK,wBAAyB,CAAA,OAAA,EAAS,WAAW,CAAA;AAAA;AAG1D,IAAA,OAAO,WAAY,CAAA,cAAA;AAAA;AAuDrB,CAAA;AAhK2D,MAAA,CAAA,iBAAA,EAAA,kBAAA,CAAA;AAA9C,iBAAA,CA4GW,mBAAyD,GAAA;AAAA,EAC/E,YAAc,EAAA,eAAA;AAAA,EACd,aAAe,EAAA,eAAA;AAAA,EACf,WAAa,EAAA,cAAA;AAAA,EACb,UAAY,EAAA,aAAA;AAAA,EACZ,cAAgB,EAAA,iBAAA;AAAA,EAChB,OAAS,EAAA,SAAA;AAAA,EACT,YAAc,EAAA,eAAA;AAAA,EACd,sBAAwB,EAAA,oBAAA;AAAA,EACxB,mBAAqB,EAAA,uBAAA;AAAA,EACrB,oBAAsB,EAAA,wBAAA;AAAA,EACtB,mBAAqB,EAAA,uBAAA;AAAA,EACrB,aAAe,EAAA,gBAAA;AAAA,EACf,UAAY,EAAA,aAAA;AAAA,EACZ,WAAa,EAAA,cAAA;AAAA,EACb,cAAgB,EAAA,iBAAA;AAAA,EAChB,uBAAyB,EAAA,4BAAA;AAAA,EACzB,YAAc,EAAA,eAAA;AAAA,EACd,WAAa,EAAA,eAAA;AAAA,EACb,sBAAwB,EAAA,0BAAA;AAAA,EACxB,cAAgB,EAAA,iBAAA;AAAA,EAChB,eAAiB,EAAA,kBAAA;AAAA,EACjB,WAAa,EAAA,cAAA;AAAA,EACb,aAAe,EAAA,gBAAA;AAAA,EACf,cAAgB,EAAA,iBAAA;AAAA,EAChB,eAAiB,EAAA,kBAAA;AAAA,EACjB,eAAiB,EAAA,kBAAA;AAAA,EACjB,WAAa,EAAA,cAAA;AAAA,EACb,WAAa,EAAA,cAAA;AAAA,EACb,eAAiB,EAAA,kBAAA;AAAA,EACjB,kBAAoB,EAAA,sBAAA;AAAA,EACpB,cAAgB,EAAA,kBAAA;AAAA,EAChB,YAAc,EAAA,eAAA;AAAA,EACd,qBAAuB,EAAA,0BAAA;AAAA,EACvB,SAAW,EAAA,cAAA;AAAA,EACX,eAAiB,EAAA,mBAAA;AAAA,EACjB,iBAAmB,EAAA,qBAAA;AAAA,EACnB,KAAO,EAAA,OAAA;AAAA,EACP,MAAQ,EAAA,QAAA;AAAA,EACR,sBAAwB,EAAA,0BAAA;AAAA,EACxB,qBAAuB,EAAA,kBAAA;AAAA,EACvB,eAAiB,EAAA,mBAAA;AAAA,EACjB,iBAAmB,EAAA,qBAAA;AAAA,EACnB,iBAAmB,EAAA,qBAAA;AAAA,EACnB,mBAAqB,EAAA,uBAAA;AAAA,EACrB,aAAe,EAAA,gBAAA;AAAA,EACf,MAAQ,EAAA,oBAAA;AAAA,EACR,YAAc,EAAA,gBAAA;AAAA,EACd,WAAa,EAAA,eAAA;AAAA,EACb,gCAAkC,EAAA,qCAAA;AAAA,EAClC,iBAAmB,EAAA;AACpB,CAAA;AA/JM,IAAM,gBAAN,GAAA;AAkKP,KAAK,SAAA,CAAU,OAAO,SAAU,CAAA;AAAA,EAC/B,IAAM,EAAA,mBAAA;AAAA,EACN,KAAO,EAAA,gBAAA;AAAA,EACP,KAAO,EAAA;AACR,CAAC,CAAA","file":"ClientPermissions.mjs","sourcesContent":["import { container } from '@sapphire/pieces';\nimport { isNullish } from '@sapphire/utilities';\nimport {\n\tBaseInteraction,\n\tChatInputCommandInteraction,\n\tContextMenuCommandInteraction,\n\tPermissionFlagsBits,\n\tPermissionsBitField,\n\ttype Message,\n\ttype PermissionsString,\n\ttype TextBasedChannel\n} from 'discord.js';\nimport { Identifiers } from '../lib/errors/Identifiers';\nimport type { Command } from '../lib/structures/Command';\nimport { AllFlowsPrecondition } from '../lib/structures/Precondition';\n\nexport interface PermissionPreconditionContext extends AllFlowsPrecondition.Context {\n\tpermissions?: PermissionsBitField;\n}\n\nexport class CorePrecondition extends AllFlowsPrecondition {\n\tprivate readonly dmChannelPermissions = new PermissionsBitField(\n\t\t~new PermissionsBitField([\n\t\t\t//\n\t\t\tPermissionFlagsBits.AddReactions,\n\t\t\tPermissionFlagsBits.AttachFiles,\n\t\t\tPermissionFlagsBits.EmbedLinks,\n\t\t\tPermissionFlagsBits.ReadMessageHistory,\n\t\t\tPermissionFlagsBits.SendMessages,\n\t\t\tPermissionFlagsBits.UseExternalEmojis,\n\t\t\tPermissionFlagsBits.ViewChannel\n\t\t]).bitfield & PermissionsBitField.All\n\t).freeze();\n\n\tpublic async messageRun(message: Message, _: Command, context: PermissionPreconditionContext): AllFlowsPrecondition.AsyncResult {\n\t\tconst required = context.permissions ?? new PermissionsBitField();\n\t\tconst { channel } = message;\n\n\t\tif (!message.client.id) {\n\t\t\treturn this.error({\n\t\t\t\tidentifier: Identifiers.PreconditionClientPermissionsNoClient,\n\t\t\t\tmessage: 'There was no client to validate the permissions for.'\n\t\t\t});\n\t\t}\n\n\t\tconst permissions = await this.getPermissionsForChannel(channel, message);\n\n\t\treturn this.sharedRun(required, permissions, 'message');\n\t}\n\n\tpublic async chatInputRun(\n\t\tinteraction: ChatInputCommandInteraction,\n\t\t_: Command,\n\t\tcontext: PermissionPreconditionContext\n\t): AllFlowsPrecondition.AsyncResult {\n\t\tconst required = context.permissions ?? new PermissionsBitField();\n\n\t\tconst availablePermissions = await this.getAvailablePermissions(interaction);\n\n\t\treturn this.sharedRun(required, availablePermissions, 'chat input');\n\t}\n\n\tpublic async contextMenuRun(\n\t\tinteraction: ContextMenuCommandInteraction,\n\t\t_: Command,\n\t\tcontext: PermissionPreconditionContext\n\t): AllFlowsPrecondition.AsyncResult {\n\t\tconst required = context.permissions ?? new PermissionsBitField();\n\n\t\tconst availablePermissions = await this.getAvailablePermissions(interaction);\n\n\t\treturn this.sharedRun(required, availablePermissions, 'context menu');\n\t}\n\n\tprivate async getPermissionsForChannel(channel: TextBasedChannel, messageOrInteraction: Message | BaseInteraction) {\n\t\tlet permissions: PermissionsBitField | null = this.dmChannelPermissions;\n\n\t\tif (messageOrInteraction.inGuild() && !channel.isDMBased()) {\n\t\t\tif (isNullish(messageOrInteraction.applicationId)) {\n\t\t\t\tconst me = await messageOrInteraction.guild?.members.fetchMe();\n\t\t\t\tif (me) {\n\t\t\t\t\tpermissions = channel.permissionsFor(me);\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tpermissions = channel.permissionsFor(messageOrInteraction.applicationId);\n\t\t\t\tif (isNullish(permissions)) {\n\t\t\t\t\tconst me = await messageOrInteraction.guild?.members.fetchMe();\n\t\t\t\t\tif (me) {\n\t\t\t\t\t\tpermissions = channel.permissionsFor(me);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn permissions;\n\t}\n\n\tprivate sharedRun(requiredPermissions: PermissionsBitField, availablePermissions: PermissionsBitField | null, commandType: string) {\n\t\tif (!availablePermissions) {\n\t\t\treturn this.error({\n\t\t\t\tidentifier: Identifiers.PreconditionClientPermissionsNoPermissions,\n\t\t\t\tmessage: `I was unable to resolve my permissions in the ${commandType} command invocation channel.`\n\t\t\t});\n\t\t}\n\n\t\tconst missing = availablePermissions.missing(requiredPermissions);\n\t\treturn missing.length === 0\n\t\t\t? this.ok()\n\t\t\t: this.error({\n\t\t\t\t\tidentifier: Identifiers.PreconditionClientPermissions,\n\t\t\t\t\tmessage: `I am missing the following permissions to run this command: ${missing\n\t\t\t\t\t\t.map((perm) => CorePrecondition.readablePermissions[perm])\n\t\t\t\t\t\t.join(', ')}`,\n\t\t\t\t\tcontext: { missing }\n\t\t\t\t});\n\t}\n\n\tprivate async getAvailablePermissions(interaction: ChatInputCommandInteraction | ContextMenuCommandInteraction) {\n\t\tif (interaction.channel) {\n\t\t\tif (interaction.channel.isDMBased()) return this.dmChannelPermissions;\n\n\t\t\tconst channel = await this.fetchChannelFromInteraction(interaction);\n\t\t\treturn this.getPermissionsForChannel(channel, interaction);\n\t\t}\n\n\t\treturn interaction.appPermissions;\n\t}\n\n\tpublic static readonly readablePermissions: Record<PermissionsString, string> = {\n\t\tAddReactions: 'Add Reactions',\n\t\tAdministrator: 'Administrator',\n\t\tAttachFiles: 'Attach Files',\n\t\tBanMembers: 'Ban Members',\n\t\tChangeNickname: 'Change Nickname',\n\t\tConnect: 'Connect',\n\t\tCreateEvents: 'Create Events',\n\t\tCreateGuildExpressions: 'Create Expressions',\n\t\tCreateInstantInvite: 'Create Instant Invite',\n\t\tCreatePrivateThreads: 'Create Private Threads',\n\t\tCreatePublicThreads: 'Create Public Threads',\n\t\tDeafenMembers: 'Deafen Members',\n\t\tEmbedLinks: 'Embed Links',\n\t\tKickMembers: 'Kick Members',\n\t\tManageChannels: 'Manage Channels',\n\t\tManageEmojisAndStickers: 'Manage Emojis and Stickers',\n\t\tManageEvents: 'Manage Events',\n\t\tManageGuild: 'Manage Server',\n\t\tManageGuildExpressions: 'Manage Guild Expressions',\n\t\tManageMessages: 'Manage Messages',\n\t\tManageNicknames: 'Manage Nicknames',\n\t\tManageRoles: 'Manage Roles',\n\t\tManageThreads: 'Manage Threads',\n\t\tManageWebhooks: 'Manage Webhooks',\n\t\tMentionEveryone: 'Mention Everyone',\n\t\tModerateMembers: 'Moderate Members',\n\t\tMoveMembers: 'Move Members',\n\t\tMuteMembers: 'Mute Members',\n\t\tPrioritySpeaker: 'Priority Speaker',\n\t\tReadMessageHistory: 'Read Message History',\n\t\tRequestToSpeak: 'Request to Speak',\n\t\tSendMessages: 'Send Messages',\n\t\tSendMessagesInThreads: 'Send Messages in Threads',\n\t\tSendPolls: 'Create Polls',\n\t\tSendTTSMessages: 'Send TTS Messages',\n\t\tSendVoiceMessages: 'Send Voice Messages',\n\t\tSpeak: 'Speak',\n\t\tStream: 'Stream',\n\t\tUseApplicationCommands: 'Use Application Commands',\n\t\tUseEmbeddedActivities: 'Start Activities',\n\t\tUseExternalApps: 'Use External Apps',\n\t\tUseExternalEmojis: 'Use External Emojis',\n\t\tUseExternalSounds: 'Use External Sounds',\n\t\tUseExternalStickers: 'Use External Stickers',\n\t\tUseSoundboard: 'Use Soundboard',\n\t\tUseVAD: 'Use Voice Activity',\n\t\tViewAuditLog: 'View Audit Log',\n\t\tViewChannel: 'Read Messages',\n\t\tViewCreatorMonetizationAnalytics: 'View Creator Monetization Analytics',\n\t\tViewGuildInsights: 'View Guild Insights'\n\t};\n}\n\nvoid container.stores.loadPiece({\n\tname: 'ClientPermissions',\n\tpiece: CorePrecondition,\n\tstore: 'preconditions'\n});\n"]}