@open-discord-bots/framework 0.0.1 → 0.0.2

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 (103) hide show
  1. package/LICENSE.md +713 -0
  2. package/README.md +104 -0
  3. package/dist/api/api.d.ts +26 -0
  4. package/dist/api/api.js +44 -0
  5. package/dist/api/main.d.ts +133 -0
  6. package/dist/api/main.js +87 -0
  7. package/dist/api/modules/action.d.ts +34 -0
  8. package/dist/api/modules/action.js +58 -0
  9. package/dist/api/modules/base.d.ts +329 -0
  10. package/dist/api/modules/base.js +804 -0
  11. package/dist/api/modules/builder.d.ts +647 -0
  12. package/dist/api/modules/builder.js +1441 -0
  13. package/dist/api/modules/checker.d.ts +648 -0
  14. package/dist/api/modules/checker.js +1324 -0
  15. package/dist/api/modules/client.d.ts +768 -0
  16. package/dist/api/modules/client.js +1859 -0
  17. package/dist/api/modules/code.d.ts +33 -0
  18. package/dist/api/modules/code.js +57 -0
  19. package/dist/api/modules/config.d.ts +70 -0
  20. package/dist/api/modules/config.js +206 -0
  21. package/dist/api/modules/console.d.ts +305 -0
  22. package/dist/api/modules/console.js +598 -0
  23. package/dist/api/modules/cooldown.d.ts +138 -0
  24. package/dist/api/modules/cooldown.js +359 -0
  25. package/dist/api/modules/database.d.ts +135 -0
  26. package/dist/api/modules/database.js +271 -0
  27. package/dist/api/modules/event.d.ts +43 -0
  28. package/dist/api/modules/event.js +100 -0
  29. package/dist/api/modules/flag.d.ts +40 -0
  30. package/dist/api/modules/flag.js +72 -0
  31. package/dist/api/modules/fuse.d.ts +218 -0
  32. package/dist/api/modules/fuse.js +123 -0
  33. package/dist/api/modules/helpmenu.d.ts +106 -0
  34. package/dist/api/modules/helpmenu.js +167 -0
  35. package/dist/api/modules/language.d.ts +85 -0
  36. package/dist/api/modules/language.js +195 -0
  37. package/dist/api/modules/permission.d.ts +121 -0
  38. package/dist/api/modules/permission.js +314 -0
  39. package/dist/api/modules/plugin.d.ts +128 -0
  40. package/dist/api/modules/plugin.js +168 -0
  41. package/dist/api/modules/post.d.ts +44 -0
  42. package/dist/api/modules/post.js +92 -0
  43. package/dist/api/modules/progressbar.d.ts +108 -0
  44. package/dist/api/modules/progressbar.js +233 -0
  45. package/dist/api/modules/responder.d.ts +506 -0
  46. package/dist/api/modules/responder.js +1468 -0
  47. package/dist/api/modules/session.d.ts +58 -0
  48. package/dist/api/modules/session.js +171 -0
  49. package/dist/api/modules/startscreen.d.ts +165 -0
  50. package/dist/api/modules/startscreen.js +293 -0
  51. package/dist/api/modules/stat.d.ts +142 -0
  52. package/dist/api/modules/stat.js +293 -0
  53. package/dist/api/modules/verifybar.d.ts +54 -0
  54. package/dist/api/modules/verifybar.js +60 -0
  55. package/dist/api/modules/worker.d.ts +41 -0
  56. package/dist/api/modules/worker.js +93 -0
  57. package/dist/api/utils.d.ts +61 -0
  58. package/dist/api/utils.js +254 -0
  59. package/dist/index.d.ts +4 -1
  60. package/dist/index.js +40 -0
  61. package/dist/startup/dump.d.ts +14 -0
  62. package/dist/startup/dump.js +79 -0
  63. package/dist/startup/errorHandling.d.ts +2 -0
  64. package/dist/startup/errorHandling.js +43 -0
  65. package/dist/startup/pluginLauncher.d.ts +2 -0
  66. package/dist/startup/pluginLauncher.js +202 -0
  67. package/package.json +9 -3
  68. package/src/api/api.ts +29 -0
  69. package/src/api/main.ts +189 -0
  70. package/src/api/modules/action.ts +58 -0
  71. package/src/api/modules/base.ts +811 -0
  72. package/src/api/modules/builder.ts +1554 -0
  73. package/src/api/modules/checker.ts +1549 -0
  74. package/src/api/modules/client.ts +2247 -0
  75. package/src/api/modules/code.ts +58 -0
  76. package/src/api/modules/config.ts +159 -0
  77. package/src/api/modules/console.ts +665 -0
  78. package/src/api/modules/cooldown.ts +348 -0
  79. package/src/api/modules/database.ts +278 -0
  80. package/src/api/modules/event.ts +99 -0
  81. package/src/api/modules/flag.ts +73 -0
  82. package/src/api/modules/fuse.ts +348 -0
  83. package/src/api/modules/helpmenu.ts +216 -0
  84. package/src/api/modules/language.ts +201 -0
  85. package/src/api/modules/permission.ts +340 -0
  86. package/src/api/modules/plugin.ts +242 -0
  87. package/src/api/modules/post.ts +90 -0
  88. package/src/api/modules/progressbar.ts +232 -0
  89. package/src/api/modules/responder.ts +1420 -0
  90. package/src/api/modules/session.ts +155 -0
  91. package/src/api/modules/startscreen.ts +320 -0
  92. package/src/api/modules/stat.ts +313 -0
  93. package/src/api/modules/verifybar.ts +61 -0
  94. package/src/api/modules/worker.ts +93 -0
  95. package/src/api/utils.ts +206 -0
  96. package/src/cli/cli.ts +151 -0
  97. package/src/cli/editConfig.ts +943 -0
  98. package/src/index.ts +6 -1
  99. package/src/startup/compilation.ts +186 -0
  100. package/src/startup/dump.ts +45 -0
  101. package/src/startup/errorHandling.ts +38 -0
  102. package/src/startup/pluginLauncher.ts +261 -0
  103. package/LICENSE +0 -21
