From 65488918acf512deb5c9c989e201d4c6477f9b80 Mon Sep 17 00:00:00 2001 From: yuansheng1549 Date: Sun, 3 Nov 2024 18:19:19 +0800 Subject: [PATCH 1/2] fix(ClientPermissions): always return `this.ok` when channel is null --- src/preconditions/ClientPermissions.ts | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/preconditions/ClientPermissions.ts b/src/preconditions/ClientPermissions.ts index aa15c7f0a..053d32a79 100644 --- a/src/preconditions/ClientPermissions.ts +++ b/src/preconditions/ClientPermissions.ts @@ -55,6 +55,8 @@ export class CorePrecondition extends AllFlowsPrecondition { ): AllFlowsPrecondition.AsyncResult { const required = context.permissions ?? new PermissionsBitField(); + if (!interaction.channel) return this.ok(); // When using user-installable apps channel will be always null + const channel = await this.fetchChannelFromInteraction(interaction); const permissions = await this.getPermissionsForChannel(channel, interaction); @@ -69,6 +71,8 @@ export class CorePrecondition extends AllFlowsPrecondition { ): AllFlowsPrecondition.AsyncResult { const required = context.permissions ?? new PermissionsBitField(); + if (!interaction.channel) return this.ok(); // When using user-installable apps channel will be always null + const channel = await this.fetchChannelFromInteraction(interaction); const permissions = await this.getPermissionsForChannel(channel, interaction); From 9a78ac1c85f29c81f634deb222a1d9819e71634d Mon Sep 17 00:00:00 2001 From: yuansheng1549 Date: Sun, 3 Nov 2024 19:24:52 +0800 Subject: [PATCH 2/2] fix: resolve requested changes Co-authored-by: Aura --- src/preconditions/ClientPermissions.ts | 27 ++++++++++++++------------ 1 file changed, 15 insertions(+), 12 deletions(-) diff --git a/src/preconditions/ClientPermissions.ts b/src/preconditions/ClientPermissions.ts index 053d32a79..d88ee8e02 100644 --- a/src/preconditions/ClientPermissions.ts +++ b/src/preconditions/ClientPermissions.ts @@ -55,13 +55,9 @@ export class CorePrecondition extends AllFlowsPrecondition { ): AllFlowsPrecondition.AsyncResult { const required = context.permissions ?? new PermissionsBitField(); - if (!interaction.channel) return this.ok(); // When using user-installable apps channel will be always null + const availablePermissions = await this.getAvailablePermissions(interaction); - const channel = await this.fetchChannelFromInteraction(interaction); - - const permissions = await this.getPermissionsForChannel(channel, interaction); - - return this.sharedRun(required, permissions, 'chat input'); + return this.sharedRun(required, availablePermissions, 'chat input'); } public async contextMenuRun( @@ -71,13 +67,9 @@ export class CorePrecondition extends AllFlowsPrecondition { ): AllFlowsPrecondition.AsyncResult { const required = context.permissions ?? new PermissionsBitField(); - if (!interaction.channel) return this.ok(); // When using user-installable apps channel will be always null - - const channel = await this.fetchChannelFromInteraction(interaction); + const availablePermissions = await this.getAvailablePermissions(interaction); - const permissions = await this.getPermissionsForChannel(channel, interaction); - - return this.sharedRun(required, permissions, 'context menu'); + return this.sharedRun(required, availablePermissions, 'context menu'); } private async getPermissionsForChannel(channel: TextBasedChannel, messageOrInteraction: Message | BaseInteraction) { @@ -117,6 +109,17 @@ export class CorePrecondition extends AllFlowsPrecondition { }); } + private async getAvailablePermissions(interaction: ChatInputCommandInteraction | ContextMenuCommandInteraction) { + if (interaction.channel) { + if (interaction.channel.isDMBased()) return this.dmChannelPermissions; + + const channel = await this.fetchChannelFromInteraction(interaction); + return this.getPermissionsForChannel(channel, interaction); + } + + return interaction.appPermissions; + } + public static readonly readablePermissions: Record = { AddReactions: 'Add Reactions', Administrator: 'Administrator',