fix decorators
This commit is contained in:
		
							parent
							
								
									a1ead7e15e
								
							
						
					
					
						commit
						945bcc6f40
					
				
					 9 changed files with 85 additions and 110 deletions
				
			
		|  | @ -12,7 +12,6 @@ import { EmojisManager } from '../managers/emojis.ts' | ||||||
| import { ActivityGame, ClientActivity } from '../types/presence.ts' | import { ActivityGame, ClientActivity } from '../types/presence.ts' | ||||||
| import type { Extension } from '../commands/extension.ts' | import type { Extension } from '../commands/extension.ts' | ||||||
| import { SlashClient } from '../interactions/slashClient.ts' | import { SlashClient } from '../interactions/slashClient.ts' | ||||||
| import type { Interaction } from '../structures/slash.ts' |  | ||||||
| import { ShardManager } from './shard.ts' | import { ShardManager } from './shard.ts' | ||||||
| import { Application } from '../structures/application.ts' | import { Application } from '../structures/application.ts' | ||||||
| import { Invite } from '../structures/invite.ts' | import { Invite } from '../structures/invite.ts' | ||||||
|  | @ -113,17 +112,6 @@ export class Client extends HarmonyEventEmitter<ClientEvents> { | ||||||
| 
 | 
 | ||||||
|   /** Client's presence. Startup one if set before connecting */ |   /** Client's presence. Startup one if set before connecting */ | ||||||
|   presence: ClientPresence = new ClientPresence() |   presence: ClientPresence = new ClientPresence() | ||||||
|   _decoratedEvents?: { |  | ||||||
|     [name: string]: (...args: any[]) => void |  | ||||||
|   } |  | ||||||
| 
 |  | ||||||
|   _decoratedSlash?: Array<{ |  | ||||||
|     name: string |  | ||||||
|     guild?: string |  | ||||||
|     parent?: string |  | ||||||
|     group?: string |  | ||||||
|     handler: (interaction: Interaction) => any |  | ||||||
|   }> |  | ||||||
| 
 | 
 | ||||||
|   _id?: string |   _id?: string | ||||||
| 
 | 
 | ||||||
|  | @ -175,13 +163,13 @@ export class Client extends HarmonyEventEmitter<ClientEvents> { | ||||||
|       this.fetchUncachedReactions = true |       this.fetchUncachedReactions = true | ||||||
| 
 | 
 | ||||||
|     if ( |     if ( | ||||||
|       this._decoratedEvents !== undefined && |       (this as any)._decoratedEvents !== undefined && | ||||||
|       Object.keys(this._decoratedEvents).length !== 0 |       Object.keys((this as any)._decoratedEvents).length !== 0 | ||||||
|     ) { |     ) { | ||||||
|       Object.entries(this._decoratedEvents).forEach((entry) => { |       Object.entries((this as any)._decoratedEvents).forEach((entry) => { | ||||||
|         this.on(entry[0] as keyof ClientEvents, entry[1].bind(this)) |         this.on(entry[0] as keyof ClientEvents, (entry as any)[1].bind(this)) | ||||||
|       }) |       }) | ||||||
|       this._decoratedEvents = undefined |       ;(this as any)._decoratedEvents = undefined | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     this.clientProperties = |     this.clientProperties = | ||||||
|  | @ -422,19 +410,23 @@ export class Client extends HarmonyEventEmitter<ClientEvents> { | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| /** Event decorator to create an Event handler from function */ | /** Event decorator to create an Event handler from function */ | ||||||
|  | // eslint-disable-next-line @typescript-eslint/explicit-function-return-type
 | ||||||
| export function event(name?: keyof ClientEvents) { | export function event(name?: keyof ClientEvents) { | ||||||
|   return function ( |   return function ( | ||||||
|     client: Client | Extension, |     client: Client | Extension, | ||||||
|     prop: keyof ClientEvents | string |     prop: keyof ClientEvents | string | ||||||
|   ) { |   ) { | ||||||
|  |     // eslint-disable-next-line @typescript-eslint/no-unnecessary-type-assertion
 | ||||||
|  |     const c = client as any | ||||||
|     const listener = ((client as unknown) as { |     const listener = ((client as unknown) as { | ||||||
|       [name in keyof ClientEvents]: (...args: ClientEvents[name]) => any |       [name in keyof ClientEvents]: (...args: ClientEvents[name]) => any | ||||||
|     })[(prop as unknown) as keyof ClientEvents] |     })[(prop as unknown) as keyof ClientEvents] | ||||||
|     if (typeof listener !== 'function') |     if (typeof listener !== 'function') | ||||||
|       throw new Error('@event decorator requires a function') |       throw new Error('@event decorator requires a function') | ||||||
|     if (client._decoratedEvents === undefined) client._decoratedEvents = {} | 
 | ||||||
|  |     if (c._decoratedEvents === undefined) c._decoratedEvents = {} | ||||||
|     const key = name === undefined ? prop : name |     const key = name === undefined ? prop : name | ||||||
| 
 | 
 | ||||||
|     client._decoratedEvents[key] = listener |     c._decoratedEvents[key] = listener | ||||||
|   } |   } | ||||||
| } | } | ||||||
|  |  | ||||||
|  | @ -70,8 +70,6 @@ export class CommandClient extends Client implements CommandClientOptions { | ||||||
|   commands: CommandsManager = new CommandsManager(this) |   commands: CommandsManager = new CommandsManager(this) | ||||||
|   categories: CategoriesManager = new CategoriesManager(this) |   categories: CategoriesManager = new CategoriesManager(this) | ||||||
| 
 | 
 | ||||||
|   _decoratedCommands?: { [name: string]: Command } |  | ||||||
| 
 |  | ||||||
|   constructor(options: CommandClientOptions) { |   constructor(options: CommandClientOptions) { | ||||||
|     super(options) |     super(options) | ||||||
|     this.prefix = options.prefix |     this.prefix = options.prefix | ||||||
|  | @ -116,11 +114,12 @@ export class CommandClient extends Client implements CommandClientOptions { | ||||||
|     this.caseSensitive = |     this.caseSensitive = | ||||||
|       options.caseSensitive === undefined ? false : options.caseSensitive |       options.caseSensitive === undefined ? false : options.caseSensitive | ||||||
| 
 | 
 | ||||||
|     if (this._decoratedCommands !== undefined) { |     const self = this as any | ||||||
|       Object.values(this._decoratedCommands).forEach((entry) => { |     if (self._decoratedCommands !== undefined) { | ||||||
|  |       Object.values(self._decoratedCommands).forEach((entry: any) => { | ||||||
|         this.commands.add(entry) |         this.commands.add(entry) | ||||||
|       }) |       }) | ||||||
|       this._decoratedCommands = undefined |       self._decoratedCommands = undefined | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     this.on( |     this.on( | ||||||
|  | @ -382,11 +381,11 @@ export class CommandClient extends Client implements CommandClientOptions { | ||||||
|  */ |  */ | ||||||
| export function command(options?: CommandOptions) { | export function command(options?: CommandOptions) { | ||||||
|   return function (target: CommandClient | Extension, name: string) { |   return function (target: CommandClient | Extension, name: string) { | ||||||
|     if (target._decoratedCommands === undefined) target._decoratedCommands = {} |     // eslint-disable-next-line @typescript-eslint/no-unnecessary-type-assertion
 | ||||||
|  |     const c = target as any | ||||||
|  |     if (c._decoratedCommands === undefined) c._decoratedCommands = {} | ||||||
| 
 | 
 | ||||||
|     const prop = ((target as unknown) as { |     const prop = c[name] | ||||||
|       [name: string]: (ctx: CommandContext) => any |  | ||||||
|     })[name] |  | ||||||
| 
 | 
 | ||||||
|     if (typeof prop !== 'function') |     if (typeof prop !== 'function') | ||||||
|       throw new Error('@command decorator can only be used on class methods') |       throw new Error('@command decorator can only be used on class methods') | ||||||
|  | @ -400,6 +399,6 @@ export function command(options?: CommandOptions) { | ||||||
| 
 | 
 | ||||||
|     if (target instanceof Extension) command.extension = target |     if (target instanceof Extension) command.extension = target | ||||||
| 
 | 
 | ||||||
|     target._decoratedCommands[command.name] = command |     c._decoratedCommands[command.name] = command | ||||||
|   } |   } | ||||||
| } | } | ||||||
|  |  | ||||||
|  | @ -73,27 +73,25 @@ export class Extension { | ||||||
|   /** Events registered by this Extension */ |   /** Events registered by this Extension */ | ||||||
|   events: { [name: string]: (...args: any[]) => {} } = {} |   events: { [name: string]: (...args: any[]) => {} } = {} | ||||||
| 
 | 
 | ||||||
|   _decoratedCommands?: { [name: string]: Command } |  | ||||||
|   _decoratedEvents?: { [name: string]: (...args: any[]) => any } |  | ||||||
| 
 |  | ||||||
|   constructor(client: CommandClient) { |   constructor(client: CommandClient) { | ||||||
|     this.client = client |     this.client = client | ||||||
|     if (this._decoratedCommands !== undefined) { |     const self = this as any | ||||||
|       Object.entries(this._decoratedCommands).forEach((entry) => { |     if (self._decoratedCommands !== undefined) { | ||||||
|  |       Object.entries(self._decoratedCommands).forEach((entry: any) => { | ||||||
|         entry[1].extension = this |         entry[1].extension = this | ||||||
|         this.commands.add(entry[1]) |         this.commands.add(entry[1]) | ||||||
|       }) |       }) | ||||||
|       this._decoratedCommands = undefined |       self._decoratedCommands = undefined | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     if ( |     if ( | ||||||
|       this._decoratedEvents !== undefined && |       self._decoratedEvents !== undefined && | ||||||
|       Object.keys(this._decoratedEvents).length !== 0 |       Object.keys(self._decoratedEvents).length !== 0 | ||||||
|     ) { |     ) { | ||||||
|       Object.entries(this._decoratedEvents).forEach((entry) => { |       Object.entries(self._decoratedEvents).forEach((entry: any) => { | ||||||
|         this.listen(entry[0] as keyof ClientEvents, entry[1].bind(this)) |         this.listen(entry[0] as keyof ClientEvents, entry[1].bind(this)) | ||||||
|       }) |       }) | ||||||
|       this._decoratedEvents = undefined |       self._decoratedEvents = undefined | ||||||
|     } |     } | ||||||
|   } |   } | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -55,14 +55,6 @@ export class SlashClient extends HarmonyEventEmitter<SlashClientEvents> { | ||||||
|   modules: SlashModule[] = [] |   modules: SlashModule[] = [] | ||||||
|   publicKey?: string |   publicKey?: string | ||||||
| 
 | 
 | ||||||
|   _decoratedSlash?: Array<{ |  | ||||||
|     name: string |  | ||||||
|     guild?: string |  | ||||||
|     parent?: string |  | ||||||
|     group?: string |  | ||||||
|     handler: (interaction: Interaction) => any |  | ||||||
|   }> |  | ||||||
| 
 |  | ||||||
|   constructor(options: SlashOptions) { |   constructor(options: SlashOptions) { | ||||||
|     super() |     super() | ||||||
|     let id = options.id |     let id = options.id | ||||||
|  | @ -76,17 +68,20 @@ export class SlashClient extends HarmonyEventEmitter<SlashClientEvents> { | ||||||
| 
 | 
 | ||||||
|     this.enabled = options.enabled ?? true |     this.enabled = options.enabled ?? true | ||||||
| 
 | 
 | ||||||
|     if (this.client?._decoratedSlash !== undefined) { |     // eslint-disable-next-line @typescript-eslint/no-unnecessary-type-assertion
 | ||||||
|       this.client._decoratedSlash.forEach((e) => { |     const client = this.client as any | ||||||
|  |     if (client?._decoratedSlash !== undefined) { | ||||||
|  |       client._decoratedSlash.forEach((e: any) => { | ||||||
|         e.handler = e.handler.bind(this.client) |         e.handler = e.handler.bind(this.client) | ||||||
|         this.handlers.push(e) |         this.handlers.push(e) | ||||||
|       }) |       }) | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     if (this._decoratedSlash !== undefined) { |     const self = this as any | ||||||
|       this._decoratedSlash.forEach((e) => { |     if (self._decoratedSlash !== undefined) { | ||||||
|  |       self._decoratedSlash.forEach((e: any) => { | ||||||
|         e.handler = e.handler.bind(this.client) |         e.handler = e.handler.bind(this.client) | ||||||
|         this.handlers.push(e) |         self.handlers.push(e) | ||||||
|       }) |       }) | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|  | @ -386,12 +381,14 @@ export class SlashClient extends HarmonyEventEmitter<SlashClientEvents> { | ||||||
| /** Decorator to create a Slash Command handler */ | /** Decorator to create a Slash Command handler */ | ||||||
| export function slash(name?: string, guild?: string) { | export function slash(name?: string, guild?: string) { | ||||||
|   return function (client: Client | SlashClient | SlashModule, prop: string) { |   return function (client: Client | SlashClient | SlashModule, prop: string) { | ||||||
|     if (client._decoratedSlash === undefined) client._decoratedSlash = [] |     // eslint-disable-next-line @typescript-eslint/no-unnecessary-type-assertion
 | ||||||
|  |     const c = client as any | ||||||
|  |     if (c._decoratedSlash === undefined) c._decoratedSlash = [] | ||||||
|     const item = (client as { [name: string]: any })[prop] |     const item = (client as { [name: string]: any })[prop] | ||||||
|     if (typeof item !== 'function') { |     if (typeof item !== 'function') { | ||||||
|       throw new Error('@slash decorator requires a function') |       throw new Error('@slash decorator requires a function') | ||||||
|     } else |     } else | ||||||
|       client._decoratedSlash.push({ |       c._decoratedSlash.push({ | ||||||
|         name: name ?? prop, |         name: name ?? prop, | ||||||
|         guild, |         guild, | ||||||
|         handler: item |         handler: item | ||||||
|  | @ -402,12 +399,14 @@ export function slash(name?: string, guild?: string) { | ||||||
| /** Decorator to create a Sub-Slash Command handler */ | /** Decorator to create a Sub-Slash Command handler */ | ||||||
| export function subslash(parent: string, name?: string, guild?: string) { | export function subslash(parent: string, name?: string, guild?: string) { | ||||||
|   return function (client: Client | SlashModule | SlashClient, prop: string) { |   return function (client: Client | SlashModule | SlashClient, prop: string) { | ||||||
|     if (client._decoratedSlash === undefined) client._decoratedSlash = [] |     // eslint-disable-next-line @typescript-eslint/no-unnecessary-type-assertion
 | ||||||
|  |     const c = client as any | ||||||
|  |     if (c._decoratedSlash === undefined) c._decoratedSlash = [] | ||||||
|     const item = (client as { [name: string]: any })[prop] |     const item = (client as { [name: string]: any })[prop] | ||||||
|     if (typeof item !== 'function') { |     if (typeof item !== 'function') { | ||||||
|       throw new Error('@subslash decorator requires a function') |       throw new Error('@subslash decorator requires a function') | ||||||
|     } else |     } else | ||||||
|       client._decoratedSlash.push({ |       c._decoratedSlash.push({ | ||||||
|         parent, |         parent, | ||||||
|         name: name ?? prop, |         name: name ?? prop, | ||||||
|         guild, |         guild, | ||||||
|  | @ -424,12 +423,14 @@ export function groupslash( | ||||||
|   guild?: string |   guild?: string | ||||||
| ) { | ) { | ||||||
|   return function (client: Client | SlashModule | SlashClient, prop: string) { |   return function (client: Client | SlashModule | SlashClient, prop: string) { | ||||||
|     if (client._decoratedSlash === undefined) client._decoratedSlash = [] |     // eslint-disable-next-line @typescript-eslint/no-unnecessary-type-assertion
 | ||||||
|  |     const c = client as any | ||||||
|  |     if (c._decoratedSlash === undefined) c._decoratedSlash = [] | ||||||
|     const item = (client as { [name: string]: any })[prop] |     const item = (client as { [name: string]: any })[prop] | ||||||
|     if (typeof item !== 'function') { |     if (typeof item !== 'function') { | ||||||
|       throw new Error('@groupslash decorator requires a function') |       throw new Error('@groupslash decorator requires a function') | ||||||
|     } else |     } else | ||||||
|       client._decoratedSlash.push({ |       c._decoratedSlash.push({ | ||||||
|         group, |         group, | ||||||
|         parent, |         parent, | ||||||
|         name: name ?? prop, |         name: name ?? prop, | ||||||
|  |  | ||||||
							
								
								
									
										1
									
								
								src/managers/_util.ts
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										1
									
								
								src/managers/_util.ts
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1 @@ | ||||||
|  | export {} | ||||||
|  | @ -11,6 +11,8 @@ import type { | ||||||
| import { CHANNEL } from '../types/endpoint.ts' | import { CHANNEL } from '../types/endpoint.ts' | ||||||
| import getChannelByType from '../utils/channel.ts' | import getChannelByType from '../utils/channel.ts' | ||||||
| import { BaseManager } from './base.ts' | import { BaseManager } from './base.ts' | ||||||
|  | // Deno is bugged
 | ||||||
|  | import {} from './_util.ts' | ||||||
| 
 | 
 | ||||||
| export type AllMessageOptions = MessageOptions | Embed | export type AllMessageOptions = MessageOptions | Embed | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -158,11 +158,7 @@ export enum ChannelTypes { | ||||||
|   GUILD_CATEGORY = 4, |   GUILD_CATEGORY = 4, | ||||||
|   GUILD_NEWS = 5, |   GUILD_NEWS = 5, | ||||||
|   GUILD_STORE = 6, |   GUILD_STORE = 6, | ||||||
| <<<<<<< HEAD |  | ||||||
|   GUILD_STAGE_VOICE = 13, |  | ||||||
| ======= |  | ||||||
|   GUILD_STAGE_VOICE = 13 |   GUILD_STAGE_VOICE = 13 | ||||||
| >>>>>>> origin/main |  | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| export interface MessagePayload { | export interface MessagePayload { | ||||||
|  | @ -345,11 +341,7 @@ export enum MessageTypes { | ||||||
|   GUILD_DISCOVERY_GRACE_PERIOD_INITIAL_WARNING = 16, |   GUILD_DISCOVERY_GRACE_PERIOD_INITIAL_WARNING = 16, | ||||||
|   GUILD_DISCOVERY_GRACE_PERIOD_FINAL_WARNING = 17, |   GUILD_DISCOVERY_GRACE_PERIOD_FINAL_WARNING = 17, | ||||||
|   REPLY = 19, |   REPLY = 19, | ||||||
| <<<<<<< HEAD |  | ||||||
|   APPLICATION_COMMAND = 20, |  | ||||||
| ======= |  | ||||||
|   APPLICATION_COMMAND = 20 |   APPLICATION_COMMAND = 20 | ||||||
| >>>>>>> origin/main |  | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| export enum MessageActivityTypes { | export enum MessageActivityTypes { | ||||||
|  |  | ||||||
|  | @ -34,9 +34,5 @@ export const PermissionFlags: { [key: string]: bigint } = { | ||||||
|   MANAGE_EMOJIS: 1n << 30n, |   MANAGE_EMOJIS: 1n << 30n, | ||||||
|   USE_SLASH_COMMANDS: 1n << 31n, |   USE_SLASH_COMMANDS: 1n << 31n, | ||||||
|   // Might be removed (as PR says)
 |   // Might be removed (as PR says)
 | ||||||
| <<<<<<< HEAD |  | ||||||
|   REQUEST_TO_SPEAK: 0x100000000n, |  | ||||||
| ======= |  | ||||||
|   REQUEST_TO_SPEAK: 0x100000000n |   REQUEST_TO_SPEAK: 0x100000000n | ||||||
| >>>>>>> origin/main |  | ||||||
| } | } | ||||||
|  |  | ||||||
|  | @ -1,48 +1,42 @@ | ||||||
| import { | import { Client, Intents, event, slash } from '../mod.ts' | ||||||
|   Client, | import { Interaction } from '../src/structures/slash.ts' | ||||||
|   Intents, |  | ||||||
|   event, |  | ||||||
|   slash, |  | ||||||
|   SlashCommandOptionType as Type |  | ||||||
| } from '../../mod.ts' |  | ||||||
| import { Interaction } from '../structures/slash.ts' |  | ||||||
| import { TOKEN } from './config.ts' | import { TOKEN } from './config.ts' | ||||||
| 
 | 
 | ||||||
| export class MyClient extends Client { | export class MyClient extends Client { | ||||||
|   @event() ready(): void { |   @event() ready(): void { | ||||||
|     console.log(`Logged in as ${this.user?.tag}!`) |     console.log(`Logged in as ${this.user?.tag}!`) | ||||||
|     this.slash.commands.bulkEdit( |     // this.slash.commands.bulkEdit(
 | ||||||
|       [ |     //   [
 | ||||||
|         { |     //     {
 | ||||||
|           name: 'test', |     //       name: 'test',
 | ||||||
|           description: 'Test command.', |     //       description: 'Test command.',
 | ||||||
|           options: [ |     //       options: [
 | ||||||
|             { |     //         {
 | ||||||
|               name: 'user', |     //           name: 'user',
 | ||||||
|               type: Type.USER, |     //           type: Type.USER,
 | ||||||
|               description: 'User' |     //           description: 'User'
 | ||||||
|             }, |     //         },
 | ||||||
|             { |     //         {
 | ||||||
|               name: 'role', |     //           name: 'role',
 | ||||||
|               type: Type.ROLE, |     //           type: Type.ROLE,
 | ||||||
|               description: 'Role' |     //           description: 'Role'
 | ||||||
|             }, |     //         },
 | ||||||
|             { |     //         {
 | ||||||
|               name: 'channel', |     //           name: 'channel',
 | ||||||
|               type: Type.CHANNEL, |     //           type: Type.CHANNEL,
 | ||||||
|               description: 'Channel' |     //           description: 'Channel'
 | ||||||
|             }, |     //         },
 | ||||||
|             { |     //         {
 | ||||||
|               name: 'string', |     //           name: 'string',
 | ||||||
|               type: Type.STRING, |     //           type: Type.STRING,
 | ||||||
|               description: 'String' |     //           description: 'String'
 | ||||||
|             } |     //         }
 | ||||||
|           ] |     //       ]
 | ||||||
|         } |     //     }
 | ||||||
|       ], |     //   ],
 | ||||||
|       '807935370556866560' |     //   '807935370556866560'
 | ||||||
|     ) |     // )
 | ||||||
|     this.slash.commands.bulkEdit([]) |     // this.slash.commands.bulkEdit([])
 | ||||||
|   } |   } | ||||||
| 
 | 
 | ||||||
|   @slash() test(d: Interaction): void { |   @slash() test(d: Interaction): void { | ||||||
|  |  | ||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue