Yet another Fluxer bot built with TypeScript and Bun
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}