mirror of
https://github.com/tiramisulabs/seyfert.git
synced 2025-07-03 05:26:07 +00:00
feat: onBotPermissionsFail
This commit is contained in:
parent
1c06184b53
commit
43cb84f54f
@ -30,7 +30,7 @@ export async function onInteractionCreate(
|
|||||||
{
|
{
|
||||||
const parentCommand = self.commands?.values.find(x => {
|
const parentCommand = self.commands?.values.find(x => {
|
||||||
if (body.data.guild_id) {
|
if (body.data.guild_id) {
|
||||||
return x.guild_id?.includes(body.data.guild_id) && x.name === body.data.name;
|
return x.guildId?.includes(body.data.guild_id) && x.name === body.data.name;
|
||||||
}
|
}
|
||||||
return x.name === body.data.name;
|
return x.name === body.data.name;
|
||||||
});
|
});
|
||||||
@ -78,7 +78,7 @@ export async function onInteractionCreate(
|
|||||||
{
|
{
|
||||||
const command = self.commands?.values.find(x => {
|
const command = self.commands?.values.find(x => {
|
||||||
if (body.data.guild_id) {
|
if (body.data.guild_id) {
|
||||||
return x.guild_id?.includes(body.data.guild_id) && x.name === body.data.name;
|
return x.guildId?.includes(body.data.guild_id) && x.name === body.data.name;
|
||||||
}
|
}
|
||||||
return x.name === body.data.name;
|
return x.name === body.data.name;
|
||||||
}) as ContextMenuCommand;
|
}) as ContextMenuCommand;
|
||||||
@ -96,8 +96,8 @@ export async function onInteractionCreate(
|
|||||||
const permissions = interaction.appPermissions.missings(
|
const permissions = interaction.appPermissions.missings(
|
||||||
...interaction.appPermissions.values([command.botPermissions]),
|
...interaction.appPermissions.values([command.botPermissions]),
|
||||||
);
|
);
|
||||||
if (permissions.length) {
|
if (!interaction.appPermissions.has('Administrator') && permissions.length) {
|
||||||
return command.onPermissionsFail?.(context, interaction.appPermissions.keys(permissions));
|
return command.onBotPermissionsFail?.(context, interaction.appPermissions.keys(permissions));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
const resultRunGlobalMiddlewares = await command.__runGlobalMiddlewares(context);
|
const resultRunGlobalMiddlewares = await command.__runGlobalMiddlewares(context);
|
||||||
@ -136,7 +136,7 @@ export async function onInteractionCreate(
|
|||||||
{
|
{
|
||||||
const parentCommand = self.commands?.values.find(x => {
|
const parentCommand = self.commands?.values.find(x => {
|
||||||
if (body.data.guild_id) {
|
if (body.data.guild_id) {
|
||||||
return x.guild_id?.includes(body.data.guild_id) && x.name === body.data.name;
|
return x.guildId?.includes(body.data.guild_id) && x.name === body.data.name;
|
||||||
}
|
}
|
||||||
return x.name === body.data.name;
|
return x.name === body.data.name;
|
||||||
});
|
});
|
||||||
@ -159,8 +159,8 @@ export async function onInteractionCreate(
|
|||||||
const permissions = interaction.appPermissions.missings(
|
const permissions = interaction.appPermissions.missings(
|
||||||
...interaction.appPermissions.values([command.botPermissions]),
|
...interaction.appPermissions.values([command.botPermissions]),
|
||||||
);
|
);
|
||||||
if (permissions.length) {
|
if (!interaction.appPermissions.has('Administrator') && permissions.length) {
|
||||||
return command.onPermissionsFail?.(context, interaction.appPermissions.keys(permissions));
|
return command.onBotPermissionsFail?.(context, interaction.appPermissions.keys(permissions));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
const [erroredOptions, result] = await command.__runOptions(context, optionsResolver);
|
const [erroredOptions, result] = await command.__runOptions(context, optionsResolver);
|
||||||
|
@ -91,7 +91,7 @@ export async function onMessageCreate(
|
|||||||
if (!command.run) return self.logger.warn(`${fullCommandName} command does not have 'run' callback`);
|
if (!command.run) return self.logger.warn(`${fullCommandName} command does not have 'run' callback`);
|
||||||
|
|
||||||
if (!command.contexts?.includes(InteractionContextTypes.BOT_DM) && !message.guildId) return;
|
if (!command.contexts?.includes(InteractionContextTypes.BOT_DM) && !message.guildId) return;
|
||||||
if (command.guild_id && !command.guild_id?.includes(message.guildId!)) return;
|
if (command.guildId && !command.guildId?.includes(message.guildId!)) return;
|
||||||
|
|
||||||
const resolved: MakeRequired<ContextOptionsResolved> = {
|
const resolved: MakeRequired<ContextOptionsResolved> = {
|
||||||
channels: {},
|
channels: {},
|
||||||
@ -108,13 +108,20 @@ export async function onMessageCreate(
|
|||||||
const extendContext = self.options?.context?.(message) ?? {};
|
const extendContext = self.options?.context?.(message) ?? {};
|
||||||
Object.assign(context, extendContext);
|
Object.assign(context, extendContext);
|
||||||
try {
|
try {
|
||||||
|
if (command.defaultMemberPermissions && message.guildId) {
|
||||||
|
const memberPermissions = await self.members.permissions(message.guildId, message.author.id);
|
||||||
|
const permissions = memberPermissions.missings(...memberPermissions.values([command.defaultMemberPermissions]));
|
||||||
|
if (!memberPermissions.has('Administrator') && permissions.length) {
|
||||||
|
return command.onPermissionsFail?.(context, memberPermissions.keys(permissions));
|
||||||
|
}
|
||||||
|
}
|
||||||
if (command.botPermissions && message.guildId) {
|
if (command.botPermissions && message.guildId) {
|
||||||
const meMember = await self.cache.members?.get(self.botId, message.guildId);
|
const meMember = await self.cache.members?.get(self.botId, message.guildId);
|
||||||
if (!meMember) return; //enable member cache and "Guilds" intent, lol
|
if (!meMember) return; //enable member cache and "Guilds" intent, lol
|
||||||
const appPermissions = await meMember.fetchPermissions();
|
const appPermissions = await meMember.fetchPermissions();
|
||||||
const permissions = appPermissions.missings(...appPermissions.values([command.botPermissions]));
|
const permissions = appPermissions.missings(...appPermissions.values([command.botPermissions]));
|
||||||
if (permissions.length) {
|
if (!appPermissions.has('Administrator') && permissions.length) {
|
||||||
return command.onPermissionsFail?.(context, appPermissions.keys(permissions));
|
return command.onBotPermissionsFail?.(context, appPermissions.keys(permissions));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (errors.length) {
|
if (errors.length) {
|
||||||
|
@ -1,14 +1,14 @@
|
|||||||
import {
|
import {
|
||||||
|
ApplicationCommandOptionType,
|
||||||
|
ApplicationCommandType,
|
||||||
type APIApplicationCommandBasicOption,
|
type APIApplicationCommandBasicOption,
|
||||||
type APIApplicationCommandOption,
|
type APIApplicationCommandOption,
|
||||||
type APIApplicationCommandSubcommandGroupOption,
|
type APIApplicationCommandSubcommandGroupOption,
|
||||||
ApplicationCommandOptionType,
|
|
||||||
ApplicationCommandType,
|
|
||||||
type LocaleString,
|
type LocaleString,
|
||||||
} from 'discord-api-types/v10';
|
} from 'discord-api-types/v10';
|
||||||
import type { PermissionStrings, SeyfertNumberOption, SeyfertStringOption } from '../..';
|
import type { PermissionStrings, SeyfertNumberOption, SeyfertStringOption } from '../..';
|
||||||
import type { Attachment } from '../../builders';
|
import type { Attachment } from '../../builders';
|
||||||
import { type FlatObjectKeys, magicImport } from '../../common';
|
import { magicImport, type FlatObjectKeys } from '../../common';
|
||||||
import type { AllChannels, AutocompleteInteraction, GuildRole, InteractionGuildMember, User } from '../../structures';
|
import type { AllChannels, AutocompleteInteraction, GuildRole, InteractionGuildMember, User } from '../../structures';
|
||||||
import type { Groups, IntegrationTypes, InteractionContextTypes, RegisteredMiddlewares } from '../decorators';
|
import type { Groups, IntegrationTypes, InteractionContextTypes, RegisteredMiddlewares } from '../decorators';
|
||||||
import type { OptionResolver } from '../optionresolver';
|
import type { OptionResolver } from '../optionresolver';
|
||||||
@ -117,13 +117,13 @@ class BaseCommand {
|
|||||||
}
|
}
|
||||||
>;
|
>;
|
||||||
|
|
||||||
guild_id?: string[];
|
guildId?: string[];
|
||||||
name!: string;
|
name!: string;
|
||||||
type!: number; // ApplicationCommandType.ChatInput | ApplicationCommandOptionType.Subcommand
|
type!: number; // ApplicationCommandType.ChatInput | ApplicationCommandOptionType.Subcommand
|
||||||
nsfw?: boolean;
|
nsfw?: boolean;
|
||||||
description!: string;
|
description!: string;
|
||||||
default_member_permissions?: string;
|
defaultMemberPermissions?: bigint;
|
||||||
integration_types?: IntegrationTypes[];
|
integrationTypes?: IntegrationTypes[];
|
||||||
contexts?: InteractionContextTypes[];
|
contexts?: InteractionContextTypes[];
|
||||||
botPermissions?: bigint;
|
botPermissions?: bigint;
|
||||||
name_localizations?: Partial<Record<LocaleString, string>>;
|
name_localizations?: Partial<Record<LocaleString, string>>;
|
||||||
@ -247,10 +247,10 @@ class BaseCommand {
|
|||||||
description: this.description,
|
description: this.description,
|
||||||
name_localizations: this.name_localizations,
|
name_localizations: this.name_localizations,
|
||||||
description_localizations: this.description_localizations,
|
description_localizations: this.description_localizations,
|
||||||
guild_id: this.guild_id,
|
guild_id: this.guildId,
|
||||||
default_member_permissions: this.default_member_permissions,
|
default_member_permissions: this.defaultMemberPermissions ? this.defaultMemberPermissions.toString() : '',
|
||||||
contexts: this.contexts,
|
contexts: this.contexts,
|
||||||
integration_types: this.integration_types,
|
integration_types: this.integrationTypes,
|
||||||
} as {
|
} as {
|
||||||
name: BaseCommand['name'];
|
name: BaseCommand['name'];
|
||||||
type: BaseCommand['type'];
|
type: BaseCommand['type'];
|
||||||
@ -258,10 +258,10 @@ class BaseCommand {
|
|||||||
description: BaseCommand['description'];
|
description: BaseCommand['description'];
|
||||||
name_localizations: BaseCommand['name_localizations'];
|
name_localizations: BaseCommand['name_localizations'];
|
||||||
description_localizations: BaseCommand['description_localizations'];
|
description_localizations: BaseCommand['description_localizations'];
|
||||||
guild_id: BaseCommand['guild_id'];
|
guild_id: BaseCommand['guildId'];
|
||||||
default_member_permissions: BaseCommand['default_member_permissions'];
|
default_member_permissions: string;
|
||||||
contexts: BaseCommand['contexts'];
|
contexts: BaseCommand['contexts'];
|
||||||
integration_types: BaseCommand['integration_types'];
|
integration_types: BaseCommand['integrationTypes'];
|
||||||
};
|
};
|
||||||
return data;
|
return data;
|
||||||
}
|
}
|
||||||
@ -284,6 +284,7 @@ class BaseCommand {
|
|||||||
onRunError?(context: CommandContext<any>, error: unknown): any;
|
onRunError?(context: CommandContext<any>, error: unknown): any;
|
||||||
onOptionsError?(context: CommandContext<{}, never>, metadata: OnOptionsReturnObject): any;
|
onOptionsError?(context: CommandContext<{}, never>, metadata: OnOptionsReturnObject): any;
|
||||||
onMiddlewaresError?(context: CommandContext<{}, never>, error: string): any;
|
onMiddlewaresError?(context: CommandContext<{}, never>, error: string): any;
|
||||||
|
onBotPermissionsFail?(context: CommandContext<{}, never>, permissions: PermissionStrings): any;
|
||||||
onPermissionsFail?(context: CommandContext<{}, never>, permissions: PermissionStrings): any;
|
onPermissionsFail?(context: CommandContext<{}, never>, permissions: PermissionStrings): any;
|
||||||
onInternalError?(client: UsingClient, error?: unknown): any;
|
onInternalError?(client: UsingClient, error?: unknown): any;
|
||||||
}
|
}
|
||||||
@ -333,6 +334,9 @@ export class Command extends BaseCommand {
|
|||||||
onMiddlewaresError(context: CommandContext<{}, never>, error: string): any {
|
onMiddlewaresError(context: CommandContext<{}, never>, error: string): any {
|
||||||
context.client.logger.fatal(`${this.name}.<onMiddlewaresError>`, context.author.id, error);
|
context.client.logger.fatal(`${this.name}.<onMiddlewaresError>`, context.author.id, error);
|
||||||
}
|
}
|
||||||
|
onBotPermissionsFail(context: CommandContext<{}, never>, permissions: PermissionStrings): any {
|
||||||
|
context.client.logger.fatal(`${this.name}.<onBotPermissionsFail>`, context.author.id, permissions);
|
||||||
|
}
|
||||||
onPermissionsFail(context: CommandContext<{}, never>, permissions: PermissionStrings): any {
|
onPermissionsFail(context: CommandContext<{}, never>, permissions: PermissionStrings): any {
|
||||||
context.client.logger.fatal(`${this.name}.<onPermissionsFail>`, context.author.id, permissions);
|
context.client.logger.fatal(`${this.name}.<onPermissionsFail>`, context.author.id, permissions);
|
||||||
}
|
}
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
import type { ApplicationCommandType, LocaleString } from 'discord-api-types/v10';
|
import type { ApplicationCommandType, LocaleString } from 'discord-api-types/v10';
|
||||||
import { type PermissionStrings, magicImport } from '../../common';
|
import { magicImport, type PermissionStrings } from '../../common';
|
||||||
import type { IntegrationTypes, InteractionContextTypes, RegisteredMiddlewares } from '../decorators';
|
import type { IntegrationTypes, InteractionContextTypes, RegisteredMiddlewares } from '../decorators';
|
||||||
import type { MenuCommandContext } from './menucontext';
|
import type { MenuCommandContext } from './menucontext';
|
||||||
import type { PassFunction, StopFunction, UsingClient } from './shared';
|
import type { PassFunction, StopFunction, UsingClient } from './shared';
|
||||||
@ -10,14 +10,14 @@ export abstract class ContextMenuCommand {
|
|||||||
__filePath?: string;
|
__filePath?: string;
|
||||||
__t?: { name: string | undefined; description: string | undefined };
|
__t?: { name: string | undefined; description: string | undefined };
|
||||||
|
|
||||||
guild_id?: string[];
|
guildId?: string[];
|
||||||
name!: string;
|
name!: string;
|
||||||
type!: ApplicationCommandType.User | ApplicationCommandType.Message;
|
type!: ApplicationCommandType.User | ApplicationCommandType.Message;
|
||||||
nsfw?: boolean;
|
nsfw?: boolean;
|
||||||
integration_types?: IntegrationTypes[];
|
integrationTypes?: IntegrationTypes[];
|
||||||
contexts?: InteractionContextTypes[];
|
contexts?: InteractionContextTypes[];
|
||||||
description!: string;
|
description!: string;
|
||||||
default_member_permissions?: string;
|
defaultMemberPermissions?: string;
|
||||||
botPermissions?: bigint;
|
botPermissions?: bigint;
|
||||||
dm?: boolean;
|
dm?: boolean;
|
||||||
name_localizations?: Partial<Record<LocaleString, string>>;
|
name_localizations?: Partial<Record<LocaleString, string>>;
|
||||||
@ -91,11 +91,11 @@ export abstract class ContextMenuCommand {
|
|||||||
description: this.description,
|
description: this.description,
|
||||||
name_localizations: this.name_localizations,
|
name_localizations: this.name_localizations,
|
||||||
description_localizations: this.description_localizations,
|
description_localizations: this.description_localizations,
|
||||||
guild_id: this.guild_id,
|
guild_id: this.guildId,
|
||||||
dm_permission: this.dm,
|
dm_permission: this.dm,
|
||||||
default_member_permissions: this.default_member_permissions,
|
default_member_permissions: this.defaultMemberPermissions,
|
||||||
contexts: this.contexts,
|
contexts: this.contexts,
|
||||||
integration_types: this.integration_types,
|
integration_types: this.integrationTypes,
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -114,6 +114,9 @@ export abstract class ContextMenuCommand {
|
|||||||
onMiddlewaresError(context: MenuCommandContext<any, never>, error: string): any {
|
onMiddlewaresError(context: MenuCommandContext<any, never>, error: string): any {
|
||||||
context.client.logger.fatal(`${this.name}.<onMiddlewaresError>`, context.author.id, error);
|
context.client.logger.fatal(`${this.name}.<onMiddlewaresError>`, context.author.id, error);
|
||||||
}
|
}
|
||||||
|
onBotPermissionsFail(context: MenuCommandContext<any, never>, permissions: PermissionStrings): any {
|
||||||
|
context.client.logger.fatal(`${this.name}.<onBotPermissionsFail>`, context.author.id, permissions);
|
||||||
|
}
|
||||||
onPermissionsFail(context: MenuCommandContext<any, never>, permissions: PermissionStrings): any {
|
onPermissionsFail(context: MenuCommandContext<any, never>, permissions: PermissionStrings): any {
|
||||||
context.client.logger.fatal(`${this.name}.<onPermissionsFail>`, context.author.id, permissions);
|
context.client.logger.fatal(`${this.name}.<onPermissionsFail>`, context.author.id, permissions);
|
||||||
}
|
}
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
import { ApplicationCommandType, type LocaleString, PermissionFlagsBits } from 'discord-api-types/v10';
|
import { ApplicationCommandType, PermissionFlagsBits, type LocaleString } from 'discord-api-types/v10';
|
||||||
import type { FlatObjectKeys, PermissionStrings } from '../common';
|
import type { FlatObjectKeys, PermissionStrings } from '../common';
|
||||||
import type { CommandOption, OptionsRecord, SubCommand } from './applications/chat';
|
import type { CommandOption, OptionsRecord, SubCommand } from './applications/chat';
|
||||||
import type { DefaultLocale, MiddlewareContext } from './applications/shared';
|
import type { DefaultLocale, MiddlewareContext } from './applications/shared';
|
||||||
@ -140,21 +140,21 @@ export function Declare(declare: DeclareOptions) {
|
|||||||
name = declare.name;
|
name = declare.name;
|
||||||
nsfw = declare.nsfw;
|
nsfw = declare.nsfw;
|
||||||
contexts = declare.contexts?.map(i => InteractionContextTypes[i]);
|
contexts = declare.contexts?.map(i => InteractionContextTypes[i]);
|
||||||
integration_types = declare.integrationTypes?.map(i => IntegrationTypes[i]);
|
integrationTypes = declare.integrationTypes?.map(i => IntegrationTypes[i]);
|
||||||
default_member_permissions = Array.isArray(declare.defaultMemberPermissions)
|
defaultMemberPermissions = Array.isArray(declare.defaultMemberPermissions)
|
||||||
? declare.defaultMemberPermissions?.reduce((acc, prev) => acc | PermissionFlagsBits[prev], BigInt(0)).toString()
|
? declare.defaultMemberPermissions?.reduce((acc, prev) => acc | PermissionFlagsBits[prev], BigInt(0))
|
||||||
: declare.defaultMemberPermissions;
|
: declare.defaultMemberPermissions;
|
||||||
botPermissions = Array.isArray(declare.botPermissions)
|
botPermissions = Array.isArray(declare.botPermissions)
|
||||||
? declare.botPermissions?.reduce((acc, prev) => acc | PermissionFlagsBits[prev], BigInt(0))
|
? declare.botPermissions?.reduce((acc, prev) => acc | PermissionFlagsBits[prev], BigInt(0))
|
||||||
: declare.botPermissions;
|
: declare.botPermissions;
|
||||||
description = '';
|
description = '';
|
||||||
type: ApplicationCommandType = ApplicationCommandType.ChatInput;
|
type: ApplicationCommandType = ApplicationCommandType.ChatInput;
|
||||||
guild_id?: string[];
|
guildId?: string[];
|
||||||
constructor(...args: any[]) {
|
constructor(...args: any[]) {
|
||||||
super(...args);
|
super(...args);
|
||||||
if ('description' in declare) this.description = declare.description;
|
if ('description' in declare) this.description = declare.description;
|
||||||
if ('type' in declare) this.type = declare.type;
|
if ('type' in declare) this.type = declare.type;
|
||||||
if ('guildId' in declare) this.guild_id = declare.guildId;
|
if ('guildId' in declare) this.guildId = declare.guildId;
|
||||||
// check if all properties are valid
|
// check if all properties are valid
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
@ -109,6 +109,8 @@ export class CommandHandler extends BaseHandler {
|
|||||||
option.onInternalError =
|
option.onInternalError =
|
||||||
option.onInternalError?.bind(option) ?? commandInstance.onInternalError?.bind(commandInstance);
|
option.onInternalError?.bind(option) ?? commandInstance.onInternalError?.bind(commandInstance);
|
||||||
option.onAfterRun = option.onAfterRun?.bind(option) ?? commandInstance.onAfterRun?.bind(commandInstance);
|
option.onAfterRun = option.onAfterRun?.bind(option) ?? commandInstance.onAfterRun?.bind(commandInstance);
|
||||||
|
option.onBotPermissionsFail =
|
||||||
|
option.onBotPermissionsFail?.bind(option) ?? commandInstance.onBotPermissionsFail?.bind(commandInstance);
|
||||||
option.onPermissionsFail =
|
option.onPermissionsFail =
|
||||||
option.onPermissionsFail?.bind(option) ?? commandInstance.onPermissionsFail?.bind(commandInstance);
|
option.onPermissionsFail?.bind(option) ?? commandInstance.onPermissionsFail?.bind(commandInstance);
|
||||||
}
|
}
|
||||||
|
@ -6,7 +6,7 @@ export class PermissionsBitField extends BitField<typeof PermissionFlagsBits> {
|
|||||||
Flags = PermissionFlagsBits;
|
Flags = PermissionFlagsBits;
|
||||||
static All = Object.values(PermissionFlagsBits).reduce((acc, value) => acc | value, 0n);
|
static All = Object.values(PermissionFlagsBits).reduce((acc, value) => acc | value, 0n);
|
||||||
|
|
||||||
declare keys: (bits: BitFieldResolvable<typeof PermissionFlagsBits>[]) => PermissionStrings;
|
declare keys: (bits?: BitFieldResolvable<typeof PermissionFlagsBits>[]) => PermissionStrings;
|
||||||
|
|
||||||
has(...bits: BitFieldResolvable<typeof PermissionFlagsBits>[]) {
|
has(...bits: BitFieldResolvable<typeof PermissionFlagsBits>[]) {
|
||||||
return super.has(...bits) || super.has('Administrator');
|
return super.has(...bits) || super.has('Administrator');
|
||||||
|
Loading…
x
Reference in New Issue
Block a user