Yet another Fluxer bot built with TypeScript and Bun
at develop 64 lines 2.1 kB view raw
1import "reflect-metadata"; 2import { Message, PermissionFlags, type PermissionString } from "@fluxerjs/core"; 3import { GetMemeberPermission } from "@/utils"; 4 5export interface RequireUserPermissionMeta { 6 permissions: PermissionString[]; 7 mode?: "all" | "any"; 8} 9 10export const GUARDS_KEY = Symbol("fluxer:guards"); 11export type Guard = (msg: Message) => boolean | Promise<boolean>; 12 13export function RequireNonBot(): Guard { 14 return (msg) => !msg.author.bot; 15} 16 17export function RequirePrefix(prefix: string): Guard { 18 return (msg) => msg.content.startsWith(prefix); 19} 20 21export function RequireUserPermission(meta: RequireUserPermissionMeta): Guard { 22 return async (msg) => { 23 const permission = await GetMemeberPermission(msg); 24 if (permission === null) return false; 25 const check = meta.mode === "any" ? "some" : "every"; 26 return meta.permissions[check]((flag) => permission.has(PermissionFlags[flag])); 27 }; 28} 29 30export function RequireGuild(): Guard { 31 return (msg) => msg.guild !== null; 32} 33 34export function RequireNonBotDecorator(): ClassDecorator { 35 return (target) => { 36 const guards: Guard[] = Reflect.getMetadata(GUARDS_KEY, target) ?? []; 37 guards.push(RequireNonBot()); 38 Reflect.defineMetadata(GUARDS_KEY, guards, target); 39 }; 40} 41 42export function RequirePrefixDecorator(prefix: string): ClassDecorator { 43 return (target) => { 44 const guards: Guard[] = Reflect.getMetadata(GUARDS_KEY, target) ?? []; 45 guards.push(RequirePrefix(prefix)); 46 Reflect.defineMetadata(GUARDS_KEY, guards, target); 47 }; 48} 49 50export function RequireUserPermissionDecorator(meta: RequireUserPermissionMeta): ClassDecorator { 51 return (target) => { 52 const guards: Guard[] = Reflect.getMetadata(GUARDS_KEY, target) ?? []; 53 guards.push(RequireUserPermission(meta)); 54 Reflect.defineMetadata(GUARDS_KEY, guards, target); 55 }; 56} 57 58export function RequireGuildDecorator(): ClassDecorator { 59 return (target) => { 60 const guards: Guard[] = Reflect.getMetadata(GUARDS_KEY, target) ?? []; 61 guards.push(RequireGuild()); 62 Reflect.defineMetadata(GUARDS_KEY, guards, target); 63 }; 64}