@pikokr/command.ts 4.0.7 → 5.0.0-dev.9796a99
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/.github/workflows/codeql-analysis.yml +70 -0
- package/.github/workflows/publish.stable.yml +1 -1
- package/.github/workflows/publish.yml +1 -1
- package/.vscode/settings.json +10 -0
- package/.vscode/templates/ts.lict +5 -0
- package/dist/index.d.ts +40 -318
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/package.json +11 -8
- package/publish-version.js +10 -0
- package/scripts/docs.ts +8 -4
- package/src/applicationCommand/ApplicationCommand.ts +17 -0
- package/src/applicationCommand/ApplicationCommandOption.ts +9 -0
- package/src/applicationCommand/index.ts +2 -6
- package/src/core/components/BaseComponent.ts +32 -0
- package/src/core/components/ComponentArgument.ts +7 -0
- package/src/core/components/ComponentArgumentDecorator.ts +17 -0
- package/src/core/components/decoratorCreator.ts +68 -0
- package/src/core/components/index.ts +3 -0
- package/src/core/index.ts +1 -0
- package/src/core/symbols.ts +2 -0
- package/src/index.ts +10 -16
- package/test/index.ts +32 -23
- package/tsconfig.json +1 -1
- package/tsconfig.prod.json +4 -0
- package/tsup.config.ts +8 -4
- package/src/applicationCommand/AppCommand.ts +0 -32
- package/src/applicationCommand/decorator.ts +0 -62
- package/src/builtinModules/BuiltInModule.ts +0 -13
- package/src/builtinModules/BuiltinApplicationCommandConverters.ts +0 -16
- package/src/builtinModules/BuiltinCommandConverters.ts +0 -87
- package/src/builtinModules/CommandHandler.ts +0 -363
- package/src/builtinModules/index.ts +0 -7
- package/src/command/ArgumentConverter.ts +0 -22
- package/src/command/Command.ts +0 -35
- package/src/command/cooldown/adapter.ts +0 -22
- package/src/command/cooldown/decorator.ts +0 -67
- package/src/command/cooldown/error.ts +0 -9
- package/src/command/cooldown/index.ts +0 -9
- package/src/command/cooldown/type.ts +0 -12
- package/src/command/decorator.ts +0 -185
- package/src/command/index.ts +0 -9
- package/src/command/utils.ts +0 -33
- package/src/constants.ts +0 -31
- package/src/error/ArgumentConverterNotFound.ts +0 -18
- package/src/error/ArgumentNotProvided.ts +0 -12
- package/src/error/CommandCheckFailed.ts +0 -19
- package/src/error/CommandNotFound.ts +0 -11
- package/src/error/InvalidTargetError.ts +0 -9
- package/src/error/ModuleError.ts +0 -11
- package/src/error/PermissionRequired.ts +0 -17
- package/src/error/checks/DMOnlyCommand.ts +0 -9
- package/src/error/checks/GuildOnlyCommand.ts +0 -9
- package/src/error/checks/OwnerOnlyCommand.ts +0 -9
- package/src/error/checks/SlashCommandGlobalCheckError.ts +0 -11
- package/src/error/checks/index.ts +0 -8
- package/src/error/index.ts +0 -12
- package/src/interface/index.ts +0 -7
- package/src/listener/Listener.ts +0 -7
- package/src/listener/decorator.ts +0 -29
- package/src/listener/index.ts +0 -6
- package/src/messageComponents/base.ts +0 -16
- package/src/messageComponents/button.ts +0 -30
- package/src/messageComponents/index.ts +0 -6
- package/src/messageComponents/selectMenu.ts +0 -30
- package/src/structures/CommandClient.ts +0 -103
- package/src/structures/Module.ts +0 -54
- package/src/structures/Registry.ts +0 -253
- package/src/structures/index.ts +0 -7
- package/src/typings.ts +0 -35
- package/src/utils.ts +0 -10
- package/test/config.example.json +0 -3
- package/test/modules/dev.ts +0 -44
- package/test/modules/test.ts +0 -148
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/home/pikokr/Desktop/Programming/command.ts/src/index.ts","../src/home/pikokr/Desktop/Programming/command.ts/src/constants.ts","../src/structures/home/pikokr/Desktop/Programming/command.ts/src/structures/Module.ts","../src/structures/home/pikokr/Desktop/Programming/command.ts/src/structures/CommandClient.ts","../src/structures/home/pikokr/Desktop/Programming/command.ts/src/structures/Registry.ts","../src/error/home/pikokr/Desktop/Programming/command.ts/src/error/InvalidTargetError.ts","../src/error/home/pikokr/Desktop/Programming/command.ts/src/error/ModuleError.ts","../src/error/home/pikokr/Desktop/Programming/command.ts/src/error/ArgumentNotProvided.ts","../src/error/home/pikokr/Desktop/Programming/command.ts/src/error/ArgumentConverterNotFound.ts","../src/error/home/pikokr/Desktop/Programming/command.ts/src/error/CommandCheckFailed.ts","../src/error/home/pikokr/Desktop/Programming/command.ts/src/error/PermissionRequired.ts","../src/error/checks/home/pikokr/Desktop/Programming/command.ts/src/error/checks/OwnerOnlyCommand.ts","../src/error/checks/home/pikokr/Desktop/Programming/command.ts/src/error/checks/GuildOnlyCommand.ts","../src/error/checks/home/pikokr/Desktop/Programming/command.ts/src/error/checks/DMOnlyCommand.ts","../src/error/checks/home/pikokr/Desktop/Programming/command.ts/src/error/checks/SlashCommandGlobalCheckError.ts","../src/error/home/pikokr/Desktop/Programming/command.ts/src/error/CommandNotFound.ts","../src/builtinModules/home/pikokr/Desktop/Programming/command.ts/src/builtinModules/BuiltInModule.ts","../src/listener/home/pikokr/Desktop/Programming/command.ts/src/listener/Listener.ts","../src/home/pikokr/Desktop/Programming/command.ts/src/utils.ts","../src/listener/home/pikokr/Desktop/Programming/command.ts/src/listener/decorator.ts","../src/builtinModules/home/pikokr/Desktop/Programming/command.ts/src/builtinModules/CommandHandler.ts","../src/command/home/pikokr/Desktop/Programming/command.ts/src/command/Command.ts","../src/command/home/pikokr/Desktop/Programming/command.ts/src/command/ArgumentConverter.ts","../src/command/home/pikokr/Desktop/Programming/command.ts/src/command/utils.ts","../src/command/home/pikokr/Desktop/Programming/command.ts/src/command/decorator.ts","../src/command/cooldown/home/pikokr/Desktop/Programming/command.ts/src/command/cooldown/type.ts","../src/command/cooldown/home/pikokr/Desktop/Programming/command.ts/src/command/cooldown/decorator.ts","../src/command/cooldown/home/pikokr/Desktop/Programming/command.ts/src/command/cooldown/error.ts","../src/command/cooldown/home/pikokr/Desktop/Programming/command.ts/src/command/cooldown/adapter.ts","../src/builtinModules/home/pikokr/Desktop/Programming/command.ts/src/builtinModules/BuiltinCommandConverters.ts","../src/builtinModules/home/pikokr/Desktop/Programming/command.ts/src/builtinModules/BuiltinApplicationCommandConverters.ts","../src/applicationCommand/home/pikokr/Desktop/Programming/command.ts/src/applicationCommand/decorator.ts","../src/applicationCommand/home/pikokr/Desktop/Programming/command.ts/src/applicationCommand/AppCommand.ts","../src/messageComponents/home/pikokr/Desktop/Programming/command.ts/src/messageComponents/base.ts","../src/messageComponents/home/pikokr/Desktop/Programming/command.ts/src/messageComponents/button.ts","../src/messageComponents/home/pikokr/Desktop/Programming/command.ts/src/messageComponents/selectMenu.ts"],"sourcesContent":["/*\n * Copyright (c) 2022 pikokr. Licensed under the MIT license\n */\n\nimport 'reflect-metadata'\nimport './typings'\n\nexport * from './interface'\nexport * from './structures'\nexport * from './error'\nexport * from './command'\nexport * from './listener'\nexport * from './builtinModules/BuiltInModule'\nexport * from './applicationCommand'\nexport * from './messageComponents'\nexport * from './error'\n","/*\n * Copyright (c) 2022 pikokr. Licensed under the MIT license\n */\n\nexport const KCommands = Symbol('Command.TS Commands')\n\nexport const KApplicationCommands = Symbol('Command.TS Slash Commands')\n\nexport const KSlashCommandOptions = Symbol('Command.TS Slash Command Options')\n\nexport const KListeners = Symbol('Command.TS Listeners')\n\nexport const KModulePath = Symbol('Command.TS Module Path')\n\nexport const KListenerExecuteCache = Symbol('Command.TS Module Identifier')\n\nexport const KBuiltInModule = Symbol('Command.TS Built-In Module')\n\nexport const KOptionals = Symbol('Command.TS Optional Parameters')\n\nexport const KRest = Symbol('Command.TS Rest Parameter')\n\nexport const KArgumentConverters = Symbol('Command.TS Argument Converter')\n\nexport const KSlashArgumentConverters = Symbol('Command.TS Slash Argument Converter')\n\nexport const KCommandChecks = Symbol('Command.TS Command Checks')\n\nexport const KApplicationCommandChecks = Symbol('Command.TS Slash Command Checks')\n\nexport const KMessageComponentHandlers = Symbol('Command.TS Message Component Handlers')\n","/*\n * Copyright (c) 2022 pikokr. Licensed under the MIT license\n */\n\nimport { KArgumentConverters, KCommands, KListeners, KMessageComponentHandlers, KModulePath, KSlashArgumentConverters, KApplicationCommands } from '../constants'\nimport type { Command } from '../command'\nimport { Listener } from '../listener'\nimport { ArgumentConverter, ApplicationCommandArgumentConverter } from '../command'\nimport { AppCommand } from '../applicationCommand'\nimport { CommandClient } from './CommandClient'\nimport { MessageComponentHandler } from '../messageComponents/base'\n\nexport abstract class Module {\n commandClient!: CommandClient\n\n get logger() {\n return this.commandClient.logger.getChildLogger({\n name: this.constructor.name,\n })\n }\n\n get commands(): Command[] {\n return Reflect.getMetadata(KCommands, this) || []\n }\n\n get listeners(): Listener[] {\n return Reflect.getMetadata(KListeners, this) || []\n }\n\n get argumentConverters(): ArgumentConverter[] {\n return Reflect.getMetadata(KArgumentConverters, this) || []\n }\n\n get applicationCommandArgumentConverters(): ApplicationCommandArgumentConverter[] {\n return Reflect.getMetadata(KSlashArgumentConverters, this) || []\n }\n\n get applicationCommands(): AppCommand[] {\n return Reflect.getMetadata(KApplicationCommands, this) || []\n }\n\n get messageComponentHandlers(): MessageComponentHandler[] {\n return Reflect.getMetadata(KMessageComponentHandlers, this) || []\n }\n\n get path(): string | undefined {\n return Reflect.getMetadata(KModulePath, this)\n }\n\n load() {}\n unload() {}\n beforeReload() {}\n afterReload() {}\n}\n","/*\n * Copyright (c) 2022 pikokr. Licensed under the MIT license\n */\n\nimport _ from 'lodash'\nimport { Registry } from './Registry'\nimport { Client, CommandInteraction, Interaction, Message, Snowflake, User } from 'discord.js'\nimport { BuiltinCommandConverters, BuiltinApplicationCommandConverters, CommandHandler } from '../builtinModules'\nimport { CoolDownAdapter, DefaultCoolDownAdapter } from '../command'\nimport { Logger } from 'tslog'\n\nexport interface CommandOptions {\n prefix: string | ((msg: any) => string | Promise<string | string[]> | string[]) | string[]\n check: (msg: Message) => boolean | Promise<boolean>\n}\n\nexport interface SlashCommandOptions {\n check: (i: CommandInteraction) => boolean | Promise<boolean>\n}\n\nexport interface ApplicationCommandOptions {\n guild?: Snowflake | Snowflake[]\n autoSync: boolean\n beforeRunCheck: (i: Interaction) => void | Promise<void>\n}\n\nexport interface CommandClientOptions {\n command: CommandOptions\n owners: 'auto' | Snowflake[]\n slashCommands: SlashCommandOptions\n applicationCommands: ApplicationCommandOptions\n}\n\nexport interface CommandClientOptionsParam {\n command: Partial<CommandOptions>\n owners: 'auto' | string[]\n slashCommands: Partial<SlashCommandOptions>\n applicationCommands: Partial<ApplicationCommandOptions>\n}\n\nexport class CommandClient {\n options: CommandClientOptions\n owners: string[] = []\n registry = new Registry(this)\n client: Client\n coolDownAdapter: CoolDownAdapter\n logger: Logger\n\n private _isReady = false\n\n private async fetchOwners(): Promise<string[]> {\n await this.client.application?.fetch()\n const o = this.client.application?.owner\n if (!o) return []\n if (o instanceof User) return [o.id]\n else return o.members.map((x) => x.id)\n }\n\n async ready() {\n if (this._isReady) return\n this._isReady = true\n if (this.options.owners === 'auto') {\n const owners = await this.fetchOwners()\n this.owners.push(...owners)\n }\n if (this.options.applicationCommands.autoSync) {\n await this.registry.syncCommands()\n }\n }\n\n constructor({ client, coolDownAdapter, logger, ...options }: Partial<CommandClientOptionsParam> & { client: Client; coolDownAdapter?: CoolDownAdapter; logger?: Logger }) {\n this.client = client\n this.coolDownAdapter = coolDownAdapter || new DefaultCoolDownAdapter()\n this.options = _.merge<CommandClientOptions, Partial<CommandClientOptionsParam>>(\n {\n command: {\n prefix: '!',\n check: () => true,\n },\n owners: 'auto',\n slashCommands: {\n check: () => true,\n },\n applicationCommands: {\n autoSync: false,\n beforeRunCheck: () => {},\n },\n },\n options,\n )\n\n this.logger = logger ?? new Logger({ name: 'Command.TS' })\n\n if (this.options.owners !== 'auto') {\n this.owners = this.options.owners\n }\n\n this.client.once('ready', () => this.ready())\n this.registry.registerModule(new CommandHandler(this.registry))\n this.registry.registerModule(new BuiltinCommandConverters(this))\n this.registry.registerModule(new BuiltinApplicationCommandConverters(this))\n }\n}\n","/*\n * Copyright (c) 2022 pikokr. Licensed under the MIT license\n */\n\nimport { CommandClient } from './CommandClient'\nimport { Module } from './Module'\nimport { Command, ApplicationCommandArgumentConverter } from '../command'\nimport { KBuiltInModule, KListenerExecuteCache, KModulePath } from '../constants'\nimport path from 'path'\nimport { InvalidModuleError, InvalidTargetError, ModuleLoadError } from '../error'\nimport { Collection, Guild } from 'discord.js'\nimport walkSync from 'walk-sync'\nimport { ArgumentConverter } from '../command'\nimport { AppCommand } from '../applicationCommand'\nimport * as fs from 'fs'\nimport { MessageComponentHandler } from '../messageComponents/base'\n\ntype ListenerExecutor = {\n event: string\n execute: any\n}\n\nexport class Registry {\n constructor(public client: CommandClient) {}\n\n modules: Collection<symbol, Module> = new Collection()\n\n private get logger() {\n return this.client.logger.getChildLogger({\n name: 'Registry',\n })\n }\n\n get commands(): Command[] {\n const result: Command[] = []\n\n for (const [, module] of this.modules) {\n result.push(...module.commands)\n }\n\n return result\n }\n\n get argumentConverters(): ArgumentConverter[] {\n const result: ArgumentConverter[] = []\n\n for (const [, module] of this.modules) {\n result.push(...module.argumentConverters)\n }\n\n return result\n }\n\n get applicationCommandArgumentConverters(): ApplicationCommandArgumentConverter[] {\n const result: ApplicationCommandArgumentConverter[] = []\n\n for (const [, module] of this.modules) {\n result.push(...module.applicationCommandArgumentConverters)\n }\n\n return result\n }\n\n get applicationCommands(): AppCommand[] {\n const result: AppCommand[] = []\n\n for (const [, module] of this.modules) {\n result.push(...module.applicationCommands)\n }\n\n return result\n }\n\n get messageComponentHandlers(): MessageComponentHandler[] {\n const result: MessageComponentHandler[] = []\n\n for (const [, module] of this.modules) {\n result.push(...module.messageComponentHandlers)\n }\n\n return result\n }\n\n registerModule(module: Module) {\n module.commandClient = this.client\n\n this.modules.set(Symbol(module.constructor.name), module)\n\n const list: ListenerExecutor[] = []\n\n for (const listener of module.listeners) {\n const bound = listener.execute.bind(module)\n list.push({ event: listener.name, execute: bound })\n this.client.client.on(listener.name, bound)\n }\n\n Reflect.defineMetadata(KListenerExecuteCache, list, module)\n\n return module\n }\n\n async loadModulesIn(dir: string, absolute = false) {\n let p = absolute ? dir : path.join(require.main!.path, dir)\n\n for (const i of walkSync(p)) {\n if (fs.lstatSync(path.join(p, i)).isFile()) {\n if (i.endsWith('.map')) continue\n await this.loadModule(path.join(p, i), true)\n }\n }\n }\n\n async loadModule(file: string, absolute: boolean = false) {\n let p = absolute ? file : path.join(require.main!.path, file)\n\n let m\n\n try {\n m = require(p)\n } catch (e: any) {\n throw new ModuleLoadError(p, e)\n }\n\n if (m.loaded) throw new Error('MODULE_ALREADY_LOADED')\n\n if (!m.install) throw new InvalidModuleError('Install function not found.')\n\n const mod = m.install(this.client)\n\n if (!(mod instanceof Module)) throw new InvalidTargetError()\n\n Reflect.defineMetadata(KModulePath, require.resolve(p), mod)\n\n this.registerModule(mod)\n\n await mod.load()\n\n m.loaded = true\n\n return mod\n }\n\n async syncCommands() {\n this.logger.debug(`Syncing commands...`)\n const commands = this.applicationCommands.filter((x) => !x.guild)\n const guild = this.client.options.applicationCommands.guild\n const syncForGuild = async (g: Guild, commands: AppCommand[]) => {\n this.logger.debug(`Syncing for guild ${g.name}(${g.id})`)\n const commandsToRegister = commands.map((x) => x.command)\n this.logger.debug(`Command List: ${commandsToRegister.map((x) => x.name).join(', ')}`)\n await g.commands.set(commandsToRegister)\n }\n const commandsWithGuild = this.applicationCommands.filter((x) => !!x.guild)\n\n if (guild) {\n if (typeof guild === 'string') {\n await syncForGuild(await this.client.client.guilds.fetch(guild), [\n ...commands,\n ...commandsWithGuild.filter((x) => x.guild && (typeof x.guild === 'string' ? guild === x.guild : x.guild.includes(guild))),\n ])\n } else {\n for (const g of guild) {\n await syncForGuild(await this.client.client.guilds.fetch(g), [\n ...commands,\n ...commandsWithGuild.filter((x) => x.guild && (typeof x.guild === 'string' ? g === x.guild : x.guild.includes(g))),\n ])\n }\n }\n } else {\n this.logger.debug('Syncing global...')\n await this.client.client.application?.commands.set(commands.map((x) => x.command))\n }\n\n const guilds = new Set<string>()\n\n for (const command of commandsWithGuild) {\n if (!command.guild) continue\n if (typeof command.guild === 'string') {\n guilds.add(command.guild)\n } else {\n for (const guild of command.guild) {\n guilds.add(guild)\n }\n }\n }\n\n for (const guild of guilds) {\n if (this.client.options.applicationCommands.guild?.includes(guild)) continue\n await syncForGuild(\n await this.client.client.guilds.fetch(guild),\n commandsWithGuild.filter((x) => x.guild && (typeof x.guild === 'string' ? guild === x.guild : x.guild.includes(guild))),\n )\n }\n\n this.logger.debug('Syncing ended.')\n }\n\n async unregisterModule(module: Module) {\n if (Reflect.getMetadata(KBuiltInModule, module)) throw new Error('Built-in modules cannot be unloaded')\n const symbol = this.modules.findKey((x) => x === module)\n if (!symbol) return module\n await module.unload()\n const list: ListenerExecutor[] = Reflect.getMetadata(KListenerExecuteCache, module)\n for (const listener of list) {\n this.client.client.removeListener(listener.event, listener.execute)\n }\n this.modules.delete(symbol)\n return module\n }\n\n async unloadModule(module: Module) {\n const p = Reflect.getMetadata(KModulePath, module)\n\n if (!p) throw new InvalidModuleError('This module is not loaded by loadModule.')\n\n await this.unregisterModule(module)\n delete require.cache[p]\n }\n\n async reloadModule(module: Module) {\n await module.beforeReload()\n const p = Reflect.getMetadata(KModulePath, module)\n await this.unloadModule(module)\n const mod = await this.loadModule(p, true)\n await mod.afterReload()\n return true\n }\n\n async reloadAll() {\n const results: {\n path: string\n success: boolean\n error?: Error\n }[] = []\n\n for (const [, module] of this.modules.filter((x) => !!x.path && !Reflect.getMetadata(KBuiltInModule, x))) {\n try {\n await this.reloadModule(module)\n results.push({\n path: module.path!,\n success: true,\n })\n } catch (e: any) {\n results.push({\n error: e,\n path: module.path!,\n success: false,\n })\n }\n }\n return results\n }\n}\n","/*\n * Copyright (c) 2022 pikokr. Licensed under the MIT license\n */\n\nexport class InvalidTargetError extends Error {\n constructor() {\n super('Class does not extend \"Module\" class.')\n }\n}\n","/*\n * Copyright (c) 2022 pikokr. Licensed under the MIT license\n */\n\nexport class ModuleLoadError extends Error {\n constructor(file: string, public error: Error) {\n super('Failed to load module ' + file)\n }\n}\n\nexport class InvalidModuleError extends Error {}\n","/*\n * Copyright (c) 2022 pikokr. Licensed under the MIT license\n */\n\nimport { Message } from 'discord.js'\nimport { Command } from '../command'\n\nexport class ArgumentNotProvided extends Error {\n constructor(public index: number, public command: Command, public msg: Message) {\n super(`Required argument #${index} not provided.`)\n }\n}\n","/*\n * Copyright (c) 2022 pikokr. Licensed under the MIT license\n */\n\nimport { CommandInteraction, ContextMenuInteraction, Message } from 'discord.js'\nimport type { Argument } from '../command'\nimport type { AppCommandArgument } from '../applicationCommand'\n\nexport class ArgumentConverterNotFound extends Error {\n constructor(public type: Argument, public msg: Message) {\n super(`Argument converter ${type.type.name} not found.`)\n }\n}\nexport class ApplicationCommandArgumentConverterNotFound extends Error {\n constructor(public type: AppCommandArgument, public interaction: CommandInteraction | ContextMenuInteraction) {\n super(`Argument converter ${type.type.name} not found.`)\n }\n}\n","/*\n * Copyright (c) 2022 pikokr. Licensed under the MIT license\n */\n\nimport { CommandInteraction, ContextMenuInteraction, Message, MessageComponentInteraction } from 'discord.js'\nimport { Command } from '../command'\nimport { AppCommand } from '../applicationCommand'\n\nexport class CommandCheckFailed extends Error {\n constructor(public msg: Message, public command: Command) {\n super()\n }\n}\n\nexport class ApplicationCommandCheckFailed extends Error {\n constructor(public interaction: CommandInteraction | MessageComponentInteraction | ContextMenuInteraction, public command: AppCommand) {\n super()\n }\n}\n","/*\n * Copyright (c) 2022 pikokr. Licensed under the MIT license\n */\n\nimport { GuildMember, Permissions } from 'discord.js'\n\nexport class UserPermissionRequired extends Error {\n constructor(public user: GuildMember, public permissions: Permissions) {\n super()\n }\n}\n\nexport class ClientPermissionRequired extends Error {\n constructor(public permissions: Permissions) {\n super()\n }\n}\n","/*\n * Copyright (c) 2022 pikokr. Licensed under the MIT license\n */\n\nexport class OwnerOnlyCommandError extends Error {\n constructor() {\n super()\n }\n}\n","/*\n * Copyright (c) 2022 pikokr. Licensed under the MIT license\n */\n\nexport class GuildOnlyCommandError extends Error {\n constructor() {\n super()\n }\n}\n","/*\n * Copyright (c) 2022 pikokr. Licensed under the MIT license\n */\n\nexport class DMOnlyCommandError extends Error {\n constructor() {\n super()\n }\n}\n","/*\n * Copyright (c) 2022 pikokr. Licensed under the MIT license\n */\n\nimport { CommandInteraction } from 'discord.js'\n\nexport class SlashCommandGlobalCheckError extends Error {\n constructor(public i: CommandInteraction) {\n super('Slash command before-run check failed.')\n }\n}\n","/*\n * Copyright (c) 2022 pikokr. Licensed under the MIT license\n */\n\nimport { Message } from 'discord.js'\n\nexport class CommandNotFound extends Error {\n constructor(public commandName: string, public msg: Message, public args: string[]) {\n super(`Command ${commandName} not found.`)\n }\n}\n","/*\n * Copyright (c) 2022 pikokr. Licensed under the MIT license\n */\n\nimport { Module } from '../structures'\nimport { KBuiltInModule } from '../constants'\n\nexport class BuiltInModule extends Module {\n constructor() {\n super()\n Reflect.defineMetadata(KBuiltInModule, true, this)\n }\n}\n","/*\n * Copyright (c) 2022 pikokr. Licensed under the MIT license\n */\n\nexport class Listener {\n constructor(public name: string, public execute: Function) {}\n}\n","/*\n * Copyright (c) 2022 pikokr. Licensed under the MIT license\n */\n\nimport { Module } from './structures'\nimport { InvalidTargetError } from './error'\n\nexport const checkTarget = (target: Object) => {\n if (!(target instanceof Module)) throw new InvalidTargetError()\n}\n","/*\n * Copyright (c) 2022 pikokr. Licensed under the MIT license\n */\n\nimport { checkTarget } from '../utils'\nimport { KListeners } from '../constants'\nimport { Listener } from './Listener'\nimport { Module } from '../structures'\n\nexport const listener = (event: string) => {\n return (\n target: Module,\n propertyKey: string,\n // descriptor: TypedPropertyDescriptor<any>,\n ) => {\n checkTarget(target)\n\n let properties: Listener[] = Reflect.getMetadata(KListeners, target)\n\n const listener = new Listener(event, Reflect.get(target, propertyKey))\n\n if (properties) {\n properties.push(listener)\n } else {\n properties = [listener]\n Reflect.defineMetadata(KListeners, properties, target)\n }\n }\n}\n","/*\n * Copyright (c) 2022 pikokr. Licensed under the MIT license\n */\n\nimport { BuiltInModule } from './BuiltInModule'\nimport { Registry } from '../structures'\nimport { listener } from '../listener'\nimport {\n CommandInteraction,\n CommandInteractionOptionResolver,\n GuildMember,\n Interaction,\n Message,\n MessageComponentInteraction,\n MessageContextMenuInteraction,\n Role,\n User,\n UserContextMenuInteraction,\n} from 'discord.js'\nimport { CommandClient } from '../structures'\nimport { Command } from '../command'\nimport { ArgumentConverterNotFound, ArgumentNotProvided, CommandCheckFailed, ApplicationCommandArgumentConverterNotFound, ApplicationCommandCheckFailed } from '../error'\nimport { CommandNotFound } from '../error/CommandNotFound'\nimport { SlashCommandGlobalCheckError } from '../error/checks/SlashCommandGlobalCheckError'\nimport { MessageComponentHandler } from '../messageComponents/base'\n\nexport class CommandHandler extends BuiltInModule {\n private readonly client: CommandClient\n\n constructor(private registry: Registry) {\n super()\n this.client = registry.client\n }\n\n // region message command handler\n @listener('messageCreate')\n async message(msg: Message) {\n const error = (error: Error) => this.client.client.emit('commandError', error, msg)\n\n try {\n const prefixList: string[] | string =\n typeof this.client.options.command.prefix === 'string'\n ? this.client.options.command.prefix\n : typeof this.client.options.command.prefix === 'function'\n ? await this.client.options.command.prefix(msg)\n : this.client.options.command.prefix\n let prefix: string\n if (typeof prefixList === 'object') {\n const res = prefixList.find((x) => msg.content.includes(x))\n\n if (!res) return\n\n prefix = res\n } else {\n if (!msg.content.includes(prefixList)) return\n prefix = prefixList\n }\n\n if (!msg.content.startsWith(prefix)) return\n\n const args = msg.content.slice(prefix.length).split(' ')\n\n const command = args.shift()\n\n if (!command) return\n\n let cmd: Command | null = null\n\n for (const c of this.registry.commands) {\n const aliases = typeof c.aliases === 'function' ? await c.aliases(msg) : c.aliases\n if ([...aliases, c.name].some((x) => x === command)) {\n cmd = c\n break\n }\n }\n\n msg.data = {\n cts: this.client,\n command: cmd,\n prefix: prefix,\n }\n\n if (!(await this.client.options.command.check(msg))) {\n return\n }\n\n if (!cmd) return error(new CommandNotFound(command, msg, args))\n\n const module = this.registry.modules.find((x) => x.commands.includes(cmd!))\n\n if (!module) return\n\n const argList: any[] = []\n\n for (const check of cmd.checks) {\n if (!(await check(msg))) return error(new CommandCheckFailed(msg, cmd))\n }\n\n for (let i = 0; i < cmd.argTypes.length; i++) {\n const argType = cmd.argTypes[i]\n const converter = this.registry.argumentConverters.find((x) => x.type === argType.type)\n\n if (argType.rest) {\n const i = args.join(' ')\n argList.push(i)\n break\n }\n\n if (!converter) return error(new ArgumentConverterNotFound(argType, msg))\n\n const converterModule = this.registry.modules.find((x) => x.argumentConverters.includes(converter))\n\n if (!converterModule) return error(new ArgumentConverterNotFound(argType, msg))\n\n if (converter.withoutParameter) {\n argList.push(await converter.execute(converterModule, msg))\n continue\n }\n const arg = args.shift()\n if (argType.optional && !arg) {\n break\n }\n if (!arg) {\n return error(new ArgumentNotProvided(i, cmd, msg))\n }\n const executed = await converter.execute(converterModule, msg, arg)\n if ((executed === undefined || executed === null) && !argType.optional) {\n return error(new ArgumentNotProvided(i, cmd, msg))\n }\n argList.push(executed)\n }\n\n try {\n await cmd.execute(module, argList)\n } catch (e: any) {\n return error(e)\n }\n } catch (e: any) {\n return error(e)\n }\n }\n // endregion\n\n // region slash command handler\n private async command(i: CommandInteraction) {\n const error = (error: Error) => this.client.client.emit('applicationCommandError', error, i)\n try {\n const cmd = this.registry.applicationCommands.find((x) => x.command.type === 'CHAT_INPUT' && x.command.name === i.commandName)\n\n if (!cmd) return\n\n const module = this.registry.modules.find((x) => x.applicationCommands.includes(cmd))\n\n if (!module) return\n\n const argList: any[] = []\n\n i.data = {\n cts: this.client,\n command: cmd,\n }\n\n if (!(await this.client.options.slashCommands.check(i))) {\n return error(new SlashCommandGlobalCheckError(i))\n }\n for (const check of cmd.checks) {\n if (!(await check(i))) return error(new ApplicationCommandCheckFailed(i, cmd))\n }\n\n for (let j = 0; j < cmd.params.length; j++) {\n const argType = cmd.params[j]\n const converter = this.registry.applicationCommandArgumentConverters.find((x) => x.type === argType.type)\n\n if (argType.type === CommandInteraction) {\n argList.push(i)\n continue\n }\n\n if (argType.type === CommandInteractionOptionResolver) {\n argList.push(i.options)\n continue\n }\n\n if (argType.name) {\n switch (argType.type) {\n case String:\n argList.push(i.options.getString(argType.name, false) || undefined)\n break\n case Role:\n argList.push(i.options.getRole(argType.name, false) || undefined)\n break\n case User:\n argList.push(i.options.getUser(argType.name, false) || undefined)\n break\n case GuildMember:\n argList.push(i.options.getMember(argType.name, false) || undefined)\n break\n case Boolean:\n argList.push(i.options.getBoolean(argType.name, false) || undefined)\n break\n case Number:\n const opt = i.options.get(argType.name, false)\n if (!opt) {\n argList.push(undefined)\n break\n }\n if (opt.type == 'NUMBER') {\n argList.push(i.options.getNumber(argType.name, false) ?? undefined)\n break\n }\n if (opt.type == 'INTEGER') {\n argList.push(i.options.getInteger(argType.name, false) ?? undefined)\n break\n }\n }\n continue\n }\n\n if (!converter) return error(new ApplicationCommandArgumentConverterNotFound(argType, i))\n\n argList.push(await converter.execute(module, i))\n }\n\n await cmd.execute(module, argList)\n } catch (e: any) {\n return error(e)\n }\n }\n // endregion\n\n private async messageComponent(i: MessageComponentInteraction) {\n const error = (e: any) => this.client.client.emit('messageComponentError', e)\n\n try {\n const handlers: MessageComponentHandler[] = []\n\n for (const handler of this.registry.messageComponentHandlers) {\n if (handler.componentId === handler.componentId && handler.componentType === i.componentType) {\n handlers.push(handler)\n }\n }\n\n for (const handler of handlers) {\n const module = this.registry.modules.find((x) => x.messageComponentHandlers.includes(handler))\n if (!module) continue\n await handler.run(module, i)\n }\n } catch (e) {\n error(e)\n }\n }\n\n private async userContextMenu(i: UserContextMenuInteraction) {\n const error = (error: Error) => this.client.client.emit('applicationCommandError', error, i)\n try {\n const cmd = this.registry.applicationCommands.find((x) => x.command.type === 'USER' && x.command.name === i.commandName)\n\n if (!cmd) return\n\n const module = this.registry.modules.find((x) => x.applicationCommands.includes(cmd))\n\n if (!module) return\n\n i.data = {\n cts: this.client,\n command: cmd,\n }\n\n for (const check of cmd.checks) {\n if (!(await check(i))) return error(new ApplicationCommandCheckFailed(i, cmd))\n }\n\n let argList: any[] = []\n\n for (let j = 0; j < cmd.params.length; j++) {\n const argType = cmd.params[j]\n const converter = this.registry.applicationCommandArgumentConverters.find((x) => x.type === argType.type)\n\n if (argType.type === UserContextMenuInteraction) {\n argList.push(i)\n continue\n }\n\n if (!converter) return error(new ApplicationCommandArgumentConverterNotFound(argType, i))\n\n argList.push(await converter.execute(module, i))\n }\n\n await cmd.execute(module, argList)\n } catch (e: any) {\n return error(e)\n }\n }\n\n private async messageContextMenu(i: MessageContextMenuInteraction) {\n const error = (error: Error) => this.client.client.emit('applicationCommandError', error, i)\n try {\n const cmd = this.registry.applicationCommands.find((x) => x.command.type === 'MESSAGE' && x.command.name === i.commandName)\n\n if (!cmd) return\n\n const module = this.registry.modules.find((x) => x.applicationCommands.includes(cmd))\n\n if (!module) return\n\n i.data = {\n cts: this.client,\n command: cmd,\n }\n\n for (const check of cmd.checks) {\n if (!(await check(i))) return error(new ApplicationCommandCheckFailed(i, cmd))\n }\n\n let argList: any[] = []\n\n for (let j = 0; j < cmd.params.length; j++) {\n const argType = cmd.params[j]\n const converter = this.registry.applicationCommandArgumentConverters.find((x) => x.type === argType.type)\n\n if (argType.type === MessageContextMenuInteraction) {\n argList.push(i)\n continue\n }\n\n if (!converter) return error(new ApplicationCommandArgumentConverterNotFound(argType, i))\n\n argList.push(await converter.execute(module, i))\n }\n\n await cmd.execute(module, argList)\n } catch (e: any) {\n return error(e)\n }\n }\n\n @listener('interactionCreate')\n async interaction(i: Interaction) {\n const error = (e: any) => this.client.client.emit('interactionError', e, i)\n\n try {\n await this.client.options.applicationCommands.beforeRunCheck(i)\n if (i.isCommand()) {\n await this.command(i)\n return\n }\n if (i.isMessageComponent()) {\n await this.messageComponent(i)\n return\n }\n if (i.isMessageContextMenu()) {\n await this.messageContextMenu(i)\n return\n }\n if (i.isUserContextMenu()) {\n await this.userContextMenu(i)\n return\n }\n } catch (e) {\n return error(e)\n }\n }\n}\n","/*\n * Copyright (c) 2022 pikokr. Licensed under the MIT license\n */\n\nimport { Module } from '../structures'\nimport { CommandInteraction, ContextMenuInteraction, Message, MessageComponentInteraction } from 'discord.js'\nimport { KCommandChecks } from '../constants'\n\nexport type Argument = {\n optional: boolean\n type: any\n rest: boolean\n}\n\nexport type CheckFunction = (msg: Message) => boolean | Promise<boolean>\nexport type ApplicationCommandCheckFunction = (i: CommandInteraction | MessageComponentInteraction | ContextMenuInteraction) => boolean | Promise<boolean>\n\nexport class Command {\n execute(module: Module, args: any[]) {\n return this.run.apply(module, args)\n }\n\n get checks(): CheckFunction[] {\n return Reflect.getMetadata(KCommandChecks, this.module, this.key) || []\n }\n\n constructor(\n private run: Function,\n public argTypes: Argument[],\n public name: string,\n public aliases: string[] | ((msg: Message) => string[] | Promise<string[]>),\n public module: Module,\n public key: symbol | string,\n ) {}\n}\n","/*\n * Copyright (c) 2022 pikokr. Licensed under the MIT license\n */\n\nimport { Module } from '../structures'\nimport { CommandInteraction, ContextMenuInteraction, Message } from 'discord.js'\n\nexport class ArgumentConverter {\n execute(module: Module, msg: Message, arg?: string) {\n return this.run.apply(module, [msg, arg])\n }\n\n constructor(public type: object, private run: Function, public withoutParameter: boolean) {}\n}\n\nexport class ApplicationCommandArgumentConverter {\n execute(module: Module, interaction: CommandInteraction | ContextMenuInteraction) {\n return this.run.apply(module, [interaction])\n }\n\n constructor(public type: object, private run: Function) {}\n}\n","/*\n * Copyright (c) 2022 pikokr. Licensed under the MIT license\n */\n\nimport { CommandInteraction, ContextMenuInteraction, Message, MessageComponentInteraction } from 'discord.js'\nimport type { CheckFunction, ApplicationCommandCheckFunction } from './Command'\nimport { KCommandChecks, KApplicationCommandChecks } from '../constants'\n\nexport const createCheckDecorator = (\n execute: ((msg: Message) => boolean | Promise<boolean>) | null,\n executeApplicationCommand?: (i: CommandInteraction | MessageComponentInteraction | ContextMenuInteraction) => boolean | Promise<boolean>,\n): MethodDecorator => {\n return (target, propertyKey) => {\n if (execute) {\n let properties: CheckFunction[] = Reflect.getMetadata(KCommandChecks, target, propertyKey)\n if (properties) {\n properties.push(execute)\n } else {\n properties = [execute]\n Reflect.defineMetadata(KCommandChecks, properties, target, propertyKey)\n }\n }\n if (executeApplicationCommand) {\n let properties: ApplicationCommandCheckFunction[] = Reflect.getMetadata(KApplicationCommandChecks, target, propertyKey)\n if (properties) {\n properties.push(executeApplicationCommand)\n } else {\n properties = [executeApplicationCommand]\n Reflect.defineMetadata(KApplicationCommandChecks, properties, target, propertyKey)\n }\n }\n }\n}\n","/*\n * Copyright (c) 2022 pikokr. Licensed under the MIT license\n */\n\nimport { KArgumentConverters, KCommands, KOptionals, KRest, KSlashArgumentConverters } from '../constants'\nimport { Command } from './Command'\nimport { checkTarget } from '../utils'\nimport { ArgumentConverter, ApplicationCommandArgumentConverter } from './ArgumentConverter'\nimport { Module } from '../structures'\nimport { createCheckDecorator } from './utils'\nimport { GuildMember, Message, PermissionResolvable, Permissions, TextChannel } from 'discord.js'\nimport { ClientPermissionRequired, DMOnlyCommandError, GuildOnlyCommandError, OwnerOnlyCommandError, UserPermissionRequired } from '../error'\n\ntype CommandOptions = {\n name: string\n aliases: string[] | ((msg: Message) => string[])\n optionTypes?: any[]\n}\n\nexport const command = (options: Partial<CommandOptions> = {}) => {\n return (\n target: Object,\n propertyKey: string,\n // descriptor: TypedPropertyDescriptor<any>,\n ) => {\n checkTarget(target)\n\n let properties: Command[] = Reflect.getMetadata(KCommands, target)\n\n const params: any[] = options.optionTypes ?? Reflect.getMetadata('design:paramtypes', target, propertyKey)\n\n const optionals: number = Reflect.getMetadata(KOptionals, target, propertyKey) || -1\n\n const rest = Reflect.getMetadata(KRest, target, propertyKey) || -1\n\n const command = new Command(\n Reflect.get(target, propertyKey),\n params.map((x, i) => ({\n type: x,\n optional: optionals === -1 ? false : optionals <= i,\n rest: rest === -1 ? false : rest === i,\n })),\n options.name || propertyKey,\n options.aliases || [],\n target as Module,\n propertyKey,\n )\n\n if (properties) {\n properties.push(command)\n } else {\n properties = [command]\n Reflect.defineMetadata(KCommands, properties, target)\n }\n }\n}\n\nexport const argumentConverter = (type: object, requireParameter = true) => {\n return (\n target: Object,\n propertyKey: string,\n // descriptor: TypedPropertyDescriptor<any>,\n ) => {\n checkTarget(target)\n\n let properties: ArgumentConverter[] = Reflect.getMetadata(KArgumentConverters, target)\n\n const converter = new ArgumentConverter(type, Reflect.get(target, propertyKey), !requireParameter)\n\n if (properties) {\n properties.push(converter)\n } else {\n properties = [converter]\n Reflect.defineMetadata(KArgumentConverters, properties, target)\n }\n }\n}\n\nexport const applicationCommandArgumentConverter = (type: object) => {\n return (\n target: Object,\n propertyKey: string,\n // descriptor: TypedPropertyDescriptor<any>,\n ) => {\n checkTarget(target)\n\n let properties: ApplicationCommandArgumentConverter[] = Reflect.getMetadata(KSlashArgumentConverters, target)\n\n const converter = new ApplicationCommandArgumentConverter(type, Reflect.get(target, propertyKey))\n\n if (properties) {\n properties.push(converter)\n } else {\n properties = [converter]\n Reflect.defineMetadata(KSlashArgumentConverters, properties, target)\n }\n }\n}\n\nexport const optional: ParameterDecorator = (target, propertyKey, parameterIndex) => {\n checkTarget(target)\n\n Reflect.defineMetadata(KOptionals, parameterIndex, target, propertyKey)\n}\n\nexport const rest: ParameterDecorator = (target, propertyKey, parameterIndex) => {\n checkTarget(target)\n\n const params: any[] = Reflect.getMetadata('design:paramtypes', target, propertyKey)\n\n if (params.length - 1 !== parameterIndex) throw new Error('Rest decorator must be used at last argument.')\n\n if (params[parameterIndex] !== String) throw new Error('Rest argument type must be \"String\"')\n\n Reflect.defineMetadata(KRest, parameterIndex, target, propertyKey)\n}\n\nexport const ownerOnly = createCheckDecorator(\n (msg) => {\n if (msg.data.cts.owners.includes(msg.author.id)) return true\n throw new OwnerOnlyCommandError()\n },\n (i) => {\n if (i.data.cts.owners.includes(i.user.id)) return true\n throw new OwnerOnlyCommandError()\n },\n)\n\nexport const guildOnly = createCheckDecorator(\n (msg) => {\n if (!!msg.guild) return true\n throw new GuildOnlyCommandError()\n },\n (i) => {\n if (!!i.guildId) return true\n throw new GuildOnlyCommandError()\n },\n)\n\nexport const dmOnly = createCheckDecorator(\n (msg) => {\n if (!msg.guild) return true\n throw new DMOnlyCommandError()\n },\n (i) => {\n if (!i.guildId) return true\n throw new DMOnlyCommandError()\n },\n)\n\nexport const requireUserPermissions = (permission: PermissionResolvable) =>\n createCheckDecorator(\n (msg) => {\n if (!msg.guild || !msg.member) throw new Error('This command must be used in guild.')\n if (msg.member.permissionsIn(msg.channel as TextChannel).has(permission)) {\n return true\n }\n throw new UserPermissionRequired(msg.member, new Permissions(permission))\n },\n (i) => {\n if (!i.guild || !i.member) throw new Error('This command must be used in guild.')\n if (!(i.member instanceof GuildMember) || i.member.permissionsIn(i.channel as TextChannel).has(permission)) {\n return true\n }\n throw new UserPermissionRequired(i.member, new Permissions(permission))\n },\n )\n\nexport const requireClientPermissions = (permission: PermissionResolvable) =>\n createCheckDecorator(\n (msg) => {\n if (!msg.guild) throw new Error('This command must be used in guild.')\n if (msg.guild.me!.permissionsIn(msg.channel as TextChannel).has(permission)) {\n return true\n }\n throw new ClientPermissionRequired(new Permissions(permission))\n },\n (i) => {\n if (!i.guild) throw new Error('This command must be used in guild.')\n if (i.guild.me!.permissionsIn(i.channel as TextChannel).has(permission)) {\n return true\n }\n throw new ClientPermissionRequired(new Permissions(permission))\n },\n )\n","/*\n * Copyright (c) 2022 pikokr. Licensed under the MIT license\n */\n\nexport enum CoolDownType {\n USER,\n CHANNEL,\n GUILD,\n ROLE,\n CATEGORY,\n MEMBER,\n}\n","/*\n * Copyright (c) 2022 pikokr. Licensed under the MIT license\n */\n\nimport { createCheckDecorator } from '../utils'\nimport { CoolDownType } from './type'\nimport { DMChannel, GuildMember, TextChannel } from 'discord.js'\nimport { CoolDownError } from './error'\n\nexport const coolDown = (type: CoolDownType, seconds: number) =>\n createCheckDecorator(\n async (msg) => {\n const a = msg.data.cts.coolDownAdapter\n const getKey = (): string => {\n switch (type) {\n case CoolDownType.USER:\n return msg.author.id\n case CoolDownType.GUILD:\n return (msg.guild || msg.author).id\n case CoolDownType.CHANNEL:\n return msg.channel.id\n case CoolDownType.MEMBER:\n return `${msg.guild?.id}.${msg.author.id}`\n case CoolDownType.ROLE:\n return (msg.channel instanceof DMChannel ? msg.channel : msg.member!.roles.highest).id\n case CoolDownType.CATEGORY:\n return ((msg.channel as TextChannel).parent || msg.channel).id\n }\n }\n const key = getKey() + '-command-' + msg.data.command?.name\n const data = await a.get(key)\n const now = Date.now()\n if (!data || !(now - data < seconds * 1000)) {\n await a.set(key, now)\n return true\n }\n throw new CoolDownError(new Date(data + seconds * 1000))\n },\n async (i) => {\n if (i.isMessageComponent()) return true\n const a = i.data.cts.coolDownAdapter\n const getKey = (): string => {\n switch (type) {\n case CoolDownType.USER:\n return i.user.id + '.user'\n case CoolDownType.GUILD:\n return (i.guild || i.user).id + '.guild'\n case CoolDownType.CHANNEL:\n return i.channel!.id + '.channel'\n case CoolDownType.MEMBER:\n return `${i.guild?.id}.${i.user.id}`\n case CoolDownType.ROLE:\n return (i.channel instanceof DMChannel ? i.channel : (i.member as GuildMember)!.roles.highest).id + '.role'\n case CoolDownType.CATEGORY:\n return ((i.channel as TextChannel).parent || i.channel!).id + '.category'\n }\n }\n const key = getKey() + '-appCommand-' + i.commandName\n const data = await a.get(key)\n const now = Date.now()\n if (!data || !(now - data < seconds * 1000)) {\n await a.set(key, now)\n return true\n }\n throw new CoolDownError(new Date(data + seconds * 1000))\n },\n )\n","/*\n * Copyright (c) 2022 pikokr. Licensed under the MIT license\n */\n\nexport class CoolDownError extends Error {\n constructor(public endsAt: Date) {\n super()\n }\n}\n","/*\n * Copyright (c) 2022 pikokr. Licensed under the MIT license\n */\n\nimport { Collection } from 'discord.js'\n\nexport interface CoolDownAdapter {\n get(id: string): Promise<number | undefined>\n set(id: string, value: number): Promise<void>\n}\n\nexport class DefaultCoolDownAdapter implements CoolDownAdapter {\n map = new Collection<string, number>()\n async get(id: string): Promise<number | undefined> {\n return this.map.get(id)\n }\n\n async set(id: string, value: number) {\n this.map.set(id, value)\n return\n }\n}\n","/*\n * Copyright (c) 2022 pikokr. Licensed under the MIT license\n */\n\nimport { BuiltInModule } from './BuiltInModule'\nimport { argumentConverter } from '../command'\nimport { Client, GuildMember, Message, User, Role } from 'discord.js'\nimport { CommandClient } from '../structures'\n\nexport class BuiltinCommandConverters extends BuiltInModule {\n client: Client\n\n constructor(private cts: CommandClient) {\n super()\n this.client = cts.client\n }\n\n @argumentConverter(Message, false)\n message(msg: Message) {\n return msg\n }\n\n @argumentConverter(String)\n string(msg: Message, arg: string) {\n return arg\n }\n\n getUserIDByMention(mention: string): `${bigint}` | undefined {\n if (!mention) return\n if (mention.startsWith('<@') && mention.endsWith('>')) {\n mention = mention.slice(2, -1)\n if (mention.startsWith('!')) {\n mention = mention.slice(1)\n }\n return mention as `${bigint}`\n }\n }\n\n @argumentConverter(User)\n user(msg: Message, value: string): User | null {\n let user = this.client.users.cache.get(value)\n if (user) return user\n user = this.client.users.cache.find((x) => x.tag === value || x.username === value)\n if (user) return user\n const id = this.getUserIDByMention(value)\n if (!id) return null\n user = this.client.users.cache.get(id)\n return user || null\n }\n\n @argumentConverter(GuildMember)\n member(msg: Message, value: string): GuildMember | undefined {\n let user = msg.guild?.members.cache.get(value)\n if (!user) return user\n user = msg.guild?.members.cache.find((x) => x.user.tag === value)\n if (user) return user\n const id = this.getUserIDByMention(value)\n if (!id) return\n user = msg.guild?.members.cache.get(id)\n return user || undefined\n }\n\n @argumentConverter(Number)\n number(msg: Message, value: string) {\n const n = Number(value)\n return isNaN(n) ? undefined : n\n }\n\n getRoleIDByMention(mention: string): `${bigint}` | undefined {\n if (!mention) return\n if (mention.startsWith('<@') && mention.endsWith('>')) {\n mention = mention.slice(2, -1)\n if (mention.startsWith('&')) {\n mention = mention.slice(1)\n }\n return mention as `${bigint}`\n }\n }\n\n @argumentConverter(Role)\n role(msg: Message, value: string): Role | undefined {\n const id = this.getRoleIDByMention(value)\n if (!id) return\n const role = msg.guild?.roles.cache.get(id)\n return role || undefined\n }\n}\n","/*\n * Copyright (c) 2022 pikokr. Licensed under the MIT license\n */\n\nimport { BuiltInModule } from './BuiltInModule'\nimport { Client } from 'discord.js'\nimport { CommandClient } from '../structures'\n\nexport class BuiltinApplicationCommandConverters extends BuiltInModule {\n client: Client\n\n constructor(private cts: CommandClient) {\n super()\n this.client = cts.client\n }\n}\n","/*\n * Copyright (c) 2022 pikokr. Licensed under the MIT license\n */\n\nimport { ApplicationCommandDataResolvable, Collection, Snowflake } from 'discord.js'\nimport { checkTarget } from '../utils'\nimport { KSlashCommandOptions, KApplicationCommands } from '../constants'\nimport { Module } from '../structures'\nimport { AppCommand } from './AppCommand'\n\ntype ApplicationCommandOptions = {\n guild: Snowflake | Snowflake[]\n optionTypes?: any[]\n}\n\nexport const applicationCommand = (opt: Partial<ApplicationCommandOptions> & { command: ApplicationCommandDataResolvable }) => {\n return (\n target: Object,\n propertyKey: string,\n // descriptor: TypedPropertyDescriptor<any>,\n ) => {\n checkTarget(target)\n\n let properties: AppCommand[] = Reflect.getMetadata(KApplicationCommands, target)\n\n const params: any[] = opt.optionTypes ?? Reflect.getMetadata('design:paramtypes', target, propertyKey)\n\n const options: Collection<number, string> = Reflect.getMetadata(KSlashCommandOptions, target, propertyKey) || new Collection<number, string>()\n\n const command = new AppCommand(\n opt.command,\n Reflect.get(target, propertyKey),\n target as Module,\n params.map((x, i) => ({\n type: x,\n name: options.get(i),\n })),\n opt.guild,\n propertyKey,\n )\n\n if (properties) {\n properties.push(command)\n } else {\n properties = [command]\n Reflect.defineMetadata(KApplicationCommands, properties, target)\n }\n }\n}\n\nexport const option = (key: string): ParameterDecorator => (target, propertyKey, parameterIndex) => {\n checkTarget(target)\n\n let properties: Collection<number, string> = Reflect.getMetadata(KSlashCommandOptions, target, propertyKey)\n\n if (!properties) {\n properties = new Collection<number, string>()\n Reflect.defineMetadata(KSlashCommandOptions, properties, target, propertyKey)\n }\n\n properties.set(parameterIndex, key)\n}\n","/*\n * Copyright (c) 2022 pikokr. Licensed under the MIT license\n */\n\nimport { Module } from '../structures'\nimport { ApplicationCommandDataResolvable, Snowflake } from 'discord.js'\nimport { KApplicationCommandChecks } from '../constants'\nimport { ApplicationCommandCheckFunction } from '../command'\n\nexport type AppCommandArgument = {\n type: any\n name?: string\n}\n\nexport class AppCommand {\n get checks(): ApplicationCommandCheckFunction[] {\n return Reflect.getMetadata(KApplicationCommandChecks, this.module, this.key) || []\n }\n\n execute(module: Module, args: any[]) {\n return this.run.apply(module, args)\n }\n\n constructor(\n public command: ApplicationCommandDataResolvable,\n private run: Function,\n public module: Module,\n public params: AppCommandArgument[],\n public guild: Snowflake | Snowflake[] | undefined,\n private key: string | symbol,\n ) {}\n}\n","/*\n * Copyright (c) 2022 pikokr. Licensed under the MIT license\n */\n\nimport { MessageComponentInteraction, MessageComponentType } from 'discord.js'\nimport { Module } from '../structures'\n\nexport type MessageComponentExecutor = (i: MessageComponentInteraction) => void | Promise<void>\n\nexport class MessageComponentHandler {\n constructor(public componentId: string, public componentType: Exclude<MessageComponentType, 'ACTION_ROW'>, public execute: MessageComponentExecutor) {}\n\n run(module: Module, i: MessageComponentInteraction) {\n return this.execute.apply(module, [i])\n }\n}\n","/*\n * Copyright (c) 2022 pikokr. Licensed under the MIT license\n */\n\nimport { MessageComponentExecutor, MessageComponentHandler } from './base'\nimport { checkTarget } from '../utils'\nimport { KMessageComponentHandlers } from '../constants'\n\nexport class ButtonInteractionHandler extends MessageComponentHandler {\n constructor(id: string, execute: MessageComponentExecutor) {\n super(id, 'BUTTON', execute)\n }\n}\n\nexport const messageButton = (id: string): MethodDecorator => {\n return (target, propertyKey) => {\n checkTarget(target)\n\n const handler = new ButtonInteractionHandler(id, Reflect.get(target, propertyKey))\n\n let properties: MessageComponentHandler[] = Reflect.getMetadata(KMessageComponentHandlers, target)\n\n if (properties) {\n properties.push(handler)\n } else {\n properties = [handler]\n Reflect.defineMetadata(KMessageComponentHandlers, properties, target)\n }\n }\n}\n","/*\n * Copyright (c) 2022 pikokr. Licensed under the MIT license\n */\n\nimport { MessageComponentExecutor, MessageComponentHandler } from './base'\nimport { checkTarget } from '../utils'\nimport { KMessageComponentHandlers } from '../constants'\n\nexport class SelectMenuInteractionHandler extends MessageComponentHandler {\n constructor(id: string, execute: MessageComponentExecutor) {\n super(id, 'SELECT_MENU', execute)\n }\n}\n\nexport const messageSelectMenu = (id: string): MethodDecorator => {\n return (target, propertyKey) => {\n checkTarget(target)\n\n const handler = new SelectMenuInteractionHandler(id, Reflect.get(target, propertyKey))\n\n let properties: MessageComponentHandler[] = Reflect.getMetadata(KMessageComponentHandlers, target)\n\n if (properties) {\n properties.push(handler)\n } else {\n properties = [handler]\n Reflect.defineMetadata(KMessageComponentHandlers, properties, target)\n }\n }\n}\n"],"mappings":"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","names":[]}
|
|
1
|
+
{"version":3,"sources":["../src/home/runner/work/command.ts/command.ts/src/index.ts","../src/core/components/home/runner/work/command.ts/command.ts/src/core/components/index.ts","../src/core/components/home/runner/work/command.ts/command.ts/src/core/components/BaseComponent.ts","../src/core/components/home/runner/work/command.ts/command.ts/src/core/components/ComponentArgument.ts","../src/core/components/home/runner/work/command.ts/command.ts/src/core/components/decoratorCreator.ts","../src/core/home/runner/work/command.ts/command.ts/src/core/symbols.ts","../src/applicationCommand/home/runner/work/command.ts/command.ts/src/applicationCommand/ApplicationCommand.ts","../src/core/components/home/runner/work/command.ts/command.ts/src/core/components/ComponentArgumentDecorator.ts","../src/applicationCommand/home/runner/work/command.ts/command.ts/src/applicationCommand/ApplicationCommandOption.ts"],"sourcesContent":["/*\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\n","import 'reflect-metadata'\nexport * from './BaseComponent'\nexport * from './decoratorCreator'\n","import { Collection } from 'discord.js'\nimport _ from 'lodash'\nimport { ComponentArgument } from './ComponentArgument'\n\nexport class BaseComponent<Options = unknown> {\n options: Options\n\n method: Function\n\n argTypes: Collection<number, ComponentArgument> = new Collection()\n\n constructor(options: Partial<Options>, method: Function, argTypes: unknown[]) {\n if (typeof options === 'object') {\n this.options = _.merge(this.defaultOptions(), options)\n } else {\n this.options = options\n }\n this.method = method\n for (let i = 0; i < argTypes.length; i++) {\n const element = argTypes[i]\n this.argTypes.set(i, new ComponentArgument(element))\n }\n }\n\n defaultOptions(): Options {\n return ({} as unknown) as Options\n }\n\n execute(target: object, args: unknown[]) {\n return this.method.apply(target, args)\n }\n}\n","import { ComponentArgumentDecorator } from './ComponentArgumentDecorator'\n\nexport class ComponentArgument {\n decorators: ComponentArgumentDecorator[] = []\n\n constructor(public type: unknown) {}\n}\n","import { Collection } from 'discord.js'\nimport { ComponentStoreSymbol } from '../symbols'\nimport { BaseComponent } from './BaseComponent'\nimport { ComponentArgumentDecorator } from './ComponentArgumentDecorator'\n\ntype ComponentStore = Collection<string|symbol, BaseComponent>\ntype ComponentArgumentStore = Collection<number, ComponentArgumentDecorator>\n\nexport const getComponentStore = (target: object): ComponentStore => {\n let result: ComponentStore|null = Reflect.getMetadata(ComponentStoreSymbol, target)\n\n if (!result) {\n result = new Collection()\n\n Reflect.defineMetadata(ComponentStoreSymbol, result, target)\n }\n\n return result\n}\n\nexport const getComponent = (target: object, key: string|symbol) => {\n const store = getComponentStore(target)\n\n return store.get(key)\n}\n\nexport const createComponentDecorator = <Options>(type: typeof BaseComponent<Options>) => {\n return (options: Options): MethodDecorator => {\n return (target, key) => {\n var component: BaseComponent<Options> = new type(options, Reflect.get(target, key), Reflect.getMetadata('design:paramtypes', target, key))\n\n const store = getComponentStore(target)\n\n const decorators = getComponentArgumentStore(target, key)\n\n decorators.forEach((x, i)=> {\n component.argTypes.get(i)?.decorators.push(x)\n })\n\n store.set(key, component)\n }\n }\n}\n\nexport const getComponentArgumentStore = (target: object, key: string|symbol): ComponentArgumentStore => {\n let result: ComponentArgumentStore|null = Reflect.getMetadata(ComponentStoreSymbol, target, key)\n\n if (!result) {\n result = new Collection()\n\n Reflect.defineMetadata(ComponentStoreSymbol, result, target, key)\n }\n\n return result\n}\n\nexport const createArgumentDecorator = <Options>(type: typeof ComponentArgumentDecorator<Options>) => {\n return (options: Options): ParameterDecorator => {\n return (target, key, idx) => {\n var arg: ComponentArgumentDecorator<Options> = new type(options)\n\n const store = getComponentArgumentStore(target, key)\n\n store.set(idx, arg)\n }\n }\n}\n\n","export const ComponentStoreSymbol = Symbol()\nexport const ComponentArgStoreSymbol = Symbol()\n","import { BaseComponent, createComponentDecorator } from '../core'\n\nexport type ApplicationCommandOptions = {\n name: string\n description: string\n}\n\nexport class SlashCommand extends BaseComponent<ApplicationCommandOptions> {\n defaultOptions() {\n return {\n name: '',\n description: '',\n }\n }\n}\n\nexport const applicationCommand = createComponentDecorator(SlashCommand)\n","import _ from 'lodash'\n\nexport class ComponentArgumentDecorator<Options = unknown> {\n options: Options\n\n constructor(options: Partial<Options>) {\n if (typeof options === 'object') {\n this.options = _.merge(this.defaultOptions(), options)\n } else {\n this.options = options\n }\n }\n\n defaultOptions(): Options {\n return ({} as unknown) as Options\n }\n}\n","import { APIApplicationCommandOption } from 'discord.js'\nimport { createArgumentDecorator } from '../core'\nimport { ComponentArgumentDecorator } from '../core/components/ComponentArgumentDecorator'\n\ntype Options = APIApplicationCommandOption\n\nexport class ApplicationCommandOption extends ComponentArgumentDecorator<Options> {}\n\nexport const option = createArgumentDecorator(ApplicationCommandOption)\n"],"mappings":"ouBAAA,kNCAA,MAAO,4BCAP,MAA2B,sBAC3B,EAAc,qBCCP,WAAuB,CAG5B,YAAmB,EAAe,MAAf,KAAA,OAFnB,WAA2C,KADtC,yBDEA,WAAmB,CAKxB,SAAkD,GAAI,cAEtD,YAAY,EAA2B,EAAkB,EAAqB,CAC5E,AAAI,MAAO,IAAY,SACrB,KAAK,QAAU,UAAE,MAAM,KAAK,iBAAkB,GAE9C,KAAK,QAAU,EAEjB,KAAK,OAAS,EACd,OAAS,GAAI,EAAG,EAAI,EAAS,OAAQ,IAAK,CACxC,GAAM,GAAU,EAAS,GACzB,KAAK,SAAS,IAAI,EAAG,GAAI,GAAkB,KAI/C,gBAA0B,CACxB,MAAQ,GAGV,QAAQ,EAAgB,EAAiB,CACvC,MAAO,MAAK,OAAO,MAAM,EAAQ,KAzB9B,qBEJP,MAA2B,sBCApB,GAAM,GAAuB,SACvB,EAA0B,SDOhC,GAAM,GAAoB,EAAC,GAAmC,CACnE,GAAI,GAA8B,QAAQ,YAAY,EAAsB,GAE5E,MAAK,IACH,GAAS,GAAI,cAEb,QAAQ,eAAe,EAAsB,EAAQ,IAGhD,GATwB,qBAYpB,EAAe,GAAC,EAAgB,IAGpC,AAFO,EAAkB,GAEnB,IAAI,GAHS,gBAMf,EAA2B,EAAU,GACzC,AAAC,GACC,CAAC,EAAQ,IAAQ,CACtB,GAAI,GAAoC,GAAI,GAAK,EAAS,QAAQ,IAAI,EAAQ,GAAM,QAAQ,YAAY,oBAAqB,EAAQ,IAErI,GAAM,GAAQ,EAAkB,GAIhC,AAFmB,EAA0B,EAAQ,GAE1C,QAAQ,CAAC,EAAG,IAAK,CAnClC,MAoCQ,KAAU,SAAS,IAAI,KAAvB,QAA2B,WAAW,KAAK,KAG7C,EAAM,IAAI,EAAK,IAbmB,4BAkB3B,EAA4B,GAAC,EAAgB,IAA+C,CACvG,GAAI,GAAsC,QAAQ,YAAY,EAAsB,EAAQ,GAE5F,MAAK,IACH,GAAS,GAAI,cAEb,QAAQ,eAAe,EAAsB,EAAQ,EAAQ,IAGxD,GATgC,6BAY5B,EAA0B,EAAU,GACxC,AAAC,GACC,CAAC,EAAQ,EAAK,IAAQ,CAC3B,GAAI,GAA2C,GAAI,GAAK,GAIxD,AAFc,EAA0B,EAAQ,GAE1C,IAAI,EAAK,IAPkB,2BEjDhC,mBAA2B,EAAa,CAC7C,gBAAiB,CACf,MAAO,CACL,KAAM,GACN,YAAa,MAJZ,oBASA,GAAM,GAAqB,EAAyB,GChB3D,MAAc,qBAEP,OAAgC,CAGrC,YAAY,EAA2B,CACrC,AAAI,MAAO,IAAY,SACrB,KAAK,QAAU,UAAE,MAAM,KAAK,iBAAkB,GAE9C,KAAK,QAAU,EAInB,gBAA0B,CACxB,MAAQ,KAZL,kCCIA,mBAAuC,EAA0B,GAAjE,gCAEA,GAAM,GAAS,EAAwB","names":[]}
|
package/package.json
CHANGED
|
@@ -1,18 +1,18 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@pikokr/command.ts",
|
|
3
3
|
"description": "Discord.js command framework for typescript.",
|
|
4
|
-
"version": "
|
|
4
|
+
"version": "5.0.0-dev.9796a99",
|
|
5
5
|
"main": "dist/index.js",
|
|
6
6
|
"types": "dist/index.d.ts",
|
|
7
7
|
"license": "MIT",
|
|
8
8
|
"devDependencies": {
|
|
9
9
|
"@discordjs/ts-docgen": "^0.3.4",
|
|
10
|
-
"@swc/core": "^1.2.
|
|
10
|
+
"@swc/core": "^1.2.218",
|
|
11
11
|
"@types/lodash": "^4.14.172",
|
|
12
12
|
"all-contributors-cli": "^6.20.0",
|
|
13
|
-
"discord.js": "^
|
|
13
|
+
"discord.js": "^14.0.1",
|
|
14
14
|
"prettier": "^2.2.1",
|
|
15
|
-
"ts-node": "^10.1
|
|
15
|
+
"ts-node": "^10.9.1",
|
|
16
16
|
"tsup": "^5.11.12",
|
|
17
17
|
"typedoc": "^0.22.11"
|
|
18
18
|
},
|
|
@@ -22,18 +22,21 @@
|
|
|
22
22
|
"lodash": "^4.17.21",
|
|
23
23
|
"reflect-metadata": "^0.1.13",
|
|
24
24
|
"tslog": "^3.3.1",
|
|
25
|
-
"typescript": "^4.
|
|
25
|
+
"typescript": "^4.7.4",
|
|
26
26
|
"walk-sync": "^3.0.0"
|
|
27
27
|
},
|
|
28
28
|
"repository": {
|
|
29
29
|
"type": "git",
|
|
30
|
-
"url": "https://github.com/pikokr/command.ts
|
|
30
|
+
"url": "https://github.com/pikokr/command.ts"
|
|
31
31
|
},
|
|
32
32
|
"scripts": {
|
|
33
33
|
"prepack": "yarn build",
|
|
34
34
|
"build": "tsup-node",
|
|
35
35
|
"docs:dev": "typedoc",
|
|
36
36
|
"docs:build": "typedoc",
|
|
37
|
-
"docs": "typedoc --json docs/typedoc-out.json src/index.ts && ts-node scripts/docs"
|
|
37
|
+
"docs": "typedoc --json docs/typedoc-out.json --tsconfig tsconfig.prod.json src/index.ts && ts-node -p tsconfig.prod.json scripts/docs"
|
|
38
|
+
},
|
|
39
|
+
"peerDependencies": {
|
|
40
|
+
"discord.js": "^14.0.1"
|
|
38
41
|
}
|
|
39
|
-
}
|
|
42
|
+
}
|
package/publish-version.js
CHANGED
|
@@ -1,3 +1,13 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* This is the default license template.
|
|
3
|
+
*
|
|
4
|
+
* File: publish-version.js
|
|
5
|
+
* Author: pikokr
|
|
6
|
+
* Copyright (c) 2022 pikokr
|
|
7
|
+
*
|
|
8
|
+
* To edit this license information: Press Ctrl+Shift+P and press 'Create new License Template...'.
|
|
9
|
+
*/
|
|
10
|
+
|
|
1
11
|
/*
|
|
2
12
|
* Copyright (c) 2022 pikokr. Licensed under the MIT license
|
|
3
13
|
*/
|
package/scripts/docs.ts
CHANGED
|
@@ -1,7 +1,11 @@
|
|
|
1
|
-
/*
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
1
|
+
/*
|
|
2
|
+
* File: docs.ts
|
|
3
|
+
*
|
|
4
|
+
* Copyright (c) 2022-2022 pikokr
|
|
5
|
+
*
|
|
6
|
+
* Licensed under MIT License. Please see more defails in LICENSE file.
|
|
7
|
+
*/
|
|
8
|
+
|
|
5
9
|
import { runGenerator } from '@discordjs/ts-docgen'
|
|
6
10
|
|
|
7
11
|
runGenerator({
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { BaseComponent, createComponentDecorator } from '../core'
|
|
2
|
+
|
|
3
|
+
export type ApplicationCommandOptions = {
|
|
4
|
+
name: string
|
|
5
|
+
description: string
|
|
6
|
+
}
|
|
7
|
+
|
|
8
|
+
export class SlashCommand extends BaseComponent<ApplicationCommandOptions> {
|
|
9
|
+
defaultOptions() {
|
|
10
|
+
return {
|
|
11
|
+
name: '',
|
|
12
|
+
description: '',
|
|
13
|
+
}
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
export const applicationCommand = createComponentDecorator(SlashCommand)
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { APIApplicationCommandOption } from 'discord.js'
|
|
2
|
+
import { createArgumentDecorator } from '../core'
|
|
3
|
+
import { ComponentArgumentDecorator } from '../core/components/ComponentArgumentDecorator'
|
|
4
|
+
|
|
5
|
+
type Options = APIApplicationCommandOption
|
|
6
|
+
|
|
7
|
+
export class ApplicationCommandOption extends ComponentArgumentDecorator<Options> {}
|
|
8
|
+
|
|
9
|
+
export const option = createArgumentDecorator(ApplicationCommandOption)
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import { Collection } from 'discord.js'
|
|
2
|
+
import _ from 'lodash'
|
|
3
|
+
import { ComponentArgument } from './ComponentArgument'
|
|
4
|
+
|
|
5
|
+
export class BaseComponent<Options = unknown> {
|
|
6
|
+
options: Options
|
|
7
|
+
|
|
8
|
+
method: Function
|
|
9
|
+
|
|
10
|
+
argTypes: Collection<number, ComponentArgument> = new Collection()
|
|
11
|
+
|
|
12
|
+
constructor(options: Partial<Options>, method: Function, argTypes: unknown[]) {
|
|
13
|
+
if (typeof options === 'object') {
|
|
14
|
+
this.options = _.merge(this.defaultOptions(), options)
|
|
15
|
+
} else {
|
|
16
|
+
this.options = options
|
|
17
|
+
}
|
|
18
|
+
this.method = method
|
|
19
|
+
for (let i = 0; i < argTypes.length; i++) {
|
|
20
|
+
const element = argTypes[i]
|
|
21
|
+
this.argTypes.set(i, new ComponentArgument(element))
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
defaultOptions(): Options {
|
|
26
|
+
return ({} as unknown) as Options
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
execute(target: object, args: unknown[]) {
|
|
30
|
+
return this.method.apply(target, args)
|
|
31
|
+
}
|
|
32
|
+
}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import _ from 'lodash'
|
|
2
|
+
|
|
3
|
+
export class ComponentArgumentDecorator<Options = unknown> {
|
|
4
|
+
options: Options
|
|
5
|
+
|
|
6
|
+
constructor(options: Partial<Options>) {
|
|
7
|
+
if (typeof options === 'object') {
|
|
8
|
+
this.options = _.merge(this.defaultOptions(), options)
|
|
9
|
+
} else {
|
|
10
|
+
this.options = options
|
|
11
|
+
}
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
defaultOptions(): Options {
|
|
15
|
+
return ({} as unknown) as Options
|
|
16
|
+
}
|
|
17
|
+
}
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
import { Collection } from 'discord.js'
|
|
2
|
+
import { ComponentStoreSymbol } from '../symbols'
|
|
3
|
+
import { BaseComponent } from './BaseComponent'
|
|
4
|
+
import { ComponentArgumentDecorator } from './ComponentArgumentDecorator'
|
|
5
|
+
|
|
6
|
+
type ComponentStore = Collection<string|symbol, BaseComponent>
|
|
7
|
+
type ComponentArgumentStore = Collection<number, ComponentArgumentDecorator>
|
|
8
|
+
|
|
9
|
+
export const getComponentStore = (target: object): ComponentStore => {
|
|
10
|
+
let result: ComponentStore|null = Reflect.getMetadata(ComponentStoreSymbol, target)
|
|
11
|
+
|
|
12
|
+
if (!result) {
|
|
13
|
+
result = new Collection()
|
|
14
|
+
|
|
15
|
+
Reflect.defineMetadata(ComponentStoreSymbol, result, target)
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
return result
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
export const getComponent = (target: object, key: string|symbol) => {
|
|
22
|
+
const store = getComponentStore(target)
|
|
23
|
+
|
|
24
|
+
return store.get(key)
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
export const createComponentDecorator = <Options>(type: typeof BaseComponent<Options>) => {
|
|
28
|
+
return (options: Options): MethodDecorator => {
|
|
29
|
+
return (target, key) => {
|
|
30
|
+
var component: BaseComponent<Options> = new type(options, Reflect.get(target, key), Reflect.getMetadata('design:paramtypes', target, key))
|
|
31
|
+
|
|
32
|
+
const store = getComponentStore(target)
|
|
33
|
+
|
|
34
|
+
const decorators = getComponentArgumentStore(target, key)
|
|
35
|
+
|
|
36
|
+
decorators.forEach((x, i)=> {
|
|
37
|
+
component.argTypes.get(i)?.decorators.push(x)
|
|
38
|
+
})
|
|
39
|
+
|
|
40
|
+
store.set(key, component)
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
export const getComponentArgumentStore = (target: object, key: string|symbol): ComponentArgumentStore => {
|
|
46
|
+
let result: ComponentArgumentStore|null = Reflect.getMetadata(ComponentStoreSymbol, target, key)
|
|
47
|
+
|
|
48
|
+
if (!result) {
|
|
49
|
+
result = new Collection()
|
|
50
|
+
|
|
51
|
+
Reflect.defineMetadata(ComponentStoreSymbol, result, target, key)
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
return result
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
export const createArgumentDecorator = <Options>(type: typeof ComponentArgumentDecorator<Options>) => {
|
|
58
|
+
return (options: Options): ParameterDecorator => {
|
|
59
|
+
return (target, key, idx) => {
|
|
60
|
+
var arg: ComponentArgumentDecorator<Options> = new type(options)
|
|
61
|
+
|
|
62
|
+
const store = getComponentArgumentStore(target, key)
|
|
63
|
+
|
|
64
|
+
store.set(idx, arg)
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from './components'
|
package/src/index.ts
CHANGED
|
@@ -1,16 +1,10 @@
|
|
|
1
|
-
/*
|
|
2
|
-
*
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
export * from './
|
|
10
|
-
export * from './
|
|
11
|
-
export * from './command'
|
|
12
|
-
export * from './listener'
|
|
13
|
-
export * from './builtinModules/BuiltInModule'
|
|
14
|
-
export * from './applicationCommand'
|
|
15
|
-
export * from './messageComponents'
|
|
16
|
-
export * from './error'
|
|
1
|
+
/*
|
|
2
|
+
* File: index.ts
|
|
3
|
+
*
|
|
4
|
+
* Copyright (c) 2022-2022 pikokr
|
|
5
|
+
*
|
|
6
|
+
* Licensed under MIT License. Please see more defails in LICENSE file.
|
|
7
|
+
*/
|
|
8
|
+
|
|
9
|
+
export * from './core'
|
|
10
|
+
export * from './applicationCommand'
|
package/test/index.ts
CHANGED
|
@@ -1,28 +1,37 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
*/
|
|
1
|
+
import { ApplicationCommandOptionType } from 'discord.js'
|
|
2
|
+
import { applicationCommand, getComponentStore, option } from '../src'
|
|
4
3
|
|
|
5
|
-
|
|
6
|
-
|
|
4
|
+
class Test {
|
|
5
|
+
@applicationCommand({
|
|
6
|
+
name: 'test',
|
|
7
|
+
description: 'wow this is test',
|
|
8
|
+
})
|
|
9
|
+
async testCommand(
|
|
10
|
+
@option({
|
|
11
|
+
name: 'hello',
|
|
12
|
+
description: '와아',
|
|
13
|
+
type: ApplicationCommandOptionType.String,
|
|
14
|
+
})
|
|
15
|
+
hello: string,
|
|
16
|
+
world: string,
|
|
17
|
+
) {}
|
|
7
18
|
|
|
8
|
-
|
|
19
|
+
@applicationCommand({
|
|
20
|
+
name: 'test2',
|
|
21
|
+
description: 'wow this is test wow',
|
|
22
|
+
})
|
|
23
|
+
async test2(
|
|
24
|
+
@option({
|
|
25
|
+
name: 'sans',
|
|
26
|
+
description: '와',
|
|
27
|
+
type: ApplicationCommandOptionType.String,
|
|
28
|
+
})
|
|
29
|
+
wa: string,
|
|
30
|
+
) {}
|
|
31
|
+
}
|
|
9
32
|
|
|
10
|
-
const
|
|
11
|
-
intents: ['GUILD_MESSAGES','GUILDS','DIRECT_MESSAGES'],
|
|
12
|
-
})
|
|
33
|
+
const ext = new Test()
|
|
13
34
|
|
|
14
|
-
const
|
|
15
|
-
owners: 'auto',
|
|
16
|
-
client,
|
|
17
|
-
command: {
|
|
18
|
-
prefix: '!',
|
|
19
|
-
},
|
|
20
|
-
applicationCommands: {
|
|
21
|
-
autoSync: true,
|
|
22
|
-
guild: '969907569592250449',
|
|
23
|
-
},
|
|
24
|
-
})
|
|
35
|
+
const store = getComponentStore(ext)
|
|
25
36
|
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
client.login(config.token)
|
|
37
|
+
console.log(store)
|
package/tsconfig.json
CHANGED
package/tsup.config.ts
CHANGED
|
@@ -1,7 +1,11 @@
|
|
|
1
|
-
/*
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
1
|
+
/*
|
|
2
|
+
* File: tsup.config.ts
|
|
3
|
+
*
|
|
4
|
+
* Copyright (c) 2022-2022 pikokr
|
|
5
|
+
*
|
|
6
|
+
* Licensed under MIT License. Please see more defails in LICENSE file.
|
|
7
|
+
*/
|
|
8
|
+
|
|
5
9
|
import { defineConfig } from 'tsup'
|
|
6
10
|
|
|
7
11
|
export default defineConfig({
|
|
@@ -1,32 +0,0 @@
|
|
|
1
|
-
/*
|
|
2
|
-
* Copyright (c) 2022 pikokr. Licensed under the MIT license
|
|
3
|
-
*/
|
|
4
|
-
|
|
5
|
-
import { Module } from '../structures'
|
|
6
|
-
import { ApplicationCommandDataResolvable, Snowflake } from 'discord.js'
|
|
7
|
-
import { KApplicationCommandChecks } from '../constants'
|
|
8
|
-
import { ApplicationCommandCheckFunction } from '../command'
|
|
9
|
-
|
|
10
|
-
export type AppCommandArgument = {
|
|
11
|
-
type: any
|
|
12
|
-
name?: string
|
|
13
|
-
}
|
|
14
|
-
|
|
15
|
-
export class AppCommand {
|
|
16
|
-
get checks(): ApplicationCommandCheckFunction[] {
|
|
17
|
-
return Reflect.getMetadata(KApplicationCommandChecks, this.module, this.key) || []
|
|
18
|
-
}
|
|
19
|
-
|
|
20
|
-
execute(module: Module, args: any[]) {
|
|
21
|
-
return this.run.apply(module, args)
|
|
22
|
-
}
|
|
23
|
-
|
|
24
|
-
constructor(
|
|
25
|
-
public command: ApplicationCommandDataResolvable,
|
|
26
|
-
private run: Function,
|
|
27
|
-
public module: Module,
|
|
28
|
-
public params: AppCommandArgument[],
|
|
29
|
-
public guild: Snowflake | Snowflake[] | undefined,
|
|
30
|
-
private key: string | symbol,
|
|
31
|
-
) {}
|
|
32
|
-
}
|