@pikokr/command.ts 3.0.0-dev.7170769 → 3.0.0-dev.85a29c3

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.
Files changed (83) hide show
  1. package/.prettierrc +2 -1
  2. package/README.md +3 -1
  3. package/dist/builtinModules/BuiltInModule.d.ts +4 -0
  4. package/dist/builtinModules/BuiltInModule.js +12 -0
  5. package/dist/builtinModules/BuiltinCommandConverters.d.ts +14 -0
  6. package/dist/builtinModules/BuiltinCommandConverters.js +89 -0
  7. package/dist/builtinModules/CommandHandler.d.ts +9 -0
  8. package/dist/builtinModules/CommandHandler.js +134 -0
  9. package/dist/builtinModules/index.d.ts +2 -0
  10. package/dist/builtinModules/index.js +14 -0
  11. package/dist/command/ArgumentConverter.d.ts +9 -0
  12. package/dist/command/ArgumentConverter.js +14 -0
  13. package/dist/command/Command.d.ts +14 -5
  14. package/dist/command/Command.js +9 -4
  15. package/dist/command/decorator.d.ts +11 -2
  16. package/dist/command/decorator.js +66 -10
  17. package/dist/command/index.d.ts +2 -0
  18. package/dist/command/index.js +2 -0
  19. package/dist/command/utils.d.ts +2 -0
  20. package/dist/command/utils.js +17 -0
  21. package/dist/constants.d.ts +7 -0
  22. package/dist/constants.js +9 -2
  23. package/dist/error/ArgumentConverterNotFound.d.ts +7 -0
  24. package/dist/error/ArgumentConverterNotFound.js +11 -0
  25. package/dist/error/ArgumentNotProvided.d.ts +8 -0
  26. package/dist/error/ArgumentNotProvided.js +12 -0
  27. package/dist/error/CommandCheckFailed.d.ts +7 -0
  28. package/dist/error/CommandCheckFailed.js +11 -0
  29. package/dist/error/CommandNotFound.d.ts +4 -0
  30. package/dist/error/CommandNotFound.js +10 -0
  31. package/dist/error/PermissionRequired.d.ts +10 -0
  32. package/dist/error/PermissionRequired.js +18 -0
  33. package/dist/error/index.d.ts +4 -0
  34. package/dist/error/index.js +4 -0
  35. package/dist/index.d.ts +3 -0
  36. package/dist/index.js +3 -0
  37. package/dist/listener/Listener.d.ts +5 -0
  38. package/dist/listener/Listener.js +10 -0
  39. package/dist/listener/decorator.d.ts +2 -0
  40. package/dist/listener/decorator.js +21 -0
  41. package/dist/listener/index.d.ts +2 -0
  42. package/dist/listener/index.js +14 -0
  43. package/dist/structures/CommandClient.d.ts +0 -1
  44. package/dist/structures/CommandClient.js +15 -38
  45. package/dist/structures/Module.d.ts +7 -0
  46. package/dist/structures/Module.js +13 -0
  47. package/dist/structures/Registry.d.ts +16 -6
  48. package/dist/structures/Registry.js +113 -22
  49. package/dist/structures/index.d.ts +2 -1
  50. package/dist/structures/index.js +2 -1
  51. package/dist/typings.d.ts +11 -0
  52. package/dist/typings.js +2 -0
  53. package/dist/utils.d.ts +1 -0
  54. package/dist/utils.js +10 -0
  55. package/package.json +3 -2
  56. package/src/builtinModules/BuiltInModule.ts +9 -0
  57. package/src/builtinModules/BuiltinCommandConverters.ts +56 -0
  58. package/src/builtinModules/CommandHandler.ts +120 -0
  59. package/src/builtinModules/index.ts +2 -0
  60. package/src/command/ArgumentConverter.ts +10 -0
  61. package/src/command/Command.ts +20 -5
  62. package/src/command/decorator.ts +84 -12
  63. package/src/command/index.ts +2 -0
  64. package/src/command/utils.ts +15 -0
  65. package/src/constants.ts +15 -1
  66. package/src/error/ArgumentConverterNotFound.ts +8 -0
  67. package/src/error/ArgumentNotProvided.ts +8 -0
  68. package/src/error/CommandCheckFailed.ts +8 -0
  69. package/src/error/CommandNotFound.ts +5 -0
  70. package/src/error/PermissionRequired.ts +13 -0
  71. package/src/error/index.ts +4 -0
  72. package/src/index.ts +3 -0
  73. package/src/listener/Listener.ts +3 -0
  74. package/src/listener/decorator.ts +25 -0
  75. package/src/listener/index.ts +2 -0
  76. package/src/structures/CommandClient.ts +10 -48
  77. package/src/structures/Module.ts +21 -0
  78. package/src/structures/Registry.ts +108 -19
  79. package/src/structures/index.ts +2 -1
  80. package/src/typings.ts +12 -0
  81. package/src/utils.ts +6 -0
  82. package/test/index.ts +5 -2
  83. package/test/modules/test.ts +44 -0
