import "reflect-metadata"; import { Message, PermissionFlags, type PermissionString } from "@fluxerjs/core"; import { GetMemeberPermission } from "@/utils"; export interface RequireUserPermissionMeta { permissions: PermissionString[]; mode?: "all" | "any"; } export const GUARDS_KEY = Symbol("fluxer:guards"); export type Guard = (msg: Message) => boolean | Promise; export function RequireNonBot(): Guard { return (msg) => !msg.author.bot; } export function RequirePrefix(prefix: string): Guard { return (msg) => msg.content.startsWith(prefix); } export function RequireUserPermission(meta: RequireUserPermissionMeta): Guard { return async (msg) => { const permission = await GetMemeberPermission(msg); if (permission === null) return false; const check = meta.mode === "any" ? "some" : "every"; return meta.permissions[check]((flag) => permission.has(PermissionFlags[flag])); }; } export function RequireGuild(): Guard { return (msg) => msg.guild !== null; } export function RequireNonBotDecorator(): ClassDecorator { return (target) => { const guards: Guard[] = Reflect.getMetadata(GUARDS_KEY, target) ?? []; guards.push(RequireNonBot()); Reflect.defineMetadata(GUARDS_KEY, guards, target); }; } export function RequirePrefixDecorator(prefix: string): ClassDecorator { return (target) => { const guards: Guard[] = Reflect.getMetadata(GUARDS_KEY, target) ?? []; guards.push(RequirePrefix(prefix)); Reflect.defineMetadata(GUARDS_KEY, guards, target); }; } export function RequireUserPermissionDecorator(meta: RequireUserPermissionMeta): ClassDecorator { return (target) => { const guards: Guard[] = Reflect.getMetadata(GUARDS_KEY, target) ?? []; guards.push(RequireUserPermission(meta)); Reflect.defineMetadata(GUARDS_KEY, guards, target); }; } export function RequireGuildDecorator(): ClassDecorator { return (target) => { const guards: Guard[] = Reflect.getMetadata(GUARDS_KEY, target) ?? []; guards.push(RequireGuild()); Reflect.defineMetadata(GUARDS_KEY, guards, target); }; }