@pikokr/command.ts 4.0.5 → 5.0.0-dev.6057824
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/docs.yml +1 -1
- 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/README.md +2 -0
- package/dist/index.d.ts +76 -299
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/docs/index.yml +1 -1
- package/package.json +18 -11
- package/publish-version.js +10 -0
- package/scripts/docs.ts +5 -1
- package/src/applicationCommand/ApplicationCommand.ts +8 -0
- package/src/applicationCommand/ApplicationCommandOption.ts +9 -0
- package/src/applicationCommand/index.ts +2 -6
- package/src/core/components/BaseComponent.ts +29 -0
- package/src/core/components/ComponentArgument.ts +7 -0
- package/src/core/components/ComponentArgumentDecorator.ts +17 -0
- package/src/core/components/decoratorCreator.ts +67 -0
- package/src/core/components/index.ts +3 -0
- package/src/core/extensions/ApplicationCommand.ts +80 -0
- package/src/core/extensions/Extension.ts +20 -0
- package/src/core/extensions/index.ts +1 -0
- package/src/core/hooks/index.ts +1 -0
- package/src/core/hooks/moduleHook.ts +31 -0
- package/src/core/index.ts +3 -0
- package/src/core/listener/index.ts +20 -0
- package/src/core/structures/CommandClient.ts +36 -0
- package/src/core/structures/Registry.ts +101 -0
- package/src/core/structures/index.ts +2 -0
- package/src/core/symbols.ts +4 -0
- package/src/index.ts +6 -12
- package/test/index.ts +62 -23
- package/tsconfig.json +3 -3
- package/tsconfig.prod.json +8 -0
- package/tsup.config.ts +6 -1
- 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 -245
- 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 -45
- package/test/modules/test.ts +0 -148
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { BaseComponent, createComponentDecorator } from '../components'
|
|
2
|
+
|
|
3
|
+
export class ListenerComponent extends BaseComponent<{ emitter: string; event: string }, { emitter?: string; event: string }> {
|
|
4
|
+
defaultOptions() {
|
|
5
|
+
return { emitter: 'discord' }
|
|
6
|
+
}
|
|
7
|
+
|
|
8
|
+
constructor(options: ListenerComponent['options'], method: Function, argTypes: unknown[]) {
|
|
9
|
+
super(
|
|
10
|
+
{
|
|
11
|
+
event: options.event,
|
|
12
|
+
emitter: options.emitter ?? 'discord',
|
|
13
|
+
},
|
|
14
|
+
method,
|
|
15
|
+
argTypes,
|
|
16
|
+
)
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
export const listener = createComponentDecorator(ListenerComponent)
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import chalk from 'chalk'
|
|
2
|
+
import { Client } from 'discord.js'
|
|
3
|
+
import EventEmitter from 'events'
|
|
4
|
+
import { Logger } from 'tslog'
|
|
5
|
+
import { ApplicationCommandExtension, ApplicationCommandExtensionConfig } from '../extensions/ApplicationCommand'
|
|
6
|
+
import { CommandClientSymbol } from '../symbols'
|
|
7
|
+
import { Registry } from './Registry'
|
|
8
|
+
|
|
9
|
+
export class CommandClient extends EventEmitter {
|
|
10
|
+
ctsLogger: Logger
|
|
11
|
+
registry: Registry
|
|
12
|
+
|
|
13
|
+
constructor(public discord: Client, public logger: Logger = new Logger({ dateTimeTimezone: Intl.DateTimeFormat().resolvedOptions().timeZone })) {
|
|
14
|
+
super()
|
|
15
|
+
|
|
16
|
+
this.ctsLogger = logger.getChildLogger({ prefix: [chalk.blue('[command.ts]')], displayFilePath: 'hidden', displayFunctionName: false })
|
|
17
|
+
|
|
18
|
+
this.registry = new Registry(this.ctsLogger, this)
|
|
19
|
+
|
|
20
|
+
this.registry.registerEventEmitter('cts', this)
|
|
21
|
+
this.registry.registerEventEmitter('discord', this.discord)
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
async enableApplicationCommandsExtension(config: ApplicationCommandExtensionConfig) {
|
|
25
|
+
await this.registry.registerModule(new ApplicationCommandExtension(config))
|
|
26
|
+
this.ctsLogger.info('Application command extension enabled.')
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
getApplicationCommandsExtension() {
|
|
30
|
+
return this.registry.extensions.find((x) => x.constructor === ApplicationCommandExtension) as ApplicationCommandExtension | undefined
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
static getFromModule(ext: object): CommandClient {
|
|
34
|
+
return Reflect.getMetadata(CommandClientSymbol, ext)
|
|
35
|
+
}
|
|
36
|
+
}
|
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
import chalk from 'chalk'
|
|
2
|
+
import { Collection } from 'discord.js'
|
|
3
|
+
import EventEmitter from 'events'
|
|
4
|
+
import _ from 'lodash'
|
|
5
|
+
import { Logger } from 'tslog'
|
|
6
|
+
import { BaseComponent, getComponentStore } from '../components'
|
|
7
|
+
import { getModuleHookStore } from '../hooks'
|
|
8
|
+
import { ListenerComponent } from '../listener'
|
|
9
|
+
import { CommandClientSymbol } from '../symbols'
|
|
10
|
+
import { CommandClient } from './CommandClient'
|
|
11
|
+
|
|
12
|
+
export class Registry {
|
|
13
|
+
extensions: object[] = []
|
|
14
|
+
|
|
15
|
+
emitters: Collection<string, EventEmitter> = new Collection()
|
|
16
|
+
|
|
17
|
+
logger: Logger
|
|
18
|
+
|
|
19
|
+
constructor(logger: Logger, public client: CommandClient) {
|
|
20
|
+
this.logger = logger.getChildLogger({
|
|
21
|
+
prefix: [chalk.green('[Registry]')],
|
|
22
|
+
})
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
getComponentsWithTypeGlobal<T extends typeof BaseComponent<Config>, Config>(type: T): InstanceType<T>[] {
|
|
26
|
+
const result: InstanceType<T>[] = []
|
|
27
|
+
|
|
28
|
+
for (const ext of this.extensions) {
|
|
29
|
+
result.push(...this.getComponentsWithType(ext, type))
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
return result
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
getComponentsWithType<T extends typeof BaseComponent<Config>, Config>(ext: object, type: T): InstanceType<T>[] {
|
|
36
|
+
const componentStore = getComponentStore(ext)
|
|
37
|
+
|
|
38
|
+
return Array.from(componentStore.filter((x) => (x.constructor as unknown) === type).values() as Iterable<InstanceType<T>>)
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
registerEventListeners(ext: object) {
|
|
42
|
+
const listeners = this.getComponentsWithType(ext, ListenerComponent)
|
|
43
|
+
|
|
44
|
+
for (const listener of listeners) {
|
|
45
|
+
const emitter = this.emitters.get(listener.options.emitter)
|
|
46
|
+
|
|
47
|
+
if (emitter) {
|
|
48
|
+
const bound = listener.method.bind(ext)
|
|
49
|
+
|
|
50
|
+
Reflect.defineMetadata('bound', bound, listener)
|
|
51
|
+
|
|
52
|
+
emitter.addListener(listener.options.event, bound)
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
unregisterEventListeners(ext: object) {
|
|
58
|
+
const listeners = this.getComponentsWithType(ext, ListenerComponent)
|
|
59
|
+
|
|
60
|
+
for (const listener of listeners) {
|
|
61
|
+
const emitter = this.emitters.get(listener.options.emitter)
|
|
62
|
+
const bound = Reflect.getMetadata('bound', listener)
|
|
63
|
+
|
|
64
|
+
if (emitter && bound) {
|
|
65
|
+
emitter.removeListener(listener.options.event, bound)
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
async registerModule(ext: object) {
|
|
71
|
+
Reflect.defineMetadata(CommandClientSymbol, this.client, ext)
|
|
72
|
+
|
|
73
|
+
this.registerEventListeners(ext)
|
|
74
|
+
await this.runModuleHook(ext, 'load')
|
|
75
|
+
this.extensions.push(ext)
|
|
76
|
+
this.logger.info(`Module registered: ${chalk.green(ext.constructor.name)}`)
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
async unregisterModule(ext: object) {
|
|
80
|
+
this.unregisterEventListeners(ext)
|
|
81
|
+
await this.runModuleHook(ext, 'unload')
|
|
82
|
+
_.remove(this.extensions, (x) => x === ext)
|
|
83
|
+
this.logger.info(`Module unregistered: ${chalk.green(ext.constructor.name)}`)
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
runModuleHook(ext: object, hookName: string, ...args: unknown[]) {
|
|
87
|
+
const hooks = getModuleHookStore(ext)
|
|
88
|
+
|
|
89
|
+
const functions = hooks.get(hookName)
|
|
90
|
+
|
|
91
|
+
if (functions) {
|
|
92
|
+
for (const fn of functions) {
|
|
93
|
+
fn.call(ext, ...args)
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
registerEventEmitter(name: string, emitter: EventEmitter) {
|
|
99
|
+
this.emitters.set(name, emitter)
|
|
100
|
+
}
|
|
101
|
+
}
|
package/src/index.ts
CHANGED
|
@@ -1,16 +1,10 @@
|
|
|
1
1
|
/*
|
|
2
|
-
*
|
|
2
|
+
* File: index.ts
|
|
3
|
+
*
|
|
4
|
+
* Copyright (c) 2022-2022 pikokr
|
|
5
|
+
*
|
|
6
|
+
* Licensed under MIT License. Please see more defails in LICENSE file.
|
|
3
7
|
*/
|
|
4
8
|
|
|
5
|
-
|
|
6
|
-
import './typings'
|
|
7
|
-
|
|
8
|
-
export * from './interface'
|
|
9
|
-
export * from './structures'
|
|
10
|
-
export * from './error'
|
|
11
|
-
export * from './command'
|
|
12
|
-
export * from './listener'
|
|
13
|
-
export * from './builtinModules/BuiltInModule'
|
|
9
|
+
export * from './core'
|
|
14
10
|
export * from './applicationCommand'
|
|
15
|
-
export * from './messageComponents'
|
|
16
|
-
export * from './error'
|
package/test/index.ts
CHANGED
|
@@ -1,30 +1,69 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
1
|
+
import { ApplicationCommandOptionType, ApplicationCommandType, Client } from 'discord.js'
|
|
2
|
+
import { applicationCommand, CommandClient, moduleHook, option, Registry } from '../src'
|
|
3
|
+
import { listener } from '../src/core/listener'
|
|
4
|
+
import 'dotenv/config'
|
|
5
|
+
import { Logger } from 'tslog'
|
|
6
|
+
import chalk from 'chalk'
|
|
7
|
+
import { Extension } from '../src/core/extensions'
|
|
4
8
|
|
|
5
|
-
|
|
6
|
-
|
|
9
|
+
class Test extends Extension {
|
|
10
|
+
@applicationCommand({
|
|
11
|
+
type: ApplicationCommandType.ChatInput,
|
|
12
|
+
name: 'test',
|
|
13
|
+
description: 'wow this is test',
|
|
14
|
+
})
|
|
15
|
+
async testCommand() {}
|
|
7
16
|
|
|
8
|
-
|
|
17
|
+
@applicationCommand({
|
|
18
|
+
type: ApplicationCommandType.ChatInput,
|
|
19
|
+
name: 'test2',
|
|
20
|
+
description: 'wow this is test wow',
|
|
21
|
+
})
|
|
22
|
+
async test2(
|
|
23
|
+
@option({
|
|
24
|
+
name: 'sans',
|
|
25
|
+
description: '와',
|
|
26
|
+
type: ApplicationCommandOptionType.String,
|
|
27
|
+
})
|
|
28
|
+
wa: string,
|
|
29
|
+
) {}
|
|
9
30
|
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
31
|
+
@moduleHook('load')
|
|
32
|
+
load() {
|
|
33
|
+
this.logger.info('Load')
|
|
34
|
+
}
|
|
13
35
|
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
prefix: '!',
|
|
19
|
-
},
|
|
20
|
-
applicationCommands: {
|
|
21
|
-
autoSync: true,
|
|
22
|
-
guild: '832938554438844438',
|
|
23
|
-
},
|
|
24
|
-
})
|
|
36
|
+
@moduleHook('unload')
|
|
37
|
+
unload() {
|
|
38
|
+
this.logger.info('Unload')
|
|
39
|
+
}
|
|
25
40
|
|
|
26
|
-
|
|
41
|
+
@listener({ event: 'ready' })
|
|
42
|
+
testEvent() {
|
|
43
|
+
this.logger.info(`Login: ${chalk.green(client.user!.tag)}`)
|
|
44
|
+
}
|
|
45
|
+
}
|
|
27
46
|
|
|
28
|
-
|
|
47
|
+
const ext = new Test()
|
|
29
48
|
|
|
30
|
-
client
|
|
49
|
+
const client = new Client({ intents: [] })
|
|
50
|
+
|
|
51
|
+
const logger = new Logger({ dateTimeTimezone: Intl.DateTimeFormat().resolvedOptions().timeZone })
|
|
52
|
+
|
|
53
|
+
const cc = new CommandClient(client, logger)
|
|
54
|
+
|
|
55
|
+
const registry = cc.registry
|
|
56
|
+
|
|
57
|
+
const run = async () => {
|
|
58
|
+
await cc.enableApplicationCommandsExtension({
|
|
59
|
+
guilds: ['832938554438844438'],
|
|
60
|
+
})
|
|
61
|
+
|
|
62
|
+
await registry.registerModule(ext)
|
|
63
|
+
|
|
64
|
+
await client.login(process.env.TOKEN)
|
|
65
|
+
|
|
66
|
+
await cc.getApplicationCommandsExtension()!.sync()
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
run()
|
package/tsconfig.json
CHANGED
|
@@ -15,11 +15,10 @@
|
|
|
15
15
|
"declaration": true,
|
|
16
16
|
/* Generates corresponding '.d.ts' file. */
|
|
17
17
|
// "declarationMap": true, /* Generates a sourcemap for each corresponding '.d.ts' file. */
|
|
18
|
-
|
|
18
|
+
"sourceMap": true /* Generates corresponding '.map' file. */,
|
|
19
19
|
// "outFile": "./", /* Concatenate and emit output to single file. */
|
|
20
20
|
"outDir": "./dist",
|
|
21
21
|
/* Redirect output structure to the directory. */
|
|
22
|
-
"rootDir": "./src",
|
|
23
22
|
/* Specify the root directory of input files. Use to control the output directory structure with --outDir. */
|
|
24
23
|
// "composite": true, /* Enable project compilation */
|
|
25
24
|
// "tsBuildInfoFile": "./", /* Specify file to store incremental compilation information */
|
|
@@ -31,6 +30,7 @@
|
|
|
31
30
|
|
|
32
31
|
/* Strict Type-Checking Options */
|
|
33
32
|
"strict": true,
|
|
33
|
+
|
|
34
34
|
/* Enable all strict type-checking options. */
|
|
35
35
|
// "noImplicitAny": true, /* Raise error on expressions and declarations with an implied 'any' type. */
|
|
36
36
|
// "strictNullChecks": true, /* Enable strict null checks. */
|
|
@@ -79,5 +79,5 @@
|
|
|
79
79
|
"forceConsistentCasingInFileNames": true
|
|
80
80
|
/* Disallow inconsistently-cased references to the same file. */
|
|
81
81
|
},
|
|
82
|
-
"exclude": ["
|
|
82
|
+
"exclude": ["node_modules"]
|
|
83
83
|
}
|
package/tsup.config.ts
CHANGED
|
@@ -1,5 +1,9 @@
|
|
|
1
1
|
/*
|
|
2
|
-
*
|
|
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.
|
|
3
7
|
*/
|
|
4
8
|
|
|
5
9
|
import { defineConfig } from 'tsup'
|
|
@@ -11,4 +15,5 @@ export default defineConfig({
|
|
|
11
15
|
clean: true,
|
|
12
16
|
dts: true,
|
|
13
17
|
minify: true,
|
|
18
|
+
tsconfig: 'tsconfig.prod.json',
|
|
14
19
|
})
|
|
@@ -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
|
-
}
|
|
@@ -1,62 +0,0 @@
|
|
|
1
|
-
/*
|
|
2
|
-
* Copyright (c) 2022 pikokr. Licensed under the MIT license
|
|
3
|
-
*/
|
|
4
|
-
|
|
5
|
-
import { ApplicationCommandDataResolvable, Collection, Snowflake } from 'discord.js'
|
|
6
|
-
import { checkTarget } from '../utils'
|
|
7
|
-
import { KSlashCommandOptions, KApplicationCommands } from '../constants'
|
|
8
|
-
import { Module } from '../structures'
|
|
9
|
-
import { AppCommand } from './AppCommand'
|
|
10
|
-
|
|
11
|
-
type ApplicationCommandOptions = {
|
|
12
|
-
guild: Snowflake | Snowflake[]
|
|
13
|
-
optionTypes?: any[]
|
|
14
|
-
}
|
|
15
|
-
|
|
16
|
-
export const applicationCommand = (opt: Partial<ApplicationCommandOptions> & { command: ApplicationCommandDataResolvable }) => {
|
|
17
|
-
return (
|
|
18
|
-
target: Object,
|
|
19
|
-
propertyKey: string,
|
|
20
|
-
// descriptor: TypedPropertyDescriptor<any>,
|
|
21
|
-
) => {
|
|
22
|
-
checkTarget(target)
|
|
23
|
-
|
|
24
|
-
let properties: AppCommand[] = Reflect.getMetadata(KApplicationCommands, target)
|
|
25
|
-
|
|
26
|
-
const params: any[] = opt.optionTypes ?? Reflect.getMetadata('design:paramtypes', target, propertyKey)
|
|
27
|
-
|
|
28
|
-
const options: Collection<number, string> = Reflect.getMetadata(KSlashCommandOptions, target, propertyKey) || new Collection<number, string>()
|
|
29
|
-
|
|
30
|
-
const command = new AppCommand(
|
|
31
|
-
opt.command,
|
|
32
|
-
Reflect.get(target, propertyKey),
|
|
33
|
-
target as Module,
|
|
34
|
-
params.map((x, i) => ({
|
|
35
|
-
type: x,
|
|
36
|
-
name: options.get(i),
|
|
37
|
-
})),
|
|
38
|
-
opt.guild,
|
|
39
|
-
propertyKey,
|
|
40
|
-
)
|
|
41
|
-
|
|
42
|
-
if (properties) {
|
|
43
|
-
properties.push(command)
|
|
44
|
-
} else {
|
|
45
|
-
properties = [command]
|
|
46
|
-
Reflect.defineMetadata(KApplicationCommands, properties, target)
|
|
47
|
-
}
|
|
48
|
-
}
|
|
49
|
-
}
|
|
50
|
-
|
|
51
|
-
export const option = (key: string): ParameterDecorator => (target, propertyKey, parameterIndex) => {
|
|
52
|
-
checkTarget(target)
|
|
53
|
-
|
|
54
|
-
let properties: Collection<number, string> = Reflect.getMetadata(KSlashCommandOptions, target, propertyKey)
|
|
55
|
-
|
|
56
|
-
if (!properties) {
|
|
57
|
-
properties = new Collection<number, string>()
|
|
58
|
-
Reflect.defineMetadata(KSlashCommandOptions, properties, target, propertyKey)
|
|
59
|
-
}
|
|
60
|
-
|
|
61
|
-
properties.set(parameterIndex, key)
|
|
62
|
-
}
|
|
@@ -1,13 +0,0 @@
|
|
|
1
|
-
/*
|
|
2
|
-
* Copyright (c) 2022 pikokr. Licensed under the MIT license
|
|
3
|
-
*/
|
|
4
|
-
|
|
5
|
-
import { Module } from '../structures'
|
|
6
|
-
import { KBuiltInModule } from '../constants'
|
|
7
|
-
|
|
8
|
-
export class BuiltInModule extends Module {
|
|
9
|
-
constructor() {
|
|
10
|
-
super()
|
|
11
|
-
Reflect.defineMetadata(KBuiltInModule, true, this)
|
|
12
|
-
}
|
|
13
|
-
}
|
|
@@ -1,16 +0,0 @@
|
|
|
1
|
-
/*
|
|
2
|
-
* Copyright (c) 2022 pikokr. Licensed under the MIT license
|
|
3
|
-
*/
|
|
4
|
-
|
|
5
|
-
import { BuiltInModule } from './BuiltInModule'
|
|
6
|
-
import { Client } from 'discord.js'
|
|
7
|
-
import { CommandClient } from '../structures'
|
|
8
|
-
|
|
9
|
-
export class BuiltinApplicationCommandConverters extends BuiltInModule {
|
|
10
|
-
client: Client
|
|
11
|
-
|
|
12
|
-
constructor(private cts: CommandClient) {
|
|
13
|
-
super()
|
|
14
|
-
this.client = cts.client
|
|
15
|
-
}
|
|
16
|
-
}
|
|
@@ -1,87 +0,0 @@
|
|
|
1
|
-
/*
|
|
2
|
-
* Copyright (c) 2022 pikokr. Licensed under the MIT license
|
|
3
|
-
*/
|
|
4
|
-
|
|
5
|
-
import { BuiltInModule } from './BuiltInModule'
|
|
6
|
-
import { argumentConverter } from '../command'
|
|
7
|
-
import { Client, GuildMember, Message, User, Role } from 'discord.js'
|
|
8
|
-
import { CommandClient } from '../structures'
|
|
9
|
-
|
|
10
|
-
export class BuiltinCommandConverters extends BuiltInModule {
|
|
11
|
-
client: Client
|
|
12
|
-
|
|
13
|
-
constructor(private cts: CommandClient) {
|
|
14
|
-
super()
|
|
15
|
-
this.client = cts.client
|
|
16
|
-
}
|
|
17
|
-
|
|
18
|
-
@argumentConverter(Message, false)
|
|
19
|
-
message(msg: Message) {
|
|
20
|
-
return msg
|
|
21
|
-
}
|
|
22
|
-
|
|
23
|
-
@argumentConverter(String)
|
|
24
|
-
string(msg: Message, arg: string) {
|
|
25
|
-
return arg
|
|
26
|
-
}
|
|
27
|
-
|
|
28
|
-
getUserIDByMention(mention: string): `${bigint}` | undefined {
|
|
29
|
-
if (!mention) return
|
|
30
|
-
if (mention.startsWith('<@') && mention.endsWith('>')) {
|
|
31
|
-
mention = mention.slice(2, -1)
|
|
32
|
-
if (mention.startsWith('!')) {
|
|
33
|
-
mention = mention.slice(1)
|
|
34
|
-
}
|
|
35
|
-
return mention as `${bigint}`
|
|
36
|
-
}
|
|
37
|
-
}
|
|
38
|
-
|
|
39
|
-
@argumentConverter(User)
|
|
40
|
-
user(msg: Message, value: string): User | null {
|
|
41
|
-
let user = this.client.users.cache.get(value)
|
|
42
|
-
if (user) return user
|
|
43
|
-
user = this.client.users.cache.find((x) => x.tag === value || x.username === value)
|
|
44
|
-
if (user) return user
|
|
45
|
-
const id = this.getUserIDByMention(value)
|
|
46
|
-
if (!id) return null
|
|
47
|
-
user = this.client.users.cache.get(id)
|
|
48
|
-
return user || null
|
|
49
|
-
}
|
|
50
|
-
|
|
51
|
-
@argumentConverter(GuildMember)
|
|
52
|
-
member(msg: Message, value: string): GuildMember | undefined {
|
|
53
|
-
let user = msg.guild?.members.cache.get(value)
|
|
54
|
-
if (!user) return user
|
|
55
|
-
user = msg.guild?.members.cache.find((x) => x.user.tag === value)
|
|
56
|
-
if (user) return user
|
|
57
|
-
const id = this.getUserIDByMention(value)
|
|
58
|
-
if (!id) return
|
|
59
|
-
user = msg.guild?.members.cache.get(id)
|
|
60
|
-
return user || undefined
|
|
61
|
-
}
|
|
62
|
-
|
|
63
|
-
@argumentConverter(Number)
|
|
64
|
-
number(msg: Message, value: string) {
|
|
65
|
-
const n = Number(value)
|
|
66
|
-
return isNaN(n) ? undefined : n
|
|
67
|
-
}
|
|
68
|
-
|
|
69
|
-
getRoleIDByMention(mention: string): `${bigint}` | undefined {
|
|
70
|
-
if (!mention) return
|
|
71
|
-
if (mention.startsWith('<@') && mention.endsWith('>')) {
|
|
72
|
-
mention = mention.slice(2, -1)
|
|
73
|
-
if (mention.startsWith('&')) {
|
|
74
|
-
mention = mention.slice(1)
|
|
75
|
-
}
|
|
76
|
-
return mention as `${bigint}`
|
|
77
|
-
}
|
|
78
|
-
}
|
|
79
|
-
|
|
80
|
-
@argumentConverter(Role)
|
|
81
|
-
role(msg: Message, value: string): Role | undefined {
|
|
82
|
-
const id = this.getRoleIDByMention(value)
|
|
83
|
-
if (!id) return
|
|
84
|
-
const role = msg.guild?.roles.cache.get(id)
|
|
85
|
-
return role || undefined
|
|
86
|
-
}
|
|
87
|
-
}
|