@pikokr/command.ts 5.0.0-dev.1687555 → 5.0.0-dev.44dc47f

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.
@@ -42,7 +42,7 @@ jobs:
42
42
 
43
43
  # Initializes the CodeQL tools for scanning.
44
44
  - name: Initialize CodeQL
45
- uses: github/codeql-action/init@v1
45
+ uses: github/codeql-action/init@v2
46
46
  with:
47
47
  languages: ${{ matrix.language }}
48
48
  # If you wish to specify custom queries, you can do so here or in a config file.
@@ -53,7 +53,7 @@ jobs:
53
53
  # Autobuild attempts to build any compiled languages (C/C++, C#, or Java).
54
54
  # If this step fails, then you should remove it and run the build manually (see below)
55
55
  - name: Autobuild
56
- uses: github/codeql-action/autobuild@v1
56
+ uses: github/codeql-action/autobuild@v2
57
57
 
58
58
  # ℹ️ Command-line programs to run using the OS shell.
59
59
  # 📚 https://git.io/JvXDl
@@ -67,4 +67,4 @@ jobs:
67
67
  # make release
68
68
 
69
69
  - name: Perform CodeQL Analysis
70
- uses: github/codeql-action/analyze@v1
70
+ uses: github/codeql-action/analyze@v2
@@ -33,7 +33,7 @@ jobs:
33
33
  run: yarn docs
34
34
 
35
35
  - name: Upload artifacts
36
- uses: actions/upload-artifact@v2
36
+ uses: actions/upload-artifact@v3
37
37
  with:
38
38
  name: docs
39
39
  path: docs/docs.json
package/dist/index.d.ts CHANGED
@@ -1,5 +1,5 @@
1
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
+ import { Collection, Snowflake, Interaction, ChatInputCommandInteraction, MessageContextMenuCommandInteraction, UserContextMenuCommandInteraction, Message, Client, UserApplicationCommandData, MessageApplicationCommandData, ChatInputApplicationCommandData, ApplicationCommandType, APIApplicationCommandOption } from 'discord.js';
3
3
  import EventEmitter from 'events';
4
4
  import * as tslog from 'tslog';
5
5
  import { Logger } from 'tslog';
@@ -52,11 +52,11 @@ declare type Options = {
52
52
  type: Function;
53
53
  parameterless: boolean;
54
54
  };
55
- declare class ConverterComponent extends BaseComponent<Options, Options & {
55
+ declare class ConverterComponent extends BaseComponent<Options, Omit<Options, 'parameterless'> & {
56
56
  parameterless?: boolean;
57
57
  }> {
58
58
  }
59
- declare const argConverter: (options: Options & {
59
+ declare const argConverter: (options: Omit<Options, "parameterless"> & {
60
60
  parameterless?: boolean | undefined;
61
61
  }) => MethodDecorator;
62
62
 
@@ -88,7 +88,7 @@ declare class Extension {
88
88
  protected get client(): discord_js.Client<boolean>;
89
89
  protected _logger?: Logger;
90
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>;
91
+ protected convertArguments(component: typeof BaseComponent<unknown>, argList: unknown[], args: Collection<number, ComponentArgument>, getConverterArgs: (arg: ComponentArgument, index: number, converter: ConverterComponent) => unknown[] | Promise<unknown[]>): Promise<void>;
92
92
  }
93
93
 
94
94
  declare class CTSExtension extends Extension {
@@ -109,6 +109,23 @@ declare class ApplicationCommandExtension extends CTSExtension {
109
109
  userInteraction(i: UserContextMenuCommandInteraction): Promise<UserContextMenuCommandInteraction<discord_js.CacheType>>;
110
110
  }
111
111
 
112
+ declare type TextCommandOptions = {
113
+ name: string;
114
+ aliases?: string;
115
+ description?: string;
116
+ };
117
+ declare class TextCommandComponent extends BaseComponent<TextCommandOptions> {
118
+ }
119
+ declare const command: (options: TextCommandOptions) => MethodDecorator;
120
+
121
+ declare type TextCommandConfig = {
122
+ prefix: string | string[] | ((msg: Message) => Promise<string | string[]> | string | string[]);
123
+ };
124
+
125
+ declare class TextCommandRestOption extends ComponentArgumentDecorator<void> {
126
+ }
127
+ declare const rest: (options: void) => ParameterDecorator;
128
+
112
129
  declare class CommandClient extends EventEmitter {
113
130
  discord: Client;
114
131
  logger: Logger;
@@ -118,6 +135,7 @@ declare class CommandClient extends EventEmitter {
118
135
  constructor(discord: Client, logger?: Logger);
119
136
  fetchOwners(): Promise<void>;
120
137
  enableApplicationCommandsExtension(config: ApplicationCommandExtensionConfig): Promise<void>;
138
+ enableTextCommandsExtension(config: TextCommandConfig): Promise<void>;
121
139
  getApplicationCommandsExtension(): ApplicationCommandExtension | undefined;
122
140
  static getFromModule(ext: object): CommandClient;
123
141
  }
@@ -148,12 +166,4 @@ declare const applicationCommand: (options: (UserApplicationCommandData | Messag
148
166
 
149
167
  declare const option: (options: APIApplicationCommandOption) => ParameterDecorator;
150
168
 
151
- declare type TextCommandOptions = {
152
- name: string;
153
- description?: string;
154
- };
155
- declare class TextCommandComponent extends BaseComponent<TextCommandOptions> {
156
- }
157
- declare const command: (options: TextCommandOptions) => MethodDecorator;
158
-
159
- export { ApplicationCommandComponent, BaseComponent, CommandClient, ComponentArgument, ComponentArgumentDecorator, ComponentHookStore, ConverterComponent, Extension, ListenerComponent, OwnerOnlyError, Registry, TextCommandComponent, applicationCommand, argConverter, command, createArgumentDecorator, createCheckDecorator, createComponentDecorator, createComponentHook, getComponent, getComponentArgumentStore, getComponentStore, getModuleHookStore, listener, moduleHook, option, ownerOnly };
169
+ export { ApplicationCommandComponent, BaseComponent, CommandClient, ComponentArgument, ComponentArgumentDecorator, ComponentHookStore, ConverterComponent, Extension, ListenerComponent, OwnerOnlyError, Registry, TextCommandComponent, TextCommandConfig, TextCommandRestOption, applicationCommand, argConverter, command, createArgumentDecorator, createCheckDecorator, createComponentDecorator, createComponentHook, getComponent, getComponentArgumentStore, getComponentStore, getModuleHookStore, listener, moduleHook, option, ownerOnly, rest };
package/dist/index.js CHANGED
@@ -1,2 +1,2 @@
1
- var zt=Object.create;var S=Object.defineProperty;var Zt=Object.getOwnPropertyDescriptor;var qt=Object.getOwnPropertyNames,xt=Object.getOwnPropertySymbols,Jt=Object.getPrototypeOf,Ct=Object.prototype.hasOwnProperty,Kt=Object.prototype.propertyIsEnumerable;var wt=(o,t,e)=>t in o?S(o,t,{enumerable:!0,configurable:!0,writable:!0,value:e}):o[t]=e,bt=(o,t)=>{for(var e in t||(t={}))Ct.call(t,e)&&wt(o,e,t[e]);if(xt)for(var e of xt(t))Kt.call(t,e)&&wt(o,e,t[e]);return o};var vt=o=>S(o,"__esModule",{value:!0}),i=(o,t)=>S(o,"name",{value:t,configurable:!0});var p=(o,t)=>()=>(o&&(t=o(o=0)),t);var Mt=(o,t)=>{for(var e in t)S(o,e,{get:t[e],enumerable:!0})},St=(o,t,e,n)=>{if(t&&typeof t=="object"||typeof t=="function")for(let r of qt(t))!Ct.call(o,r)&&(e||r!=="default")&&S(o,r,{get:()=>t[r],enumerable:!(n=Zt(t,r))||n.enumerable});return o},C=(o,t)=>St(vt(S(o!=null?zt(Jt(o)):{},"default",!t&&o&&o.__esModule?{get:()=>o.default,enumerable:!0}:{value:o,enumerable:!0})),o),Qt=(o=>(t,e)=>o&&o.get(t)||(e=St(vt({}),t,1),o&&o.set(t,e),e))(typeof WeakMap!="undefined"?new WeakMap:0);var s=p(()=>{});var F,ne,Y,B,tt,R=p(()=>{s();F=Symbol(),ne=Symbol(),Y=Symbol(),B=Symbol(),tt=Symbol()});var Rt,et,N,ot=p(()=>{s();Rt=require("discord.js");R();et=i((o,t)=>{let e=Reflect.getMetadata(tt,o,t);return e||(e=new Rt.Collection,Reflect.defineMetadata(tt,e,o,t)),e},"getComponentHookStore"),N=i((o,t)=>(e,n)=>{let r=et(e,n),c=r.get(o);c||(c=[],r.set(o,c)),c.push(t)},"createComponentHook")});var rt,I,Vt,x,nt,st,k=p(()=>{s();rt=require("discord.js");ot();R();I=i(o=>{let t=Reflect.getMetadata(F,o);return t||(t=new rt.Collection,Reflect.defineMetadata(F,t,o)),t},"getComponentStore"),Vt=i((o,t)=>I(o).get(t),"getComponent"),x=i(o=>t=>(e,n)=>{var r=new o(t,Reflect.get(e,n),Reflect.getMetadata("design:paramtypes",e,n));let c=et(e,n);r.hooks=c;let m=I(e);nt(e,n).forEach((u,v)=>{var E;(E=r.argTypes.get(v))==null||E.decorators.push(u)}),m.set(n,r)},"createComponentDecorator"),nt=i((o,t)=>{let e=Reflect.getMetadata(F,o,t);return e||(e=new rt.Collection,Reflect.defineMetadata(F,e,o,t)),e},"getComponentArgumentStore"),st=i(o=>t=>(e,n,r)=>{var c=new o(t);nt(e,n).set(r,c)},"createArgumentDecorator")});var _,it=p(()=>{s();_=class{constructor(t){this.type=t,this.decorators=[]}};i(_,"ComponentArgument")});var kt,O,Ht=p(()=>{s();kt=C(require("lodash")),O=class{constructor(t){typeof t=="object"?this.options=kt.default.merge(this.defaultOptions(),t):this.options=t}defaultOptions(){return{}}};i(O,"ComponentArgumentDecorator")});var d,Xt,ct=p(()=>{s();k();H();d=class extends g{};i(d,"ApplicationCommandComponent");Xt=x(d)});var T,Tt,mt=p(()=>{s();at();T=class extends O{};i(T,"ApplicationCommandOption");Tt=st(T)});var Lt,P,pt,Et=p(()=>{s();Lt=require("discord.js");R();P=i(o=>{let t=Reflect.getMetadata(Y,o);return t||(t=new Lt.Collection,Reflect.defineMetadata(Y,t,o)),t},"getModuleHookStore"),pt=i(o=>(t,e)=>{let n=P(t),r=n.get(o);r||(r=[],n.set(o,r)),r.push(Reflect.get(t,e))},"moduleHook")});var $=p(()=>{s();Et();ot()});var M,lt,G=p(()=>{s();H();k();M=class extends g{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");lt=x(M)});var z,Ft,It,A,ft=p(()=>{s();z=C(require("chalk")),Ft=require("discord.js"),It=C(require("lodash"));dt();$();G();R();A=class{constructor(t,e){this.client=e,this.extensions=[],this.emitters=new Ft.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=I(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(B,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"),It.default.remove(this.extensions,e=>e===t),this.logger.info(`Module unregistered: ${z.default.green(t.constructor.name)}`)}runModuleHook(t,e,...n){let c=P(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=p(()=>{s();ft();gt()});var L,j,q=p(()=>{s();H();k();L=class extends g{};i(L,"ConverterComponent");j=x(L)});var _t,Ot,D,ut=p(()=>{s();_t=C(require("chalk")),Ot=require("discord.js");q();Z();D=class{get commandClient(){return w.getFromModule(this)}get client(){return this.commandClient.discord}get logger(){return this._logger||(this._logger=this.commandClient.logger.getChildLogger({prefix:[_t.default.green(`[${this.constructor.name}]`)],displayFunctionName:!1})),this._logger}async convertArguments(t,e,n,r){let c=new Ot.Collection;for(let m of this.commandClient.registry.extensions)for(let l of this.commandClient.registry.getComponentsWithType(m,L))l.options.component==t&&c.set(l.options.type,{component:l,ext:m});for(let[m,l]of n){let u=c.get(l.type);if(!u){e[m]=void 0;continue}let v=await r(l,m);e[m]=await u.component.execute(u.ext,v)}}};i(D,"Extension")});var $t,J,At=p(()=>{s();$t=C(require("chalk"));ut();J=class extends D{get logger(){return this._logger||(this._logger=this.commandClient.ctsLogger.getChildLogger({prefix:[$t.default.green(`[${this.constructor.name}]`)],displayFunctionName:!1})),this._logger}};i(J,"CTSExtension")});var b,f,W,h,y,jt=p(()=>{s();b=C(require("chalk")),f=require("discord.js");ct();mt();$();G();Z();q();At();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},h=function(o,t){if(typeof Reflect=="object"&&typeof Reflect.metadata=="function")return Reflect.metadata(o,t)},y=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 u of l)u.options.name===t.commandName&&(n=m,e=u)}if(e&&n){let m=[];await this.convertArguments(d,m,e.argTypes,()=>[t]);for(let[l,u]of e.argTypes){let v=null;for(let E of u.decorators)if(E instanceof T){v=(c=t.options.get(E.options.name,!1))==null?void 0:c.value;break}v&&(m[l]=v)}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=w.getFromModule(this);this.logger.info("Trying to sync commands...");let e=[];for(let n of t.registry.getComponentsWithTypeGlobal(d)){let r=bt({},n.options);if(r.type===f.ApplicationCommandType.ChatInput){r.options=[];for(let[,c]of n.argTypes){let m=c.decorators.find(l=>l.constructor===T);m&&r.options.push(m.options)}}e.push(r)}if(this.logger.info(`Processing ${b.default.green(e.length)} commands(${e.map(n=>b.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 ${b.default.green(r.name)}(${b.default.blue(r.id)})`),await r.commands.set(e),this.logger.info(`Successfully registered commands for guild ${b.default.green(r.name)}(${b.default.blue(r.id)})`)}catch(r){this.logger.error(`Failed to register commands to guild ${b.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(y,"ApplicationCommandExtension");W([lt({event:"interactionCreate"}),h("design:type",Function),h("design:paramtypes",[typeof f.Interaction=="undefined"?Object:f.Interaction])],y.prototype,"interactionCreate",null);W([pt("load"),h("design:type",Function),h("design:paramtypes",[])],y.prototype,"load",null);W([j({component:d,parameterless:!0,type:f.ChatInputCommandInteraction}),h("design:type",Function),h("design:paramtypes",[typeof f.ChatInputCommandInteraction=="undefined"?Object:f.ChatInputCommandInteraction])],y.prototype,"chatInteraction",null);W([j({component:d,parameterless:!0,type:f.MessageContextMenuCommandInteraction}),h("design:type",Function),h("design:paramtypes",[typeof f.MessageContextMenuCommandInteraction=="undefined"?Object:f.MessageContextMenuCommandInteraction])],y.prototype,"messageInteraction",null);W([j({component:d,parameterless:!0,type:f.UserContextMenuCommandInteraction}),h("design:type",Function),h("design:paramtypes",[typeof f.UserContextMenuCommandInteraction=="undefined"?Object:f.UserContextMenuCommandInteraction])],y.prototype,"userInteraction",null)});var Ut={};Mt(Ut,{CommandClient:()=>w});var K,Q,Dt,Wt,w,gt=p(()=>{s();K=C(require("chalk")),Q=require("discord.js"),Dt=C(require("events")),Wt=require("tslog");jt();R();ft();w=class extends Dt.default{constructor(t,e=new Wt.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 y(t)),this.ctsLogger.info("Application command extension enabled.")}getApplicationCommandsExtension(){return this.registry.extensions.find(t=>t.constructor===y)}static getFromModule(t){return Reflect.getMetadata(B,t)}};i(w,"CommandClient")});var ht,g,H=p(()=>{s();ht=require("discord.js");it();g=class{hooks=new ht.Collection;argTypes=new ht.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 _(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(()=>(gt(),Ut));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(g,"BaseComponent")});var eo,dt=p(()=>{s();eo=require("reflect-metadata");k();it();Ht();H()});var U,yt=p(()=>{s();U=class{};i(U,"OwnerOnlyError")});var V,Bt,Yt,Nt=p(()=>{s();V=require("discord.js");$();yt();Bt=i(o=>N("beforeCall",o),"createCheckDecorator"),Yt=Bt(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=p(()=>{s();Nt();yt()});var Gt=p(()=>{s();ut()});var at=p(()=>{s();dt();$();q();Pt();G();Z();Gt()});var ee={};Mt(ee,{ApplicationCommandComponent:()=>d,BaseComponent:()=>g,CommandClient:()=>w,ComponentArgument:()=>_,ComponentArgumentDecorator:()=>O,ConverterComponent:()=>L,Extension:()=>D,ListenerComponent:()=>M,OwnerOnlyError:()=>U,Registry:()=>A,TextCommandComponent:()=>X,applicationCommand:()=>Xt,argConverter:()=>j,command:()=>te,createArgumentDecorator:()=>st,createCheckDecorator:()=>Bt,createComponentDecorator:()=>x,createComponentHook:()=>N,getComponent:()=>Vt,getComponentArgumentStore:()=>nt,getComponentStore:()=>I,getModuleHookStore:()=>P,listener:()=>lt,moduleHook:()=>pt,option:()=>Tt,ownerOnly:()=>Yt});s();at();s();ct();mt();s();s();k();H();var X=class extends g{};i(X,"TextCommandComponent");var te=x(X);module.exports=Qt(ee);0&&(module.exports={ApplicationCommandComponent,BaseComponent,CommandClient,ComponentArgument,ComponentArgumentDecorator,ConverterComponent,Extension,ListenerComponent,OwnerOnlyError,Registry,TextCommandComponent,applicationCommand,argConverter,command,createArgumentDecorator,createCheckDecorator,createComponentDecorator,createComponentHook,getComponent,getComponentArgumentStore,getComponentStore,getModuleHookStore,listener,moduleHook,option,ownerOnly});
1
+ "use strict";var Qt=Object.create;var U=Object.defineProperty;var Vt=Object.getOwnPropertyDescriptor;var Xt=Object.getOwnPropertyNames;var Yt=Object.getPrototypeOf,te=Object.prototype.hasOwnProperty;var i=(r,t)=>U(r,"name",{value:t,configurable:!0});var m=(r,t)=>()=>(r&&(t=r(r=0)),t);var Ft=(r,t)=>{for(var e in t)U(r,e,{get:t[e],enumerable:!0})},Tt=(r,t,e,o)=>{if(t&&typeof t=="object"||typeof t=="function")for(let n of Xt(t))!te.call(r,n)&&n!==e&&U(r,n,{get:()=>t[n],enumerable:!(o=Vt(t,n))||o.enumerable});return r};var S=(r,t,e)=>(e=r!=null?Qt(Yt(r)):{},Tt(t||!r||!r.__esModule?U(e,"default",{value:r,enumerable:!0}):e,r)),ee=r=>Tt(U({},"__esModule",{value:!0}),r);var z,me,mt,X,pt,E=m(()=>{"use strict";z=Symbol(),me=Symbol(),mt=Symbol(),X=Symbol(),pt=Symbol()});var Ht,lt,Y,ft=m(()=>{"use strict";Ht=require("discord.js");E();lt=i((r,t)=>{let e=Reflect.getMetadata(pt,r,t);return e||(e=new Ht.Collection,Reflect.defineMetadata(pt,e,r,t)),e},"getComponentHookStore"),Y=i((r,t)=>(e,o)=>{let n=lt(e,o),s=n.get(r);s||(s=[],n.set(r,s)),s.push(t)},"createComponentHook")});var gt,Z,oe,C,dt,q,$=m(()=>{"use strict";gt=require("discord.js");ft();E();Z=i(r=>{let t=Reflect.getMetadata(z,r);return t||(t=new gt.Collection,Reflect.defineMetadata(z,t,r)),t},"getComponentStore"),oe=i((r,t)=>Z(r).get(t),"getComponent"),C=i(r=>t=>(e,o)=>{var n=new r(t,Reflect.get(e,o),Reflect.getMetadata("design:paramtypes",e,o));let s=lt(e,o);n.hooks=s;let c=Z(e);dt(e,o).forEach((l,h)=>{var x;(x=n.argTypes.get(h))==null||x.decorators.push(l)}),c.set(o,n)},"createComponentDecorator"),dt=i((r,t)=>{let e=Reflect.getMetadata(z,r,t);return e||(e=new gt.Collection,Reflect.defineMetadata(z,e,r,t)),e},"getComponentArgumentStore"),q=i(r=>t=>(e,o,n)=>{var s=new r(t);dt(e,o).set(n,s)},"createArgumentDecorator")});var W,ut=m(()=>{"use strict";W=class{constructor(t){this.type=t,this.decorators=[]}};i(W,"ComponentArgument")});var jt,R,Lt=m(()=>{"use strict";jt=S(require("lodash")),R=class{constructor(t){typeof t=="object"?this.options=jt.default.merge(this.defaultOptions(),t):this.options=t}defaultOptions(){return{}}};i(R,"ComponentArgumentDecorator")});var f,re,ht=m(()=>{"use strict";$();A();f=class extends g{};i(f,"ApplicationCommandComponent");re=C(f)});var H,It,yt=m(()=>{"use strict";D();H=class extends R{};i(H,"ApplicationCommandOption");It=q(H)});var Ot,tt,xt,Et=m(()=>{"use strict";Ot=require("discord.js");E();tt=i(r=>{let t=Reflect.getMetadata(mt,r);return t||(t=new Ot.Collection,Reflect.defineMetadata(mt,t,r)),t},"getModuleHookStore"),xt=i(r=>(t,e)=>{let o=tt(t),n=o.get(r);n||(n=[],o.set(r,n)),n.push(Reflect.get(t,e))},"moduleHook")});var J=m(()=>{"use strict";Et();ft()});var k,K,Q=m(()=>{"use strict";A();$();k=class extends g{defaultOptions(){return{emitter:"discord"}}constructor(t,e,o){super({event:t.event,emitter:t.emitter??"discord"},e,o)}};i(k,"ListenerComponent");K=C(k)});var et,$t,Wt,P,Ct=m(()=>{"use strict";et=S(require("chalk")),$t=require("discord.js"),Wt=S(require("lodash"));wt();J();Q();E();P=class{constructor(t,e){this.client=e,this.extensions=[],this.emitters=new $t.Collection,this.logger=t.getChildLogger({prefix:[et.default.green("[Registry]")]})}getComponentsWithTypeGlobal(t){let e=[];for(let o of this.extensions)e.push(...this.getComponentsWithType(o,t));return e}getComponentsWithType(t,e){let o=Z(t);return Array.from(o.filter(n=>n.constructor===e).values())}registerEventListeners(t){let e=this.getComponentsWithType(t,k);for(let o of e){let n=this.emitters.get(o.options.emitter);if(n){let s=o.method.bind(t);Reflect.defineMetadata("bound",s,o),n.addListener(o.options.event,s)}}}unregisterEventListeners(t){let e=this.getComponentsWithType(t,k);for(let o of e){let n=this.emitters.get(o.options.emitter),s=Reflect.getMetadata("bound",o);n&&s&&n.removeListener(o.options.event,s)}}async registerModule(t){Reflect.defineMetadata(X,this.client,t),this.registerEventListeners(t),await this.runModuleHook(t,"load"),this.extensions.push(t),this.logger.info(`Module registered: ${et.default.green(t.constructor.name)}`)}async unregisterModule(t){this.unregisterEventListeners(t),await this.runModuleHook(t,"unload"),Wt.default.remove(this.extensions,e=>e===t),this.logger.info(`Module unregistered: ${et.default.green(t.constructor.name)}`)}runModuleHook(t,e,...o){let s=tt(t).get(e);if(s)for(let c of s)c.call(t,...o)}registerEventEmitter(t,e){this.emitters.set(t,e)}};i(P,"Registry")});var ot=m(()=>{"use strict";Ct();bt()});var j,w,rt=m(()=>{"use strict";A();$();j=class extends g{};i(j,"ConverterComponent");w=C(j)});var At,Dt,N,vt=m(()=>{"use strict";At=S(require("chalk")),Dt=require("discord.js");rt();ot();N=class{get commandClient(){return b.getFromModule(this)}get client(){return this.commandClient.discord}get logger(){return this._logger||(this._logger=this.commandClient.logger.getChildLogger({prefix:[At.default.green(`[${this.constructor.name}]`)],displayFunctionName:!1})),this._logger}async convertArguments(t,e,o,n){let s=new Dt.Collection;for(let c of this.commandClient.registry.extensions)for(let a of this.commandClient.registry.getComponentsWithType(c,j))a.options.component==t&&s.set(a.options.type,{component:a,ext:c});for(let[c,a]of o){let l=s.get(a.type);if(!l){e[c]=void 0;continue}let h=await n(a,c,l.component);e[c]=await l.component.execute(l.ext,h)}}};i(N,"Extension")});var Pt,L,Mt=m(()=>{"use strict";Pt=S(require("chalk"));vt();L=class extends N{get logger(){return this._logger||(this._logger=this.commandClient.ctsLogger.getChildLogger({prefix:[Pt.default.green(`[${this.constructor.name}]`)],displayFunctionName:!1})),this._logger}};i(L,"CTSExtension")});var _,p,V,y,d,Nt=m(()=>{"use strict";_=S(require("chalk")),p=require("discord.js");ht();yt();J();Q();ot();rt();Mt();V=function(r,t,e,o){var n=arguments.length,s=n<3?t:o===null?o=Object.getOwnPropertyDescriptor(t,e):o,c;if(typeof Reflect=="object"&&typeof Reflect.decorate=="function")s=Reflect.decorate(r,t,e,o);else for(var a=r.length-1;a>=0;a--)(c=r[a])&&(s=(n<3?c(s):n>3?c(t,e,s):c(t,e))||s);return n>3&&s&&Object.defineProperty(t,e,s),s},y=function(r,t){if(typeof Reflect=="object"&&typeof Reflect.metadata=="function")return Reflect.metadata(r,t)},d=class extends L{constructor(t){super(),this.config=t}async interactionCreate(t){var s;if(t.type!==p.InteractionType.ApplicationCommand)return;let e=null,o=null,n=this.commandClient.registry.extensions;for(let c of n){let a=this.commandClient.registry.getComponentsWithType(c,f);for(let l of a)l.options.name===t.commandName&&(o=c,e=l)}if(e&&o){let c=[];await this.convertArguments(f,c,e.argTypes,()=>[t]);for(let[a,l]of e.argTypes){let h=null;for(let x of l.decorators)if(x instanceof H){h=(s=t.options.get(x.options.name,!1))==null?void 0:s.value;break}h&&(c[a]=h)}try{await e.execute(o,c,[t])}catch(a){this.logger.error(a),this.commandClient.emit("applicationCommandInvokeError",a,t)}}}async load(){}async sync(){let t=b.getFromModule(this);this.logger.info("Trying to sync commands...");let e=[];for(let o of t.registry.getComponentsWithTypeGlobal(f)){let n={...o.options};if(n.type===p.ApplicationCommandType.ChatInput){n.options=[];for(let[,s]of o.argTypes){let c=s.decorators.find(a=>a.constructor===H);c&&n.options.push(c.options)}}e.push(n)}if(this.logger.info(`Processing ${_.default.green(e.length)} commands(${e.map(o=>_.default.blue(o.name)).join(", ")})`),this.config.guilds)for(let o of this.config.guilds)try{let n=await this.client.guilds.fetch(o);await n.fetch(),this.logger.info(`Registering commands for guild ${_.default.green(n.name)}(${_.default.blue(n.id)})`),await n.commands.set(e),this.logger.info(`Successfully registered commands for guild ${_.default.green(n.name)}(${_.default.blue(n.id)})`)}catch(n){this.logger.error(`Failed to register commands to guild ${_.default.green(o)}: ${n.message}`)}else try{this.logger.info("Registering commands globally..."),await this.client.application.commands.set(e),this.logger.info("Successfully registered commands.")}catch(o){this.logger.error(`Failed to register commands to global: ${o.message}`)}}async chatInteraction(t){return t}async messageInteraction(t){return t}async userInteraction(t){return t}};i(d,"ApplicationCommandExtension");V([K({event:"interactionCreate"}),y("design:type",Function),y("design:paramtypes",[typeof p.Interaction>"u"?Object:p.Interaction])],d.prototype,"interactionCreate",null);V([xt("load"),y("design:type",Function),y("design:paramtypes",[])],d.prototype,"load",null);V([w({component:f,parameterless:!0,type:p.ChatInputCommandInteraction}),y("design:type",Function),y("design:paramtypes",[typeof p.ChatInputCommandInteraction>"u"?Object:p.ChatInputCommandInteraction])],d.prototype,"chatInteraction",null);V([w({component:f,parameterless:!0,type:p.MessageContextMenuCommandInteraction}),y("design:type",Function),y("design:paramtypes",[typeof p.MessageContextMenuCommandInteraction>"u"?Object:p.MessageContextMenuCommandInteraction])],d.prototype,"messageInteraction",null);V([w({component:f,parameterless:!0,type:p.UserContextMenuCommandInteraction}),y("design:type",Function),y("design:paramtypes",[typeof p.UserContextMenuCommandInteraction>"u"?Object:p.UserContextMenuCommandInteraction])],d.prototype,"userInteraction",null)});var u,ne,St=m(()=>{"use strict";$();A();u=class extends g{};i(u,"TextCommandComponent");ne=C(u)});var I,se,Rt=m(()=>{"use strict";D();D();I=class extends R{};i(I,"TextCommandRestOption");se=q(I)});var B,nt,F,v,Bt=m(()=>{"use strict";Q();B=require("discord.js");Mt();St();Rt();D();nt=function(r,t,e,o){var n=arguments.length,s=n<3?t:o===null?o=Object.getOwnPropertyDescriptor(t,e):o,c;if(typeof Reflect=="object"&&typeof Reflect.decorate=="function")s=Reflect.decorate(r,t,e,o);else for(var a=r.length-1;a>=0;a--)(c=r[a])&&(s=(n<3?c(s):n>3?c(t,e,s):c(t,e))||s);return n>3&&s&&Object.defineProperty(t,e,s),s},F=function(r,t){if(typeof Reflect=="object"&&typeof Reflect.metadata=="function")return Reflect.metadata(r,t)},v=class extends L{constructor(t){super(),this.config=t}async processPrefix(t){let e=t.content,o=this.config.prefix;if(typeof o=="function"&&(o=await o(t)),typeof o=="string")return e.startsWith(o)?o.length:null;if(o instanceof Array){let n=o.find(s=>e.startsWith(s));return n?n.length:null}return null}async messageCreate(t){let e=await this.processPrefix(t);if(!e)return;let o=t.content.slice(e),n=[],s=new Map;for(let M of this.commandClient.registry.extensions)for(let O of this.commandClient.registry.getComponentsWithType(M,u))n.push(O),s.set(O,M);let c=0,a=n.find(M=>{let O=[M.options.name];M.options.aliases&&O.push(...M.options.aliases);for(let T of O)if(o.startsWith(T))return o.length===T.length?(c=T.length,!0):(c=T.length,o.startsWith(T+" "));return!1});if(!a)return;let l=s.get(a);if(!l)return;let h=[],x=o.slice(c+1).split(/ /g);await this.convertArguments(u,h,a.argTypes,async(M,O,T)=>{if(T.options.parameterless)return[t];if(M.decorators.find(at=>at.constructor===I)){let at=x.join(" ");return x=[],[at,t]}return[x.shift(),t]}),await a.execute(l,h,[t])}async mesage(t){return t}async str(t){return t}async num(t){return Number(t)}};i(v,"TextCommandExtension");nt([K({event:"messageCreate",emitter:"discord"}),F("design:type",Function),F("design:paramtypes",[typeof B.Message>"u"?Object:B.Message])],v.prototype,"messageCreate",null);nt([w({component:u,type:B.Message,parameterless:!0}),F("design:type",Function),F("design:paramtypes",[typeof B.Message>"u"?Object:B.Message])],v.prototype,"mesage",null);nt([w({component:u,type:String}),F("design:type",Function),F("design:paramtypes",[String])],v.prototype,"str",null);nt([w({component:u,type:Number}),F("design:type",Function),F("design:paramtypes",[String])],v.prototype,"num",null)});var zt={};Ft(zt,{CommandClient:()=>b});var st,it,Gt,Ut,b,bt=m(()=>{"use strict";st=S(require("chalk")),it=require("discord.js"),Gt=S(require("events")),Ut=require("tslog");Nt();Bt();E();Ct();b=class extends Gt.default{constructor(t,e=new Ut.Logger({dateTimeTimezone:Intl.DateTimeFormat().resolvedOptions().timeZone})){super(),this.discord=t,this.logger=e,this.owners=new Set,this.ctsLogger=e.getChildLogger({prefix:[st.default.blue("[command.ts]")],displayFilePath:"hidden",displayFunctionName:!1}),this.registry=new P(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 it.User)this.owners.add(t.id),e.push(t.tag);else if(t instanceof it.Team)for(let[o,n]of t.members)this.owners.add(o),e.push(n.user.tag);this.ctsLogger.info(`Fetched ${st.default.green(e.length)} owners(${e.map(o=>st.default.blue(o)).join(", ")})`)}async enableApplicationCommandsExtension(t){await this.registry.registerModule(new d(t)),this.ctsLogger.info("Application command extension enabled.")}async enableTextCommandsExtension(t){await this.registry.registerModule(new v(t)),this.ctsLogger.info("Text command extension enabled.")}getApplicationCommandsExtension(){return this.registry.extensions.find(t=>t.constructor===d)}static getFromModule(t){return Reflect.getMetadata(X,t)}};i(b,"CommandClient")});var kt,g,A=m(()=>{"use strict";kt=require("discord.js");ut();g=class{hooks=new kt.Collection;argTypes=new kt.Collection;constructor(t,e,o){this.options=this.convertOptions(t),this.method=e;for(let n=0;n<o.length;n++){let s=o[n];this.argTypes.set(n,new W(s))}}convertOptions(t){return t}async executeHook(t,e,o){let n=this.hooks.get(e);if(!n)return;let{CommandClient:s}=await Promise.resolve().then(()=>(bt(),zt));for(let c of n)await c.call(null,s.getFromModule(t),...o)}async execute(t,e,o=e){await this.executeHook(t,"beforeCall",o);let n;try{n=await this.method.call(t,...e)}catch(s){throw await this.executeHook(t,"invokeError",[s]),s}return await this.executeHook(t,"afterCall",[n]),n}};i(g,"BaseComponent")});var wo,wt=m(()=>{"use strict";wo=require("reflect-metadata");$();ut();Lt();A()});var G,_t=m(()=>{"use strict";G=class{};i(G,"OwnerOnlyError")});var ct,Zt,ie,qt=m(()=>{"use strict";ct=require("discord.js");J();_t();Zt=i(r=>Y("beforeCall",r),"createCheckDecorator"),ie=Zt(async(r,t)=>{let e=!1;if(t instanceof ct.BaseInteraction?e=r.owners.has(t.user.id):t instanceof ct.Message&&(e=r.owners.has(t.author.id)),!e)throw new G})});var Jt=m(()=>{"use strict";qt();_t()});var Kt=m(()=>{"use strict";vt()});var D=m(()=>{"use strict";wt();J();rt();Jt();Q();ot();Kt()});var ce={};Ft(ce,{ApplicationCommandComponent:()=>f,BaseComponent:()=>g,CommandClient:()=>b,ComponentArgument:()=>W,ComponentArgumentDecorator:()=>R,ConverterComponent:()=>j,Extension:()=>N,ListenerComponent:()=>k,OwnerOnlyError:()=>G,Registry:()=>P,TextCommandComponent:()=>u,TextCommandRestOption:()=>I,applicationCommand:()=>re,argConverter:()=>w,command:()=>ne,createArgumentDecorator:()=>q,createCheckDecorator:()=>Zt,createComponentDecorator:()=>C,createComponentHook:()=>Y,getComponent:()=>oe,getComponentArgumentStore:()=>dt,getComponentStore:()=>Z,getModuleHookStore:()=>tt,listener:()=>K,moduleHook:()=>xt,option:()=>It,ownerOnly:()=>ie,rest:()=>se});module.exports=ee(ce);D();ht();yt();St();Rt();0&&(module.exports={ApplicationCommandComponent,BaseComponent,CommandClient,ComponentArgument,ComponentArgumentDecorator,ConverterComponent,Extension,ListenerComponent,OwnerOnlyError,Registry,TextCommandComponent,TextCommandRestOption,applicationCommand,argConverter,command,createArgumentDecorator,createCheckDecorator,createComponentDecorator,createComponentHook,getComponent,getComponentArgumentStore,getComponentStore,getModuleHookStore,listener,moduleHook,option,ownerOnly,rest});
2
2
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
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","../src/textCommand/home/runner/work/command.ts/command.ts/src/textCommand/index.ts","../src/textCommand/home/runner/work/command.ts/command.ts/src/textCommand/TextCommand.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'\r\nexport * from './applicationCommand'\r\nexport * from './textCommand'\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\nexport * from './ApplicationCommand'\nexport { option } from './ApplicationCommandOption'\n","export * from './TextCommand'\n","import { createComponentDecorator } from '../core/components/decoratorCreator'\nimport { BaseComponent } from '../core/components/BaseComponent'\n\ntype TextCommandOptions = {\n name: string\n description?: string\n}\n\nexport class TextCommandComponent extends BaseComponent<TextCommandOptions> {}\n\nexport const command = createComponentDecorator(TextCommandComponent)\n"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../src/core/symbols.ts","../src/core/hooks/componentHook.ts","../src/core/components/decoratorCreator.ts","../src/core/components/ComponentArgument.ts","../src/core/components/ComponentArgumentDecorator.ts","../src/applicationCommand/ApplicationCommand.ts","../src/applicationCommand/ApplicationCommandOption.ts","../src/core/hooks/moduleHook.ts","../src/core/hooks/index.ts","../src/core/listener/index.ts","../src/core/structures/Registry.ts","../src/core/structures/index.ts","../src/core/converter/index.ts","../src/core/extensions/Extension.ts","../src/core/extensions/CTSExtension.ts","../src/applicationCommand/ApplicationCommandExtension.ts","../src/textCommand/TextCommand.ts","../src/textCommand/parameters.ts","../src/textCommand/TextCommandExtension.ts","../src/core/structures/CommandClient.ts","../src/core/components/BaseComponent.ts","../src/core/components/index.ts","../src/core/utils/errors.ts","../src/core/utils/checks.ts","../src/core/utils/index.ts","../src/core/extensions/index.ts","../src/core/index.ts","../src/index.ts"],"sourcesContent":["/*\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","/*\r\n* File: componentHook.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 { 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, Omit<Options, 'parameterless'> & { 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, converter: ConverterComponent) => 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, converter.component)\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: TextCommand.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 { createComponentDecorator } from '../core/components/decoratorCreator'\nimport { BaseComponent } from '../core/components/BaseComponent'\n\ntype TextCommandOptions = {\n name: string\n aliases?: string\n description?: string\n}\n\nexport class TextCommandComponent extends BaseComponent<TextCommandOptions> {}\n\nexport const command = createComponentDecorator(TextCommandComponent)\n","/*\r\n * File: parameters.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 '../core'\r\nimport { createArgumentDecorator } from '../core'\r\n\r\nexport class TextCommandRestOption extends ComponentArgumentDecorator<void> {}\r\n\r\nexport const rest = createArgumentDecorator(TextCommandRestOption)\r\n","/*\r\n* File: TextCommandExtension.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 { listener } from '../core/listener'\nimport { Message } from 'discord.js'\nimport { CTSExtension } from '../core/extensions/CTSExtension'\nimport { TextCommandComponent } from './TextCommand'\nimport { TextCommandRestOption } from './parameters'\nimport { argConverter } from '../core'\n\nexport type TextCommandConfig = {\n prefix: string | string[] | ((msg: Message) => Promise<string | string[]> | string | string[])\n}\n\nexport class TextCommandExtension extends CTSExtension {\n constructor(private config: TextCommandConfig) {\n super()\n }\n\n private async processPrefix(msg: Message): Promise<number | null> {\n const content = msg.content\n let prefix = this.config.prefix\n\n if (typeof prefix === 'function') {\n prefix = await prefix(msg)\n }\n\n if (typeof prefix === 'string') {\n if (content.startsWith(prefix)) return prefix.length\n return null\n }\n\n if (prefix instanceof Array) {\n const p = prefix.find((x) => content.startsWith(x))\n\n if (p) return p.length\n return null\n }\n\n return null\n }\n\n @listener({ event: 'messageCreate', emitter: 'discord' })\n private async messageCreate(msg: Message) {\n const startIndex = await this.processPrefix(msg)\n\n if (!startIndex) return\n\n const content = msg.content.slice(startIndex)\n\n const commands: TextCommandComponent[] = []\n\n const extensions = new Map<TextCommandComponent, object>()\n\n for (const ext of this.commandClient.registry.extensions) {\n for (const cmd of this.commandClient.registry.getComponentsWithType(ext, TextCommandComponent)) {\n commands.push(cmd)\n extensions.set(cmd, ext)\n }\n }\n\n let commandNameLength = 0\n\n const command = commands.find((x) => {\n const names = [x.options.name]\n\n if (x.options.aliases) {\n names.push(...x.options.aliases)\n }\n\n for (const name of names) {\n if (content.startsWith(name)) {\n if (content.length === name.length) {\n commandNameLength = name.length\n return true\n }\n commandNameLength = name.length\n return content.startsWith(name + ' ')\n }\n }\n\n return false\n })\n\n if (!command) return\n\n const ext = extensions.get(command)\n\n if (!ext) return\n\n const args: unknown[] = []\n\n let argStrings = content.slice(commandNameLength + 1).split(/ /g)\n\n await this.convertArguments(TextCommandComponent, args, command.argTypes, async (arg, i, converter) => {\n if (converter.options.parameterless) return [msg]\n\n if (arg.decorators.find((x) => x.constructor === TextCommandRestOption)) {\n const text = argStrings.join(' ')\n argStrings = []\n return [text, msg]\n }\n return [argStrings.shift(), msg]\n })\n\n await command.execute(ext, args, [msg])\n }\n\n @argConverter({ component: TextCommandComponent, type: Message, parameterless: true })\n async mesage(msg: Message) {\n return msg\n }\n\n @argConverter({ component: TextCommandComponent, type: String })\n async str(value: string) {\n return value\n }\n\n @argConverter({ component: TextCommandComponent, type: Number })\n async num(value: string) {\n return Number(value)\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 { TextCommandConfig } from '../../textCommand'\nimport { TextCommandExtension } from '../../textCommand/TextCommandExtension'\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 async enableTextCommandsExtension(config: TextCommandConfig) {\n await this.registry.registerModule(new TextCommandExtension(config))\n this.ctsLogger.info('Text 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","/*\r\n* File: BaseComponent.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 _ 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 let result\n try {\n result = await this.method.call(target, ...args)\n } catch (e) {\n await this.executeHook(target, 'invokeError', [e])\n throw e\n }\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'\r\nexport * from './applicationCommand'\r\nexport * from './textCommand'\r\n"],"mappings":"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","names":[]}
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@pikokr/command.ts",
3
3
  "description": "Discord.js command framework for typescript.",
4
- "version": "5.0.0-dev.1687555",
4
+ "version": "5.0.0-dev.44dc47f",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",
7
7
  "license": "MIT",
@@ -9,20 +9,19 @@
9
9
  "@discordjs/ts-docgen": "0.4.1",
10
10
  "@swc/core": "1.2.218",
11
11
  "@types/chalk": "2.2.0",
12
- "@types/lodash": "4.14.172",
12
+ "@types/lodash": "4.14.182",
13
13
  "all-contributors-cli": "6.20.0",
14
- "discord.js": "14.0.1",
14
+ "discord.js": "14.0.3",
15
15
  "dotenv": "16.0.1",
16
16
  "prettier": "2.7.1",
17
17
  "ts-node": "10.9.1",
18
- "tsup": "5.11.12",
18
+ "tsup": "6.1.3",
19
19
  "typedoc": "0.22.11",
20
20
  "typescript": "4.7.4"
21
21
  },
22
22
  "dependencies": {
23
- "@types/node": "^14.14.37",
23
+ "@types/node": "^16.0.0",
24
24
  "chalk": "4.1.2",
25
- "discord-api-types": "^0.23.1",
26
25
  "lodash": "^4.17.21",
27
26
  "reflect-metadata": "^0.1.13",
28
27
  "tslog": "^3.3.1",
@@ -1,11 +1,11 @@
1
- /*
2
- * File: BaseComponent.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: BaseComponent.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 { Collection } from 'discord.js'
10
10
  import _ from 'lodash'
11
11
  import type { ComponentHookStore } from '../hooks'
@@ -48,7 +48,13 @@ export class BaseComponent<Options = unknown, OptionsArg = Options> {
48
48
 
49
49
  async execute(target: object, args: unknown[], beforeCallArgs: unknown[] = args) {
50
50
  await this.executeHook(target, 'beforeCall', beforeCallArgs)
51
- const result = await this.method.call(target, ...args)
51
+ let result
52
+ try {
53
+ result = await this.method.call(target, ...args)
54
+ } catch (e) {
55
+ await this.executeHook(target, 'invokeError', [e])
56
+ throw e
57
+ }
52
58
  await this.executeHook(target, 'afterCall', [result])
53
59
 
54
60
  return result
@@ -1,10 +1,10 @@
1
1
  /*
2
- * File: index.ts
3
- *
4
- * Copyright (c) 2022-2022 pikokr
5
- *
6
- * Licensed under MIT License. Please see more defails in LICENSE file.
7
- */
2
+ * File: index.ts
3
+ *
4
+ * Copyright (c) 2022-2022 pikokr
5
+ *
6
+ * Licensed under MIT License. Please see more defails in LICENSE file.
7
+ */
8
8
 
9
9
  import 'reflect-metadata'
10
10
  export * from './decoratorCreator'
@@ -11,6 +11,6 @@ import { createComponentDecorator } from '../components/decoratorCreator'
11
11
 
12
12
  type Options = { component: typeof BaseComponent<unknown>; type: Function; parameterless: boolean }
13
13
 
14
- export class ConverterComponent extends BaseComponent<Options, Options & { parameterless?: boolean }> {}
14
+ export class ConverterComponent extends BaseComponent<Options, Omit<Options, 'parameterless'> & { parameterless?: boolean }> {}
15
15
 
16
16
  export const argConverter = createComponentDecorator(ConverterComponent)
@@ -34,7 +34,7 @@ export class Extension {
34
34
  component: typeof BaseComponent<unknown>,
35
35
  argList: unknown[],
36
36
  args: Collection<number, ComponentArgument>,
37
- getConverterArgs: (arg: ComponentArgument, index: number) => unknown[] | Promise<unknown[]>,
37
+ getConverterArgs: (arg: ComponentArgument, index: number, converter: ConverterComponent) => unknown[] | Promise<unknown[]>,
38
38
  ) {
39
39
  const items = new Collection<unknown, { ext: object; component: ConverterComponent }>()
40
40
 
@@ -54,7 +54,7 @@ export class Extension {
54
54
  continue
55
55
  }
56
56
 
57
- const converterArgs = await getConverterArgs(arg, index)
57
+ const converterArgs = await getConverterArgs(arg, index, converter.component)
58
58
 
59
59
  argList[index] = await converter.component.execute(converter.ext, converterArgs)
60
60
  }
@@ -1,11 +1,11 @@
1
- /*
2
- * File: componentHook.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: componentHook.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 { Collection } from 'discord.js'
10
10
  import { ComponentHookSymbol } from '../symbols'
11
11
 
@@ -1,10 +1,10 @@
1
1
  /*
2
- * File: index.ts
3
- *
4
- * Copyright (c) 2022-2022 pikokr
5
- *
6
- * Licensed under MIT License. Please see more defails in LICENSE file.
7
- */
2
+ * File: index.ts
3
+ *
4
+ * Copyright (c) 2022-2022 pikokr
5
+ *
6
+ * Licensed under MIT License. Please see more defails in LICENSE file.
7
+ */
8
8
 
9
9
  export * from './moduleHook'
10
10
  export { createComponentHook } from './componentHook'
@@ -11,6 +11,8 @@ import { Client, Snowflake, Team, User } from 'discord.js'
11
11
  import EventEmitter from 'events'
12
12
  import { Logger } from 'tslog'
13
13
  import { ApplicationCommandExtension, ApplicationCommandExtensionConfig } from '../../applicationCommand/ApplicationCommandExtension'
14
+ import { TextCommandConfig } from '../../textCommand'
15
+ import { TextCommandExtension } from '../../textCommand/TextCommandExtension'
14
16
  import { CommandClientSymbol } from '../symbols'
15
17
  import { Registry } from './Registry'
16
18
  export class CommandClient extends EventEmitter {
@@ -61,6 +63,11 @@ export class CommandClient extends EventEmitter {
61
63
  this.ctsLogger.info('Application command extension enabled.')
62
64
  }
63
65
 
66
+ async enableTextCommandsExtension(config: TextCommandConfig) {
67
+ await this.registry.registerModule(new TextCommandExtension(config))
68
+ this.ctsLogger.info('Text command extension enabled.')
69
+ }
70
+
64
71
  getApplicationCommandsExtension() {
65
72
  return this.registry.extensions.find((x) => x.constructor === ApplicationCommandExtension) as ApplicationCommandExtension | undefined
66
73
  }
@@ -1,10 +1,10 @@
1
1
  /*
2
- * File: symbols.ts
3
- *
4
- * Copyright (c) 2022-2022 pikokr
5
- *
6
- * Licensed under MIT License. Please see more defails in LICENSE file.
7
- */
2
+ * File: symbols.ts
3
+ *
4
+ * Copyright (c) 2022-2022 pikokr
5
+ *
6
+ * Licensed under MIT License. Please see more defails in LICENSE file.
7
+ */
8
8
 
9
9
  export const ComponentStoreSymbol = Symbol()
10
10
  export const ComponentArgStoreSymbol = Symbol()
package/src/index.ts CHANGED
@@ -1,10 +1,10 @@
1
1
  /*
2
- * File: index.ts
3
- *
4
- * Copyright (c) 2022-2022 pikokr
5
- *
6
- * Licensed under MIT License. Please see more defails in LICENSE file.
7
- */
2
+ * File: index.ts
3
+ *
4
+ * Copyright (c) 2022-2022 pikokr
5
+ *
6
+ * Licensed under MIT License. Please see more defails in LICENSE file.
7
+ */
8
8
 
9
9
  export * from './core'
10
10
  export * from './applicationCommand'
@@ -1,8 +1,17 @@
1
+ /*
2
+ * File: TextCommand.ts
3
+ *
4
+ * Copyright (c) 2022-2022 pikokr
5
+ *
6
+ * Licensed under MIT License. Please see more defails in LICENSE file.
7
+ */
8
+
1
9
  import { createComponentDecorator } from '../core/components/decoratorCreator'
2
10
  import { BaseComponent } from '../core/components/BaseComponent'
3
11
 
4
12
  type TextCommandOptions = {
5
13
  name: string
14
+ aliases?: string
6
15
  description?: string
7
16
  }
8
17
 
@@ -0,0 +1,128 @@
1
+ /*
2
+ * File: TextCommandExtension.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 { listener } from '../core/listener'
10
+ import { Message } from 'discord.js'
11
+ import { CTSExtension } from '../core/extensions/CTSExtension'
12
+ import { TextCommandComponent } from './TextCommand'
13
+ import { TextCommandRestOption } from './parameters'
14
+ import { argConverter } from '../core'
15
+
16
+ export type TextCommandConfig = {
17
+ prefix: string | string[] | ((msg: Message) => Promise<string | string[]> | string | string[])
18
+ }
19
+
20
+ export class TextCommandExtension extends CTSExtension {
21
+ constructor(private config: TextCommandConfig) {
22
+ super()
23
+ }
24
+
25
+ private async processPrefix(msg: Message): Promise<number | null> {
26
+ const content = msg.content
27
+ let prefix = this.config.prefix
28
+
29
+ if (typeof prefix === 'function') {
30
+ prefix = await prefix(msg)
31
+ }
32
+
33
+ if (typeof prefix === 'string') {
34
+ if (content.startsWith(prefix)) return prefix.length
35
+ return null
36
+ }
37
+
38
+ if (prefix instanceof Array) {
39
+ const p = prefix.find((x) => content.startsWith(x))
40
+
41
+ if (p) return p.length
42
+ return null
43
+ }
44
+
45
+ return null
46
+ }
47
+
48
+ @listener({ event: 'messageCreate', emitter: 'discord' })
49
+ private async messageCreate(msg: Message) {
50
+ const startIndex = await this.processPrefix(msg)
51
+
52
+ if (!startIndex) return
53
+
54
+ const content = msg.content.slice(startIndex)
55
+
56
+ const commands: TextCommandComponent[] = []
57
+
58
+ const extensions = new Map<TextCommandComponent, object>()
59
+
60
+ for (const ext of this.commandClient.registry.extensions) {
61
+ for (const cmd of this.commandClient.registry.getComponentsWithType(ext, TextCommandComponent)) {
62
+ commands.push(cmd)
63
+ extensions.set(cmd, ext)
64
+ }
65
+ }
66
+
67
+ let commandNameLength = 0
68
+
69
+ const command = commands.find((x) => {
70
+ const names = [x.options.name]
71
+
72
+ if (x.options.aliases) {
73
+ names.push(...x.options.aliases)
74
+ }
75
+
76
+ for (const name of names) {
77
+ if (content.startsWith(name)) {
78
+ if (content.length === name.length) {
79
+ commandNameLength = name.length
80
+ return true
81
+ }
82
+ commandNameLength = name.length
83
+ return content.startsWith(name + ' ')
84
+ }
85
+ }
86
+
87
+ return false
88
+ })
89
+
90
+ if (!command) return
91
+
92
+ const ext = extensions.get(command)
93
+
94
+ if (!ext) return
95
+
96
+ const args: unknown[] = []
97
+
98
+ let argStrings = content.slice(commandNameLength + 1).split(/ /g)
99
+
100
+ await this.convertArguments(TextCommandComponent, args, command.argTypes, async (arg, i, converter) => {
101
+ if (converter.options.parameterless) return [msg]
102
+
103
+ if (arg.decorators.find((x) => x.constructor === TextCommandRestOption)) {
104
+ const text = argStrings.join(' ')
105
+ argStrings = []
106
+ return [text, msg]
107
+ }
108
+ return [argStrings.shift(), msg]
109
+ })
110
+
111
+ await command.execute(ext, args, [msg])
112
+ }
113
+
114
+ @argConverter({ component: TextCommandComponent, type: Message, parameterless: true })
115
+ async mesage(msg: Message) {
116
+ return msg
117
+ }
118
+
119
+ @argConverter({ component: TextCommandComponent, type: String })
120
+ async str(value: string) {
121
+ return value
122
+ }
123
+
124
+ @argConverter({ component: TextCommandComponent, type: Number })
125
+ async num(value: string) {
126
+ return Number(value)
127
+ }
128
+ }
@@ -1 +1,11 @@
1
+ /*
2
+ * File: index.ts
3
+ *
4
+ * Copyright (c) 2022-2022 pikokr
5
+ *
6
+ * Licensed under MIT License. Please see more defails in LICENSE file.
7
+ */
8
+
1
9
  export * from './TextCommand'
10
+ export type { TextCommandConfig } from './TextCommandExtension'
11
+ export * from './parameters'
@@ -0,0 +1,14 @@
1
+ /*
2
+ * File: parameters.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 { ComponentArgumentDecorator } from '../core'
10
+ import { createArgumentDecorator } from '../core'
11
+
12
+ export class TextCommandRestOption extends ComponentArgumentDecorator<void> {}
13
+
14
+ export const rest = createArgumentDecorator(TextCommandRestOption)
package/test/index.ts CHANGED
@@ -6,8 +6,8 @@
6
6
  * Licensed under MIT License. Please see more defails in LICENSE file.
7
7
  */
8
8
 
9
- import { ApplicationCommandOptionType, ApplicationCommandType, ChatInputCommandInteraction, Client } from 'discord.js'
10
- import { applicationCommand, CommandClient, moduleHook, option, ownerOnly, listener, Extension } from '../dist'
9
+ import { ApplicationCommandOptionType, ApplicationCommandType, ChatInputCommandInteraction, Client, Message } from 'discord.js'
10
+ import { applicationCommand, CommandClient, moduleHook, option, ownerOnly, listener, Extension, command, rest } from '../src'
11
11
  import 'dotenv/config'
12
12
  import { Logger } from 'tslog'
13
13
  import chalk from 'chalk'
@@ -56,11 +56,17 @@ class Test extends Extension {
56
56
  this.logger.info(`Login: ${chalk.green(client.user!.tag)}`)
57
57
  await this.commandClient.fetchOwners()
58
58
  }
59
+
60
+ @command({ name: 'test' })
61
+ async test(msg: Message, @rest() sans: string) {
62
+ console.log(sans)
63
+ await msg.reply('Wow')
64
+ }
59
65
  }
60
66
 
61
67
  const ext = new Test()
62
68
 
63
- const client = new Client({ intents: [] })
69
+ const client = new Client({ intents: ['GuildMessages', 'MessageContent', 'DirectMessages', 'Guilds'] })
64
70
 
65
71
  const logger = new Logger({ dateTimeTimezone: Intl.DateTimeFormat().resolvedOptions().timeZone })
66
72
 
@@ -73,6 +79,10 @@ const run = async () => {
73
79
  guilds: ['832938554438844438'],
74
80
  })
75
81
 
82
+ await cc.enableTextCommandsExtension({
83
+ prefix: '.',
84
+ })
85
+
76
86
  await registry.registerModule(ext)
77
87
 
78
88
  await client.login(process.env.TOKEN)