diff --git a/src/models/rest.ts b/src/models/rest.ts index 0d9ccd0..ed39f59 100644 --- a/src/models/rest.ts +++ b/src/models/rest.ts @@ -51,15 +51,61 @@ export interface RateLimit { bucket: string | null } +const METHODS = ['get', 'post', 'patch', 'put', 'delete', 'head'] + +export type MethodFunction = ( + body?: unknown, + maxRetries?: number, + bucket?: string | null, + rawResponse?: boolean +) => Promise + +export interface APIMap extends MethodFunction { + get: APIMap + post: APIMap + patch: APIMap + put: APIMap + delete: APIMap + head: APIMap + [name: string]: APIMap +} + +export const builder = (rest: RESTManager, acum = '/'): APIMap => { + const routes = {} + const proxy = new Proxy(routes, { + get: (_, p, __) => { + if (p === 'toString') return () => acum + if (METHODS.includes(String(p))) { + const method = ((rest as unknown) as { + [name: string]: MethodFunction + })[String(p)] + return async (...args: any[]) => + await method.bind(rest)( + `${baseEndpoints.DISCORD_API_URL}/v${rest.version}${acum.substring( + 0, + acum.length - 1 + )}`, + ...args + ) + } + return builder(rest, acum + String(p) + '/') + } + }) + return (proxy as unknown) as APIMap +} + export class RESTManager { client?: Client queues: { [key: string]: QueuedItem[] } = {} rateLimits = new Collection() globalRateLimit: boolean = false processing: boolean = false + version: number = 8 + api: APIMap constructor(client?: Client) { this.client = client + this.api = builder(this) // eslint-disable-next-line @typescript-eslint/no-floating-promises this.handleRateLimits() } diff --git a/src/test/music.ts b/src/test/music.ts index 3801237..fd84f3f 100644 --- a/src/test/music.ts +++ b/src/test/music.ts @@ -7,7 +7,8 @@ import { groupslash, CommandContext, Extension, - Collection + Collection, + SlashCommandOptionType } from '../../mod.ts' import { LL_IP, LL_PASS, LL_PORT, TOKEN } from './config.ts' import { @@ -60,12 +61,12 @@ class MyClient extends CommandClient { } @subslash('cmd', 'sub-cmd-no-grp') - subCmdNoGrp(d: Interaction): void { + subCmdNoGroup(d: Interaction): void { d.respond({ content: 'sub-cmd-no-group worked' }) } @groupslash('cmd', 'sub-cmd-group', 'sub-cmd') - subCmdGrp(d: Interaction): void { + subCmdGroup(d: Interaction): void { d.respond({ content: 'sub-cmd-group worked' }) } @@ -74,53 +75,62 @@ class MyClient extends CommandClient { console.log(d.name) } + @event() + raw(evt: string, d: any): void { + if (!evt.startsWith('APPLICATION')) return + console.log(evt, d) + } + @event() ready(): void { console.log(`Logged in as ${this.user?.tag}!`) this.manager.init(this.user?.id as string) - // client.slash.commands.create( - // { - // name: 'cmd', - // description: 'Parent command', - // options: [ - // { - // name: 'sub-cmd-group', - // type: SlashCommandOptionType.SUB_COMMAND_GROUP, - // description: 'Sub Cmd Group', - // options: [ - // { - // name: 'sub-cmd', - // type: SlashCommandOptionType.SUB_COMMAND, - // description: 'Sub Cmd' - // } - // ] - // }, - // { - // name: 'sub-cmd-no-grp', - // type: SlashCommandOptionType.SUB_COMMAND, - // description: 'Sub Cmd' - // }, - // { - // name: 'sub-cmd-grp-2', - // type: SlashCommandOptionType.SUB_COMMAND_GROUP, - // description: 'Sub Cmd Group 2', - // options: [ - // { - // name: 'sub-cmd-1', - // type: SlashCommandOptionType.SUB_COMMAND, - // description: 'Sub Cmd 1' - // }, - // { - // name: 'sub-cmd-2', - // type: SlashCommandOptionType.SUB_COMMAND, - // description: 'Sub Cmd 2' - // } - // ] - // } - // ] - // }, - // '783319033205751809' - // ) + + // this.rest.api.users['422957901716652033'].get().then(console.log) + client.slash.commands.create( + { + name: 'cmd', + description: 'Parent command!', + options: [ + { + name: 'sub-cmd-group', + type: SlashCommandOptionType.SUB_COMMAND_GROUP, + description: 'Sub Cmd Group', + options: [ + { + name: 'sub-cmd', + type: SlashCommandOptionType.SUB_COMMAND, + description: 'Sub Cmd' + } + ] + }, + { + name: 'sub-cmd-no-grp', + type: SlashCommandOptionType.SUB_COMMAND, + description: 'Sub Cmd' + }, + { + name: 'sub-cmd-grp-2', + type: SlashCommandOptionType.SUB_COMMAND_GROUP, + description: 'Sub Cmd Group 2', + options: [ + { + name: 'sub-cmd-1', + type: SlashCommandOptionType.SUB_COMMAND, + description: 'Sub Cmd 1' + }, + { + name: 'sub-cmd-2', + type: SlashCommandOptionType.SUB_COMMAND, + description: 'Sub Cmd 2' + } + ] + } + ] + }, + '783319033205751809' + ) + // client.slash.commands.delete('788719077329207296', '783319033205751809') } } @@ -166,7 +176,7 @@ class VCExtension extends Extension { await player.play(track) - ctx.channel.send(`Now playing ${info.title}!`) + ctx.channel.send(`Now playing ${info.title}!\nDebug Track: ${track}`) } @command()