@pikokr/command.ts 5.0.7-dev.7f7ca01 → 5.0.7-dev.da681d6
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.
package/dist/index.d.ts
CHANGED
@@ -168,6 +168,7 @@ declare class SubCommandGroup {
|
|
168
168
|
}
|
169
169
|
declare class SubCommandGroupChild {
|
170
170
|
options: Omit<APIApplicationCommandSubcommandOption, 'type'>;
|
171
|
+
parent: SubCommandGroup;
|
171
172
|
constructor(options: Omit<APIApplicationCommandSubcommandOption, 'type'>, parent: SubCommandGroup);
|
172
173
|
command(options: Omit<ChatInputApplicationCommandData, 'options' | 'type'>): MethodDecorator;
|
173
174
|
}
|
package/dist/index.js
CHANGED
@@ -1,2 +1,2 @@
|
|
1
|
-
"use strict";var oe=Object.create;var G=Object.defineProperty;var re=Object.getOwnPropertyDescriptor;var ne=Object.getOwnPropertyNames;var se=Object.getPrototypeOf,ie=Object.prototype.hasOwnProperty;var c=(o,t)=>G(o,"name",{value:t,configurable:!0});var p=(o,t)=>()=>(o&&(t=o(o=0)),t);var jt=(o,t)=>{for(var e in t)G(o,e,{get:t[e],enumerable:!0})},Ht=(o,t,e,r)=>{if(t&&typeof t=="object"||typeof t=="function")for(let n of ne(t))!ie.call(o,n)&&n!==e&&G(o,n,{get:()=>t[n],enumerable:!(r=re(t,n))||r.enumerable});return o};var h=(o,t,e)=>(e=o!=null?oe(se(o)):{},Ht(t||!o||!o.__esModule?G(e,"default",{value:o,enumerable:!0}):e,o)),ce=o=>Ht(G({},"__esModule",{value:!0}),o);var z,he,ut,X,dt,Y,O=p(()=>{"use strict";z=Symbol(),he=Symbol(),ut=Symbol(),X=Symbol(),dt=Symbol(),Y=Symbol()});var Lt,gt,tt,ht=p(()=>{"use strict";Lt=require("discord.js");O();gt=c((o,t)=>{let e=Reflect.getMetadata(dt,o,t);return e||(e=new Lt.Collection,Reflect.defineMetadata(dt,e,o,t)),e},"getComponentHookStore"),tt=c((o,t)=>(e,r)=>{let n=gt(e,r),s=n.get(o);s||(s=[],n.set(o,s)),s.push(t)},"createComponentHook")});var yt,U,ae,u,xt,Z,W=p(()=>{"use strict";yt=require("discord.js");ht();O();U=c(o=>{let t=Reflect.getMetadata(z,o);return t||(t=new yt.Collection,Reflect.defineMetadata(z,t,o)),t},"getComponentStore"),ae=c((o,t)=>U(o).get(t),"getComponent"),u=c(o=>(t,e)=>{o._init(Reflect.get(t,e),Reflect.getMetadata("design:paramtypes",t,e));let r=gt(t,e);o.hooks=r;let n=U(t);xt(t,e).forEach((i,a)=>{var l;(l=o.argTypes.get(a))==null||l.decorators.push(i)}),n.set(e,o)},"createComponentDecorator"),xt=c((o,t)=>{let e=Reflect.getMetadata(z,o,t);return e||(e=new yt.Collection,Reflect.defineMetadata(z,e,o,t)),e},"getComponentArgumentStore"),Z=c(o=>t=>(e,r,n)=>{var s=new o(t);xt(e,r).set(n,s)},"createArgumentDecorator")});var $,Ct=p(()=>{"use strict";$=class{constructor(t){this.type=t,this.decorators=[]}};c($,"ComponentArgument")});var At,R,Et=p(()=>{"use strict";At=h(require("lodash")),R=class{constructor(t){typeof t=="object"?this.options=At.default.merge(this.defaultOptions(),t):this.options=t}defaultOptions(){return{}}};c(R,"ComponentArgumentDecorator")});var f,me,et=p(()=>{"use strict";W();D();f=class extends d{constructor(t){super(),this.options=t}};c(f,"ApplicationCommandComponent");me=c(o=>u(new f(o)),"applicationCommand")});var T,Ot,wt=p(()=>{"use strict";j();T=class extends R{};c(T,"ApplicationCommandOption");Ot=Z(T)});var Wt,_,J,K=p(()=>{"use strict";Wt=h(require("lodash"));D();W();_=class extends d{constructor(t){super(),this.options=Wt.default.merge({emitter:"discord"},t)}};c(_,"ListenerComponent");J=c(o=>u(new _(o)),"listener")});var $t,ot,pe,Dt=p(()=>{"use strict";$t=require("discord.js");O();ot=c(o=>{let t=Reflect.getMetadata(ut,o);return t||(t=new $t.Collection,Reflect.defineMetadata(ut,t,o)),t},"getModuleHookStore"),pe=c(o=>(t,e)=>{let r=ot(t),n=r.get(o);n||(n=[],r.set(o,n)),n.push(Reflect.get(t,e))},"moduleHook")});var rt=p(()=>{"use strict";Dt();ht()});var nt,Pt,Nt,qt,Bt,P,bt=p(()=>{"use strict";nt=h(require("chalk")),Pt=require("discord.js"),Nt=h(require("lodash"));Mt();rt();K();O();qt=h(require("walk-sync")),Bt=h(require("path")),P=class{constructor(t,e){this.client=e,this.extensions=[],this.emitters=new Pt.Collection,this.logger=t.getChildLogger({prefix:[nt.default.green("[Registry]")]})}getComponentsWithTypeGlobal(t){let e=[];for(let r of this.extensions)e.push(...this.getComponentsWithType(r,t));return e}getComponentsWithType(t,e){let r=U(t);return Array.from(r.filter(n=>n.constructor===e).values())}registerEventListeners(t){let e=this.getComponentsWithType(t,_);for(let r of e){let n=this.emitters.get(r.options.emitter);if(n){let s=r.method.bind(t);Reflect.defineMetadata("bound",s,r),n.addListener(r.options.event,s)}}}unregisterEventListeners(t){let e=this.getComponentsWithType(t,_);for(let r of e){let n=this.emitters.get(r.options.emitter),s=Reflect.getMetadata("bound",r);n&&s&&n.removeListener(r.options.event,s)}}async loadAllModulesInDirectory(t){let e=[],r=(0,qt.default)(t).filter(n=>n.endsWith(".ts")||n.endsWith(".js"));for(let n of r)if(!n.endsWith(".d.ts"))try{let s=Bt.default.join(t,n),i=require(s);if(typeof i.setup!="function")continue;let a=await i.setup();e.push(...await this.registerModules(a,s))}catch{this.logger.error(`Failed to load ${n}`)}return e}async registerModules(t,e){let r=[];if(t instanceof Array)for(let n of t)await this.registerModule(n),Reflect.defineMetadata(Y,e,n),r.push(n);else await this.registerModule(t),Reflect.defineMetadata(Y,e,t),r.push(t);return r}async reloadModules(){let t=[],e=new Set;for(let r of this.extensions){let n=Reflect.getMetadata(Y,r);!n||(e.add(n),await this.unregisterModule(r),delete require.cache[require.resolve(n)])}for(let r of e)try{let n=require(r);if(typeof n.setup!="function")continue;let s=await n.setup(this.client);await this.registerModules(s,r),t.push({file:r,result:!0})}catch(n){t.push({file:r,result:!1,error:n})}return t}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: ${nt.default.green(t.constructor.name)}`)}async unregisterModule(t){this.unregisterEventListeners(t),await this.runModuleHook(t,"unload"),Nt.default.remove(this.extensions,e=>e===t),this.logger.info(`Module unregistered: ${nt.default.green(t.constructor.name)}`)}runModuleHook(t,e,...r){let s=ot(t).get(e);if(s)for(let i of s)i.call(t,...r)}registerEventEmitter(t,e){this.emitters.set(t,e)}};c(P,"Registry")});var st=p(()=>{"use strict";bt();St()});var H,w,it=p(()=>{"use strict";D();W();H=class extends d{constructor(t){super(),this.options=t}};c(H,"ConverterComponent");w=c(o=>u(new H(o)),"argConverter")});var Gt,zt,N,vt=p(()=>{"use strict";Gt=h(require("chalk")),zt=require("discord.js");it();st();N=class{get commandClient(){return M.getFromModule(this)}get client(){return this.commandClient.discord}get logger(){return this._logger||(this._logger=this.commandClient.logger.getChildLogger({prefix:[Gt.default.green(`[${this.constructor.name}]`)],displayFunctionName:!1})),this._logger}async convertArguments(t,e,r,n){let s=new zt.Collection;for(let i of this.commandClient.registry.extensions)for(let a of this.commandClient.registry.getComponentsWithType(i,H))a.options.component==t&&s.set(a.options.type,{component:a,ext:i});for(let[i,a]of r){let l=s.get(a.type);if(!l){e[i]=void 0;continue}let C=await n(a,i,l.component);e[i]=await l.component.execute(l.ext,C)}}};c(N,"Extension")});var Ut,L,Rt=p(()=>{"use strict";Ut=h(require("chalk"));vt();L=class extends N{get logger(){return this._logger||(this._logger=this.commandClient.ctsLogger.getChildLogger({prefix:[Ut.default.green(`[${this.constructor.name}]`)],displayFunctionName:!1})),this._logger}};c(L,"CTSExtension")});var k,m,Q,b,y,Zt=p(()=>{"use strict";k=h(require("chalk")),m=require("discord.js");et();wt();K();st();it();Rt();Q=function(o,t,e,r){var n=arguments.length,s=n<3?t:r===null?r=Object.getOwnPropertyDescriptor(t,e):r,i;if(typeof Reflect=="object"&&typeof Reflect.decorate=="function")s=Reflect.decorate(o,t,e,r);else for(var a=o.length-1;a>=0;a--)(i=o[a])&&(s=(n<3?i(s):n>3?i(t,e,s):i(t,e))||s);return n>3&&s&&Object.defineProperty(t,e,s),s},b=function(o,t){if(typeof Reflect=="object"&&typeof Reflect.metadata=="function")return Reflect.metadata(o,t)},y=class extends L{constructor(t){super(),this.config=t}async interactionCreate(t){var s;if(t.type!==m.InteractionType.ApplicationCommand)return;let e=null,r=null,n=this.commandClient.registry.extensions;for(let i of n){let a=this.commandClient.registry.getComponentsWithType(i,f);for(let l of a)l.options.name===t.commandName&&(r=i,e=l)}if(e&&r){let i=[];await this.convertArguments(f,i,e.argTypes,()=>[t]);for(let[a,l]of e.argTypes){let C=null;for(let g of l.decorators)if(g instanceof T){if([m.ApplicationCommandOptionType.Subcommand,m.ApplicationCommandOptionType.SubcommandGroup].includes(g.options.type)&&t.isChatInputCommand()){if(g.options.type===m.ApplicationCommandOptionType.Subcommand){C=t.options.getSubcommand()===g.options.name;break}if(g.options.type===m.ApplicationCommandOptionType.SubcommandGroup){C=t.options.getSubcommandGroup()===g.options.name;break}}C=(s=t.options.get(g.options.name,!1))==null?void 0:s.value;break}C&&(i[a]=C)}try{await e.execute(r,i,[t])}catch(a){this.commandClient.emit("applicationCommandInvokeError",a,t)}}}async sync(){let t=M.getFromModule(this);this.logger.info("Trying to sync commands...");let e=[],r=new m.Collection;for(let n of t.registry.getComponentsWithTypeGlobal(f)){let s={...n.options};if(s.type===m.ApplicationCommandType.ChatInput){s.options=[];for(let[,i]of n.argTypes){let a=i.decorators.find(l=>l.constructor===T);a&&s.options.push(a.options)}}if(n.options.guilds){for(let i of n.options.guilds){let a=r.get(i);a||(a=[],r.set(i,a)),a.push(s)}continue}if(this.config.guilds){for(let i of this.config.guilds){let a=r.get(i);a||(a=[],r.set(i,a)),a.push(s)}continue}e.push(s)}if(r.size)for(let[n,s]of r){this.logger.info(`Processing ${k.default.green(s.length)} commands(${s.map(i=>k.default.blue(i.name)).join(", ")})`);try{let i=await this.client.guilds.fetch(n);await i.fetch(),this.logger.info(`Registering commands for guild ${k.default.green(i.name)}(${k.default.blue(i.id)})`),await i.commands.set(s),this.logger.info(`Successfully registered commands for guild ${k.default.green(i.name)}(${k.default.blue(i.id)})`)}catch(i){this.logger.error(`Failed to register commands to guild ${k.default.green(n)}: ${i.message}`)}}if(e.length)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}async commandInteraction(t){return t}};c(y,"ApplicationCommandExtension");Q([J({event:"interactionCreate"}),b("design:type",Function),b("design:paramtypes",[typeof m.Interaction>"u"?Object:m.Interaction])],y.prototype,"interactionCreate",null);Q([w({component:f,parameterless:!0,type:m.ChatInputCommandInteraction}),b("design:type",Function),b("design:paramtypes",[typeof m.ChatInputCommandInteraction>"u"?Object:m.ChatInputCommandInteraction])],y.prototype,"chatInteraction",null);Q([w({component:f,parameterless:!0,type:m.MessageContextMenuCommandInteraction}),b("design:type",Function),b("design:paramtypes",[typeof m.MessageContextMenuCommandInteraction>"u"?Object:m.MessageContextMenuCommandInteraction])],y.prototype,"messageInteraction",null);Q([w({component:f,parameterless:!0,type:m.UserContextMenuCommandInteraction}),b("design:type",Function),b("design:paramtypes",[typeof m.UserContextMenuCommandInteraction>"u"?Object:m.UserContextMenuCommandInteraction])],y.prototype,"userInteraction",null);Q([w({component:f,parameterless:!0,type:m.CommandInteraction}),b("design:type",Function),b("design:paramtypes",[typeof m.UserContextMenuCommandInteraction>"u"?Object:m.UserContextMenuCommandInteraction])],y.prototype,"commandInteraction",null)});var x,le,_t=p(()=>{"use strict";W();D();x=class extends d{constructor(t){super(),this.options=t}};c(x,"TextCommandComponent");le=c(o=>u(new x(o)),"command")});var A,fe,kt=p(()=>{"use strict";j();j();A=class extends R{};c(A,"TextCommandRestOption");fe=Z(A)});var q,ct,F,S,Jt=p(()=>{"use strict";K();q=require("discord.js");Rt();_t();kt();j();ct=function(o,t,e,r){var n=arguments.length,s=n<3?t:r===null?r=Object.getOwnPropertyDescriptor(t,e):r,i;if(typeof Reflect=="object"&&typeof Reflect.decorate=="function")s=Reflect.decorate(o,t,e,r);else for(var a=o.length-1;a>=0;a--)(i=o[a])&&(s=(n<3?i(s):n>3?i(t,e,s):i(t,e))||s);return n>3&&s&&Object.defineProperty(t,e,s),s},F=function(o,t){if(typeof Reflect=="object"&&typeof Reflect.metadata=="function")return Reflect.metadata(o,t)},S=class extends L{constructor(t){super(),this.config=t}async processPrefix(t){let e=t.content,r=this.config.prefix;if(typeof r=="function"&&(r=await r(t)),typeof r=="string")return e.startsWith(r)?r.length:null;if(r instanceof Array){let n=r.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 r=t.content.slice(e),n=[],s=new Map;for(let v of this.commandClient.registry.extensions)for(let E of this.commandClient.registry.getComponentsWithType(v,x))n.push(E),s.set(E,v);let i=0,a=n.find(v=>{let E=[v.options.name];v.options.aliases&&E.push(...v.options.aliases);for(let I of E)if(r.startsWith(I))return r.length===I.length?(i=I.length,!0):(i=I.length,r.startsWith(I+" "));return!1});if(!a)return;let l=s.get(a);if(!l)return;let C=[],g=r.slice(i+1).split(/ /g);await this.convertArguments(x,C,a.argTypes,async(v,E,I)=>{if(I.options.parameterless)return[t];if(v.decorators.find(ft=>ft.constructor===A)){let ft=g.join(" ");return g=[],[ft,t]}return[g.shift(),t]}),await a.execute(l,C,[t])}async mesage(t){return t}async str(t){return t}async num(t){return Number(t)}};c(S,"TextCommandExtension");ct([J({event:"messageCreate",emitter:"discord"}),F("design:type",Function),F("design:paramtypes",[typeof q.Message>"u"?Object:q.Message])],S.prototype,"messageCreate",null);ct([w({component:x,type:q.Message,parameterless:!0}),F("design:type",Function),F("design:paramtypes",[typeof q.Message>"u"?Object:q.Message])],S.prototype,"mesage",null);ct([w({component:x,type:String}),F("design:type",Function),F("design:paramtypes",[String])],S.prototype,"str",null);ct([w({component:x,type:Number}),F("design:type",Function),F("design:paramtypes",[String])],S.prototype,"num",null)});var Vt={};jt(Vt,{CommandClient:()=>M});var at,mt,Kt,Qt,M,St=p(()=>{"use strict";at=h(require("chalk")),mt=require("discord.js"),Kt=h(require("events")),Qt=require("tslog");Zt();Jt();O();bt();M=class extends Kt.default{constructor(t,e=new Qt.Logger({dateTimeTimezone:Intl.DateTimeFormat().resolvedOptions().timeZone})){super(),this.discord=t,this.logger=e,this.owners=new Set,this.ctsLogger=e.getChildLogger({prefix:[at.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 mt.User)this.owners.add(t.id),e.push(t.tag);else if(t instanceof mt.Team)for(let[r,n]of t.members)this.owners.add(r),e.push(n.user.tag);this.ctsLogger.info(`Fetched ${at.default.green(e.length)} owners(${e.map(r=>at.default.blue(r)).join(", ")})`)}async enableApplicationCommandsExtension(t){await this.registry.registerModule(new y(t)),this.ctsLogger.info("Application command extension enabled.")}async enableTextCommandsExtension(t){await this.registry.registerModule(new S(t)),this.ctsLogger.info("Text command extension enabled.")}getApplicationCommandsExtension(){return this.registry.extensions.find(t=>t.constructor===y)}static getFromModule(t){return Reflect.getMetadata(X,t)}};c(M,"CommandClient")});var Ft,d,D=p(()=>{"use strict";Ft=require("discord.js");Ct();d=class{hooks=new Ft.Collection;argTypes=new Ft.Collection;_init(t,e){this.method=t;for(let r=0;r<e.length;r++){let n=e[r];this.argTypes.set(r,new $(n))}}async executeHook(t,e,r){let n=this.hooks.get(e);if(!n)return;let{CommandClient:s}=await Promise.resolve().then(()=>(St(),Vt));for(let i of n)await i.call(null,s.getFromModule(t),...r)}async execute(t,e,r=e){await this.executeHook(t,"beforeCall",r);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}};c(d,"BaseComponent")});var _o,Mt=p(()=>{"use strict";_o=require("reflect-metadata");W();Ct();Et();D()});var B,It=p(()=>{"use strict";B=class{};c(B,"OwnerOnlyError")});var pt,Xt,ue,Yt=p(()=>{"use strict";pt=require("discord.js");rt();It();Xt=c(o=>tt("beforeCall",o),"createCheckDecorator"),ue=Xt(async(o,t)=>{let e=!1;if(t instanceof pt.BaseInteraction?e=o.owners.has(t.user.id):t instanceof pt.Message&&(e=o.owners.has(t.author.id)),!e)throw new B})});var te=p(()=>{"use strict";Yt();It()});var ee=p(()=>{"use strict";vt()});var j=p(()=>{"use strict";Mt();rt();it();te();K();st();ee()});var de={};jt(de,{ApplicationCommandComponent:()=>f,BaseComponent:()=>d,CommandClient:()=>M,ComponentArgument:()=>$,ComponentArgumentDecorator:()=>R,ConverterComponent:()=>H,Extension:()=>N,ListenerComponent:()=>_,OwnerOnlyError:()=>B,Registry:()=>P,SubCommandGroup:()=>lt,SubCommandGroupChild:()=>V,TextCommandComponent:()=>x,TextCommandRestOption:()=>A,applicationCommand:()=>me,argConverter:()=>w,command:()=>le,createArgumentDecorator:()=>Z,createCheckDecorator:()=>Xt,createComponentDecorator:()=>u,createComponentHook:()=>tt,getComponent:()=>ae,getComponentArgumentStore:()=>xt,getComponentStore:()=>U,getModuleHookStore:()=>ot,listener:()=>J,moduleHook:()=>pe,option:()=>Ot,ownerOnly:()=>ue,rest:()=>fe});module.exports=ce(de);j();et();wt();var Tt=require("discord.js");j();et();var lt=class{constructor(t,e){this.options=t,this.guilds=e}command(t){let e=new f({type:Tt.ApplicationCommandType.ChatInput,...t});return e.subcommandGroup=this,u(e)}createChild(t){return new V(t,this)}};c(lt,"SubCommandGroup");var V=class{constructor(t,e){this.options=t}command(t){let e=new f({type:Tt.ApplicationCommandType.ChatInput,...t});return e.subcommandGroupChild=this,u(e)}};c(V,"SubCommandGroupChild");_t();kt();0&&(module.exports={ApplicationCommandComponent,BaseComponent,CommandClient,ComponentArgument,ComponentArgumentDecorator,ConverterComponent,Extension,ListenerComponent,OwnerOnlyError,Registry,SubCommandGroup,SubCommandGroupChild,TextCommandComponent,TextCommandRestOption,applicationCommand,argConverter,command,createArgumentDecorator,createCheckDecorator,createComponentDecorator,createComponentHook,getComponent,getComponentArgumentStore,getComponentStore,getModuleHookStore,listener,moduleHook,option,ownerOnly,rest});
|
1
|
+
"use strict";var oe=Object.create;var B=Object.defineProperty;var ne=Object.getOwnPropertyDescriptor;var re=Object.getOwnPropertyNames;var se=Object.getPrototypeOf,ie=Object.prototype.hasOwnProperty;var a=(n,t)=>B(n,"name",{value:t,configurable:!0});var l=(n,t)=>()=>(n&&(t=n(n=0)),t);var Gt=(n,t)=>{for(var e in t)B(n,e,{get:t[e],enumerable:!0})},jt=(n,t,e,o)=>{if(t&&typeof t=="object"||typeof t=="function")for(let s of re(t))!ie.call(n,s)&&s!==e&&B(n,s,{get:()=>t[s],enumerable:!(o=ne(t,s))||o.enumerable});return n};var b=(n,t,e)=>(e=n!=null?oe(se(n)):{},jt(t||!n||!n.__esModule?B(e,"default",{value:n,enumerable:!0}):e,n)),ae=n=>jt(B({},"__esModule",{value:!0}),n);var z,he,ft,X,ut,Y,A=l(()=>{"use strict";z=Symbol(),he=Symbol(),ft=Symbol(),X=Symbol(),ut=Symbol(),Y=Symbol()});var Ht,dt,tt,gt=l(()=>{"use strict";Ht=require("discord.js");A();dt=a((n,t)=>{let e=Reflect.getMetadata(ut,n,t);return e||(e=new Ht.Collection,Reflect.defineMetadata(ut,e,n,t)),e},"getComponentHookStore"),tt=a((n,t)=>(e,o)=>{let s=dt(e,o),r=s.get(n);r||(r=[],s.set(n,r)),r.push(t)},"createComponentHook")});var ht,U,ce,y,yt,Z,E=l(()=>{"use strict";ht=require("discord.js");gt();A();U=a(n=>{let t=Reflect.getMetadata(z,n);return t||(t=new ht.Collection,Reflect.defineMetadata(z,t,n)),t},"getComponentStore"),ce=a((n,t)=>U(n).get(t),"getComponent"),y=a(n=>(t,e)=>{n._init(Reflect.get(t,e),Reflect.getMetadata("design:paramtypes",t,e));let o=dt(t,e);n.hooks=o;let s=U(t);yt(t,e).forEach((c,i)=>{var m;(m=n.argTypes.get(i))==null||m.decorators.push(c)}),s.set(e,n)},"createComponentDecorator"),yt=a((n,t)=>{let e=Reflect.getMetadata(z,n,t);return e||(e=new ht.Collection,Reflect.defineMetadata(z,e,n,t)),e},"getComponentArgumentStore"),Z=a(n=>t=>(e,o,s)=>{var r=new n(t);yt(e,o).set(s,r)},"createArgumentDecorator")});var O,xt=l(()=>{"use strict";O=class{constructor(t){this.type=t,this.decorators=[]}};a(O,"ComponentArgument")});var Lt,R,$t=l(()=>{"use strict";Lt=b(require("lodash")),R=class{constructor(t){typeof t=="object"?this.options=Lt.default.merge(this.defaultOptions(),t):this.options=t}defaultOptions(){return{}}};a(R,"ComponentArgumentDecorator")});var g,me,et=l(()=>{"use strict";E();W();g=class extends x{constructor(t){super(),this.options=t}};a(g,"ApplicationCommandComponent");me=a(n=>y(new g(n)),"applicationCommand")});var F,At,bt=l(()=>{"use strict";G();F=class extends R{};a(F,"ApplicationCommandOption");At=Z(F)});var Et,I,J,K=l(()=>{"use strict";Et=b(require("lodash"));W();E();I=class extends x{constructor(t){super(),this.options=Et.default.merge({emitter:"discord"},t)}};a(I,"ListenerComponent");J=a(n=>y(new I(n)),"listener")});var j,S,ot=l(()=>{"use strict";W();E();j=class extends x{constructor(t){super(),this.options=t}};a(j,"ConverterComponent");S=a(n=>y(new j(n)),"argConverter")});var Ot,nt,pe,Wt=l(()=>{"use strict";Ot=require("discord.js");A();nt=a(n=>{let t=Reflect.getMetadata(ft,n);return t||(t=new Ot.Collection,Reflect.defineMetadata(ft,t,n)),t},"getModuleHookStore"),pe=a(n=>(t,e)=>{let o=nt(t),s=o.get(n);s||(s=[],o.set(n,s)),s.push(Reflect.get(t,e))},"moduleHook")});var rt=l(()=>{"use strict";Wt();gt()});var st,Dt,Pt,Nt,qt,D,Ct=l(()=>{"use strict";st=b(require("chalk")),Dt=require("discord.js"),Pt=b(require("lodash"));wt();rt();K();A();Nt=b(require("walk-sync")),qt=b(require("path")),D=class{constructor(t,e){this.client=e,this.extensions=[],this.emitters=new Dt.Collection,this.logger=t.getChildLogger({prefix:[st.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=U(t);return Array.from(o.filter(s=>s.constructor===e).values())}registerEventListeners(t){let e=this.getComponentsWithType(t,I);for(let o of e){let s=this.emitters.get(o.options.emitter);if(s){let r=o.method.bind(t);Reflect.defineMetadata("bound",r,o),s.addListener(o.options.event,r)}}}unregisterEventListeners(t){let e=this.getComponentsWithType(t,I);for(let o of e){let s=this.emitters.get(o.options.emitter),r=Reflect.getMetadata("bound",o);s&&r&&s.removeListener(o.options.event,r)}}async loadAllModulesInDirectory(t){let e=[],o=(0,Nt.default)(t).filter(s=>s.endsWith(".ts")||s.endsWith(".js"));for(let s of o)if(!s.endsWith(".d.ts"))try{let r=qt.default.join(t,s),c=require(r);if(typeof c.setup!="function")continue;let i=await c.setup();e.push(...await this.registerModules(i,r))}catch{this.logger.error(`Failed to load ${s}`)}return e}async registerModules(t,e){let o=[];if(t instanceof Array)for(let s of t)await this.registerModule(s),Reflect.defineMetadata(Y,e,s),o.push(s);else await this.registerModule(t),Reflect.defineMetadata(Y,e,t),o.push(t);return o}async reloadModules(){let t=[],e=new Set;for(let o of this.extensions){let s=Reflect.getMetadata(Y,o);!s||(e.add(s),await this.unregisterModule(o),delete require.cache[require.resolve(s)])}for(let o of e)try{let s=require(o);if(typeof s.setup!="function")continue;let r=await s.setup(this.client);await this.registerModules(r,o),t.push({file:o,result:!0})}catch(s){t.push({file:o,result:!1,error:s})}return t}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: ${st.default.green(t.constructor.name)}`)}async unregisterModule(t){this.unregisterEventListeners(t),await this.runModuleHook(t,"unload"),Pt.default.remove(this.extensions,e=>e===t),this.logger.info(`Module unregistered: ${st.default.green(t.constructor.name)}`)}runModuleHook(t,e,...o){let r=nt(t).get(e);if(r)for(let c of r)c.call(t,...o)}registerEventEmitter(t,e){this.emitters.set(t,e)}};a(D,"Registry")});var St=l(()=>{"use strict";Ct();Mt()});var Bt,zt,P,vt=l(()=>{"use strict";Bt=b(require("chalk")),zt=require("discord.js");ot();St();P=class{get commandClient(){return H.getFromModule(this)}get client(){return this.commandClient.discord}get logger(){return this._logger||(this._logger=this.commandClient.logger.getChildLogger({prefix:[Bt.default.green(`[${this.constructor.name}]`)],displayFunctionName:!1})),this._logger}async convertArguments(t,e,o,s){let r=new zt.Collection;for(let c of this.commandClient.registry.extensions)for(let i of this.commandClient.registry.getComponentsWithType(c,j))i.options.component==t&&r.set(i.options.type,{component:i,ext:c});for(let[c,i]of o){let m=r.get(i.type);if(!m){e[c]=void 0;continue}let u=await s(i,c,m.component);e[c]=await m.component.execute(m.ext,u)}}};a(P,"Extension")});var Ut,L,kt=l(()=>{"use strict";Ut=b(require("chalk"));vt();L=class extends P{get logger(){return this._logger||(this._logger=this.commandClient.ctsLogger.getChildLogger({prefix:[Ut.default.green(`[${this.constructor.name}]`)],displayFunctionName:!1})),this._logger}};a(L,"CTSExtension")});var M,p,Q,v,C,Zt=l(()=>{"use strict";M=b(require("chalk")),p=require("discord.js");et();bt();K();ot();kt();Q=function(n,t,e,o){var s=arguments.length,r=s<3?t:o===null?o=Object.getOwnPropertyDescriptor(t,e):o,c;if(typeof Reflect=="object"&&typeof Reflect.decorate=="function")r=Reflect.decorate(n,t,e,o);else for(var i=n.length-1;i>=0;i--)(c=n[i])&&(r=(s<3?c(r):s>3?c(t,e,r):c(t,e))||r);return s>3&&r&&Object.defineProperty(t,e,r),r},v=function(n,t){if(typeof Reflect=="object"&&typeof Reflect.metadata=="function")return Reflect.metadata(n,t)},C=class extends L{constructor(t){super(),this.config=t}async interactionCreate(t){var i;if(t.type!==p.InteractionType.ApplicationCommand)return;let e=null,o=null,s=this.commandClient.registry.extensions,r=null,c=null;t.commandType===p.ApplicationCommandType.ChatInput&&(r=t.options.getSubcommand(!1),c=t.options.getSubcommandGroup(!1));t:for(let m of s){let u=this.commandClient.registry.getComponentsWithType(m,g);if(r){for(let f of u)if(!(!f.subcommandGroup&&!f.subcommandGroupChild)){if(f.subcommandGroupChild&&f.subcommandGroupChild.parent.options.name===t.commandName&&f.subcommandGroupChild.options.name===c&&f.options.name===r){o=m,e=f;break t}if(f.subcommandGroup&&!c&&f.subcommandGroup.options.name===t.commandName&&f.options.name===r){o=m,e=f;break t}}}else for(let f of u)if(f.options.name===t.commandName){o=m,e=f;break t}}if(e&&o){let m=[];await this.convertArguments(g,m,e.argTypes,()=>[t]);for(let[u,f]of e.argTypes){let d=null;for(let h of f.decorators)if(h instanceof F){if([p.ApplicationCommandOptionType.Subcommand,p.ApplicationCommandOptionType.SubcommandGroup].includes(h.options.type)&&t.isChatInputCommand()){if(h.options.type===p.ApplicationCommandOptionType.Subcommand){d=t.options.getSubcommand()===h.options.name;break}if(h.options.type===p.ApplicationCommandOptionType.SubcommandGroup){d=t.options.getSubcommandGroup()===h.options.name;break}}d=(i=t.options.get(h.options.name,!1))==null?void 0:i.value;break}d&&(m[u]=d)}try{await e.execute(o,m,[t])}catch(u){this.commandClient.emit("applicationCommandInvokeError",u,t)}}}async sync(){let t=this.commandClient;this.logger.info("Trying to sync commands...");let e=[],o=new p.Collection,s=new p.Collection;for(let r of t.registry.getComponentsWithTypeGlobal(g)){if(r.subcommandGroup){let i=s.get(r.subcommandGroup.options.name);if(!i){if(i={...r.subcommandGroup.options,type:p.ApplicationCommandType.ChatInput},r.subcommandGroup.guilds)for(let m of r.subcommandGroup.guilds){let u=o.get(m);u||(u=[],o.set(m,u))}else e.push(i);s.set(r.subcommandGroup.options.name,i)}i.options||(i.options=[]),i.options.push({...r.options,type:p.ApplicationCommandOptionType.Subcommand});continue}else if(r.subcommandGroupChild){let i=r.subcommandGroupChild.parent,m=s.get(i.options.name);if(!m){if(m={...i.options,type:p.ApplicationCommandType.ChatInput},i.guilds)for(let f of i.guilds){let d=o.get(f);d||(d=[],o.set(f,d))}else e.push(m);s.set(i.options.name,m)}m.options||(m.options=[]);let u=m.options.find(f=>f.name===r.subcommandGroupChild.options.name);u||(u={type:p.ApplicationCommandOptionType.SubcommandGroup,...r.subcommandGroupChild.options},m.options.push(u)),u.options||(u.options=[]),u.options.push({...r.options,type:p.ApplicationCommandOptionType.Subcommand});continue}let c={...r.options};if(c.type===p.ApplicationCommandType.ChatInput){c.options=[];for(let[,i]of r.argTypes){let m=i.decorators.find(u=>u.constructor===F);m&&c.options.push(m.options)}}if(r.options.guilds){for(let i of r.options.guilds){let m=o.get(i);m||(m=[],o.set(i,m))}continue}e.push(c)}if(this.config.guilds){for(let r of this.config.guilds){let c=o.get(r);c||(c=[],o.set(r,c)),c.push(...e)}e=[]}if(o.size)for(let[r,c]of o)try{let i=await this.client.guilds.fetch(r);await i.fetch(),this.logger.info(`Processing ${M.default.green(c.length)} commands(${c.map(m=>M.default.blue(m.name)).join(", ")}) for guild ${M.default.green(i.name)}(${M.default.blue(i.id)})`),await i.commands.set(c),this.logger.info(`Successfully registered commands for guild ${M.default.green(i.name)}(${M.default.blue(i.id)})`)}catch(i){this.logger.error(`Failed to register commands to guild ${M.default.green(r)}: ${i.message}`)}if(e.length)try{this.logger.info(`Processing ${M.default.green(e.length)} commands(${e.map(r=>M.default.blue(r.name)).join(", ")}) for application scope...`),await this.client.application.commands.set(e),this.logger.info("Successfully registered commands.")}catch(r){this.logger.error(`Failed to register commands to global: ${r.message}`)}}async chatInteraction(t){return t}async messageInteraction(t){return t}async userInteraction(t){return t}async commandInteraction(t){return t}};a(C,"ApplicationCommandExtension");Q([J({event:"interactionCreate"}),v("design:type",Function),v("design:paramtypes",[typeof p.Interaction>"u"?Object:p.Interaction])],C.prototype,"interactionCreate",null);Q([S({component:g,parameterless:!0,type:p.ChatInputCommandInteraction}),v("design:type",Function),v("design:paramtypes",[typeof p.ChatInputCommandInteraction>"u"?Object:p.ChatInputCommandInteraction])],C.prototype,"chatInteraction",null);Q([S({component:g,parameterless:!0,type:p.MessageContextMenuCommandInteraction}),v("design:type",Function),v("design:paramtypes",[typeof p.MessageContextMenuCommandInteraction>"u"?Object:p.MessageContextMenuCommandInteraction])],C.prototype,"messageInteraction",null);Q([S({component:g,parameterless:!0,type:p.UserContextMenuCommandInteraction}),v("design:type",Function),v("design:paramtypes",[typeof p.UserContextMenuCommandInteraction>"u"?Object:p.UserContextMenuCommandInteraction])],C.prototype,"userInteraction",null);Q([S({component:g,parameterless:!0,type:p.CommandInteraction}),v("design:type",Function),v("design:paramtypes",[typeof p.UserContextMenuCommandInteraction>"u"?Object:p.UserContextMenuCommandInteraction])],C.prototype,"commandInteraction",null)});var w,le,Rt=l(()=>{"use strict";E();W();w=class extends x{constructor(t){super(),this.options=t}};a(w,"TextCommandComponent");le=a(n=>y(new w(n)),"command")});var $,fe,It=l(()=>{"use strict";G();G();$=class extends R{};a($,"TextCommandRestOption");fe=Z($)});var N,it,_,k,Jt=l(()=>{"use strict";K();N=require("discord.js");kt();Rt();It();G();it=function(n,t,e,o){var s=arguments.length,r=s<3?t:o===null?o=Object.getOwnPropertyDescriptor(t,e):o,c;if(typeof Reflect=="object"&&typeof Reflect.decorate=="function")r=Reflect.decorate(n,t,e,o);else for(var i=n.length-1;i>=0;i--)(c=n[i])&&(r=(s<3?c(r):s>3?c(t,e,r):c(t,e))||r);return s>3&&r&&Object.defineProperty(t,e,r),r},_=function(n,t){if(typeof Reflect=="object"&&typeof Reflect.metadata=="function")return Reflect.metadata(n,t)},k=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 s=o.find(r=>e.startsWith(r));return s?s.length:null}return null}async messageCreate(t){let e=await this.processPrefix(t);if(!e)return;let o=t.content.slice(e),s=[],r=new Map;for(let d of this.commandClient.registry.extensions)for(let h of this.commandClient.registry.getComponentsWithType(d,w))s.push(h),r.set(h,d);let c=0,i=s.find(d=>{let h=[d.options.name];d.options.aliases&&h.push(...d.options.aliases);for(let T of h)if(o.startsWith(T))return o.length===T.length?(c=T.length,!0):(c=T.length,o.startsWith(T+" "));return!1});if(!i)return;let m=r.get(i);if(!m)return;let u=[],f=o.slice(c+1).split(/ /g);await this.convertArguments(w,u,i.argTypes,async(d,h,T)=>{if(T.options.parameterless)return[t];if(d.decorators.find(lt=>lt.constructor===$)){let lt=f.join(" ");return f=[],[lt,t]}return[f.shift(),t]}),await i.execute(m,u,[t])}async mesage(t){return t}async str(t){return t}async num(t){return Number(t)}};a(k,"TextCommandExtension");it([J({event:"messageCreate",emitter:"discord"}),_("design:type",Function),_("design:paramtypes",[typeof N.Message>"u"?Object:N.Message])],k.prototype,"messageCreate",null);it([S({component:w,type:N.Message,parameterless:!0}),_("design:type",Function),_("design:paramtypes",[typeof N.Message>"u"?Object:N.Message])],k.prototype,"mesage",null);it([S({component:w,type:String}),_("design:type",Function),_("design:paramtypes",[String])],k.prototype,"str",null);it([S({component:w,type:Number}),_("design:type",Function),_("design:paramtypes",[String])],k.prototype,"num",null)});var Vt={};Gt(Vt,{CommandClient:()=>H});var at,ct,Kt,Qt,H,Mt=l(()=>{"use strict";at=b(require("chalk")),ct=require("discord.js"),Kt=b(require("events")),Qt=require("tslog");Zt();Jt();A();Ct();H=class extends Kt.default{constructor(t,e=new Qt.Logger({dateTimeTimezone:Intl.DateTimeFormat().resolvedOptions().timeZone})){super(),this.discord=t,this.logger=e,this.owners=new Set,this.ctsLogger=e.getChildLogger({prefix:[at.default.blue("[command.ts]")],displayFilePath:"hidden",displayFunctionName:!1}),this.registry=new D(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 ct.User)this.owners.add(t.id),e.push(t.tag);else if(t instanceof ct.Team)for(let[o,s]of t.members)this.owners.add(o),e.push(s.user.tag);this.ctsLogger.info(`Fetched ${at.default.green(e.length)} owners(${e.map(o=>at.default.blue(o)).join(", ")})`)}async enableApplicationCommandsExtension(t){await this.registry.registerModule(new C(t)),this.ctsLogger.info("Application command extension enabled.")}async enableTextCommandsExtension(t){await this.registry.registerModule(new k(t)),this.ctsLogger.info("Text command extension enabled.")}getApplicationCommandsExtension(){return this.registry.extensions.find(t=>t.constructor===C)}static getFromModule(t){return Reflect.getMetadata(X,t)}};a(H,"CommandClient")});var _t,x,W=l(()=>{"use strict";_t=require("discord.js");xt();x=class{hooks=new _t.Collection;argTypes=new _t.Collection;_init(t,e){this.method=t;for(let o=0;o<e.length;o++){let s=e[o];this.argTypes.set(o,new O(s))}}async executeHook(t,e,o){let s=this.hooks.get(e);if(!s)return;let{CommandClient:r}=await Promise.resolve().then(()=>(Mt(),Vt));for(let c of s)await c.call(null,r.getFromModule(t),...o)}async execute(t,e,o=e){await this.executeHook(t,"beforeCall",o);let s;try{s=await this.method.call(t,...e)}catch(r){throw await this.executeHook(t,"invokeError",[r]),r}return await this.executeHook(t,"afterCall",[s]),s}};a(x,"BaseComponent")});var ko,wt=l(()=>{"use strict";ko=require("reflect-metadata");E();xt();$t();W()});var q,Tt=l(()=>{"use strict";q=class{};a(q,"OwnerOnlyError")});var mt,Xt,ue,Yt=l(()=>{"use strict";mt=require("discord.js");rt();Tt();Xt=a(n=>tt("beforeCall",n),"createCheckDecorator"),ue=Xt(async(n,t)=>{let e=!1;if(t instanceof mt.BaseInteraction?e=n.owners.has(t.user.id):t instanceof mt.Message&&(e=n.owners.has(t.author.id)),!e)throw new q})});var te=l(()=>{"use strict";Yt();Tt()});var ee=l(()=>{"use strict";vt()});var G=l(()=>{"use strict";wt();rt();ot();te();K();St();ee()});var de={};Gt(de,{ApplicationCommandComponent:()=>g,BaseComponent:()=>x,CommandClient:()=>H,ComponentArgument:()=>O,ComponentArgumentDecorator:()=>R,ConverterComponent:()=>j,Extension:()=>P,ListenerComponent:()=>I,OwnerOnlyError:()=>q,Registry:()=>D,SubCommandGroup:()=>pt,SubCommandGroupChild:()=>V,TextCommandComponent:()=>w,TextCommandRestOption:()=>$,applicationCommand:()=>me,argConverter:()=>S,command:()=>le,createArgumentDecorator:()=>Z,createCheckDecorator:()=>Xt,createComponentDecorator:()=>y,createComponentHook:()=>tt,getComponent:()=>ce,getComponentArgumentStore:()=>yt,getComponentStore:()=>U,getModuleHookStore:()=>nt,listener:()=>J,moduleHook:()=>pe,option:()=>At,ownerOnly:()=>ue,rest:()=>fe});module.exports=ae(de);G();et();bt();var Ft=require("discord.js");G();et();var pt=class{constructor(t,e){this.options=t,this.guilds=e}command(t){let e=new g({type:Ft.ApplicationCommandType.ChatInput,...t});return e.subcommandGroup=this,y(e)}createChild(t){return new V(t,this)}};a(pt,"SubCommandGroup");var V=class{constructor(t,e){this.options=t,this.parent=e}command(t){let e=new g({type:Ft.ApplicationCommandType.ChatInput,...t});return e.subcommandGroupChild=this,y(e)}};a(V,"SubCommandGroupChild");Rt();It();0&&(module.exports={ApplicationCommandComponent,BaseComponent,CommandClient,ComponentArgument,ComponentArgumentDecorator,ConverterComponent,Extension,ListenerComponent,OwnerOnlyError,Registry,SubCommandGroup,SubCommandGroupChild,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":["../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/listener/index.ts","../src/core/hooks/moduleHook.ts","../src/core/hooks/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","../src/applicationCommand/group.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\nexport const FilePathSymbol = 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","/*\n * File: decoratorCreator.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 { 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 = (component: BaseComponent): MethodDecorator => {\n return (target, key) => {\n component._init(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\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","/*\n * File: ApplicationCommand.ts\n *\n * Copyright (c) 2022-2022 pikokr\n *\n * Licensed under MIT License. Please see more defails in LICENSE file.\n */\n\nimport type { ApplicationCommandType, ChatInputApplicationCommandData, MessageApplicationCommandData, Snowflake, UserApplicationCommandData } from 'discord.js'\nimport { createComponentDecorator } from '../core/components/decoratorCreator'\nimport { BaseComponent } from '../core/components/BaseComponent'\nimport { SubCommandGroup, SubCommandGroupChild } from './group'\n\ntype Options = (UserApplicationCommandData | MessageApplicationCommandData | Omit<ChatInputApplicationCommandData, 'options'>) & {\n type: ApplicationCommandType\n guilds?: Snowflake[]\n}\n\nexport class ApplicationCommandComponent extends BaseComponent {\n options: Options\n\n subcommandGroup?: SubCommandGroup\n subcommandGroupChild?: SubCommandGroupChild\n\n constructor(options: UserApplicationCommandData | MessageApplicationCommandData | Omit<ChatInputApplicationCommandData, 'options'>) {\n super()\n\n this.options = options as Options\n }\n}\n\nexport const applicationCommand = (options: Options) => createComponentDecorator(new ApplicationCommandComponent(options))\n\nexport type { Options as ApplicationCommandComponentOptions }\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","/*\n * File: index.ts\n *\n * Copyright (c) 2022-2022 pikokr\n *\n * Licensed under MIT License. Please see more defails in LICENSE file.\n */\n\nimport _ from 'lodash'\nimport { BaseComponent } from '../components/BaseComponent'\nimport { createComponentDecorator } from '../components/decoratorCreator'\n\ntype Options = { emitter: string; event: string }\n\ntype OptionsArg = { emitter?: string; event: string }\n\nexport class ListenerComponent extends BaseComponent {\n options: Options\n\n constructor(options: OptionsArg) {\n super()\n\n this.options = _.merge({ emitter: 'discord' }, options)\n }\n}\n\nexport const listener = (options: OptionsArg) => createComponentDecorator(new ListenerComponent(options))\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","/*\n * File: Registry.ts\n *\n * Copyright (c) 2022-2022 pikokr\n *\n * Licensed under MIT License. Please see more defails in LICENSE file.\n */\n\nimport chalk from 'chalk'\nimport { Collection } from 'discord.js'\nimport EventEmitter from 'events'\nimport _, { result } 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, FilePathSymbol } from '../symbols'\nimport { CommandClient } from './CommandClient'\nimport walkSync from 'walk-sync'\nimport path from 'path'\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>(type: unknown): T[] {\n const result: T[] = []\n\n for (const ext of this.extensions) {\n result.push(...this.getComponentsWithType<T>(ext, type))\n }\n\n return result\n }\n\n getComponentsWithType<T>(ext: object, type: unknown): T[] {\n const componentStore = getComponentStore(ext)\n\n return Array.from(componentStore.filter((x) => (x.constructor as unknown) === type).values() as Iterable<T>)\n }\n\n registerEventListeners(ext: object) {\n const listeners = this.getComponentsWithType<ListenerComponent>(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<ListenerComponent>(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 loadAllModulesInDirectory(dir: string): Promise<object[]> {\n const results: object[] = []\n\n const files = walkSync(dir).filter((x) => x.endsWith('.ts') || x.endsWith('.js'))\n\n for (const file of files) {\n if (file.endsWith('.d.ts')) continue\n try {\n const p = path.join(dir, file)\n const mod = require(p)\n\n if (typeof mod.setup !== 'function') continue\n\n const modules = await mod.setup()\n\n results.push(...(await this.registerModules(modules, p)))\n } catch (e) {\n this.logger.error(`Failed to load ${file}`)\n }\n }\n\n return results\n }\n\n private async registerModules(modules: object | object[], p: string) {\n const results: object[] = []\n if (modules instanceof Array) {\n for (const module of modules) {\n await this.registerModule(module)\n Reflect.defineMetadata(FilePathSymbol, p, module)\n results.push(module)\n }\n } else {\n await this.registerModule(modules)\n Reflect.defineMetadata(FilePathSymbol, p, modules)\n results.push(modules)\n }\n\n return results\n }\n\n async reloadModules() {\n const result: { file: string; result: boolean; error?: Error }[] = []\n const paths = new Set<string>()\n for (const module of this.extensions) {\n const file = Reflect.getMetadata(FilePathSymbol, module)\n if (!file) continue\n\n paths.add(file)\n\n await this.unregisterModule(module)\n delete require.cache[require.resolve(file)]\n }\n\n for (const path of paths) {\n try {\n const mod = require(path)\n\n if (typeof mod.setup !== 'function') continue\n\n const modules = await mod.setup(this.client)\n\n await this.registerModules(modules, path)\n\n result.push({\n file: path,\n result: true,\n })\n } catch (e) {\n result.push({\n file: path,\n result: false,\n error: e as Error,\n })\n }\n }\n\n return result\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","/*\n * File: index.ts\n *\n * Copyright (c) 2022-2022 pikokr\n *\n * Licensed under MIT License. Please see more defails in LICENSE file.\n */\n\nimport { BaseComponent } from '../components/BaseComponent'\nimport { createComponentDecorator } from '../components/decoratorCreator'\n\ntype Options = { component: unknown; type: Function; parameterless: boolean }\n\ntype OptionsArg = Omit<Options, 'parameterless'> & { parameterless?: boolean }\n\nexport class ConverterComponent extends BaseComponent {\n options: Options\n\n constructor(options: OptionsArg) {\n super()\n this.options = options as Options\n }\n}\n\nexport const argConverter = (options: OptionsArg) => createComponentDecorator(new ConverterComponent(options))\n","/*\n * File: Extension.ts\n *\n * Copyright (c) 2022-2022 pikokr\n *\n * Licensed under MIT License. Please see more defails in LICENSE file.\n */\n\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: 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<ConverterComponent>(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","/*\n * File: ApplicationCommandExtension.ts\n *\n * Copyright (c) 2022-2022 pikokr\n *\n * Licensed under MIT License. Please see more defails in LICENSE file.\n */\n\nimport chalk from 'chalk'\nimport {\n ApplicationCommandData,\n ApplicationCommandOptionType,\n ApplicationCommandType,\n ChatInputCommandInteraction,\n Collection,\n CommandInteraction,\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<ApplicationCommandComponent>(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 if ([ApplicationCommandOptionType.Subcommand, ApplicationCommandOptionType.SubcommandGroup].includes(decorator.options.type) && i.isChatInputCommand()) {\n if (decorator.options.type === ApplicationCommandOptionType.Subcommand) {\n value = i.options.getSubcommand() === decorator.options.name\n break\n }\n if (decorator.options.type === ApplicationCommandOptionType.SubcommandGroup) {\n value = i.options.getSubcommandGroup() === decorator.options.name\n break\n }\n }\n\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.commandClient.emit('applicationCommandInvokeError', e, i)\n }\n }\n }\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 const guildCommands = new Collection<Snowflake, ApplicationCommandData[]>()\n\n for (const command of client.registry.getComponentsWithTypeGlobal<ApplicationCommandComponent>(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 if (command.options.guilds) {\n for (const guild of command.options.guilds) {\n let commands = guildCommands.get(guild)\n if (!commands) {\n commands = []\n guildCommands.set(guild, commands)\n }\n commands.push(cmd)\n }\n continue\n }\n\n if (this.config.guilds) {\n for (const guild of this.config.guilds) {\n let commands = guildCommands.get(guild)\n if (!commands) {\n commands = []\n guildCommands.set(guild, commands)\n }\n commands.push(cmd)\n }\n continue\n }\n commands.push(cmd)\n }\n\n if (guildCommands.size) {\n for (const [guild, commands] of guildCommands) {\n this.logger.info(`Processing ${chalk.green(commands.length)} commands(${commands.map((x) => chalk.blue(x.name)).join(', ')})`)\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 }\n if (commands.length) {\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 @argConverter({\n component: ApplicationCommandComponent,\n parameterless: true,\n type: CommandInteraction,\n })\n async commandInteraction(i: UserContextMenuCommandInteraction) {\n return i\n }\n}\n","/*\n * File: TextCommand.ts\n *\n * Copyright (c) 2022-2022 pikokr\n *\n * Licensed under MIT License. Please see more defails in LICENSE file.\n */\n\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 {\n constructor(public options: TextCommandOptions) {\n super()\n }\n}\n\nexport const command = (options: TextCommandOptions) => createComponentDecorator(new TextCommandComponent(options))\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","/*\n * File: TextCommandExtension.ts\n *\n * Copyright (c) 2022-2022 pikokr\n *\n * Licensed under MIT License. Please see more defails in LICENSE file.\n */\n\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<TextCommandComponent>(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","/*\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 {\n method!: Function\n\n hooks: ComponentHookStore = new Collection()\n\n argTypes: Collection<number, ComponentArgument> = new Collection()\n\n _init(method: Function, argTypes: unknown[]) {\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 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","import { APIApplicationCommandSubcommandOption, ApplicationCommandType, ChatInputApplicationCommandData } from 'discord.js'\nimport { createComponentDecorator } from '../core'\nimport { ApplicationCommandComponent } from './ApplicationCommand'\n\nexport class SubCommandGroup {\n constructor(public options: Omit<APIApplicationCommandSubcommandOption, 'type'>, public guilds?: string[]) {}\n\n command(options: Omit<ChatInputApplicationCommandData, 'options' | 'type'>): MethodDecorator {\n const cmd = new ApplicationCommandComponent({\n type: ApplicationCommandType.ChatInput,\n ...options,\n })\n cmd.subcommandGroup = this\n return createComponentDecorator(cmd)\n }\n\n createChild(options: Omit<APIApplicationCommandSubcommandOption, 'type'>) {\n return new SubCommandGroupChild(options, this)\n }\n}\n\nexport class SubCommandGroupChild {\n constructor(public options: Omit<APIApplicationCommandSubcommandOption, 'type'>, parent: SubCommandGroup) {}\n\n command(options: Omit<ChatInputApplicationCommandData, 'options' | 'type'>): MethodDecorator {\n const cmd = new ApplicationCommandComponent({\n type: ApplicationCommandType.ChatInput,\n ...options,\n })\n cmd.subcommandGroupChild = this\n return createComponentDecorator(cmd)\n }\n}\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/listener/index.ts","../src/core/converter/index.ts","../src/core/hooks/moduleHook.ts","../src/core/hooks/index.ts","../src/core/structures/Registry.ts","../src/core/structures/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","../src/applicationCommand/group.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\nexport const FilePathSymbol = 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","/*\n * File: decoratorCreator.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 { 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 = (component: BaseComponent): MethodDecorator => {\n return (target, key) => {\n component._init(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\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","/*\n * File: ApplicationCommand.ts\n *\n * Copyright (c) 2022-2022 pikokr\n *\n * Licensed under MIT License. Please see more defails in LICENSE file.\n */\n\nimport type { ApplicationCommandType, ChatInputApplicationCommandData, MessageApplicationCommandData, Snowflake, UserApplicationCommandData } from 'discord.js'\nimport { createComponentDecorator } from '../core/components/decoratorCreator'\nimport { BaseComponent } from '../core/components/BaseComponent'\nimport { SubCommandGroup, SubCommandGroupChild } from './group'\n\ntype Options = (UserApplicationCommandData | MessageApplicationCommandData | Omit<ChatInputApplicationCommandData, 'options'>) & {\n type: ApplicationCommandType\n guilds?: Snowflake[]\n}\n\nexport class ApplicationCommandComponent extends BaseComponent {\n options: Options\n\n subcommandGroup?: SubCommandGroup\n subcommandGroupChild?: SubCommandGroupChild\n\n constructor(options: UserApplicationCommandData | MessageApplicationCommandData | Omit<ChatInputApplicationCommandData, 'options'>) {\n super()\n\n this.options = options as Options\n }\n}\n\nexport const applicationCommand = (options: Options) => createComponentDecorator(new ApplicationCommandComponent(options))\n\nexport type { Options as ApplicationCommandComponentOptions }\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","/*\n * File: index.ts\n *\n * Copyright (c) 2022-2022 pikokr\n *\n * Licensed under MIT License. Please see more defails in LICENSE file.\n */\n\nimport _ from 'lodash'\nimport { BaseComponent } from '../components/BaseComponent'\nimport { createComponentDecorator } from '../components/decoratorCreator'\n\ntype Options = { emitter: string; event: string }\n\ntype OptionsArg = { emitter?: string; event: string }\n\nexport class ListenerComponent extends BaseComponent {\n options: Options\n\n constructor(options: OptionsArg) {\n super()\n\n this.options = _.merge({ emitter: 'discord' }, options)\n }\n}\n\nexport const listener = (options: OptionsArg) => createComponentDecorator(new ListenerComponent(options))\n","/*\n * File: index.ts\n *\n * Copyright (c) 2022-2022 pikokr\n *\n * Licensed under MIT License. Please see more defails in LICENSE file.\n */\n\nimport { BaseComponent } from '../components/BaseComponent'\nimport { createComponentDecorator } from '../components/decoratorCreator'\n\ntype Options = { component: unknown; type: Function; parameterless: boolean }\n\ntype OptionsArg = Omit<Options, 'parameterless'> & { parameterless?: boolean }\n\nexport class ConverterComponent extends BaseComponent {\n options: Options\n\n constructor(options: OptionsArg) {\n super()\n this.options = options as Options\n }\n}\n\nexport const argConverter = (options: OptionsArg) => createComponentDecorator(new ConverterComponent(options))\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","/*\n * File: Registry.ts\n *\n * Copyright (c) 2022-2022 pikokr\n *\n * Licensed under MIT License. Please see more defails in LICENSE file.\n */\n\nimport chalk from 'chalk'\nimport { Collection } from 'discord.js'\nimport EventEmitter from 'events'\nimport _, { result } 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, FilePathSymbol } from '../symbols'\nimport { CommandClient } from './CommandClient'\nimport walkSync from 'walk-sync'\nimport path from 'path'\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>(type: unknown): T[] {\n const result: T[] = []\n\n for (const ext of this.extensions) {\n result.push(...this.getComponentsWithType<T>(ext, type))\n }\n\n return result\n }\n\n getComponentsWithType<T>(ext: object, type: unknown): T[] {\n const componentStore = getComponentStore(ext)\n\n return Array.from(componentStore.filter((x) => (x.constructor as unknown) === type).values() as Iterable<T>)\n }\n\n registerEventListeners(ext: object) {\n const listeners = this.getComponentsWithType<ListenerComponent>(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<ListenerComponent>(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 loadAllModulesInDirectory(dir: string): Promise<object[]> {\n const results: object[] = []\n\n const files = walkSync(dir).filter((x) => x.endsWith('.ts') || x.endsWith('.js'))\n\n for (const file of files) {\n if (file.endsWith('.d.ts')) continue\n try {\n const p = path.join(dir, file)\n const mod = require(p)\n\n if (typeof mod.setup !== 'function') continue\n\n const modules = await mod.setup()\n\n results.push(...(await this.registerModules(modules, p)))\n } catch (e) {\n this.logger.error(`Failed to load ${file}`)\n }\n }\n\n return results\n }\n\n private async registerModules(modules: object | object[], p: string) {\n const results: object[] = []\n if (modules instanceof Array) {\n for (const module of modules) {\n await this.registerModule(module)\n Reflect.defineMetadata(FilePathSymbol, p, module)\n results.push(module)\n }\n } else {\n await this.registerModule(modules)\n Reflect.defineMetadata(FilePathSymbol, p, modules)\n results.push(modules)\n }\n\n return results\n }\n\n async reloadModules() {\n const result: { file: string; result: boolean; error?: Error }[] = []\n const paths = new Set<string>()\n for (const module of this.extensions) {\n const file = Reflect.getMetadata(FilePathSymbol, module)\n if (!file) continue\n\n paths.add(file)\n\n await this.unregisterModule(module)\n delete require.cache[require.resolve(file)]\n }\n\n for (const path of paths) {\n try {\n const mod = require(path)\n\n if (typeof mod.setup !== 'function') continue\n\n const modules = await mod.setup(this.client)\n\n await this.registerModules(modules, path)\n\n result.push({\n file: path,\n result: true,\n })\n } catch (e) {\n result.push({\n file: path,\n result: false,\n error: e as Error,\n })\n }\n }\n\n return result\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","/*\n * File: Extension.ts\n *\n * Copyright (c) 2022-2022 pikokr\n *\n * Licensed under MIT License. Please see more defails in LICENSE file.\n */\n\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: 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<ConverterComponent>(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","/*\n * File: ApplicationCommandExtension.ts\n *\n * Copyright (c) 2022-2022 pikokr\n *\n * Licensed under MIT License. Please see more defails in LICENSE file.\n */\n\nimport chalk from 'chalk'\nimport {\n APIApplicationCommandSubcommandGroupOption,\n APIApplicationCommandSubcommandOption,\n ApplicationCommandData,\n ApplicationCommandOptionData,\n ApplicationCommandOptionType,\n ApplicationCommandSubCommandData,\n ApplicationCommandType,\n ChatInputApplicationCommandData,\n ChatInputCommandInteraction,\n Collection,\n CommandInteraction,\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'\nimport { inspect } from 'util'\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 let subcommand: string | null = null\n let subcommandGroup: string | null = null\n\n if (i.commandType === ApplicationCommandType.ChatInput) {\n subcommand = i.options.getSubcommand(false)\n subcommandGroup = i.options.getSubcommandGroup(false)\n }\n\n extLoop: for (const extension of extensions) {\n const components = this.commandClient.registry.getComponentsWithType<ApplicationCommandComponent>(extension, ApplicationCommandComponent)\n\n if (subcommand) {\n for (const command of components) {\n if (!command.subcommandGroup && !command.subcommandGroupChild) continue\n\n if (\n command.subcommandGroupChild &&\n command.subcommandGroupChild.parent.options.name === i.commandName &&\n command.subcommandGroupChild.options.name === subcommandGroup &&\n command.options.name === subcommand\n ) {\n ext = extension\n cmd = command\n break extLoop\n }\n if (command.subcommandGroup && !subcommandGroup && command.subcommandGroup.options.name === i.commandName && command.options.name === subcommand) {\n ext = extension\n cmd = command\n break extLoop\n }\n }\n } else {\n for (const command of components) {\n if (command.options.name === i.commandName) {\n ext = extension\n cmd = command\n break extLoop\n }\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 if ([ApplicationCommandOptionType.Subcommand, ApplicationCommandOptionType.SubcommandGroup].includes(decorator.options.type) && i.isChatInputCommand()) {\n if (decorator.options.type === ApplicationCommandOptionType.Subcommand) {\n value = i.options.getSubcommand() === decorator.options.name\n break\n }\n if (decorator.options.type === ApplicationCommandOptionType.SubcommandGroup) {\n value = i.options.getSubcommandGroup() === decorator.options.name\n break\n }\n }\n\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.commandClient.emit('applicationCommandInvokeError', e, i)\n }\n }\n }\n\n async sync() {\n const client = this.commandClient\n\n this.logger.info('Trying to sync commands...')\n\n let commands: ApplicationCommandData[] = []\n\n const guildCommands = new Collection<Snowflake, ApplicationCommandData[]>()\n\n const subcommandGroups = new Collection<string, ChatInputApplicationCommandData>()\n\n for (const command of client.registry.getComponentsWithTypeGlobal<ApplicationCommandComponent>(ApplicationCommandComponent)) {\n if (command.subcommandGroup) {\n let group = subcommandGroups.get(command.subcommandGroup.options.name)\n\n if (!group) {\n group = {\n ...command.subcommandGroup.options,\n type: ApplicationCommandType.ChatInput,\n }\n\n if (command.subcommandGroup.guilds) {\n for (const guild of command.subcommandGroup.guilds) {\n let commands = guildCommands.get(guild)\n if (!commands) {\n commands = []\n guildCommands.set(guild, commands)\n }\n }\n } else {\n commands.push(group)\n }\n\n subcommandGroups.set(command.subcommandGroup.options.name, group)\n }\n\n if (!group.options) group.options = []\n\n group.options.push({ ...command.options, type: ApplicationCommandOptionType.Subcommand } as ApplicationCommandSubCommandData)\n\n continue\n } else if (command.subcommandGroupChild) {\n const parent = command.subcommandGroupChild.parent\n let group = subcommandGroups.get(parent.options.name)\n\n if (!group) {\n group = {\n ...parent.options,\n type: ApplicationCommandType.ChatInput,\n }\n\n if (parent.guilds) {\n for (const guild of parent.guilds) {\n let commands = guildCommands.get(guild)\n if (!commands) {\n commands = []\n guildCommands.set(guild, commands)\n }\n }\n } else {\n commands.push(group)\n }\n\n subcommandGroups.set(parent.options.name, group)\n }\n\n if (!group.options) group.options = []\n\n let child = group.options.find((x) => x.name === command.subcommandGroupChild!.options.name) as APIApplicationCommandSubcommandGroupOption\n\n if (!child) {\n child = { type: ApplicationCommandOptionType.SubcommandGroup, ...(command.subcommandGroupChild.options as Omit<APIApplicationCommandSubcommandGroupOption, 'type'>) }\n group.options.push(child)\n }\n\n if (!child.options) child.options = []\n\n child.options.push({ ...command.options, type: ApplicationCommandOptionType.Subcommand } as APIApplicationCommandSubcommandOption)\n\n continue\n }\n\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 if (command.options.guilds) {\n for (const guild of command.options.guilds) {\n let commands = guildCommands.get(guild)\n if (!commands) {\n commands = []\n guildCommands.set(guild, commands)\n }\n }\n continue\n }\n\n commands.push(cmd)\n }\n\n if (this.config.guilds) {\n for (const guild of this.config.guilds) {\n let g = guildCommands.get(guild)\n if (!g) {\n g = []\n guildCommands.set(guild, g)\n }\n g.push(...commands)\n }\n\n commands = []\n }\n\n if (guildCommands.size) {\n for (const [guild, commands] of guildCommands) {\n try {\n const g = await this.client.guilds.fetch(guild)\n await g.fetch()\n this.logger.info(\n `Processing ${chalk.green(commands.length)} commands(${commands.map((x) => chalk.blue(x.name)).join(', ')}) for guild ${chalk.green(g.name)}(${chalk.blue(g.id)})`,\n )\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 }\n if (commands.length) {\n try {\n this.logger.info(`Processing ${chalk.green(commands.length)} commands(${commands.map((x) => chalk.blue(x.name)).join(', ')}) for application scope...`)\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 @argConverter({\n component: ApplicationCommandComponent,\n parameterless: true,\n type: CommandInteraction,\n })\n async commandInteraction(i: UserContextMenuCommandInteraction) {\n return i\n }\n}\n","/*\n * File: TextCommand.ts\n *\n * Copyright (c) 2022-2022 pikokr\n *\n * Licensed under MIT License. Please see more defails in LICENSE file.\n */\n\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 {\n constructor(public options: TextCommandOptions) {\n super()\n }\n}\n\nexport const command = (options: TextCommandOptions) => createComponentDecorator(new TextCommandComponent(options))\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","/*\n * File: TextCommandExtension.ts\n *\n * Copyright (c) 2022-2022 pikokr\n *\n * Licensed under MIT License. Please see more defails in LICENSE file.\n */\n\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<TextCommandComponent>(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","/*\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 {\n method!: Function\n\n hooks: ComponentHookStore = new Collection()\n\n argTypes: Collection<number, ComponentArgument> = new Collection()\n\n _init(method: Function, argTypes: unknown[]) {\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 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","import { APIApplicationCommandSubcommandOption, ApplicationCommandType, ChatInputApplicationCommandData } from 'discord.js'\nimport { createComponentDecorator } from '../core'\nimport { ApplicationCommandComponent } from './ApplicationCommand'\n\nexport class SubCommandGroup {\n constructor(public options: Omit<APIApplicationCommandSubcommandOption, 'type'>, public guilds?: string[]) {}\n\n command(options: Omit<ChatInputApplicationCommandData, 'options' | 'type'>): MethodDecorator {\n const cmd = new ApplicationCommandComponent({\n type: ApplicationCommandType.ChatInput,\n ...options,\n })\n cmd.subcommandGroup = this\n return createComponentDecorator(cmd)\n }\n\n createChild(options: Omit<APIApplicationCommandSubcommandOption, 'type'>) {\n return new SubCommandGroupChild(options, this)\n }\n}\n\nexport class SubCommandGroupChild {\n constructor(public options: Omit<APIApplicationCommandSubcommandOption, 'type'>, public parent: SubCommandGroup) {}\n\n command(options: Omit<ChatInputApplicationCommandData, 'options' | 'type'>): MethodDecorator {\n const cmd = new ApplicationCommandComponent({\n type: ApplicationCommandType.ChatInput,\n ...options,\n })\n cmd.subcommandGroupChild = this\n return createComponentDecorator(cmd)\n }\n}\n"],"mappings":"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","names":[]}
|
package/package.json
CHANGED
@@ -8,9 +8,14 @@
|
|
8
8
|
|
9
9
|
import chalk from 'chalk'
|
10
10
|
import {
|
11
|
+
APIApplicationCommandSubcommandGroupOption,
|
12
|
+
APIApplicationCommandSubcommandOption,
|
11
13
|
ApplicationCommandData,
|
14
|
+
ApplicationCommandOptionData,
|
12
15
|
ApplicationCommandOptionType,
|
16
|
+
ApplicationCommandSubCommandData,
|
13
17
|
ApplicationCommandType,
|
18
|
+
ChatInputApplicationCommandData,
|
14
19
|
ChatInputCommandInteraction,
|
15
20
|
Collection,
|
16
21
|
CommandInteraction,
|
@@ -27,6 +32,7 @@ import { listener } from '../core/listener'
|
|
27
32
|
import { CommandClient } from '../core/structures'
|
28
33
|
import { argConverter } from '../core/converter'
|
29
34
|
import { CTSExtension } from '../core/extensions/CTSExtension'
|
35
|
+
import { inspect } from 'util'
|
30
36
|
|
31
37
|
export type ApplicationCommandExtensionConfig = {
|
32
38
|
guilds?: Snowflake[]
|
@@ -46,13 +52,44 @@ export class ApplicationCommandExtension extends CTSExtension {
|
|
46
52
|
|
47
53
|
const extensions = this.commandClient.registry.extensions
|
48
54
|
|
49
|
-
|
55
|
+
let subcommand: string | null = null
|
56
|
+
let subcommandGroup: string | null = null
|
57
|
+
|
58
|
+
if (i.commandType === ApplicationCommandType.ChatInput) {
|
59
|
+
subcommand = i.options.getSubcommand(false)
|
60
|
+
subcommandGroup = i.options.getSubcommandGroup(false)
|
61
|
+
}
|
62
|
+
|
63
|
+
extLoop: for (const extension of extensions) {
|
50
64
|
const components = this.commandClient.registry.getComponentsWithType<ApplicationCommandComponent>(extension, ApplicationCommandComponent)
|
51
65
|
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
66
|
+
if (subcommand) {
|
67
|
+
for (const command of components) {
|
68
|
+
if (!command.subcommandGroup && !command.subcommandGroupChild) continue
|
69
|
+
|
70
|
+
if (
|
71
|
+
command.subcommandGroupChild &&
|
72
|
+
command.subcommandGroupChild.parent.options.name === i.commandName &&
|
73
|
+
command.subcommandGroupChild.options.name === subcommandGroup &&
|
74
|
+
command.options.name === subcommand
|
75
|
+
) {
|
76
|
+
ext = extension
|
77
|
+
cmd = command
|
78
|
+
break extLoop
|
79
|
+
}
|
80
|
+
if (command.subcommandGroup && !subcommandGroup && command.subcommandGroup.options.name === i.commandName && command.options.name === subcommand) {
|
81
|
+
ext = extension
|
82
|
+
cmd = command
|
83
|
+
break extLoop
|
84
|
+
}
|
85
|
+
}
|
86
|
+
} else {
|
87
|
+
for (const command of components) {
|
88
|
+
if (command.options.name === i.commandName) {
|
89
|
+
ext = extension
|
90
|
+
cmd = command
|
91
|
+
break extLoop
|
92
|
+
}
|
56
93
|
}
|
57
94
|
}
|
58
95
|
}
|
@@ -97,15 +134,87 @@ export class ApplicationCommandExtension extends CTSExtension {
|
|
97
134
|
}
|
98
135
|
|
99
136
|
async sync() {
|
100
|
-
const client =
|
137
|
+
const client = this.commandClient
|
101
138
|
|
102
139
|
this.logger.info('Trying to sync commands...')
|
103
140
|
|
104
|
-
|
141
|
+
let commands: ApplicationCommandData[] = []
|
105
142
|
|
106
143
|
const guildCommands = new Collection<Snowflake, ApplicationCommandData[]>()
|
107
144
|
|
145
|
+
const subcommandGroups = new Collection<string, ChatInputApplicationCommandData>()
|
146
|
+
|
108
147
|
for (const command of client.registry.getComponentsWithTypeGlobal<ApplicationCommandComponent>(ApplicationCommandComponent)) {
|
148
|
+
if (command.subcommandGroup) {
|
149
|
+
let group = subcommandGroups.get(command.subcommandGroup.options.name)
|
150
|
+
|
151
|
+
if (!group) {
|
152
|
+
group = {
|
153
|
+
...command.subcommandGroup.options,
|
154
|
+
type: ApplicationCommandType.ChatInput,
|
155
|
+
}
|
156
|
+
|
157
|
+
if (command.subcommandGroup.guilds) {
|
158
|
+
for (const guild of command.subcommandGroup.guilds) {
|
159
|
+
let commands = guildCommands.get(guild)
|
160
|
+
if (!commands) {
|
161
|
+
commands = []
|
162
|
+
guildCommands.set(guild, commands)
|
163
|
+
}
|
164
|
+
}
|
165
|
+
} else {
|
166
|
+
commands.push(group)
|
167
|
+
}
|
168
|
+
|
169
|
+
subcommandGroups.set(command.subcommandGroup.options.name, group)
|
170
|
+
}
|
171
|
+
|
172
|
+
if (!group.options) group.options = []
|
173
|
+
|
174
|
+
group.options.push({ ...command.options, type: ApplicationCommandOptionType.Subcommand } as ApplicationCommandSubCommandData)
|
175
|
+
|
176
|
+
continue
|
177
|
+
} else if (command.subcommandGroupChild) {
|
178
|
+
const parent = command.subcommandGroupChild.parent
|
179
|
+
let group = subcommandGroups.get(parent.options.name)
|
180
|
+
|
181
|
+
if (!group) {
|
182
|
+
group = {
|
183
|
+
...parent.options,
|
184
|
+
type: ApplicationCommandType.ChatInput,
|
185
|
+
}
|
186
|
+
|
187
|
+
if (parent.guilds) {
|
188
|
+
for (const guild of parent.guilds) {
|
189
|
+
let commands = guildCommands.get(guild)
|
190
|
+
if (!commands) {
|
191
|
+
commands = []
|
192
|
+
guildCommands.set(guild, commands)
|
193
|
+
}
|
194
|
+
}
|
195
|
+
} else {
|
196
|
+
commands.push(group)
|
197
|
+
}
|
198
|
+
|
199
|
+
subcommandGroups.set(parent.options.name, group)
|
200
|
+
}
|
201
|
+
|
202
|
+
if (!group.options) group.options = []
|
203
|
+
|
204
|
+
let child = group.options.find((x) => x.name === command.subcommandGroupChild!.options.name) as APIApplicationCommandSubcommandGroupOption
|
205
|
+
|
206
|
+
if (!child) {
|
207
|
+
child = { type: ApplicationCommandOptionType.SubcommandGroup, ...(command.subcommandGroupChild.options as Omit<APIApplicationCommandSubcommandGroupOption, 'type'>) }
|
208
|
+
group.options.push(child)
|
209
|
+
}
|
210
|
+
|
211
|
+
if (!child.options) child.options = []
|
212
|
+
|
213
|
+
child.options.push({ ...command.options, type: ApplicationCommandOptionType.Subcommand } as APIApplicationCommandSubcommandOption)
|
214
|
+
|
215
|
+
continue
|
216
|
+
}
|
217
|
+
|
109
218
|
const cmd: ApplicationCommandData = { ...command.options }
|
110
219
|
|
111
220
|
if (cmd.type === ApplicationCommandType.ChatInput) {
|
@@ -127,32 +236,34 @@ export class ApplicationCommandExtension extends CTSExtension {
|
|
127
236
|
commands = []
|
128
237
|
guildCommands.set(guild, commands)
|
129
238
|
}
|
130
|
-
commands.push(cmd)
|
131
239
|
}
|
132
240
|
continue
|
133
241
|
}
|
134
242
|
|
135
|
-
|
136
|
-
|
137
|
-
|
138
|
-
|
139
|
-
|
140
|
-
|
141
|
-
|
142
|
-
|
243
|
+
commands.push(cmd)
|
244
|
+
}
|
245
|
+
|
246
|
+
if (this.config.guilds) {
|
247
|
+
for (const guild of this.config.guilds) {
|
248
|
+
let g = guildCommands.get(guild)
|
249
|
+
if (!g) {
|
250
|
+
g = []
|
251
|
+
guildCommands.set(guild, g)
|
143
252
|
}
|
144
|
-
|
253
|
+
g.push(...commands)
|
145
254
|
}
|
146
|
-
|
255
|
+
|
256
|
+
commands = []
|
147
257
|
}
|
148
258
|
|
149
259
|
if (guildCommands.size) {
|
150
260
|
for (const [guild, commands] of guildCommands) {
|
151
|
-
this.logger.info(`Processing ${chalk.green(commands.length)} commands(${commands.map((x) => chalk.blue(x.name)).join(', ')})`)
|
152
261
|
try {
|
153
262
|
const g = await this.client.guilds.fetch(guild)
|
154
263
|
await g.fetch()
|
155
|
-
this.logger.info(
|
264
|
+
this.logger.info(
|
265
|
+
`Processing ${chalk.green(commands.length)} commands(${commands.map((x) => chalk.blue(x.name)).join(', ')}) for guild ${chalk.green(g.name)}(${chalk.blue(g.id)})`,
|
266
|
+
)
|
156
267
|
|
157
268
|
await g.commands.set(commands)
|
158
269
|
|
@@ -164,7 +275,7 @@ export class ApplicationCommandExtension extends CTSExtension {
|
|
164
275
|
}
|
165
276
|
if (commands.length) {
|
166
277
|
try {
|
167
|
-
this.logger.info(`
|
278
|
+
this.logger.info(`Processing ${chalk.green(commands.length)} commands(${commands.map((x) => chalk.blue(x.name)).join(', ')}) for application scope...`)
|
168
279
|
|
169
280
|
await this.client.application!.commands.set(commands)
|
170
281
|
|
@@ -20,7 +20,7 @@ export class SubCommandGroup {
|
|
20
20
|
}
|
21
21
|
|
22
22
|
export class SubCommandGroupChild {
|
23
|
-
constructor(public options: Omit<APIApplicationCommandSubcommandOption, 'type'>, parent: SubCommandGroup) {}
|
23
|
+
constructor(public options: Omit<APIApplicationCommandSubcommandOption, 'type'>, public parent: SubCommandGroup) {}
|
24
24
|
|
25
25
|
command(options: Omit<ChatInputApplicationCommandData, 'options' | 'type'>): MethodDecorator {
|
26
26
|
const cmd = new ApplicationCommandComponent({
|