@@ -0,0 +1,85 @@
1
+ import { ODManager, ODManagerData, ODPromiseVoid, ODValidId } from "./base";
2
+ import { ODDebugger } from "./console";
3
+ /**## ODLanguageMetadata `interface`
4
+ * This interface contains all metadata available in the language files.
5
+ */
6
+ export interface ODLanguageMetadata {
7
+ /**The version of Open Discord this translation is made for. */
8
+ otversion: string;
9
+ /**The name of the language in english (with capital letter). */
10
+ language: string;
11
+ /**A list of translators (discord/github username) who've contributed to this language. */
12
+ translators: string[];
13
+ /**The last date that this translation has been modified (format: DD/MM/YYYY) */
14
+ lastedited: string;
15
+ /**When `true`, the translator made use of some sort of automation while creating the translation. (e.g. ChatGPT, Google Translate, DeepL, ...) */
16
+ automated: boolean;
17
+ }
18
+ /**## ODLanguageManager `class`
19
+ * This is an Open Discord language manager.
20
+ *
21
+ * It manages all languages in the bot and manages translation for you!
22
+ * Get a translation via the `getTranslation()` or `getTranslationWithParams()` methods.
23
+ *
24
+ * Add new languages using the `ODlanguage` class in your plugin!
25
+ */
26
+ export declare class ODLanguageManager extends ODManager<ODLanguage> {
27
+ #private;
28
+ /**The currently selected language. */
29
+ current: ODLanguage | null;
30
+ /**The currently selected backup language. (used when translation missing in current language) */
31
+ backup: ODLanguage | null;
32
+ constructor(debug: ODDebugger, presets: boolean);
33
+ /**Set the current language by providing the ID of a language which is registered in this manager. */
34
+ setCurrentLanguage(id: ODValidId): void;
35
+ /**Get the current language (same as `this.current`) */
36
+ getCurrentLanguage(): ODLanguage | null;
37
+ /**Set the backup language by providing the ID of a language which is registered in this manager. */
38
+ setBackupLanguage(id: ODValidId): void;
39
+ /**Get the backup language (same as `this.backup`) */
40
+ getBackupLanguage(): ODLanguage | null;
41
+ /**Get the metadata of the current/backup language. */
42
+ getLanguageMetadata(frombackup?: boolean): ODLanguageMetadata | null;
43
+ /**Get the ID (string) of the current language. (Not backup language) */
44
+ getCurrentLanguageId(): string;
45
+ /**Get a translation string by JSON location. (e.g. `"checker.system.typeError"`) */
46
+ getTranslation(id: string): string | null;
47
+ /**Get a backup translation string by JSON location and replace `{0}`,`{1}`,`{2}`,... with the provided parameters. */
48
+ getTranslationWithParams(id: string, params: string[]): string | null;
49
+ /**Init all language files. */
50
+ init(): Promise<void>;
51
+ }
52
+ /**## ODLanguage `class`
53
+ * This is an Open Discord language file.
54
+ *
55
+ * It contains metadata and all translation strings available in this language.
56
+ * Register this class to an `ODLanguageManager` to use it!
57
+ *
58
+ * JSON languages should be created using the `ODJsonLanguage` class instead!
59
+ */
60
+ export declare class ODLanguage extends ODManagerData {
61
+ /**The name of the file with extension. */
62
+ file: string;
63
+ /**The path to the file relative to the main directory. */
64
+ path: string;
65
+ /**The raw object data of the translation. */
66
+ data: any;
67
+ /**The metadata of the language if available. */
68
+ metadata: ODLanguageMetadata | null;
69
+ constructor(id: ODValidId, data: any);
70
+ /**Init the language. */
71
+ init(): ODPromiseVoid;
72
+ }
73
+ /**## ODJsonLanguage `class`
74
+ * This is an Open Discord JSON language file.
75
+ *
76
+ * It contains metadata and all translation strings from a certain JSON file (in `./languages/`).
77
+ * Register this class to an `ODLanguageManager` to use it!
78
+ *
79
+ * Use the `ODLanguage` class to use translations from non-JSON files!
80
+ */
81
+ export declare class ODJsonLanguage extends ODLanguage {
82
+ constructor(id: ODValidId, file: string, customPath?: string);
83
+ /**Init the langauge. */
84
+ init(): ODPromiseVoid;
85
+ }
@@ -0,0 +1,195 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.ODJsonLanguage = exports.ODLanguage = exports.ODLanguageManager = void 0;
7
+ ///////////////////////////////////////
8
+ //LANGUAGE MODULE
9
+ ///////////////////////////////////////
10
+ const base_1 = require("./base");
11
+ const path_1 = __importDefault(require("path"));
12
+ const fs_1 = __importDefault(require("fs"));
13
+ /**## ODLanguageManager `class`
14
+ * This is an Open Discord language manager.
15
+ *
16
+ * It manages all languages in the bot and manages translation for you!
17
+ * Get a translation via the `getTranslation()` or `getTranslationWithParams()` methods.
18
+ *
19
+ * Add new languages using the `ODlanguage` class in your plugin!
20
+ */
21
+ class ODLanguageManager extends base_1.ODManager {
22
+ /**The currently selected language. */
23
+ current = null;
24
+ /**The currently selected backup language. (used when translation missing in current language) */
25
+ backup = null;
26
+ /**An alias to Open Discord debugger. */
27
+ #debug;
28
+ constructor(debug, presets) {
29
+ super(debug, "language");
30
+ if (presets)
31
+ this.add(new ODLanguage("english", "english.json"));
32
+ this.current = presets ? new ODLanguage("english", "english.json") : null;
33
+ this.backup = presets ? new ODLanguage("english", "english.json") : null;
34
+ this.#debug = debug;
35
+ }
36
+ /**Set the current language by providing the ID of a language which is registered in this manager. */
37
+ setCurrentLanguage(id) {
38
+ this.current = this.get(id);
39
+ const languageId = this.current?.id.value ?? "<unknown-id>";
40
+ const languageAutomated = this.current?.metadata?.automated.toString() ?? "<unknown-metadata>";
41
+ this.#debug.debug("Selected current language", [
42
+ { key: "id", value: languageId },
43
+ { key: "automated", value: languageAutomated },
44
+ ]);
45
+ }
46
+ /**Get the current language (same as `this.current`) */
47
+ getCurrentLanguage() {
48
+ return (this.current) ? this.current : null;
49
+ }
50
+ /**Set the backup language by providing the ID of a language which is registered in this manager. */
51
+ setBackupLanguage(id) {
52
+ this.backup = this.get(id);
53
+ const languageId = this.backup?.id.value ?? "<unknown-id>";
54
+ const languageAutomated = this.backup?.metadata?.automated.toString() ?? "<unknown-metadata>";
55
+ this.#debug.debug("Selected backup language", [
56
+ { key: "id", value: languageId },
57
+ { key: "automated", value: languageAutomated },
58
+ ]);
59
+ }
60
+ /**Get the backup language (same as `this.backup`) */
61
+ getBackupLanguage() {
62
+ return (this.backup) ? this.backup : null;
63
+ }
64
+ /**Get the metadata of the current/backup language. */
65
+ getLanguageMetadata(frombackup) {
66
+ if (frombackup)
67
+ return (this.backup) ? this.backup.metadata : null;
68
+ return (this.current) ? this.current.metadata : null;
69
+ }
70
+ /**Get the ID (string) of the current language. (Not backup language) */
71
+ getCurrentLanguageId() {
72
+ return (this.current) ? this.current.id.value : "";
73
+ }
74
+ /**Get a translation string by JSON location. (e.g. `"checker.system.typeError"`) */
75
+ getTranslation(id) {
76
+ if (!this.current)
77
+ return this.#getBackupTranslation(id);
78
+ const splitted = id.split(".");
79
+ let currentObject = this.current.data;
80
+ let result = false;
81
+ splitted.forEach((id) => {
82
+ if (typeof currentObject[id] == "object") {
83
+ currentObject = currentObject[id];
84
+ }
85
+ else if (typeof currentObject[id] == "string") {
86
+ result = currentObject[id];
87
+ }
88
+ });
89
+ if (typeof result == "string")
90
+ return result;
91
+ else
92
+ return this.#getBackupTranslation(id);
93
+ }
94
+ /**Get a backup translation string by JSON location. (system only) */
95
+ #getBackupTranslation(id) {
96
+ if (!this.backup)
97
+ return null;
98
+ const splitted = id.split(".");
99
+ let currentObject = this.backup.data;
100
+ let result = false;
101
+ splitted.forEach((id) => {
102
+ if (typeof currentObject[id] == "object") {
103
+ currentObject = currentObject[id];
104
+ }
105
+ else if (typeof currentObject[id] == "string") {
106
+ result = currentObject[id];
107
+ }
108
+ });
109
+ if (typeof result == "string")
110
+ return result;
111
+ else
112
+ return null;
113
+ }
114
+ /**Get a backup translation string by JSON location and replace `{0}`,`{1}`,`{2}`,... with the provided parameters. */
115
+ getTranslationWithParams(id, params) {
116
+ let translation = this.getTranslation(id);
117
+ if (!translation)
118
+ return translation;
119
+ params.forEach((value, index) => {
120
+ if (!translation)
121
+ return;
122
+ translation = translation.replace(`{${index}}`, value);
123
+ });
124
+ return translation;
125
+ }
126
+ /**Init all language files. */
127
+ async init() {
128
+ for (const language of this.getAll()) {
129
+ try {
130
+ await language.init();
131
+ }
132
+ catch (err) {
133
+ process.emit("uncaughtException", new base_1.ODSystemError(err));
134
+ }
135
+ }
136
+ }
137
+ }
138
+ exports.ODLanguageManager = ODLanguageManager;
139
+ /**## ODLanguage `class`
140
+ * This is an Open Discord language file.
141
+ *
142
+ * It contains metadata and all translation strings available in this language.
143
+ * Register this class to an `ODLanguageManager` to use it!
144
+ *
145
+ * JSON languages should be created using the `ODJsonLanguage` class instead!
146
+ */
147
+ class ODLanguage extends base_1.ODManagerData {
148
+ /**The name of the file with extension. */
149
+ file = "";
150
+ /**The path to the file relative to the main directory. */
151
+ path = "";
152
+ /**The raw object data of the translation. */
153
+ data;
154
+ /**The metadata of the language if available. */
155
+ metadata = null;
156
+ constructor(id, data) {
157
+ super(id);
158
+ this.data = data;
159
+ }
160
+ /**Init the language. */
161
+ init() {
162
+ //nothing
163
+ }
164
+ }
165
+ exports.ODLanguage = ODLanguage;
166
+ /**## ODJsonLanguage `class`
167
+ * This is an Open Discord JSON language file.
168
+ *
169
+ * It contains metadata and all translation strings from a certain JSON file (in `./languages/`).
170
+ * Register this class to an `ODLanguageManager` to use it!
171
+ *
172
+ * Use the `ODLanguage` class to use translations from non-JSON files!
173
+ */
174
+ class ODJsonLanguage extends ODLanguage {
175
+ constructor(id, file, customPath) {
176
+ super(id, {});
177
+ this.file = (file.endsWith(".json")) ? file : file + ".json";
178
+ this.path = customPath ? path_1.default.join("./", customPath, this.file) : path_1.default.join("./languages/", this.file);
179
+ }
180
+ /**Init the langauge. */
181
+ init() {
182
+ if (!fs_1.default.existsSync(this.path))
183
+ throw new base_1.ODSystemError("Unable to parse language \"" + path_1.default.join("./", this.path) + "\", the file doesn't exist!");
184
+ try {
185
+ this.data = JSON.parse(fs_1.default.readFileSync(this.path).toString());
186
+ }
187
+ catch (err) {
188
+ process.emit("uncaughtException", err);
189
+ throw new base_1.ODSystemError("Unable to parse language \"" + path_1.default.join("./", this.path) + "\"!");
190
+ }
191
+ if (this.data["_TRANSLATION"])
192
+ this.metadata = this.data["_TRANSLATION"];
193
+ }
194
+ }
195
+ exports.ODJsonLanguage = ODJsonLanguage;
@@ -0,0 +1,121 @@
1
+ import { ODValidId, ODManager, ODManagerData } from "./base";
2
+ import * as discord from "discord.js";
3
+ import { ODDebugger } from "./console";
4
+ import { ODClientManager } from "./client";
5
+ /**## ODPermissionType `type`
6
+ * All available permission types/levels. Can be used in the `ODPermission` class.
7
+ */
8
+ export type ODPermissionType = "member" | "support" | "moderator" | "admin" | "owner" | "developer";
9
+ /**## ODPermissionScope `type`
10
+ * The scope in which a certain permission is active.
11
+ */
12
+ export type ODPermissionScope = "global-user" | "channel-user" | "global-role" | "channel-role";
13
+ /**## ODPermissionResult `interface`
14
+ * The result returned by `ODPermissionManager.getPermissions()`.
15
+ */
16
+ export interface ODPermissionResult {
17
+ /**The permission type. */
18
+ type: ODPermissionType;
19
+ /**The permission scope. */
20
+ scope: ODPermissionScope | "default";
21
+ /**The highest level available for this scope. */
22
+ level: ODPermissionLevel;
23
+ /**The permission which returned this level. */
24
+ source: ODPermission | null;
25
+ }
26
+ /**## ODPermissionLevel `enum`
27
+ * All available permission types/levels. But as `enum` instead of `type`. Used to calculate the level.
28
+ */
29
+ export declare enum ODPermissionLevel {
30
+ /**A normal member. (Default for everyone) */
31
+ member = 0,
32
+ /**Support team. Higher than a normal member. (Used for ticket-admins) */
33
+ support = 1,
34
+ /**Moderator. Higher than the support team. (Unused) */
35
+ moderator = 2,
36
+ /**Admin. Higher than a moderator. (Used for global-admins) */
37
+ admin = 3,
38
+ /**Server owner. (Able to use all commands including `/stats reset`) */
39
+ owner = 4,
40
+ /**Bot owner or all users from dev team. (Able to use all commands including `/stats reset`) */
41
+ developer = 5
42
+ }
43
+ /**## ODPermission `class`
44
+ * This is an Open Discord permission.
45
+ *
46
+ * It defines a single permission level for a specific scope (global/channel & user/role)
47
+ * These permissions only apply to commands & interactions.
48
+ * They are not related to channel permissions in the ticket system.
49
+ *
50
+ * Register this class to an `ODPermissionManager` to use it!
51
+ */
52
+ export declare class ODPermission extends ODManagerData {
53
+ /**The scope of this permission. */
54
+ readonly scope: ODPermissionScope;
55
+ /**The type/level of this permission. */
56
+ readonly permission: ODPermissionType;
57
+ /**The user/role of this permission. */
58
+ readonly value: discord.Role | discord.User;
59
+ /**The channel that this permission applies to. (`null` when global) */
60
+ readonly channel: discord.Channel | null;
61
+ constructor(id: ODValidId, scope: "global-user", permission: ODPermissionType, value: discord.User);
62
+ constructor(id: ODValidId, scope: "global-role", permission: ODPermissionType, value: discord.Role);
63
+ constructor(id: ODValidId, scope: "channel-user", permission: ODPermissionType, value: discord.User, channel: discord.Channel);
64
+ constructor(id: ODValidId, scope: "channel-role", permission: ODPermissionType, value: discord.Role, channel: discord.Channel);
65
+ }
66
+ /**## ODPermissionSettings `interface`
67
+ * Optional settings for the `getPermissions()` method in the `ODPermissionManager`.
68
+ */
69
+ export interface ODPermissionSettings {
70
+ /**Include permissions from the global user scope. */
71
+ allowGlobalUserScope?: boolean;
72
+ /**Include permissions from the global role scope. */
73
+ allowGlobalRoleScope?: boolean;
74
+ /**Include permissions from the channel user scope. */
75
+ allowChannelUserScope?: boolean;
76
+ /**Include permissions from the channel role scope. */
77
+ allowChannelRoleScope?: boolean;
78
+ /**Only include permissions of which the id matches this regex. */
79
+ idRegex?: RegExp;
80
+ }
81
+ /**## ODPermissionCalculationCallback `type`
82
+ * The callback of the permission calculation. (Used in `ODPermissionManager`)
83
+ */
84
+ export type ODPermissionCalculationCallback = (user: discord.User, channel?: discord.Channel | null, guild?: discord.Guild | null, settings?: ODPermissionSettings | null) => Promise<ODPermissionResult>;
85
+ /**## ODPermissionCommandResult `type`
86
+ * The result of calculating permissions for a command.
87
+ */
88
+ export type ODPermissionCommandResult = {
89
+ /**Returns `true` when the user has valid permissions. */
90
+ hasPerms: false;
91
+ reason: "no-perms" | "disabled" | "not-in-server";
92
+ } | {
93
+ /**Returns `true` when the user has valid permissions. */
94
+ hasPerms: true;
95
+ /**Is the user a server admin or a normal member? This does not decide if the user has permissions or not. */
96
+ isAdmin: boolean;
97
+ };
98
+ /**## ODPermissionManager `class`
99
+ * This is an Open Discord permission manager.
100
+ *
101
+ * It manages all permissions in the bot!
102
+ * Use the `getPermissions()` and `hasPermissions()` methods to get user perms.
103
+ *
104
+ * Add new permissions using the `ODPermission` class in your plugin!
105
+ */
106
+ export declare class ODPermissionManager extends ODManager<ODPermission> {
107
+ #private;
108
+ /**The result which is returned when no other permissions match. (`member` by default) */
109
+ defaultResult: ODPermissionResult;
110
+ constructor(debug: ODDebugger, client: ODClientManager, useDefaultCalculation?: boolean);
111
+ /**Edit the permission calculation function in this manager. */
112
+ setCalculation(calculation: ODPermissionCalculationCallback): void;
113
+ /**Edit the result which is returned when no other permissions match. (`member` by default) */
114
+ setDefaultResult(result: ODPermissionResult): void;
115
+ /**Get an `ODPermissionResult` based on a few context factors. Use `hasPermissions()` to simplify the result. */
116
+ getPermissions(user: discord.User, channel?: discord.Channel | null, guild?: discord.Guild | null, settings?: ODPermissionSettings | null): Promise<ODPermissionResult>;
117
+ /**Simplifies the `ODPermissionResult` returned from `getPermissions()` and returns a boolean to check if the user matches the required permissions. */
118
+ hasPermissions(minimum: ODPermissionType, data: ODPermissionResult): boolean;
119
+ /**Check the permissions for a certain command of the bot. */
120
+ checkCommandPerms(permissionMode: string, requiredLevel: ODPermissionType, user: discord.User, member?: discord.GuildMember | null, channel?: discord.Channel | null, guild?: discord.Guild | null, settings?: ODPermissionSettings): Promise<ODPermissionCommandResult>;
121
+ }