@@ -0,0 +1,10 @@
1
+ import { GuildMember, Permissions } from 'discord.js';
2
+ export declare class UserPermissionRequired extends Error {
3
+ user: GuildMember;
4
+ permissions: Permissions;
5
+ constructor(user: GuildMember, permissions: Permissions);
6
+ }
7
+ export declare class ClientPermissionRequired extends Error {
8
+ permissions: Permissions;
9
+ constructor(permissions: Permissions);
10
+ }
@@ -0,0 +1,18 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.ClientPermissionRequired = exports.UserPermissionRequired = void 0;
4
+ class UserPermissionRequired extends Error {
5
+ constructor(user, permissions) {
6
+ super();
7
+ this.user = user;
8
+ this.permissions = permissions;
9
+ }
10
+ }
11
+ exports.UserPermissionRequired = UserPermissionRequired;
12
+ class ClientPermissionRequired extends Error {
13
+ constructor(permissions) {
14
+ super();
15
+ this.permissions = permissions;
16
+ }
17
+ }
18
+ exports.ClientPermissionRequired = ClientPermissionRequired;
@@ -1,2 +1,6 @@
1
1
  export * from './InvalidTargetError';
2
2
  export * from './ModuleError';
3
+ export * from './ArgumentNotProvided';
4
+ export * from './ArgumentConverterNotFound';
5
+ export * from './CommandCheckFailed';
6
+ export * from './PermissionRequired';
@@ -12,3 +12,7 @@ var __exportStar = (this && this.__exportStar) || function(m, exports) {
12
12
  Object.defineProperty(exports, "__esModule", { value: true });
13
13
  __exportStar(require("./InvalidTargetError"), exports);
14
14
  __exportStar(require("./ModuleError"), exports);
15
+ __exportStar(require("./ArgumentNotProvided"), exports);
16
+ __exportStar(require("./ArgumentConverterNotFound"), exports);
17
+ __exportStar(require("./CommandCheckFailed"), exports);
18
+ __exportStar(require("./PermissionRequired"), exports);
package/dist/index.d.ts CHANGED
@@ -1,5 +1,8 @@
1
1
  import 'reflect-metadata';
2
+ import './typings';
2
3
  export * from './interface';
3
4
  export * from './structures';
4
5
  export * from './error';
5
6
  export * from './command';
7
+ export * from './listener';
8
+ export * from './builtinModules/BuiltInModule';
package/dist/index.js CHANGED
@@ -11,7 +11,10 @@ var __exportStar = (this && this.__exportStar) || function(m, exports) {
11
11
  };
12
12
  Object.defineProperty(exports, "__esModule", { value: true });
13
13
  require("reflect-metadata");
14
+ require("./typings");
14
15
  __exportStar(require("./interface"), exports);
15
16
  __exportStar(require("./structures"), exports);
16
17
  __exportStar(require("./error"), exports);
17
18
  __exportStar(require("./command"), exports);
19
+ __exportStar(require("./listener"), exports);
20
+ __exportStar(require("./builtinModules/BuiltInModule"), exports);
@@ -0,0 +1,5 @@
1
+ export declare class Listener {
2
+ name: string;
3
+ execute: Function;
4
+ constructor(name: string, execute: Function);
5
+ }
@@ -0,0 +1,10 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.Listener = void 0;
4
+ class Listener {
5
+ constructor(name, execute) {
6
+ this.name = name;
7
+ this.execute = execute;
8
+ }
9
+ }
10
+ exports.Listener = Listener;
@@ -0,0 +1,2 @@
1
+ import { Module } from '../structures';
2
+ export declare const listener: (event: string) => (target: Module, propertyKey: string) => void;
@@ -0,0 +1,21 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.listener = void 0;
4
+ const utils_1 = require("../utils");
5
+ const constants_1 = require("../constants");
6
+ const Listener_1 = require("./Listener");
7
+ const listener = (event) => {
8
+ return (target, propertyKey) => {
9
+ utils_1.checkTarget(target);
10
+ let properties = Reflect.getMetadata(constants_1.KListeners, target);
11
+ const listener = new Listener_1.Listener(event, Reflect.get(target, propertyKey));
12
+ if (properties) {
13
+ properties.push(listener);
14
+ }
15
+ else {
16
+ properties = [listener];
17
+ Reflect.defineMetadata(constants_1.KListeners, properties, target);
18
+ }
19
+ };
20
+ };
21
+ exports.listener = listener;
@@ -0,0 +1,2 @@
1
+ export * from './Listener';
2
+ export * from './decorator';
@@ -0,0 +1,14 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
5
+ }) : (function(o, m, k, k2) {
6
+ if (k2 === undefined) k2 = k;
7
+ o[k2] = m[k];
8
+ }));
9
+ var __exportStar = (this && this.__exportStar) || function(m, exports) {
10
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
11
+ };
12
+ Object.defineProperty(exports, "__esModule", { value: true });
13
+ __exportStar(require("./Listener"), exports);
14
+ __exportStar(require("./decorator"), exports);
@@ -16,7 +16,6 @@ export declare class CommandClient {
16
16
  owners: string[];
17
17
  registry: Registry;
18
18
  client: Client;
19
- private handle;
20
19
  private _isReady;
21
20
  private fetchOwners;
22
21
  ready(): Promise<void>;
@@ -27,6 +27,7 @@ exports.CommandClient = void 0;
27
27
  const lodash_1 = __importDefault(require("lodash"));
28
28
  const Registry_1 = require("./Registry");
29
29
  const discord_js_1 = require("discord.js");
30
+ const builtinModules_1 = require("../builtinModules");
30
31
  class CommandClient {
31
32
  constructor(_a) {
32
33
  var { client } = _a, options = __rest(_a, ["client"]);
@@ -40,54 +41,30 @@ class CommandClient {
40
41
  },
41
42
  owners: 'auto',
42
43
  });
43
- this.client.on('messageCreate', (msg) => this.handle(msg));
44
- this.client.once('ready', this.ready);
44
+ this.client.once('ready', () => this.ready());
45
+ this.registry.registerModule(new builtinModules_1.CommandHandler(this.registry));
46
+ this.registry.registerModule(new builtinModules_1.BuiltinCommandConverters(this));
45
47
  }
46
- handle(msg) {
48
+ fetchOwners() {
49
+ var _a, _b;
47
50
  return __awaiter(this, void 0, void 0, function* () {
48
- const prefixList = typeof this.options.command.prefix === 'string'
49
- ? this.options.command.prefix
50
- : typeof this.options.command.prefix === 'function'
51
- ? yield this.options.command.prefix(msg)
52
- : this.options.command.prefix;
53
- let prefix;
54
- if (typeof prefixList === 'object') {
55
- const res = prefixList.find((x) => msg.content.includes(x));
56
- if (!res)
57
- return;
58
- prefix = res;
59
- }
60
- else {
61
- if (!msg.content.includes(prefixList))
62
- return;
63
- prefix = prefixList;
64
- }
65
- const args = msg.content.slice(prefix.length).split(' ');
66
- const command = args.shift();
67
- if (!command)
68
- return;
69
- this.registry.commands;
70
- console.log(command);
71
- console.log(args);
51
+ yield ((_a = this.client.application) === null || _a === void 0 ? void 0 : _a.fetch());
52
+ const o = (_b = this.client.application) === null || _b === void 0 ? void 0 : _b.owner;
53
+ if (!o)
54
+ return [];
55
+ if (o instanceof discord_js_1.User)
56
+ return [o.id];
57
+ else
58
+ return o.members.map((x) => x.id);
72
59
  });
73
60
  }
74
- fetchOwners() {
75
- var _a;
76
- const o = (_a = this.client.application) === null || _a === void 0 ? void 0 : _a.owner;
77
- if (!o)
78
- return [];
79
- if (o instanceof discord_js_1.User)
80
- return [o.id];
81
- else
82
- return o.members.map((x) => x.id);
83
- }
84
61
  ready() {
85
62
  return __awaiter(this, void 0, void 0, function* () {
86
63
  if (this._isReady)
87
64
  return;
88
65
  this._isReady = true;
89
66
  if (this.options.owners === 'auto') {
90
- const owners = this.fetchOwners();
67
+ const owners = yield this.fetchOwners();
91
68
  this.owners.push(...owners);
92
69
  }
93
70
  });
@@ -1,4 +1,11 @@
1
+ import type { Command } from '../command';
2
+ import { Listener } from '../listener';
3
+ import { ArgumentConverter } from '../command';
1
4
  export declare abstract class Module {
5
+ get commands(): Command[];
6
+ get listeners(): Listener[];
7
+ get argumentConverters(): ArgumentConverter[];
8
+ get path(): string | undefined;
2
9
  load(): void;
3
10
  unload(): void;
4
11
  beforeReload(): void;
@@ -1,7 +1,20 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.Module = void 0;
4
+ const constants_1 = require("../constants");
4
5
  class Module {
6
+ get commands() {
7
+ return Reflect.getMetadata(constants_1.KCommands, this) || [];
8
+ }
9
+ get listeners() {
10
+ return Reflect.getMetadata(constants_1.KListeners, this) || [];
11
+ }
12
+ get argumentConverters() {
13
+ return Reflect.getMetadata(constants_1.KArgumentConverters, this) || [];
14
+ }
15
+ get path() {
16
+ return Reflect.getMetadata(constants_1.KModulePath, this);
17
+ }
5
18
  load() { }
6
19
  unload() { }
7
20
  beforeReload() { }
@@ -1,13 +1,23 @@
1
1
  import { CommandClient } from './CommandClient';
2
2
  import { Module } from './Module';
3
3
  import { Command } from '../command';
4
+ import { Collection } from 'discord.js';
5
+ import { ArgumentConverter } from '../command';
4
6
  export declare class Registry {
5
- private client;
7
+ client: CommandClient;
6
8
  constructor(client: CommandClient);
7
- modules: Module[];
9
+ modules: Collection<symbol, Module>;
8
10
  get commands(): Command[];
9
- registerModule(module: Module): void;
10
- loadModule(file: string, absolute?: boolean): void;
11
- unregisterModule(module: Module): void;
12
- unloadModule(module: Module): void;
11
+ get argumentConverters(): ArgumentConverter[];
12
+ registerModule(module: Module): Module;
13
+ loadModulesIn(dir: string, absolute?: boolean): Promise<void>;
14
+ loadModule(file: string, absolute?: boolean): Promise<Module>;
15
+ unregisterModule(module: Module): Promise<Module>;
16
+ unloadModule(module: Module): Promise<void>;
17
+ reloadModule(module: Module): Promise<boolean>;
18
+ reloadAll(): Promise<{
19
+ path: string;
20
+ success: boolean;
21
+ error?: Error | undefined;
22
+ }[]>;
13
23
  }
@@ -1,4 +1,13 @@
1
1
  "use strict";
2
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
3
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
4
+ return new (P || (P = Promise))(function (resolve, reject) {
5
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
6
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
7
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
8
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
9
+ });
10
+ };
2
11
  var __importDefault = (this && this.__importDefault) || function (mod) {
3
12
  return (mod && mod.__esModule) ? mod : { "default": mod };
4
13
  };
@@ -8,44 +17,126 @@ const Module_1 = require("./Module");
8
17
  const constants_1 = require("../constants");
9
18
  const path_1 = __importDefault(require("path"));
10
19
  const error_1 = require("../error");
20
+ const discord_js_1 = require("discord.js");
21
+ const walk_sync_1 = __importDefault(require("walk-sync"));
11
22
  class Registry {
12
23
  constructor(client) {
13
24
  this.client = client;
14
- this.modules = [];
25
+ this.modules = new discord_js_1.Collection();
15
26
  }
16
27
  get commands() {
17
28
  const result = [];
18
- for (const module of this.modules) {
19
- const commands = Reflect.getMetadata(constants_1.KCommands, module);
20
- result.push(...commands);
29
+ for (const [, module] of this.modules) {
30
+ result.push(...module.commands);
31
+ }
32
+ return result;
33
+ }
34
+ get argumentConverters() {
35
+ const result = [];
36
+ for (const [, module] of this.modules) {
37
+ result.push(...module.argumentConverters);
21
38
  }
22
39
  return result;
23
40
  }
24
41
  registerModule(module) {
25
- // TODO
42
+ this.modules.set(Symbol(module.constructor.name), module);
43
+ const list = [];
44
+ for (const listener of module.listeners) {
45
+ const bound = listener.execute.bind(module);
46
+ list.push({ event: listener.name, execute: bound });
47
+ this.client.client.on(listener.name, bound);
48
+ }
49
+ Reflect.defineMetadata(constants_1.KListenerExecuteCache, list, module);
50
+ return module;
51
+ }
52
+ loadModulesIn(dir, absolute = false) {
53
+ return __awaiter(this, void 0, void 0, function* () {
54
+ let p = absolute ? dir : path_1.default.join(require.main.path, dir);
55
+ for (const i of walk_sync_1.default(p)) {
56
+ yield this.loadModule(path_1.default.join(p, i), true);
57
+ }
58
+ });
26
59
  }
27
60
  loadModule(file, absolute = false) {
28
- let p = absolute ? file : path_1.default.join(require.main.path, file);
29
- let m;
30
- try {
31
- m = require(p);
32
- }
33
- catch (e) {
34
- throw new error_1.ModuleLoadError(p);
35
- }
36
- if (!m.install)
37
- throw new error_1.InvalidModuleError('Install function not found.');
38
- const mod = m.install();
39
- if (!(mod instanceof Module_1.Module))
40
- throw new error_1.InvalidTargetError();
41
- Reflect.defineMetadata(constants_1.KModulePath, require.resolve(p), mod);
42
- this.registerModule(m);
61
+ return __awaiter(this, void 0, void 0, function* () {
62
+ let p = absolute ? file : path_1.default.join(require.main.path, file);
63
+ let m;
64
+ try {
65
+ m = require(p);
66
+ }
67
+ catch (e) {
68
+ throw new error_1.ModuleLoadError(p);
69
+ }
70
+ if (m.loaded)
71
+ throw new Error('MODULE_ALREADY_LOADED');
72
+ if (!m.install)
73
+ throw new error_1.InvalidModuleError('Install function not found.');
74
+ const mod = m.install(this.client);
75
+ if (!(mod instanceof Module_1.Module))
76
+ throw new error_1.InvalidTargetError();
77
+ Reflect.defineMetadata(constants_1.KModulePath, require.resolve(p), mod);
78
+ this.registerModule(mod);
79
+ yield mod.load();
80
+ m.loaded = true;
81
+ return mod;
82
+ });
43
83
  }
44
84
  unregisterModule(module) {
45
- // TODO
85
+ return __awaiter(this, void 0, void 0, function* () {
86
+ if (Reflect.getMetadata(constants_1.KBuiltInModule, module))
87
+ throw new Error('Built-in modules cannot be unloaded');
88
+ const symbol = this.modules.findKey((x) => x === module);
89
+ if (!symbol)
90
+ return module;
91
+ yield module.unload();
92
+ const list = Reflect.getMetadata(constants_1.KListenerExecuteCache, module);
93
+ for (const listener of list) {
94
+ this.client.client.removeListener(listener.event, listener.execute);
95
+ }
96
+ this.modules.delete(symbol);
97
+ return module;
98
+ });
46
99
  }
47
100
  unloadModule(module) {
48
- // TODO
101
+ return __awaiter(this, void 0, void 0, function* () {
102
+ const p = Reflect.getMetadata(constants_1.KModulePath, module);
103
+ if (!p)
104
+ throw new error_1.InvalidModuleError('This module is not loaded by loadModule.');
105
+ yield this.unregisterModule(module);
106
+ delete require.cache[p];
107
+ });
108
+ }
109
+ reloadModule(module) {
110
+ return __awaiter(this, void 0, void 0, function* () {
111
+ yield module.beforeReload();
112
+ const p = Reflect.getMetadata(constants_1.KModulePath, module);
113
+ yield this.unloadModule(module);
114
+ const mod = yield this.loadModule(p, true);
115
+ yield mod.afterReload();
116
+ return true;
117
+ });
118
+ }
119
+ reloadAll() {
120
+ return __awaiter(this, void 0, void 0, function* () {
121
+ const results = [];
122
+ for (const [, module] of this.modules.filter((x) => !!x.path)) {
123
+ try {
124
+ yield this.reloadModule(module);
125
+ results.push({
126
+ path: module.path,
127
+ success: false,
128
+ });
129
+ }
130
+ catch (e) {
131
+ results.push({
132
+ error: e,
133
+ path: module.path,
134
+ success: false,
135
+ });
136
+ }
137
+ }
138
+ return results;
139
+ });
49
140
  }
50
141
  }
51
142
  exports.Registry = Registry;
@@ -1,2 +1,3 @@
1
- export * from './CommandClient';
2
1
  export * from './Module';
2
+ export * from './CommandClient';
3
+ export * from './Registry';
@@ -10,5 +10,6 @@ var __exportStar = (this && this.__exportStar) || function(m, exports) {
10
10
  for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
11
11
  };
12
12
  Object.defineProperty(exports, "__esModule", { value: true });
13
- __exportStar(require("./CommandClient"), exports);
14
13
  __exportStar(require("./Module"), exports);
14
+ __exportStar(require("./CommandClient"), exports);
15
+ __exportStar(require("./Registry"), exports);
@@ -0,0 +1,11 @@
1
+ import type { Command } from './command';
2
+ import { CommandClient } from './structures';
3
+ declare module 'discord.js' {
4
+ interface Message {
5
+ data: {
6
+ command: Command;
7
+ prefix: string;
8
+ cts: CommandClient;
9
+ };
10
+ }
11
+ }
@@ -0,0 +1,2 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
@@ -0,0 +1 @@
1
+ export declare const checkTarget: (target: Object) => void;
package/dist/utils.js ADDED
@@ -0,0 +1,10 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.checkTarget = void 0;
4
+ const structures_1 = require("./structures");
5
+ const error_1 = require("./error");
6
+ const checkTarget = (target) => {
7
+ if (!(target instanceof structures_1.Module))
8
+ throw new error_1.InvalidTargetError();
9
+ };
10
+ exports.checkTarget = checkTarget;
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@pikokr/command.ts",
3
3
  "description": "Discord.js command framework for typescript.",
4
- "version": "3.0.0-dev.7170769",
4
+ "version": "3.0.0-dev.85a29c3",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",
7
7
  "license": "MIT",
@@ -16,7 +16,8 @@
16
16
  "@types/node": "^14.14.37",
17
17
  "lodash": "^4.17.21",
18
18
  "reflect-metadata": "^0.1.13",
19
- "typescript": "^4.2.3"
19
+ "typescript": "^4.2.3",
20
+ "walk-sync": "^3.0.0"
20
21
  },
21
22
  "repository": {
22
23
  "type": "git",
@@ -0,0 +1,9 @@
1
+ import { Module } from '../structures'
2
+ import { KBuiltInModule } from '../constants'
3
+
4
+ export class BuiltInModule extends Module {
5
+ constructor() {
6
+ super()
7
+ Reflect.defineMetadata(KBuiltInModule, true, this)
8
+ }
9
+ }
@@ -0,0 +1,56 @@
1
+ import { BuiltInModule } from './BuiltInModule'
2
+ import { argumentConverter } from '../command'
3
+ import { Client, GuildMember, Message, User } from 'discord.js'
4
+ import { CommandClient } from '../structures'
5
+
6
+ export class BuiltinCommandConverters extends BuiltInModule {
7
+ client: Client
8
+
9
+ constructor(private cts: CommandClient) {
10
+ super()
11
+ this.client = cts.client
12
+ }
13
+
14
+ @argumentConverter(Message, false)
15
+ message(msg: Message) {
16
+ return msg
17
+ }
18
+
19
+ @argumentConverter(String)
20
+ string(msg: Message, arg: string) {
21
+ return arg
22
+ }
23
+
24
+ getUserIDByMention(mention: string): `${bigint}` | undefined {
25
+ if (!mention) return
26
+ if (mention.startsWith('<@') && mention.endsWith('>')) {
27
+ mention = mention.slice(2, -1)
28
+ if (mention.startsWith('!')) {
29
+ mention = mention.slice(1)
30
+ }
31
+ return mention as `${bigint}`
32
+ }
33
+ }
34
+
35
+ @argumentConverter(User)
36
+ user(value: string): User | null {
37
+ const id = this.getUserIDByMention(value)
38
+ if (!id) return null
39
+ const user = this.client.users.cache.get(id)
40
+ return user || null
41
+ }
42
+
43
+ @argumentConverter(GuildMember)
44
+ member(value: string, msg: Message): GuildMember | undefined {
45
+ const id = this.getUserIDByMention(value)
46
+ if (!id) return
47
+ const user = msg.guild?.members.cache.get(id)
48
+ return user || undefined
49
+ }
50
+
51
+ @argumentConverter(Number)
52
+ number(value: string) {
53
+ const n = Number(value)
54
+ return isNaN(n) ? undefined : n
55
+ }
56
+ }