@pikokr/command.ts 5.0.0-dev.a0bc517 → 5.0.0-dev.d547cd1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (35) hide show
  1. package/dist/index.d.ts +107 -34
  2. package/dist/index.js +1 -1
  3. package/dist/index.js.map +1 -1
  4. package/package.json +6 -2
  5. package/publish-version.js +10 -0
  6. package/scripts/docs.ts +8 -8
  7. package/src/applicationCommand/ApplicationCommand.ts +14 -18
  8. package/src/applicationCommand/ApplicationCommandExtension.ts +169 -0
  9. package/src/applicationCommand/ApplicationCommandOption.ts +9 -2
  10. package/src/applicationCommand/index.ts +8 -0
  11. package/src/core/components/BaseComponent.ts +36 -14
  12. package/src/core/components/ComponentArgument.ts +8 -0
  13. package/src/core/components/ComponentArgumentDecorator.ts +8 -0
  14. package/src/core/components/decoratorCreator.ts +17 -3
  15. package/src/core/components/index.ts +13 -3
  16. package/src/core/converter/index.ts +16 -0
  17. package/src/core/extensions/CTSExtension.ts +17 -0
  18. package/src/core/extensions/Extension.ts +62 -0
  19. package/src/core/extensions/index.ts +9 -0
  20. package/src/core/hooks/componentHook.ts +40 -0
  21. package/src/core/hooks/index.ts +11 -1
  22. package/src/core/hooks/moduleHook.ts +11 -3
  23. package/src/core/index.ts +13 -1
  24. package/src/core/listener/index.ts +22 -2
  25. package/src/core/structures/CommandClient.ts +61 -4
  26. package/src/core/structures/Registry.ts +29 -5
  27. package/src/core/structures/index.ts +8 -0
  28. package/src/core/symbols.ts +13 -4
  29. package/src/core/utils/checks.ts +27 -0
  30. package/src/core/utils/errors.ts +9 -0
  31. package/src/core/utils/index.ts +10 -0
  32. package/src/index.ts +8 -8
  33. package/test/index.ts +40 -26
  34. package/tsconfig.prod.json +1 -0
  35. package/tsup.config.ts +8 -8
package/dist/index.d.ts CHANGED
@@ -1,5 +1,16 @@
1
- import { Collection, Client, ApplicationCommandType, APIApplicationCommandOption } from 'discord.js';
1
+ import * as discord_js from 'discord.js';
2
+ import { Collection, Snowflake, Interaction, ChatInputCommandInteraction, MessageContextMenuCommandInteraction, UserContextMenuCommandInteraction, Client, UserApplicationCommandData, MessageApplicationCommandData, ChatInputApplicationCommandData, ApplicationCommandType, APIApplicationCommandOption } from 'discord.js';
2
3
  import EventEmitter from 'events';
4
+ import * as tslog from 'tslog';
5
+ import { Logger } from 'tslog';
6
+
7
+ declare type ModuleHookStore = Collection<string, Function[]>;
8
+ declare const getModuleHookStore: (target: object) => ModuleHookStore;
9
+ declare const moduleHook: (name: string) => MethodDecorator;
10
+
11
+ declare type ComponentHookFn = (...args: any[]) => void | Promise<void>;
12
+ declare type ComponentHookStore = Collection<string, ComponentHookFn[]>;
13
+ declare const createComponentHook: (name: string, fn: ComponentHookFn) => MethodDecorator;
3
14
 
4
15
  declare class ComponentArgumentDecorator<Options = unknown> {
5
16
  options: Options;
@@ -13,32 +24,112 @@ declare class ComponentArgument {
13
24
  constructor(type: unknown);
14
25
  }
15
26
 
16
- declare class BaseComponent<Options = unknown, RequiredOptions = unknown> {
17
- options: Options & RequiredOptions;
27
+ declare class BaseComponent<Options = unknown, OptionsArg = Options> {
28
+ options: Options;
18
29
  method: Function;
30
+ hooks: ComponentHookStore;
19
31
  argTypes: Collection<number, ComponentArgument>;
20
- constructor(options: Partial<Options> & RequiredOptions, method: Function, argTypes: unknown[]);
21
- defaultOptions(): Options & Partial<RequiredOptions>;
22
- execute(target: object, args: unknown[]): any;
32
+ constructor(options: OptionsArg, method: Function, argTypes: unknown[]);
33
+ convertOptions(options: OptionsArg): Options;
34
+ executeHook(target: object, name: string, args: unknown[]): Promise<void>;
35
+ execute(target: object, args: unknown[], beforeCallArgs?: unknown[]): Promise<any>;
23
36
  }
24
37
 
25
38
  declare type ComponentStore = Collection<string | symbol, BaseComponent>;
26
39
  declare type ComponentArgumentStore = Collection<number, ComponentArgumentDecorator>;
27
40
  declare const getComponentStore: (target: object) => ComponentStore;
28
41
  declare const getComponent: (target: object, key: string | symbol) => BaseComponent<unknown, unknown> | undefined;
29
- declare const createComponentDecorator: <Options, RequiredOptions>(type: {
30
- new (options: Partial<Options> & RequiredOptions, method: Function, argTypes: unknown[]): BaseComponent<Options, RequiredOptions>;
31
- }) => (options: Partial<Options> & RequiredOptions) => MethodDecorator;
42
+ declare const createComponentDecorator: <Options, OptionArgs>(type: {
43
+ new (options: OptionArgs, method: Function, argTypes: unknown[]): BaseComponent<Options, OptionArgs>;
44
+ }) => (options: OptionArgs) => MethodDecorator;
32
45
  declare const getComponentArgumentStore: (target: object, key: string | symbol) => ComponentArgumentStore;
33
46
  declare const createArgumentDecorator: <Options>(type: {
34
47
  new (options: Partial<Options>): ComponentArgumentDecorator<Options>;
35
48
  }) => (options: Options) => ParameterDecorator;
36
49
 
50
+ declare type Options = {
51
+ component: typeof BaseComponent<unknown>;
52
+ type: Function;
53
+ parameterless: boolean;
54
+ };
55
+ declare class ConverterComponent extends BaseComponent<Options, Options & {
56
+ parameterless?: boolean;
57
+ }> {
58
+ }
59
+ declare const argConverter: (options: Options & {
60
+ parameterless?: boolean | undefined;
61
+ }) => MethodDecorator;
62
+
63
+ declare const createCheckDecorator: (fn: ComponentHookFn) => MethodDecorator;
64
+ declare const ownerOnly: MethodDecorator;
65
+
66
+ declare class OwnerOnlyError {
67
+ }
68
+
69
+ declare class ListenerComponent extends BaseComponent<{
70
+ emitter: string;
71
+ event: string;
72
+ }, {
73
+ emitter?: string;
74
+ event: string;
75
+ }> {
76
+ defaultOptions(): {
77
+ emitter: string;
78
+ };
79
+ constructor(options: ListenerComponent['options'], method: Function, argTypes: unknown[]);
80
+ }
81
+ declare const listener: (options: {
82
+ emitter?: string | undefined;
83
+ event: string;
84
+ }) => MethodDecorator;
85
+
86
+ declare class Extension {
87
+ protected get commandClient(): CommandClient;
88
+ protected get client(): discord_js.Client<boolean>;
89
+ protected _logger?: Logger;
90
+ protected get logger(): Logger;
91
+ protected convertArguments(component: typeof BaseComponent<unknown>, argList: unknown[], args: Collection<number, ComponentArgument>, getConverterArgs: (arg: ComponentArgument, index: number) => unknown[] | Promise<unknown[]>): Promise<void>;
92
+ }
93
+
94
+ declare class CTSExtension extends Extension {
95
+ protected get logger(): tslog.Logger;
96
+ }
97
+
98
+ declare type ApplicationCommandExtensionConfig = {
99
+ guilds?: Snowflake[];
100
+ };
101
+ declare class ApplicationCommandExtension extends CTSExtension {
102
+ config: ApplicationCommandExtensionConfig;
103
+ constructor(config: ApplicationCommandExtensionConfig);
104
+ interactionCreate(i: Interaction): Promise<void>;
105
+ load(): Promise<void>;
106
+ sync(): Promise<void>;
107
+ chatInteraction(i: ChatInputCommandInteraction): Promise<ChatInputCommandInteraction<discord_js.CacheType>>;
108
+ messageInteraction(i: MessageContextMenuCommandInteraction): Promise<MessageContextMenuCommandInteraction<discord_js.CacheType>>;
109
+ userInteraction(i: UserContextMenuCommandInteraction): Promise<UserContextMenuCommandInteraction<discord_js.CacheType>>;
110
+ }
111
+
112
+ declare class CommandClient extends EventEmitter {
113
+ discord: Client;
114
+ logger: Logger;
115
+ ctsLogger: Logger;
116
+ registry: Registry;
117
+ owners: Set<Snowflake>;
118
+ constructor(discord: Client, logger?: Logger);
119
+ fetchOwners(): Promise<void>;
120
+ enableApplicationCommandsExtension(config: ApplicationCommandExtensionConfig): Promise<void>;
121
+ getApplicationCommandsExtension(): ApplicationCommandExtension | undefined;
122
+ static getFromModule(ext: object): CommandClient;
123
+ }
124
+
37
125
  declare class Registry {
126
+ client: CommandClient;
38
127
  extensions: object[];
39
128
  emitters: Collection<string, EventEmitter>;
40
- getComponentsWithTypeGlobal<T extends typeof BaseComponent<Config, RequiredConfig>, Config, RequiredConfig>(type: T): InstanceType<T>[];
41
- getComponentsWithType<T extends typeof BaseComponent<Config, RequiredConfig>, Config, RequiredConfig>(ext: object, type: T): InstanceType<T>[];
129
+ logger: Logger;
130
+ constructor(logger: Logger, client: CommandClient);
131
+ getComponentsWithTypeGlobal<T extends typeof BaseComponent<Config>, Config>(type: T): InstanceType<T>[];
132
+ getComponentsWithType<T extends typeof BaseComponent<Config>, Config>(ext: object, type: T): InstanceType<T>[];
42
133
  registerEventListeners(ext: object): void;
43
134
  unregisterEventListeners(ext: object): void;
44
135
  registerModule(ext: object): Promise<void>;
@@ -47,32 +138,14 @@ declare class Registry {
47
138
  registerEventEmitter(name: string, emitter: EventEmitter): void;
48
139
  }
49
140
 
50
- declare class CommandClient extends EventEmitter {
51
- discord: Client;
52
- registry: Registry;
53
- constructor(discord: Client);
54
- }
55
-
56
- declare type ModuleHookStore = Collection<string | symbol, Function[]>;
57
- declare const getModuleHookStore: (target: object) => ModuleHookStore;
58
- declare const moduleHook: (name: string) => MethodDecorator;
59
-
60
- declare type ApplicationCommandOptions = {
141
+ declare class ApplicationCommandComponent extends BaseComponent<(UserApplicationCommandData | MessageApplicationCommandData | Omit<ChatInputApplicationCommandData, 'options'>) & {
61
142
  type: ApplicationCommandType;
62
- };
63
- declare type ApplicationCommandRequiredOptions = {
64
- name: string;
65
- description: string;
66
- };
67
- declare class ApplicationCommandComponent extends BaseComponent<ApplicationCommandOptions, ApplicationCommandRequiredOptions> {
68
- defaultOptions(): {
69
- type: ApplicationCommandType;
70
- };
143
+ }> {
71
144
  }
72
- declare const applicationCommand: (options: Partial<{
145
+ declare const applicationCommand: (options: (UserApplicationCommandData | MessageApplicationCommandData | Omit<ChatInputApplicationCommandData, "options">) & {
73
146
  type: ApplicationCommandType;
74
- }> & Partial<ApplicationCommandOptions> & ApplicationCommandRequiredOptions) => MethodDecorator;
147
+ }) => MethodDecorator;
75
148
 
76
149
  declare const option: (options: APIApplicationCommandOption) => ParameterDecorator;
77
150
 
78
- export { ApplicationCommandComponent, BaseComponent, CommandClient, Registry, applicationCommand, createArgumentDecorator, createComponentDecorator, getComponent, getComponentArgumentStore, getComponentStore, getModuleHookStore, moduleHook, option };
151
+ export { ApplicationCommandComponent, BaseComponent, CommandClient, ComponentArgument, ComponentArgumentDecorator, ComponentHookStore, ConverterComponent, Extension, ListenerComponent, OwnerOnlyError, Registry, applicationCommand, argConverter, createArgumentDecorator, createCheckDecorator, createComponentDecorator, createComponentHook, getComponent, getComponentArgumentStore, getComponentStore, getModuleHookStore, listener, moduleHook, option, ownerOnly };
package/dist/index.js CHANGED
@@ -1,2 +1,2 @@
1
- var z=Object.create;var l=Object.defineProperty;var F=Object.getOwnPropertyDescriptor;var J=Object.getOwnPropertyNames;var K=Object.getPrototypeOf,N=Object.prototype.hasOwnProperty;var T=e=>l(e,"__esModule",{value:!0}),n=(e,t)=>l(e,"name",{value:t,configurable:!0});var P=(e,t)=>{for(var o in t)l(e,o,{get:t[o],enumerable:!0})},L=(e,t,o,r)=>{if(t&&typeof t=="object"||typeof t=="function")for(let s of J(t))!N.call(e,s)&&(o||s!=="default")&&l(e,s,{get:()=>t[s],enumerable:!(r=F(t,s))||r.enumerable});return e},h=(e,t)=>L(T(l(e!=null?z(K(e)):{},"default",!t&&e&&e.__esModule?{get:()=>e.default,enumerable:!0}:{value:e,enumerable:!0})),e),Q=(e=>(t,o)=>e&&e.get(t)||(o=L(T({}),t,1),e&&e.set(t,o),o))(typeof WeakMap!="undefined"?new WeakMap:0);var Y={};P(Y,{ApplicationCommandComponent:()=>y,BaseComponent:()=>m,CommandClient:()=>w,Registry:()=>d,applicationCommand:()=>X,createArgumentDecorator:()=>E,createComponentDecorator:()=>u,getComponent:()=>U,getComponentArgumentStore:()=>v,getComponentStore:()=>a,getModuleHookStore:()=>x,moduleHook:()=>V,option:()=>G});var pt=require("reflect-metadata");var D=require("discord.js"),O=h(require("lodash"));var g=class{constructor(t){this.type=t,this.decorators=[]}};n(g,"ComponentArgument");var m=class{argTypes=new D.Collection;constructor(t,o,r){typeof t=="object"?this.options=O.default.merge(this.defaultOptions(),t):typeof t=="string"?this.options=t:this.options=null,this.method=o;for(let s=0;s<r.length;s++){let p=r[s];this.argTypes.set(s,new g(p))}}defaultOptions(){return{}}execute(t,o){return this.method.apply(t,o)}};n(m,"BaseComponent");var M=require("discord.js");var f=Symbol(),ot=Symbol(),C=Symbol(),rt=Symbol();var a=n(e=>{let t=Reflect.getMetadata(f,e);return t||(t=new M.Collection,Reflect.defineMetadata(f,t,e)),t},"getComponentStore"),U=n((e,t)=>a(e).get(t),"getComponent"),u=n(e=>t=>(o,r)=>{var s=new e(t,Reflect.get(o,r),Reflect.getMetadata("design:paramtypes",o,r));let p=a(o);v(o,r).forEach((I,q)=>{var H;(H=s.argTypes.get(q))==null||H.decorators.push(I)}),p.set(r,s)},"createComponentDecorator"),v=n((e,t)=>{let o=Reflect.getMetadata(f,e,t);return o||(o=new M.Collection,Reflect.defineMetadata(f,o,e,t)),o},"getComponentArgumentStore"),E=n(e=>t=>(o,r,s)=>{var p=new e(t);v(o,r).set(s,p)},"createArgumentDecorator");var k=require("discord.js"),A=h(require("lodash"));var W=require("discord.js");var x=n(e=>{let t=Reflect.getMetadata(C,e);return t||(t=new W.Collection,Reflect.defineMetadata(C,t,e)),t},"getModuleHookStore"),V=n(e=>(t,o)=>{let r=x(t),s=r.get(o);s||(s=[],r.set(o,s)),s.push(Reflect.get(t,o))},"moduleHook");var c=class extends m{defaultOptions(){return{emitter:"discord"}}};n(c,"ListenerComponent");var gt=u(c);var d=class{extensions=[];emitters=new k.Collection;getComponentsWithTypeGlobal(t){let o=[];for(let r of this.extensions)o.push(...this.getComponentsWithType(r,t));return o}getComponentsWithType(t,o){let r=a(t);return Array.from(r.filter(s=>s.constructor===o).values())}registerEventListeners(t){let o=this.getComponentsWithType(t,c);for(let r of o){let s=this.emitters.get(r.options.emitter);if(s){let p=r.method.bind(t);Reflect.defineMetadata("bound",p,r),s.addListener(r.options.event,p)}}}unregisterEventListeners(t){let o=this.getComponentsWithType(t,c);for(let r of o){let s=this.emitters.get(r.options.emitter),p=Reflect.getMetadata("bound",r);s&&p&&s.removeListener(r.options.event,p)}}async registerModule(t){this.registerEventListeners(t),await this.runModuleHook(t,"load"),this.extensions.push(t)}async unregisterModule(t){this.unregisterEventListeners(t),await this.runModuleHook(t,"unload"),A.default.remove(this.extensions,o=>o===t)}runModuleHook(t,o,...r){let p=x(t).get(o);if(p)for(let b of p)b.apply(t,r)}registerEventEmitter(t,o){this.emitters.set(t,o)}};n(d,"Registry");var _=h(require("events"));var w=class extends _.default{constructor(t){super();this.discord=t,this.registry=new d,this.registry.registerEventEmitter("cts",this),this.registry.registerEventEmitter("discord",this.discord)}};n(w,"CommandClient");var j=require("discord.js");var y=class extends m{defaultOptions(){return{type:j.ApplicationCommandType.ChatInput}}};n(y,"ApplicationCommandComponent");var X=u(y);var B=h(require("lodash")),S=class{constructor(t){typeof t=="object"?this.options=B.default.merge(this.defaultOptions(),t):this.options=t}defaultOptions(){return{}}};n(S,"ComponentArgumentDecorator");var R=class extends S{};n(R,"ApplicationCommandOption");var G=E(R);module.exports=Q(Y);0&&(module.exports={ApplicationCommandComponent,BaseComponent,CommandClient,Registry,applicationCommand,createArgumentDecorator,createComponentDecorator,getComponent,getComponentArgumentStore,getComponentStore,getModuleHookStore,moduleHook,option});
1
+ var Gt=Object.create;var S=Object.defineProperty;var zt=Object.getOwnPropertyDescriptor;var Zt=Object.getOwnPropertyNames,yt=Object.getOwnPropertySymbols,qt=Object.getPrototypeOf,xt=Object.prototype.hasOwnProperty,Jt=Object.prototype.propertyIsEnumerable;var Ct=(o,t,e)=>t in o?S(o,t,{enumerable:!0,configurable:!0,writable:!0,value:e}):o[t]=e,wt=(o,t)=>{for(var e in t||(t={}))xt.call(t,e)&&Ct(o,e,t[e]);if(yt)for(var e of yt(t))Jt.call(t,e)&&Ct(o,e,t[e]);return o};var bt=o=>S(o,"__esModule",{value:!0}),i=(o,t)=>S(o,"name",{value:t,configurable:!0});var a=(o,t)=>()=>(o&&(t=o(o=0)),t);var vt=(o,t)=>{for(var e in t)S(o,e,{get:t[e],enumerable:!0})},Mt=(o,t,e,n)=>{if(t&&typeof t=="object"||typeof t=="function")for(let r of Zt(t))!xt.call(o,r)&&(e||r!=="default")&&S(o,r,{get:()=>t[r],enumerable:!(n=zt(t,r))||n.enumerable});return o},x=(o,t)=>Mt(bt(S(o!=null?Gt(qt(o)):{},"default",!t&&o&&o.__esModule?{get:()=>o.default,enumerable:!0}:{value:o,enumerable:!0})),o),Kt=(o=>(t,e)=>o&&o.get(t)||(e=Mt(bt({}),t,1),o&&o.set(t,e),e))(typeof WeakMap!="undefined"?new WeakMap:0);var s=a(()=>{});var L,oe,X,N,Y,R=a(()=>{s();L=Symbol(),oe=Symbol(),X=Symbol(),N=Symbol(),Y=Symbol()});var St,tt,P,et=a(()=>{s();St=require("discord.js");R();tt=i((o,t)=>{let e=Reflect.getMetadata(Y,o,t);return e||(e=new St.Collection,Reflect.defineMetadata(Y,e,o,t)),e},"getComponentHookStore"),P=i((o,t)=>(e,n)=>{let r=tt(e,n),c=r.get(o);c||(c=[],r.set(o,c)),c.push(t)},"createComponentHook")});var ot,E,Qt,v,rt,nt,F=a(()=>{s();ot=require("discord.js");et();R();E=i(o=>{let t=Reflect.getMetadata(L,o);return t||(t=new ot.Collection,Reflect.defineMetadata(L,t,o)),t},"getComponentStore"),Qt=i((o,t)=>E(o).get(t),"getComponent"),v=i(o=>t=>(e,n)=>{var r=new o(t,Reflect.get(e,n),Reflect.getMetadata("design:paramtypes",e,n));let c=tt(e,n);r.hooks=c;let m=E(e);rt(e,n).forEach((g,b)=>{var H;(H=r.argTypes.get(b))==null||H.decorators.push(g)}),m.set(n,r)},"createComponentDecorator"),rt=i((o,t)=>{let e=Reflect.getMetadata(L,o,t);return e||(e=new ot.Collection,Reflect.defineMetadata(L,e,o,t)),e},"getComponentArgumentStore"),nt=i(o=>t=>(e,n,r)=>{var c=new o(t);rt(e,n).set(r,c)},"createArgumentDecorator")});var I,st=a(()=>{s();I=class{constructor(t){this.type=t,this.decorators=[]}};i(I,"ComponentArgument")});var Rt,_,kt=a(()=>{s();Rt=x(require("lodash")),_=class{constructor(t){typeof t=="object"?this.options=Rt.default.merge(this.defaultOptions(),t):this.options=t}defaultOptions(){return{}}};i(_,"ComponentArgumentDecorator")});var d,Vt,it=a(()=>{s();F();O();d=class extends y{};i(d,"ApplicationCommandComponent");Vt=v(d)});var k,Tt,ct=a(()=>{s();mt();k=class extends _{};i(k,"ApplicationCommandOption");Tt=nt(k)});var Ht,B,at,Lt=a(()=>{s();Ht=require("discord.js");R();B=i(o=>{let t=Reflect.getMetadata(X,o);return t||(t=new Ht.Collection,Reflect.defineMetadata(X,t,o)),t},"getModuleHookStore"),at=i(o=>(t,e)=>{let n=B(t),r=n.get(o);r||(r=[],n.set(o,r)),r.push(Reflect.get(t,e))},"moduleHook")});var $=a(()=>{s();Lt();et()});var M,pt,G=a(()=>{s();O();F();M=class extends y{defaultOptions(){return{emitter:"discord"}}constructor(t,e,n){super({event:t.event,emitter:(r=t.emitter)!=null?r:"discord"},e,n);var r}};i(M,"ListenerComponent");pt=v(M)});var z,Et,Ft,A,lt=a(()=>{s();z=x(require("chalk")),Et=require("discord.js"),Ft=x(require("lodash"));ft();$();G();R();A=class{constructor(t,e){this.client=e,this.extensions=[],this.emitters=new Et.Collection,this.logger=t.getChildLogger({prefix:[z.default.green("[Registry]")]})}getComponentsWithTypeGlobal(t){let e=[];for(let n of this.extensions)e.push(...this.getComponentsWithType(n,t));return e}getComponentsWithType(t,e){let n=E(t);return Array.from(n.filter(r=>r.constructor===e).values())}registerEventListeners(t){let e=this.getComponentsWithType(t,M);for(let n of e){let r=this.emitters.get(n.options.emitter);if(r){let c=n.method.bind(t);Reflect.defineMetadata("bound",c,n),r.addListener(n.options.event,c)}}}unregisterEventListeners(t){let e=this.getComponentsWithType(t,M);for(let n of e){let r=this.emitters.get(n.options.emitter),c=Reflect.getMetadata("bound",n);r&&c&&r.removeListener(n.options.event,c)}}async registerModule(t){Reflect.defineMetadata(N,this.client,t),this.registerEventListeners(t),await this.runModuleHook(t,"load"),this.extensions.push(t),this.logger.info(`Module registered: ${z.default.green(t.constructor.name)}`)}async unregisterModule(t){this.unregisterEventListeners(t),await this.runModuleHook(t,"unload"),Ft.default.remove(this.extensions,e=>e===t),this.logger.info(`Module unregistered: ${z.default.green(t.constructor.name)}`)}runModuleHook(t,e,...n){let c=B(t).get(e);if(c)for(let m of c)m.call(t,...n)}registerEventEmitter(t,e){this.emitters.set(t,e)}};i(A,"Registry")});var Z=a(()=>{s();lt();dt()});var T,j,q=a(()=>{s();O();F();T=class extends y{};i(T,"ConverterComponent");j=v(T)});var It,_t,D,gt=a(()=>{s();It=x(require("chalk")),_t=require("discord.js");q();Z();D=class{get commandClient(){return C.getFromModule(this)}get client(){return this.commandClient.discord}get logger(){return this._logger||(this._logger=this.commandClient.logger.getChildLogger({prefix:[It.default.green(`[${this.constructor.name}]`)],displayFunctionName:!1})),this._logger}async convertArguments(t,e,n,r){let c=new _t.Collection;for(let m of this.commandClient.registry.extensions)for(let l of this.commandClient.registry.getComponentsWithType(m,T))l.options.component==t&&c.set(l.options.type,{component:l,ext:m});for(let[m,l]of n){let g=c.get(l.type);if(!g){e[m]=void 0;continue}let b=await r(l,m);e[m]=await g.component.execute(g.ext,b)}}};i(D,"Extension")});var Ot,J,$t=a(()=>{s();Ot=x(require("chalk"));gt();J=class extends D{get logger(){return this._logger||(this._logger=this.commandClient.ctsLogger.getChildLogger({prefix:[Ot.default.green(`[${this.constructor.name}]`)],displayFunctionName:!1})),this._logger}};i(J,"CTSExtension")});var w,f,W,u,h,At=a(()=>{s();w=x(require("chalk")),f=require("discord.js");it();ct();$();G();Z();q();$t();W=function(o,t,e,n){var r=arguments.length,c=r<3?t:n===null?n=Object.getOwnPropertyDescriptor(t,e):n,m;if(typeof Reflect=="object"&&typeof Reflect.decorate=="function")c=Reflect.decorate(o,t,e,n);else for(var l=o.length-1;l>=0;l--)(m=o[l])&&(c=(r<3?m(c):r>3?m(t,e,c):m(t,e))||c);return r>3&&c&&Object.defineProperty(t,e,c),c},u=function(o,t){if(typeof Reflect=="object"&&typeof Reflect.metadata=="function")return Reflect.metadata(o,t)},h=class extends J{constructor(t){super();this.config=t}async interactionCreate(t){var c;if(t.type!==f.InteractionType.ApplicationCommand)return;let e=null,n=null,r=this.commandClient.registry.extensions;for(let m of r){let l=this.commandClient.registry.getComponentsWithType(m,d);for(let g of l)g.options.name===t.commandName&&(n=m,e=g)}if(e&&n){let m=[];await this.convertArguments(d,m,e.argTypes,()=>[t]);for(let[l,g]of e.argTypes){let b=null;for(let H of g.decorators)if(H instanceof k){b=(c=t.options.get(H.options.name,!1))==null?void 0:c.value;break}b&&(m[l]=b)}try{await e.execute(n,m,[t])}catch(l){this.logger.error(l),this.commandClient.emit("applicationCommandInvokeError",l,t)}}}async load(){}async sync(){let t=C.getFromModule(this);this.logger.info("Trying to sync commands...");let e=[];for(let n of t.registry.getComponentsWithTypeGlobal(d)){let r=wt({},n.options);if(r.type===f.ApplicationCommandType.ChatInput){r.options=[];for(let[,c]of n.argTypes){let m=c.decorators.find(l=>l.constructor===k);m&&r.options.push(m.options)}}e.push(r)}if(this.logger.info(`Processing ${w.default.green(e.length)} commands(${e.map(n=>w.default.blue(n.name)).join(", ")})`),this.config.guilds)for(let n of this.config.guilds)try{let r=await this.client.guilds.fetch(n);await r.fetch(),this.logger.info(`Registering commands for guild ${w.default.green(r.name)}(${w.default.blue(r.id)})`),await r.commands.set(e),this.logger.info(`Successfully registered commands for guild ${w.default.green(r.name)}(${w.default.blue(r.id)})`)}catch(r){this.logger.error(`Failed to register commands to guild ${w.default.green(n)}: ${r.message}`)}else try{this.logger.info("Registering commands globally..."),await this.client.application.commands.set(e),this.logger.info("Successfully registered commands.")}catch(n){this.logger.error(`Failed to register commands to global: ${n.message}`)}}async chatInteraction(t){return t}async messageInteraction(t){return t}async userInteraction(t){return t}};i(h,"ApplicationCommandExtension");W([pt({event:"interactionCreate"}),u("design:type",Function),u("design:paramtypes",[typeof f.Interaction=="undefined"?Object:f.Interaction])],h.prototype,"interactionCreate",null);W([at("load"),u("design:type",Function),u("design:paramtypes",[])],h.prototype,"load",null);W([j({component:d,parameterless:!0,type:f.ChatInputCommandInteraction}),u("design:type",Function),u("design:paramtypes",[typeof f.ChatInputCommandInteraction=="undefined"?Object:f.ChatInputCommandInteraction])],h.prototype,"chatInteraction",null);W([j({component:d,parameterless:!0,type:f.MessageContextMenuCommandInteraction}),u("design:type",Function),u("design:paramtypes",[typeof f.MessageContextMenuCommandInteraction=="undefined"?Object:f.MessageContextMenuCommandInteraction])],h.prototype,"messageInteraction",null);W([j({component:d,parameterless:!0,type:f.UserContextMenuCommandInteraction}),u("design:type",Function),u("design:paramtypes",[typeof f.UserContextMenuCommandInteraction=="undefined"?Object:f.UserContextMenuCommandInteraction])],h.prototype,"userInteraction",null)});var Wt={};vt(Wt,{CommandClient:()=>C});var K,Q,jt,Dt,C,dt=a(()=>{s();K=x(require("chalk")),Q=require("discord.js"),jt=x(require("events")),Dt=require("tslog");At();R();lt();C=class extends jt.default{constructor(t,e=new Dt.Logger({dateTimeTimezone:Intl.DateTimeFormat().resolvedOptions().timeZone})){super();this.discord=t,this.logger=e,this.owners=new Set,this.ctsLogger=e.getChildLogger({prefix:[K.default.blue("[command.ts]")],displayFilePath:"hidden",displayFunctionName:!1}),this.registry=new A(this.ctsLogger,this),this.registry.registerEventEmitter("cts",this),this.registry.registerEventEmitter("discord",this.discord)}async fetchOwners(){if(!this.discord.application)throw new Error("The client is not logged in.");this.ctsLogger.info("Fetching owners..."),await this.discord.application.fetch();let t=this.discord.application.owner;if(!t)throw new Error("Cannot find application owner");let e=[];if(t instanceof Q.User)this.owners.add(t.id),e.push(t.tag);else if(t instanceof Q.Team)for(let[n,r]of t.members)this.owners.add(n),e.push(r.user.tag);this.ctsLogger.info(`Fetched ${K.default.green(e.length)} owners(${e.map(n=>K.default.blue(n)).join(", ")})`)}async enableApplicationCommandsExtension(t){await this.registry.registerModule(new h(t)),this.ctsLogger.info("Application command extension enabled.")}getApplicationCommandsExtension(){return this.registry.extensions.find(t=>t.constructor===h)}static getFromModule(t){return Reflect.getMetadata(N,t)}};i(C,"CommandClient")});var ut,y,O=a(()=>{s();ut=require("discord.js");st();y=class{hooks=new ut.Collection;argTypes=new ut.Collection;constructor(t,e,n){this.options=this.convertOptions(t),this.method=e;for(let r=0;r<n.length;r++){let c=n[r];this.argTypes.set(r,new I(c))}}convertOptions(t){return t}async executeHook(t,e,n){let r=this.hooks.get(e);if(!r)return;let{CommandClient:c}=await Promise.resolve().then(()=>(dt(),Wt));for(let m of r)await m.call(null,c.getFromModule(t),...n)}async execute(t,e,n=e){await this.executeHook(t,"beforeCall",n);let r=await this.method.call(t,...e);return await this.executeHook(t,"afterCall",[r]),r}};i(y,"BaseComponent")});var Ye,ft=a(()=>{s();Ye=require("reflect-metadata");F();st();kt();O()});var U,ht=a(()=>{s();U=class{};i(U,"OwnerOnlyError")});var V,Ut,Xt,Nt=a(()=>{s();V=require("discord.js");$();ht();Ut=i(o=>P("beforeCall",o),"createCheckDecorator"),Xt=Ut(async(o,t)=>{let e=!1;if(t instanceof V.BaseInteraction?e=o.owners.has(t.user.id):t instanceof V.Message&&(e=o.owners.has(t.author.id)),!e)throw new U})});var Pt=a(()=>{s();Nt();ht()});var Bt=a(()=>{s();gt()});var mt=a(()=>{s();ft();$();q();Pt();G();Z();Bt()});var Yt={};vt(Yt,{ApplicationCommandComponent:()=>d,BaseComponent:()=>y,CommandClient:()=>C,ComponentArgument:()=>I,ComponentArgumentDecorator:()=>_,ConverterComponent:()=>T,Extension:()=>D,ListenerComponent:()=>M,OwnerOnlyError:()=>U,Registry:()=>A,applicationCommand:()=>Vt,argConverter:()=>j,createArgumentDecorator:()=>nt,createCheckDecorator:()=>Ut,createComponentDecorator:()=>v,createComponentHook:()=>P,getComponent:()=>Qt,getComponentArgumentStore:()=>rt,getComponentStore:()=>E,getModuleHookStore:()=>B,listener:()=>pt,moduleHook:()=>at,option:()=>Tt,ownerOnly:()=>Xt});s();mt();s();it();ct();module.exports=Kt(Yt);0&&(module.exports={ApplicationCommandComponent,BaseComponent,CommandClient,ComponentArgument,ComponentArgumentDecorator,ConverterComponent,Extension,ListenerComponent,OwnerOnlyError,Registry,applicationCommand,argConverter,createArgumentDecorator,createCheckDecorator,createComponentDecorator,createComponentHook,getComponent,getComponentArgumentStore,getComponentStore,getModuleHookStore,listener,moduleHook,option,ownerOnly});
2
2
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/home/runner/work/command.ts/command.ts/src/index.ts","../src/core/components/home/runner/work/command.ts/command.ts/src/core/components/index.ts","../src/core/components/home/runner/work/command.ts/command.ts/src/core/components/BaseComponent.ts","../src/core/components/home/runner/work/command.ts/command.ts/src/core/components/ComponentArgument.ts","../src/core/components/home/runner/work/command.ts/command.ts/src/core/components/decoratorCreator.ts","../src/core/home/runner/work/command.ts/command.ts/src/core/symbols.ts","../src/core/structures/home/runner/work/command.ts/command.ts/src/core/structures/Registry.ts","../src/core/hooks/home/runner/work/command.ts/command.ts/src/core/hooks/moduleHook.ts","../src/core/listener/home/runner/work/command.ts/command.ts/src/core/listener/index.ts","../src/core/structures/home/runner/work/command.ts/command.ts/src/core/structures/CommandClient.ts","../src/applicationCommand/home/runner/work/command.ts/command.ts/src/applicationCommand/ApplicationCommand.ts","../src/core/components/home/runner/work/command.ts/command.ts/src/core/components/ComponentArgumentDecorator.ts","../src/applicationCommand/home/runner/work/command.ts/command.ts/src/applicationCommand/ApplicationCommandOption.ts"],"sourcesContent":["/*\n * File: index.ts\n *\n * Copyright (c) 2022-2022 pikokr\n *\n * Licensed under MIT License. Please see more defails in LICENSE file.\n */\n\nexport * from './core'\nexport * from './applicationCommand'\n","import 'reflect-metadata'\nexport * from './BaseComponent'\nexport * from './decoratorCreator'\n","import { Collection } from 'discord.js'\nimport _ from 'lodash'\nimport { ComponentArgument } from './ComponentArgument'\n\nexport class BaseComponent<Options = unknown, RequiredOptions = unknown> {\n options: Options & RequiredOptions\n\n method: Function\n\n argTypes: Collection<number, ComponentArgument> = new Collection()\n\n constructor(options: Partial<Options> & RequiredOptions, method: Function, argTypes: unknown[]) {\n if (typeof options === 'object') {\n this.options = _.merge(this.defaultOptions(), options)\n } else if (typeof options === 'string') {\n this.options = options as this['options']\n } else {\n this.options = null as unknown as this['options']\n }\n this.method = method\n for (let i = 0; i < argTypes.length; i++) {\n const element = argTypes[i]\n this.argTypes.set(i, new ComponentArgument(element))\n }\n }\n\n defaultOptions(): Options & Partial<RequiredOptions> {\n return {} as unknown as ReturnType<this['defaultOptions']>\n }\n\n execute(target: object, args: unknown[]) {\n return this.method.apply(target, args)\n }\n}\n","import { ComponentArgumentDecorator } from './ComponentArgumentDecorator'\n\nexport class ComponentArgument {\n decorators: ComponentArgumentDecorator[] = []\n\n constructor(public type: unknown) {}\n}\n","import { Collection } from 'discord.js'\nimport { ComponentStoreSymbol } from '../symbols'\nimport { BaseComponent } from './BaseComponent'\nimport { ComponentArgumentDecorator } from './ComponentArgumentDecorator'\n\ntype ComponentStore = Collection<string | symbol, BaseComponent>\ntype ComponentArgumentStore = Collection<number, ComponentArgumentDecorator>\n\nexport const getComponentStore = (target: object): ComponentStore => {\n let result: ComponentStore | null = Reflect.getMetadata(ComponentStoreSymbol, target)\n\n if (!result) {\n result = new Collection()\n\n Reflect.defineMetadata(ComponentStoreSymbol, result, target)\n }\n\n return result\n}\n\nexport const getComponent = (target: object, key: string | symbol) => {\n const store = getComponentStore(target)\n\n return store.get(key)\n}\n\nexport const createComponentDecorator = <Options, RequiredOptions>(type: typeof BaseComponent<Options, RequiredOptions>) => {\n return (options: Partial<Options> & RequiredOptions): MethodDecorator => {\n return (target, key) => {\n var component: BaseComponent<Options> = new type(options, Reflect.get(target, key), Reflect.getMetadata('design:paramtypes', target, key))\n\n const store = getComponentStore(target)\n\n const decorators = getComponentArgumentStore(target, key)\n\n decorators.forEach((x, i) => {\n component.argTypes.get(i)?.decorators.push(x)\n })\n\n store.set(key, component)\n }\n }\n}\n\nexport const getComponentArgumentStore = (target: object, key: string | symbol): ComponentArgumentStore => {\n let result: ComponentArgumentStore | null = Reflect.getMetadata(ComponentStoreSymbol, target, key)\n\n if (!result) {\n result = new Collection()\n\n Reflect.defineMetadata(ComponentStoreSymbol, result, target, key)\n }\n\n return result\n}\n\nexport const createArgumentDecorator = <Options>(type: typeof ComponentArgumentDecorator<Options>) => {\n return (options: Options): ParameterDecorator => {\n return (target, key, idx) => {\n var arg: ComponentArgumentDecorator<Options> = new type(options)\n\n const store = getComponentArgumentStore(target, key)\n\n store.set(idx, arg)\n }\n }\n}\n","export const ComponentStoreSymbol = Symbol()\nexport const ComponentArgStoreSymbol = Symbol()\nexport const ModuleHookStoreSymbol = Symbol()\nexport const ListenersSymbol = Symbol()\n","import { Collection } from 'discord.js'\nimport EventEmitter from 'events'\nimport _ from 'lodash'\nimport { BaseComponent, getComponentStore } from '../components'\nimport { getModuleHookStore } from '../hooks'\nimport { ListenerComponent } from '../listener'\nimport { ListenersSymbol } from '../symbols'\n\nexport class Registry {\n extensions: object[] = []\n\n emitters: Collection<string, EventEmitter> = new Collection()\n\n getComponentsWithTypeGlobal<T extends typeof BaseComponent<Config, RequiredConfig>, Config, RequiredConfig>(type: T): InstanceType<T>[] {\n const result: InstanceType<T>[] = []\n\n for (const ext of this.extensions) {\n result.push(...this.getComponentsWithType(ext, type))\n }\n\n return result\n }\n\n getComponentsWithType<T extends typeof BaseComponent<Config, RequiredConfig>, Config, RequiredConfig>(ext: object, type: T): InstanceType<T>[] {\n const componentStore = getComponentStore(ext)\n\n return Array.from(componentStore.filter((x) => (x.constructor as unknown) === type).values() as Iterable<InstanceType<T>>)\n }\n\n registerEventListeners(ext: object) {\n const listeners = this.getComponentsWithType(ext, ListenerComponent)\n\n for (const listener of listeners) {\n const emitter = this.emitters.get(listener.options.emitter)\n\n if (emitter) {\n const bound = listener.method.bind(ext)\n\n Reflect.defineMetadata('bound', bound, listener)\n\n emitter.addListener(listener.options.event, bound)\n }\n }\n }\n\n unregisterEventListeners(ext: object) {\n const listeners = this.getComponentsWithType(ext, ListenerComponent)\n\n for (const listener of listeners) {\n const emitter = this.emitters.get(listener.options.emitter)\n const bound = Reflect.getMetadata('bound', listener)\n\n if (emitter && bound) {\n emitter.removeListener(listener.options.event, bound)\n }\n }\n }\n\n async registerModule(ext: object) {\n this.registerEventListeners(ext)\n await this.runModuleHook(ext, 'load')\n this.extensions.push(ext)\n }\n\n async unregisterModule(ext: object) {\n this.unregisterEventListeners(ext)\n await this.runModuleHook(ext, 'unload')\n _.remove(this.extensions, (x) => x === ext)\n }\n\n runModuleHook(ext: object, hookName: string, ...args: unknown[]) {\n const hooks = getModuleHookStore(ext)\n\n const functions = hooks.get(hookName)\n\n if (functions) {\n for (const fn of functions) {\n fn.apply(ext, args)\n }\n }\n }\n\n registerEventEmitter(name: string, emitter: EventEmitter) {\n this.emitters.set(name, emitter)\n }\n}\n","import { Collection } from 'discord.js'\nimport { ModuleHookStoreSymbol } from '../symbols'\n\ntype ModuleHookStore = Collection<string | symbol, Function[]>\n\nexport const getModuleHookStore = (target: object) => {\n let result: ModuleHookStore | null = Reflect.getMetadata(ModuleHookStoreSymbol, target)\n\n if (!result) {\n result = new Collection()\n\n Reflect.defineMetadata(ModuleHookStoreSymbol, result, target)\n }\n\n return result\n}\n\nexport const moduleHook = (name: string): MethodDecorator => {\n return (target, key) => {\n const store = getModuleHookStore(target)\n\n let v = store.get(key)\n\n if (!v) {\n v = []\n store.set(key, v)\n }\n\n v.push(Reflect.get(target, key))\n }\n}\n","import { BaseComponent, createComponentDecorator } from '../components'\n\nexport class ListenerComponent extends BaseComponent<{ emitter: string }, { event: string }> {\n defaultOptions() {\n return { emitter: 'discord' }\n }\n}\n\nexport const listener = createComponentDecorator(ListenerComponent)\n","import { Client } from 'discord.js'\nimport EventEmitter from 'events'\nimport { Registry } from './Registry'\n\nexport class CommandClient extends EventEmitter {\n registry = new Registry()\n\n constructor(public discord: Client) {\n super()\n\n this.registry.registerEventEmitter('cts', this)\n this.registry.registerEventEmitter('discord', this.discord)\n }\n}\n","import { ApplicationCommandType } from 'discord.js'\nimport { BaseComponent, createComponentDecorator } from '../core'\n\ntype ApplicationCommandOptions = {\n type: ApplicationCommandType\n}\n\ntype ApplicationCommandRequiredOptions = {\n name: string\n description: string\n}\n\nexport class ApplicationCommandComponent extends BaseComponent<ApplicationCommandOptions, ApplicationCommandRequiredOptions> {\n defaultOptions() {\n return {\n type: ApplicationCommandType.ChatInput,\n }\n }\n}\n\nexport const applicationCommand = createComponentDecorator(ApplicationCommandComponent)\n","import _ from 'lodash'\n\nexport class ComponentArgumentDecorator<Options = unknown> {\n options: Options\n\n constructor(options: Partial<Options>) {\n if (typeof options === 'object') {\n this.options = _.merge(this.defaultOptions(), options)\n } else {\n this.options = options\n }\n }\n\n defaultOptions(): Options {\n return {} as unknown as Options\n }\n}\n","import { APIApplicationCommandOption } from 'discord.js'\nimport { createArgumentDecorator } from '../core'\nimport { ComponentArgumentDecorator } from '../core/components/ComponentArgumentDecorator'\n\ntype Options = APIApplicationCommandOption\n\nexport class ApplicationCommandOption extends ComponentArgumentDecorator<Options> {}\n\nexport const option = createArgumentDecorator(ApplicationCommandOption)\n"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../node_modules/tsup/assets/home/runner/work/command.ts/command.ts/node_modules/tsup/assets/cjs_shims.js","../src/core/home/runner/work/command.ts/command.ts/src/core/symbols.ts","../src/core/hooks/home/runner/work/command.ts/command.ts/src/core/hooks/componentHook.ts","../src/core/components/home/runner/work/command.ts/command.ts/src/core/components/decoratorCreator.ts","../src/core/components/home/runner/work/command.ts/command.ts/src/core/components/ComponentArgument.ts","../src/core/components/home/runner/work/command.ts/command.ts/src/core/components/ComponentArgumentDecorator.ts","../src/applicationCommand/home/runner/work/command.ts/command.ts/src/applicationCommand/ApplicationCommand.ts","../src/applicationCommand/home/runner/work/command.ts/command.ts/src/applicationCommand/ApplicationCommandOption.ts","../src/core/hooks/home/runner/work/command.ts/command.ts/src/core/hooks/moduleHook.ts","../src/core/hooks/home/runner/work/command.ts/command.ts/src/core/hooks/index.ts","../src/core/listener/home/runner/work/command.ts/command.ts/src/core/listener/index.ts","../src/core/structures/home/runner/work/command.ts/command.ts/src/core/structures/Registry.ts","../src/core/structures/home/runner/work/command.ts/command.ts/src/core/structures/index.ts","../src/core/converter/home/runner/work/command.ts/command.ts/src/core/converter/index.ts","../src/core/extensions/home/runner/work/command.ts/command.ts/src/core/extensions/Extension.ts","../src/core/extensions/home/runner/work/command.ts/command.ts/src/core/extensions/CTSExtension.ts","../src/applicationCommand/home/runner/work/command.ts/command.ts/src/applicationCommand/ApplicationCommandExtension.ts","../src/core/structures/home/runner/work/command.ts/command.ts/src/core/structures/CommandClient.ts","../src/core/components/home/runner/work/command.ts/command.ts/src/core/components/BaseComponent.ts","../src/core/components/home/runner/work/command.ts/command.ts/src/core/components/index.ts","../src/core/utils/home/runner/work/command.ts/command.ts/src/core/utils/errors.ts","../src/core/utils/home/runner/work/command.ts/command.ts/src/core/utils/checks.ts","../src/core/utils/home/runner/work/command.ts/command.ts/src/core/utils/index.ts","../src/core/extensions/home/runner/work/command.ts/command.ts/src/core/extensions/index.ts","../src/core/home/runner/work/command.ts/command.ts/src/core/index.ts","../src/home/runner/work/command.ts/command.ts/src/index.ts","../src/applicationCommand/home/runner/work/command.ts/command.ts/src/applicationCommand/index.ts"],"sourcesContent":["// Shim globals in cjs bundle\n// There's a weird bug that esbuild will always inject importMetaUrl\n// if we export it as `const importMetaUrl = ... __filename ...`\n// But using a function will not cause this issue\n\nconst getImportMetaUrl = () =>\n typeof document === 'undefined'\n ? new URL('file:' + __filename).href\n : (document.currentScript && document.currentScript.src) ||\n new URL('main.js', document.baseURI).href\n\nexport const importMetaUrl = /* @__PURE__ */ getImportMetaUrl()\n","/*\r\n * File: symbols.ts\r\n *\r\n * Copyright (c) 2022-2022 pikokr\r\n *\r\n * Licensed under MIT License. Please see more defails in LICENSE file.\r\n */\r\n\r\nexport const ComponentStoreSymbol = Symbol()\r\nexport const ComponentArgStoreSymbol = Symbol()\r\nexport const ModuleHookStoreSymbol = Symbol()\r\nexport const CommandClientSymbol = Symbol()\r\nexport const ComponentHookSymbol = Symbol()\r\n","/*\n * File: componentHook.ts\n *\n * Copyright (c) 2022-2022 pikokr\n *\n * Licensed under MIT License. Please see more defails in LICENSE file.\n */\n\nimport { Collection } from 'discord.js'\nimport { ComponentHookSymbol } from '../symbols'\n\nexport type ComponentHookFn = (...args: any[]) => void | Promise<void>\n\nexport type ComponentHookStore = Collection<string, ComponentHookFn[]>\n\nexport const getComponentHookStore = (target: object, property: string | symbol): ComponentHookStore => {\n let data = Reflect.getMetadata(ComponentHookSymbol, target, property) as ComponentHookStore\n\n if (!data) {\n data = new Collection()\n Reflect.defineMetadata(ComponentHookSymbol, data, target, property)\n }\n\n return data\n}\n\nexport const createComponentHook = (name: string, fn: ComponentHookFn): MethodDecorator => {\n return (target, key) => {\n const store = getComponentHookStore(target, key)\n\n let hooks = store.get(name)\n\n if (!hooks) {\n hooks = []\n store.set(name, hooks)\n }\n\n hooks.push(fn)\n }\n}\n","/*\r\n* File: decoratorCreator.ts\r\n* \r\n* Copyright (c) 2022-2022 pikokr\r\n* \r\n* Licensed under MIT License. Please see more defails in LICENSE file.\r\n*/\r\n\r\nimport { Collection } from 'discord.js'\nimport { ComponentHookStore } from '../hooks'\nimport { getComponentHookStore } from '../hooks/componentHook'\nimport { ComponentStoreSymbol } from '../symbols'\nimport { BaseComponent } from './BaseComponent'\nimport { ComponentArgumentDecorator } from './ComponentArgumentDecorator'\n\ntype ComponentStore = Collection<string | symbol, BaseComponent>\ntype ComponentArgumentStore = Collection<number, ComponentArgumentDecorator>\n\nexport const getComponentStore = (target: object): ComponentStore => {\n let result: ComponentStore | null = Reflect.getMetadata(ComponentStoreSymbol, target)\n\n if (!result) {\n result = new Collection()\n\n Reflect.defineMetadata(ComponentStoreSymbol, result, target)\n }\n\n return result\n}\n\nexport const getComponent = (target: object, key: string | symbol) => {\n const store = getComponentStore(target)\n\n return store.get(key)\n}\n\nexport const createComponentDecorator = <Options, OptionArgs>(type: typeof BaseComponent<Options, OptionArgs>) => {\n return (options: OptionArgs): MethodDecorator => {\n return (target, key) => {\n var component: BaseComponent<Options, OptionArgs> = new type(options, Reflect.get(target, key), Reflect.getMetadata('design:paramtypes', target, key))\n\n const componentHookStore: ComponentHookStore = getComponentHookStore(target, key)\n\n component.hooks = componentHookStore\n\n const store = getComponentStore(target)\n\n const decorators = getComponentArgumentStore(target, key)\n\n decorators.forEach((x, i) => {\n component.argTypes.get(i)?.decorators.push(x)\n })\n\n store.set(key, component)\n }\n }\n}\n\nexport const getComponentArgumentStore = (target: object, key: string | symbol): ComponentArgumentStore => {\n let result: ComponentArgumentStore | null = Reflect.getMetadata(ComponentStoreSymbol, target, key)\n\n if (!result) {\n result = new Collection()\n\n Reflect.defineMetadata(ComponentStoreSymbol, result, target, key)\n }\n\n return result\n}\n\nexport const createArgumentDecorator = <Options>(type: typeof ComponentArgumentDecorator<Options>) => {\n return (options: Options): ParameterDecorator => {\n return (target, key, idx) => {\n var arg: ComponentArgumentDecorator<Options> = new type(options)\n\n const store = getComponentArgumentStore(target, key)\n\n store.set(idx, arg)\n }\n }\n}\n","/*\r\n* File: ComponentArgument.ts\r\n* \r\n* Copyright (c) 2022-2022 pikokr\r\n* \r\n* Licensed under MIT License. Please see more defails in LICENSE file.\r\n*/\r\n\r\nimport { ComponentArgumentDecorator } from './ComponentArgumentDecorator'\n\nexport class ComponentArgument {\n decorators: ComponentArgumentDecorator[] = []\n\n constructor(public type: unknown) {}\n}\n","/*\r\n* File: ComponentArgumentDecorator.ts\r\n* \r\n* Copyright (c) 2022-2022 pikokr\r\n* \r\n* Licensed under MIT License. Please see more defails in LICENSE file.\r\n*/\r\n\r\nimport _ from 'lodash'\n\nexport class ComponentArgumentDecorator<Options = unknown> {\n options: Options\n\n constructor(options: Partial<Options>) {\n if (typeof options === 'object') {\n this.options = _.merge(this.defaultOptions(), options)\n } else {\n this.options = options\n }\n }\n\n defaultOptions(): Options {\n return {} as unknown as Options\n }\n}\n","/*\r\n* File: ApplicationCommand.ts\r\n* \r\n* Copyright (c) 2022-2022 pikokr\r\n* \r\n* Licensed under MIT License. Please see more defails in LICENSE file.\r\n*/\r\n\r\nimport type { ApplicationCommandType, ChatInputApplicationCommandData, MessageApplicationCommandData, UserApplicationCommandData } from 'discord.js'\nimport { createComponentDecorator } from '../core/components/decoratorCreator'\nimport { BaseComponent } from '../core/components/BaseComponent'\n\nexport class ApplicationCommandComponent extends BaseComponent<\n (UserApplicationCommandData | MessageApplicationCommandData | Omit<ChatInputApplicationCommandData, 'options'>) & { type: ApplicationCommandType }\n> {}\n\nexport const applicationCommand = createComponentDecorator(ApplicationCommandComponent)\n","/*\r\n* File: ApplicationCommandOption.ts\r\n* \r\n* Copyright (c) 2022-2022 pikokr\r\n* \r\n* Licensed under MIT License. Please see more defails in LICENSE file.\r\n*/\r\n\r\nimport { APIApplicationCommandOption } from 'discord.js'\nimport { createArgumentDecorator, ComponentArgumentDecorator } from '../core'\n\ntype Options = APIApplicationCommandOption\n\nexport class ApplicationCommandOption extends ComponentArgumentDecorator<Options> {}\n\nexport const option = createArgumentDecorator(ApplicationCommandOption)\n","/*\r\n* File: moduleHook.ts\r\n* \r\n* Copyright (c) 2022-2022 pikokr\r\n* \r\n* Licensed under MIT License. Please see more defails in LICENSE file.\r\n*/\r\n\r\nimport { Collection } from 'discord.js'\nimport { ModuleHookStoreSymbol } from '../symbols'\n\ntype ModuleHookStore = Collection<string, Function[]>\n\nexport const getModuleHookStore = (target: object) => {\n let result: ModuleHookStore | null = Reflect.getMetadata(ModuleHookStoreSymbol, target)\n\n if (!result) {\n result = new Collection()\n\n Reflect.defineMetadata(ModuleHookStoreSymbol, result, target)\n }\n\n return result\n}\n\nexport const moduleHook = (name: string): MethodDecorator => {\n return (target, key) => {\n const store = getModuleHookStore(target)\n\n let v = store.get(name)\n\n if (!v) {\n v = []\n store.set(name, v)\n }\n\n v.push(Reflect.get(target, key))\n }\n}\n","/*\r\n * File: index.ts\r\n *\r\n * Copyright (c) 2022-2022 pikokr\r\n *\r\n * Licensed under MIT License. Please see more defails in LICENSE file.\r\n */\r\n\r\nexport * from './moduleHook'\r\nexport { createComponentHook } from './componentHook'\r\nexport type { ComponentHookStore } from './componentHook'\r\n","/*\r\n* File: index.ts\r\n* \r\n* Copyright (c) 2022-2022 pikokr\r\n* \r\n* Licensed under MIT License. Please see more defails in LICENSE file.\r\n*/\r\n\r\nimport { BaseComponent } from '../components/BaseComponent'\nimport { createComponentDecorator } from '../components/decoratorCreator'\n\nexport class ListenerComponent extends BaseComponent<{ emitter: string; event: string }, { emitter?: string; event: string }> {\n defaultOptions() {\n return { emitter: 'discord' }\n }\n\n constructor(options: ListenerComponent['options'], method: Function, argTypes: unknown[]) {\n super(\n {\n event: options.event,\n emitter: options.emitter ?? 'discord',\n },\n method,\n argTypes,\n )\n }\n}\n\nexport const listener = createComponentDecorator(ListenerComponent)\n","/*\r\n* File: Registry.ts\r\n* \r\n* Copyright (c) 2022-2022 pikokr\r\n* \r\n* Licensed under MIT License. Please see more defails in LICENSE file.\r\n*/\r\n\r\nimport chalk from 'chalk'\nimport { Collection } from 'discord.js'\nimport EventEmitter from 'events'\nimport _ from 'lodash'\nimport { Logger } from 'tslog'\nimport { getComponentStore } from '../components'\nimport type { BaseComponent } from '../components'\nimport { getModuleHookStore } from '../hooks'\nimport { ListenerComponent } from '../listener'\nimport { CommandClientSymbol } from '../symbols'\nimport { CommandClient } from './CommandClient'\n\nexport class Registry {\n extensions: object[] = []\n\n emitters: Collection<string, EventEmitter> = new Collection()\n\n logger: Logger\n\n constructor(logger: Logger, public client: CommandClient) {\n this.logger = logger.getChildLogger({\n prefix: [chalk.green('[Registry]')],\n })\n }\n\n getComponentsWithTypeGlobal<T extends typeof BaseComponent<Config>, Config>(type: T): InstanceType<T>[] {\n const result: InstanceType<T>[] = []\n\n for (const ext of this.extensions) {\n result.push(...this.getComponentsWithType(ext, type))\n }\n\n return result\n }\n\n getComponentsWithType<T extends typeof BaseComponent<Config>, Config>(ext: object, type: T): InstanceType<T>[] {\n const componentStore = getComponentStore(ext)\n\n return Array.from(componentStore.filter((x) => (x.constructor as unknown) === type).values() as Iterable<InstanceType<T>>)\n }\n\n registerEventListeners(ext: object) {\n const listeners = this.getComponentsWithType(ext, ListenerComponent)\n\n for (const listener of listeners) {\n const emitter = this.emitters.get(listener.options.emitter)\n\n if (emitter) {\n const bound = listener.method.bind(ext)\n\n Reflect.defineMetadata('bound', bound, listener)\n\n emitter.addListener(listener.options.event, bound)\n }\n }\n }\n\n unregisterEventListeners(ext: object) {\n const listeners = this.getComponentsWithType(ext, ListenerComponent)\n\n for (const listener of listeners) {\n const emitter = this.emitters.get(listener.options.emitter)\n const bound = Reflect.getMetadata('bound', listener)\n\n if (emitter && bound) {\n emitter.removeListener(listener.options.event, bound)\n }\n }\n }\n\n async registerModule(ext: object) {\n Reflect.defineMetadata(CommandClientSymbol, this.client, ext)\n\n this.registerEventListeners(ext)\n await this.runModuleHook(ext, 'load')\n this.extensions.push(ext)\n this.logger.info(`Module registered: ${chalk.green(ext.constructor.name)}`)\n }\n\n async unregisterModule(ext: object) {\n this.unregisterEventListeners(ext)\n await this.runModuleHook(ext, 'unload')\n _.remove(this.extensions, (x) => x === ext)\n this.logger.info(`Module unregistered: ${chalk.green(ext.constructor.name)}`)\n }\n\n runModuleHook(ext: object, hookName: string, ...args: unknown[]) {\n const hooks = getModuleHookStore(ext)\n\n const functions = hooks.get(hookName)\n\n if (functions) {\n for (const fn of functions) {\n fn.call(ext, ...args)\n }\n }\n }\n\n registerEventEmitter(name: string, emitter: EventEmitter) {\n this.emitters.set(name, emitter)\n }\n}\n","/*\r\n* File: index.ts\r\n* \r\n* Copyright (c) 2022-2022 pikokr\r\n* \r\n* Licensed under MIT License. Please see more defails in LICENSE file.\r\n*/\r\n\r\nexport * from './Registry'\nexport * from './CommandClient'\n","/*\r\n* File: index.ts\r\n* \r\n* Copyright (c) 2022-2022 pikokr\r\n* \r\n* Licensed under MIT License. Please see more defails in LICENSE file.\r\n*/\r\n\r\nimport { BaseComponent } from '../components/BaseComponent'\nimport { createComponentDecorator } from '../components/decoratorCreator'\n\ntype Options = { component: typeof BaseComponent<unknown>; type: Function; parameterless: boolean }\n\nexport class ConverterComponent extends BaseComponent<Options, Options & { parameterless?: boolean }> {}\n\nexport const argConverter = createComponentDecorator(ConverterComponent)\n","/*\r\n* File: Extension.ts\r\n* \r\n* Copyright (c) 2022-2022 pikokr\r\n* \r\n* Licensed under MIT License. Please see more defails in LICENSE file.\r\n*/\r\n\r\nimport chalk from 'chalk'\nimport { Collection } from 'discord.js'\nimport { Logger } from 'tslog'\nimport { BaseComponent } from '../components'\nimport { ComponentArgument } from '../components/ComponentArgument'\nimport { ConverterComponent } from '../converter'\nimport { CommandClient } from '../structures'\n\nexport class Extension {\n protected get commandClient() {\n return CommandClient.getFromModule(this)\n }\n\n protected get client() {\n return this.commandClient.discord\n }\n\n protected _logger?: Logger\n\n protected get logger() {\n if (!this._logger) this._logger = this.commandClient.logger.getChildLogger({ prefix: [chalk.green(`[${this.constructor.name}]`)], displayFunctionName: false })\n return this._logger\n }\n\n protected async convertArguments(\n component: typeof BaseComponent<unknown>,\n argList: unknown[],\n args: Collection<number, ComponentArgument>,\n getConverterArgs: (arg: ComponentArgument, index: number) => unknown[] | Promise<unknown[]>,\n ) {\n const items = new Collection<unknown, { ext: object; component: ConverterComponent }>()\n\n for (const extension of this.commandClient.registry.extensions) {\n for (const converter of this.commandClient.registry.getComponentsWithType(extension, ConverterComponent)) {\n if (converter.options.component != component) continue\n\n items.set(converter.options.type, { component: converter, ext: extension })\n }\n }\n\n for (const [index, arg] of args) {\n const converter = items.get(arg.type)\n\n if (!converter) {\n argList[index] = undefined\n continue\n }\n\n const converterArgs = await getConverterArgs(arg, index)\n\n argList[index] = await converter.component.execute(converter.ext, converterArgs)\n }\n }\n}\n","/*\r\n* File: CTSExtension.ts\r\n* \r\n* Copyright (c) 2022-2022 pikokr\r\n* \r\n* Licensed under MIT License. Please see more defails in LICENSE file.\r\n*/\r\n\r\nimport chalk from 'chalk'\nimport { Extension } from './Extension'\n\nexport class CTSExtension extends Extension {\n protected get logger() {\n if (!this._logger) this._logger = this.commandClient.ctsLogger.getChildLogger({ prefix: [chalk.green(`[${this.constructor.name}]`)], displayFunctionName: false })\n return this._logger\n }\n}\n","/*\r\n* File: ApplicationCommandExtension.ts\r\n* \r\n* Copyright (c) 2022-2022 pikokr\r\n* \r\n* Licensed under MIT License. Please see more defails in LICENSE file.\r\n*/\r\n\r\nimport chalk from 'chalk'\nimport {\n ApplicationCommandData,\n ApplicationCommandType,\n ChatInputCommandInteraction,\n Interaction,\n InteractionType,\n MessageContextMenuCommandInteraction,\n Snowflake,\n UserContextMenuCommandInteraction,\n} from 'discord.js'\nimport { ApplicationCommandComponent } from './ApplicationCommand'\nimport { ApplicationCommandOption } from './ApplicationCommandOption'\nimport { moduleHook } from '../core/hooks'\nimport { listener } from '../core/listener'\nimport { CommandClient } from '../core/structures'\nimport { argConverter } from '../core/converter'\nimport { CTSExtension } from '../core/extensions/CTSExtension'\n\nexport type ApplicationCommandExtensionConfig = {\n guilds?: Snowflake[]\n}\n\nexport class ApplicationCommandExtension extends CTSExtension {\n constructor(public config: ApplicationCommandExtensionConfig) {\n super()\n }\n\n @listener({ event: 'interactionCreate' })\n async interactionCreate(i: Interaction) {\n if (i.type !== InteractionType.ApplicationCommand) return\n\n let cmd: ApplicationCommandComponent | null = null\n let ext: object | null = null\n\n const extensions = this.commandClient.registry.extensions\n\n for (const extension of extensions) {\n const components = this.commandClient.registry.getComponentsWithType(extension, ApplicationCommandComponent)\n\n for (const command of components) {\n if (command.options.name === i.commandName) {\n ext = extension\n cmd = command\n }\n }\n }\n\n if (cmd && ext) {\n const argList: unknown[] = []\n\n await this.convertArguments(ApplicationCommandComponent, argList, cmd.argTypes, () => [i])\n\n for (const [idx, arg] of cmd.argTypes) {\n let value: unknown = null\n\n for (const decorator of arg.decorators) {\n if (decorator instanceof ApplicationCommandOption) {\n value = i.options.get(decorator.options.name, false)?.value\n break\n }\n }\n\n if (value) {\n argList[idx] = value\n }\n }\n\n try {\n await cmd.execute(ext, argList, [i])\n } catch (e) {\n this.logger.error(e)\n this.commandClient.emit('applicationCommandInvokeError', e, i)\n }\n }\n }\n\n @moduleHook('load')\n async load() {}\n\n async sync() {\n const client = CommandClient.getFromModule(this)\n\n this.logger.info('Trying to sync commands...')\n\n const commands: ApplicationCommandData[] = []\n\n for (const command of client.registry.getComponentsWithTypeGlobal(ApplicationCommandComponent)) {\n const cmd: ApplicationCommandData = { ...command.options }\n\n if (cmd.type === ApplicationCommandType.ChatInput) {\n cmd.options = []\n\n for (const [, arg] of command.argTypes) {\n const option = arg.decorators.find((x) => x.constructor === ApplicationCommandOption) as ApplicationCommandOption\n\n if (option) {\n cmd.options.push(option.options)\n }\n }\n }\n\n commands.push(cmd)\n }\n\n this.logger.info(`Processing ${chalk.green(commands.length)} commands(${commands.map((x) => chalk.blue(x.name)).join(', ')})`)\n\n if (this.config.guilds) {\n for (const guild of this.config.guilds) {\n try {\n const g = await this.client.guilds.fetch(guild)\n await g.fetch()\n this.logger.info(`Registering commands for guild ${chalk.green(g.name)}(${chalk.blue(g.id)})`)\n\n await g.commands.set(commands)\n\n this.logger.info(`Successfully registered commands for guild ${chalk.green(g.name)}(${chalk.blue(g.id)})`)\n } catch (e) {\n this.logger.error(`Failed to register commands to guild ${chalk.green(guild)}: ${(e as Error).message}`)\n }\n }\n } else {\n try {\n this.logger.info(`Registering commands globally...`)\n\n await this.client.application!.commands.set(commands)\n\n this.logger.info('Successfully registered commands.')\n } catch (e) {\n this.logger.error(`Failed to register commands to global: ${(e as Error).message}`)\n }\n }\n }\n\n @argConverter({\n component: ApplicationCommandComponent,\n parameterless: true,\n type: ChatInputCommandInteraction,\n })\n async chatInteraction(i: ChatInputCommandInteraction) {\n return i\n }\n\n @argConverter({\n component: ApplicationCommandComponent,\n parameterless: true,\n type: MessageContextMenuCommandInteraction,\n })\n async messageInteraction(i: MessageContextMenuCommandInteraction) {\n return i\n }\n\n @argConverter({\n component: ApplicationCommandComponent,\n parameterless: true,\n type: UserContextMenuCommandInteraction,\n })\n async userInteraction(i: UserContextMenuCommandInteraction) {\n return i\n }\n}\n","/*\r\n* File: CommandClient.ts\r\n* \r\n* Copyright (c) 2022-2022 pikokr\r\n* \r\n* Licensed under MIT License. Please see more defails in LICENSE file.\r\n*/\r\n\r\nimport chalk from 'chalk'\nimport { Client, Snowflake, Team, User } from 'discord.js'\nimport EventEmitter from 'events'\nimport { Logger } from 'tslog'\nimport { ApplicationCommandExtension, ApplicationCommandExtensionConfig } from '../../applicationCommand/ApplicationCommandExtension'\nimport { CommandClientSymbol } from '../symbols'\nimport { Registry } from './Registry'\nexport class CommandClient extends EventEmitter {\n ctsLogger: Logger\n registry: Registry\n\n owners: Set<Snowflake> = new Set()\n\n constructor(public discord: Client, public logger: Logger = new Logger({ dateTimeTimezone: Intl.DateTimeFormat().resolvedOptions().timeZone })) {\n super()\n\n this.ctsLogger = logger.getChildLogger({ prefix: [chalk.blue('[command.ts]')], displayFilePath: 'hidden', displayFunctionName: false })\n\n this.registry = new Registry(this.ctsLogger, this)\n\n this.registry.registerEventEmitter('cts', this)\n this.registry.registerEventEmitter('discord', this.discord)\n }\n\n async fetchOwners() {\n if (!this.discord.application) throw new Error('The client is not logged in.')\n\n this.ctsLogger.info('Fetching owners...')\n\n await this.discord.application.fetch()\n\n const owner = this.discord.application.owner\n\n if (!owner) throw new Error('Cannot find application owner')\n\n const owners: string[] = []\n\n if (owner instanceof User) {\n this.owners.add(owner.id)\n owners.push(owner.tag)\n } else if (owner instanceof Team) {\n for (const [id, member] of owner.members) {\n this.owners.add(id)\n owners.push(member.user.tag)\n }\n }\n\n this.ctsLogger.info(`Fetched ${chalk.green(owners.length)} owners(${owners.map((x) => chalk.blue(x)).join(', ')})`)\n }\n\n async enableApplicationCommandsExtension(config: ApplicationCommandExtensionConfig) {\n await this.registry.registerModule(new ApplicationCommandExtension(config))\n this.ctsLogger.info('Application command extension enabled.')\n }\n\n getApplicationCommandsExtension() {\n return this.registry.extensions.find((x) => x.constructor === ApplicationCommandExtension) as ApplicationCommandExtension | undefined\n }\n\n static getFromModule(ext: object): CommandClient {\n return Reflect.getMetadata(CommandClientSymbol, ext)\n }\n}\n","/*\n * File: BaseComponent.ts\n *\n * Copyright (c) 2022-2022 pikokr\n *\n * Licensed under MIT License. Please see more defails in LICENSE file.\n */\n\nimport { Collection } from 'discord.js'\nimport _ from 'lodash'\nimport type { ComponentHookStore } from '../hooks'\nimport { ComponentArgument } from './ComponentArgument'\n\nexport class BaseComponent<Options = unknown, OptionsArg = Options> {\n options: Options\n\n method: Function\n\n hooks: ComponentHookStore = new Collection()\n\n argTypes: Collection<number, ComponentArgument> = new Collection()\n\n constructor(options: OptionsArg, method: Function, argTypes: unknown[]) {\n this.options = this.convertOptions(options)\n\n this.method = method\n for (let i = 0; i < argTypes.length; i++) {\n const element = argTypes[i]\n this.argTypes.set(i, new ComponentArgument(element))\n }\n }\n\n convertOptions(options: OptionsArg): Options {\n return options as unknown as Options\n }\n\n async executeHook(target: object, name: string, args: unknown[]) {\n const hook = this.hooks.get(name)\n\n if (!hook) return\n\n const { CommandClient } = await import('../structures/CommandClient')\n\n for (const fn of hook) {\n await fn.call(null, CommandClient.getFromModule(target), ...args)\n }\n }\n\n async execute(target: object, args: unknown[], beforeCallArgs: unknown[] = args) {\n await this.executeHook(target, 'beforeCall', beforeCallArgs)\n const result = await this.method.call(target, ...args)\n await this.executeHook(target, 'afterCall', [result])\n\n return result\n }\n}\n","/*\r\n * File: index.ts\r\n *\r\n * Copyright (c) 2022-2022 pikokr\r\n *\r\n * Licensed under MIT License. Please see more defails in LICENSE file.\r\n */\r\n\r\nimport 'reflect-metadata'\r\nexport * from './decoratorCreator'\r\nexport * from './ComponentArgument'\r\nexport * from './ComponentArgumentDecorator'\r\nexport * from './BaseComponent'\r\n","/*\r\n* File: errors.ts\r\n* \r\n* Copyright (c) 2022-2022 pikokr\r\n* \r\n* Licensed under MIT License. Please see more defails in LICENSE file.\r\n*/\r\n\r\nexport class OwnerOnlyError {}\n","/*\r\n* File: checks.ts\r\n* \r\n* Copyright (c) 2022-2022 pikokr\r\n* \r\n* Licensed under MIT License. Please see more defails in LICENSE file.\r\n*/\r\n\r\nimport { BaseInteraction, Interaction, Message } from 'discord.js'\nimport { createComponentHook } from '../hooks'\nimport { ComponentHookFn } from '../hooks/componentHook'\nimport { CommandClient } from '../structures'\nimport { OwnerOnlyError } from './errors'\n\nexport const createCheckDecorator = (fn: ComponentHookFn) => createComponentHook('beforeCall', fn)\n\nexport const ownerOnly = createCheckDecorator(async (client: CommandClient, i: Interaction | Message) => {\n let isOwner = false\n\n if (i instanceof BaseInteraction) {\n isOwner = client.owners.has(i.user.id)\n } else if (i instanceof Message) {\n isOwner = client.owners.has(i.author.id)\n }\n\n if (!isOwner) throw new OwnerOnlyError()\n})\n","/*\r\n* File: index.ts\r\n* \r\n* Copyright (c) 2022-2022 pikokr\r\n* \r\n* Licensed under MIT License. Please see more defails in LICENSE file.\r\n*/\r\n\r\nexport * from './checks'\nexport * from './errors'\n","/*\r\n* File: index.ts\r\n* \r\n* Copyright (c) 2022-2022 pikokr\r\n* \r\n* Licensed under MIT License. Please see more defails in LICENSE file.\r\n*/\r\n\r\nexport * from './Extension'\n","/*\r\n* File: index.ts\r\n* \r\n* Copyright (c) 2022-2022 pikokr\r\n* \r\n* Licensed under MIT License. Please see more defails in LICENSE file.\r\n*/\r\n\r\nexport * from './components'\nexport * from './hooks'\nexport * from './converter'\nexport * from './utils'\nexport * from './listener'\nexport * from './structures'\nexport * from './extensions'\n","/*\r\n* File: index.ts\r\n* \r\n* Copyright (c) 2022-2022 pikokr\r\n* \r\n* Licensed under MIT License. Please see more defails in LICENSE file.\r\n*/\r\n\r\nexport * from './core'\nexport * from './applicationCommand'\n","/*\r\n* File: index.ts\r\n* \r\n* Copyright (c) 2022-2022 pikokr\r\n* \r\n* Licensed under MIT License. Please see more defails in LICENSE file.\r\n*/\r\n\r\nexport * from './ApplicationCommand'\nexport { option } from './ApplicationCommandOption'\n"],"mappings":"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","names":[]}
package/package.json CHANGED
@@ -1,16 +1,18 @@
1
1
  {
2
2
  "name": "@pikokr/command.ts",
3
3
  "description": "Discord.js command framework for typescript.",
4
- "version": "5.0.0-dev.a0bc517",
4
+ "version": "5.0.0-dev.d547cd1",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",
7
7
  "license": "MIT",
8
8
  "devDependencies": {
9
9
  "@discordjs/ts-docgen": "^0.4.1",
10
10
  "@swc/core": "^1.2.218",
11
+ "@types/chalk": "^2.2.0",
11
12
  "@types/lodash": "^4.14.172",
12
13
  "all-contributors-cli": "^6.20.0",
13
14
  "discord.js": "^14.0.1",
15
+ "dotenv": "^16.0.1",
14
16
  "prettier": "^2.7.1",
15
17
  "ts-node": "^10.9.1",
16
18
  "tsup": "^5.11.12",
@@ -19,6 +21,7 @@
19
21
  },
20
22
  "dependencies": {
21
23
  "@types/node": "^14.14.37",
24
+ "chalk": "4.1.2",
22
25
  "discord-api-types": "^0.23.1",
23
26
  "lodash": "^4.17.21",
24
27
  "reflect-metadata": "^0.1.13",
@@ -34,7 +37,8 @@
34
37
  "build": "tsup-node",
35
38
  "docs:dev": "typedoc",
36
39
  "docs:build": "typedoc",
37
- "docs": "typedoc --json docs/typedoc-out.json --tsconfig tsconfig.prod.json src/index.ts && ts-node scripts/docs"
40
+ "docs": "typedoc --json docs/typedoc-out.json --tsconfig tsconfig.prod.json src/index.ts && ts-node scripts/docs",
41
+ "test": "yarn ts-node --swc test"
38
42
  },
39
43
  "peerDependencies": {
40
44
  "discord.js": "^14.0.1"
@@ -1,3 +1,13 @@
1
+ /*
2
+ * This is the default license template.
3
+ *
4
+ * File: publish-version.js
5
+ * Author: pikokr
6
+ * Copyright (c) 2022 pikokr
7
+ *
8
+ * To edit this license information: Press Ctrl+Shift+P and press 'Create new License Template...'.
9
+ */
10
+
1
11
  /*
2
12
  * This is the default license template.
3
13
  *
package/scripts/docs.ts CHANGED
@@ -1,11 +1,11 @@
1
- /*
2
- * File: docs.ts
3
- *
4
- * Copyright (c) 2022-2022 pikokr
5
- *
6
- * Licensed under MIT License. Please see more defails in LICENSE file.
7
- */
8
-
1
+ /*
2
+ * File: docs.ts
3
+ *
4
+ * Copyright (c) 2022-2022 pikokr
5
+ *
6
+ * Licensed under MIT License. Please see more defails in LICENSE file.
7
+ */
8
+
9
9
  import { runGenerator } from '@discordjs/ts-docgen'
10
10
 
11
11
  runGenerator({
@@ -1,21 +1,17 @@
1
- import { ApplicationCommandType } from 'discord.js'
2
- import { BaseComponent, createComponentDecorator } from '../core'
1
+ /*
2
+ * File: ApplicationCommand.ts
3
+ *
4
+ * Copyright (c) 2022-2022 pikokr
5
+ *
6
+ * Licensed under MIT License. Please see more defails in LICENSE file.
7
+ */
8
+
9
+ import type { ApplicationCommandType, ChatInputApplicationCommandData, MessageApplicationCommandData, UserApplicationCommandData } from 'discord.js'
10
+ import { createComponentDecorator } from '../core/components/decoratorCreator'
11
+ import { BaseComponent } from '../core/components/BaseComponent'
3
12
 
4
- type ApplicationCommandOptions = {
5
- type: ApplicationCommandType
6
- }
7
-
8
- type ApplicationCommandRequiredOptions = {
9
- name: string
10
- description: string
11
- }
12
-
13
- export class ApplicationCommandComponent extends BaseComponent<ApplicationCommandOptions, ApplicationCommandRequiredOptions> {
14
- defaultOptions() {
15
- return {
16
- type: ApplicationCommandType.ChatInput,
17
- }
18
- }
19
- }
13
+ export class ApplicationCommandComponent extends BaseComponent<
14
+ (UserApplicationCommandData | MessageApplicationCommandData | Omit<ChatInputApplicationCommandData, 'options'>) & { type: ApplicationCommandType }
15
+ > {}
20
16
 
21
17
  export const applicationCommand = createComponentDecorator(ApplicationCommandComponent)
@@ -0,0 +1,169 @@
1
+ /*
2
+ * File: ApplicationCommandExtension.ts
3
+ *
4
+ * Copyright (c) 2022-2022 pikokr
5
+ *
6
+ * Licensed under MIT License. Please see more defails in LICENSE file.
7
+ */
8
+
9
+ import chalk from 'chalk'
10
+ import {
11
+ ApplicationCommandData,
12
+ ApplicationCommandType,
13
+ ChatInputCommandInteraction,
14
+ Interaction,
15
+ InteractionType,
16
+ MessageContextMenuCommandInteraction,
17
+ Snowflake,
18
+ UserContextMenuCommandInteraction,
19
+ } from 'discord.js'
20
+ import { ApplicationCommandComponent } from './ApplicationCommand'
21
+ import { ApplicationCommandOption } from './ApplicationCommandOption'
22
+ import { moduleHook } from '../core/hooks'
23
+ import { listener } from '../core/listener'
24
+ import { CommandClient } from '../core/structures'
25
+ import { argConverter } from '../core/converter'
26
+ import { CTSExtension } from '../core/extensions/CTSExtension'
27
+
28
+ export type ApplicationCommandExtensionConfig = {
29
+ guilds?: Snowflake[]
30
+ }
31
+
32
+ export class ApplicationCommandExtension extends CTSExtension {
33
+ constructor(public config: ApplicationCommandExtensionConfig) {
34
+ super()
35
+ }
36
+
37
+ @listener({ event: 'interactionCreate' })
38
+ async interactionCreate(i: Interaction) {
39
+ if (i.type !== InteractionType.ApplicationCommand) return
40
+
41
+ let cmd: ApplicationCommandComponent | null = null
42
+ let ext: object | null = null
43
+
44
+ const extensions = this.commandClient.registry.extensions
45
+
46
+ for (const extension of extensions) {
47
+ const components = this.commandClient.registry.getComponentsWithType(extension, ApplicationCommandComponent)
48
+
49
+ for (const command of components) {
50
+ if (command.options.name === i.commandName) {
51
+ ext = extension
52
+ cmd = command
53
+ }
54
+ }
55
+ }
56
+
57
+ if (cmd && ext) {
58
+ const argList: unknown[] = []
59
+
60
+ await this.convertArguments(ApplicationCommandComponent, argList, cmd.argTypes, () => [i])
61
+
62
+ for (const [idx, arg] of cmd.argTypes) {
63
+ let value: unknown = null
64
+
65
+ for (const decorator of arg.decorators) {
66
+ if (decorator instanceof ApplicationCommandOption) {
67
+ value = i.options.get(decorator.options.name, false)?.value
68
+ break
69
+ }
70
+ }
71
+
72
+ if (value) {
73
+ argList[idx] = value
74
+ }
75
+ }
76
+
77
+ try {
78
+ await cmd.execute(ext, argList, [i])
79
+ } catch (e) {
80
+ this.logger.error(e)
81
+ this.commandClient.emit('applicationCommandInvokeError', e, i)
82
+ }
83
+ }
84
+ }
85
+
86
+ @moduleHook('load')
87
+ async load() {}
88
+
89
+ async sync() {
90
+ const client = CommandClient.getFromModule(this)
91
+
92
+ this.logger.info('Trying to sync commands...')
93
+
94
+ const commands: ApplicationCommandData[] = []
95
+
96
+ for (const command of client.registry.getComponentsWithTypeGlobal(ApplicationCommandComponent)) {
97
+ const cmd: ApplicationCommandData = { ...command.options }
98
+
99
+ if (cmd.type === ApplicationCommandType.ChatInput) {
100
+ cmd.options = []
101
+
102
+ for (const [, arg] of command.argTypes) {
103
+ const option = arg.decorators.find((x) => x.constructor === ApplicationCommandOption) as ApplicationCommandOption
104
+
105
+ if (option) {
106
+ cmd.options.push(option.options)
107
+ }
108
+ }
109
+ }
110
+
111
+ commands.push(cmd)
112
+ }
113
+
114
+ this.logger.info(`Processing ${chalk.green(commands.length)} commands(${commands.map((x) => chalk.blue(x.name)).join(', ')})`)
115
+
116
+ if (this.config.guilds) {
117
+ for (const guild of this.config.guilds) {
118
+ try {
119
+ const g = await this.client.guilds.fetch(guild)
120
+ await g.fetch()
121
+ this.logger.info(`Registering commands for guild ${chalk.green(g.name)}(${chalk.blue(g.id)})`)
122
+
123
+ await g.commands.set(commands)
124
+
125
+ this.logger.info(`Successfully registered commands for guild ${chalk.green(g.name)}(${chalk.blue(g.id)})`)
126
+ } catch (e) {
127
+ this.logger.error(`Failed to register commands to guild ${chalk.green(guild)}: ${(e as Error).message}`)
128
+ }
129
+ }
130
+ } else {
131
+ try {
132
+ this.logger.info(`Registering commands globally...`)
133
+
134
+ await this.client.application!.commands.set(commands)
135
+
136
+ this.logger.info('Successfully registered commands.')
137
+ } catch (e) {
138
+ this.logger.error(`Failed to register commands to global: ${(e as Error).message}`)
139
+ }
140
+ }
141
+ }
142
+
143
+ @argConverter({
144
+ component: ApplicationCommandComponent,
145
+ parameterless: true,
146
+ type: ChatInputCommandInteraction,
147
+ })
148
+ async chatInteraction(i: ChatInputCommandInteraction) {
149
+ return i
150
+ }
151
+
152
+ @argConverter({
153
+ component: ApplicationCommandComponent,
154
+ parameterless: true,
155
+ type: MessageContextMenuCommandInteraction,
156
+ })
157
+ async messageInteraction(i: MessageContextMenuCommandInteraction) {
158
+ return i
159
+ }
160
+
161
+ @argConverter({
162
+ component: ApplicationCommandComponent,
163
+ parameterless: true,
164
+ type: UserContextMenuCommandInteraction,
165
+ })
166
+ async userInteraction(i: UserContextMenuCommandInteraction) {
167
+ return i
168
+ }
169
+ }