zumito-framework 1.1.45 → 1.1.47

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 (55) hide show
  1. package/dist/TranslationManager.d.ts +15 -15
  2. package/dist/TranslationManager.js +41 -41
  3. package/dist/ZumitoFramework.d.ts +51 -51
  4. package/dist/ZumitoFramework.js +312 -312
  5. package/dist/baseModule/BaseModule.d.ts +6 -6
  6. package/dist/baseModule/BaseModule.js +16 -16
  7. package/dist/baseModule/events/discord/interactionCreate.d.ts +6 -6
  8. package/dist/baseModule/events/discord/interactionCreate.js +50 -50
  9. package/dist/baseModule/events/discord/messageCreate.d.ts +16 -16
  10. package/dist/baseModule/events/discord/messageCreate.js +233 -233
  11. package/dist/baseModule/index.d.ts +6 -6
  12. package/dist/baseModule/index.js +15 -15
  13. package/dist/baseModule/models/errors.json +13 -13
  14. package/dist/baseModule/models/guild.json +22 -22
  15. package/dist/definitions/ApiResponse.d.ts +4 -4
  16. package/dist/definitions/ApiResponse.js +16 -16
  17. package/dist/index.d.ts +17 -17
  18. package/dist/index.js +12 -12
  19. package/dist/managers/EmojiManager.d.ts +11 -11
  20. package/dist/managers/EmojiManager.js +32 -32
  21. package/dist/types/Command.d.ts +24 -24
  22. package/dist/types/Command.js +25 -25
  23. package/dist/types/CommandArgDefinition.d.ts +7 -7
  24. package/dist/types/CommandArgDefinition.js +1 -1
  25. package/dist/types/CommandArguments.d.ts +8 -8
  26. package/dist/types/CommandArguments.js +15 -15
  27. package/dist/types/CommandChoiceDefinition.d.ts +4 -4
  28. package/dist/types/CommandChoiceDefinition.js +1 -1
  29. package/dist/types/CommandParameters.d.ts +18 -18
  30. package/dist/types/CommandParameters.js +1 -1
  31. package/dist/types/CommandType.d.ts +6 -6
  32. package/dist/types/CommandType.js +6 -6
  33. package/dist/types/Commands.d.ts +23 -23
  34. package/dist/types/Commands.js +26 -26
  35. package/dist/types/EventParameters.d.ts +8 -8
  36. package/dist/types/EventParameters.js +1 -1
  37. package/dist/types/FrameworkEvent.d.ts +5 -5
  38. package/dist/types/FrameworkEvent.js +4 -4
  39. package/dist/types/FrameworkSettings.d.ts +11 -11
  40. package/dist/types/FrameworkSettings.js +1 -1
  41. package/dist/types/Module.d.ts +26 -25
  42. package/dist/types/Module.js +201 -191
  43. package/dist/types/SelectMenuParameters.d.ts +9 -9
  44. package/dist/types/SelectMenuParameters.js +1 -1
  45. package/dist/types/Translation.d.ts +9 -9
  46. package/dist/types/Translation.js +31 -31
  47. package/dist/utils/EmojiFallback.d.ts +6 -6
  48. package/dist/utils/EmojiFallback.js +14 -14
  49. package/dist/utils/TextFormatter.d.ts +26 -26
  50. package/dist/utils/TextFormatter.js +82 -82
  51. package/package.json +1 -1
  52. package/plop-templates/command.js.hbs +16 -16
  53. package/plop-templates/translation.json.hbs +7 -7
  54. package/plopfile.js +88 -88
  55. package/templateGenerator.mjs +25 -25
@@ -1,16 +1,16 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.baseModule = void 0;
4
- const Module_1 = require("../types/Module");
5
- const interactionCreate_1 = require("./events/discord/interactionCreate");
6
- const messageCreate_1 = require("./events/discord/messageCreate");
7
- class baseModule extends Module_1.Module {
8
- constructor(modulePath, framework) {
9
- super(modulePath, framework);
10
- }
11
- registerEvents() {
12
- this.events.set('interactionCreate', new interactionCreate_1.InteractionCreate());
13
- this.events.set('messageCreate', new messageCreate_1.MessageCreate());
14
- }
15
- }
16
- exports.baseModule = baseModule;
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.baseModule = void 0;
4
+ const Module_1 = require("../types/Module");
5
+ const interactionCreate_1 = require("./events/discord/interactionCreate");
6
+ const messageCreate_1 = require("./events/discord/messageCreate");
7
+ class baseModule extends Module_1.Module {
8
+ constructor(modulePath, framework) {
9
+ super(modulePath, framework);
10
+ }
11
+ registerEvents() {
12
+ this.events.set('interactionCreate', new interactionCreate_1.InteractionCreate());
13
+ this.events.set('messageCreate', new messageCreate_1.MessageCreate());
14
+ }
15
+ }
16
+ exports.baseModule = baseModule;
@@ -1,6 +1,6 @@
1
- import { EventParameters } from "../../../types/EventParameters.js";
2
- import { FrameworkEvent } from "../../../types/FrameworkEvent.js";
3
- export declare class InteractionCreate extends FrameworkEvent {
4
- once: boolean;
5
- execute({ interaction, client, framework }: EventParameters): Promise<void>;
6
- }
1
+ import { EventParameters } from "../../../types/EventParameters.js";
2
+ import { FrameworkEvent } from "../../../types/FrameworkEvent.js";
3
+ export declare class InteractionCreate extends FrameworkEvent {
4
+ once: boolean;
5
+ execute({ interaction, client, framework }: EventParameters): Promise<void>;
6
+ }
@@ -1,50 +1,50 @@
1
- import { CommandType } from "../../../types/CommandType.js";
2
- import { FrameworkEvent } from "../../../types/FrameworkEvent.js";
3
- export class InteractionCreate extends FrameworkEvent {
4
- once = false;
5
- async execute({ interaction, client, framework }) {
6
- let guildSettings;
7
- if (interaction.guildId) {
8
- guildSettings = await framework.getGuildSettings(interaction.guildId);
9
- }
10
- if (interaction.isCommand()) {
11
- if (!framework.commands.has(interaction.commandName))
12
- return;
13
- const commandInstance = framework.commands.get(interaction.commandName);
14
- let args = new Map();
15
- commandInstance.args.forEach(arg => {
16
- let option = interaction.options.get(arg.name);
17
- if (option) {
18
- switch (arg.type) {
19
- case "user":
20
- args.set(arg.name, option.user);
21
- break;
22
- case "member":
23
- args.set(arg.name, option.member);
24
- break;
25
- default:
26
- args.set(arg.name, option.value || option.user || option.role || option.channel || option.options || option.message || option.member || option.focused || option.autocomplete || option.attachment);
27
- break;
28
- }
29
- }
30
- });
31
- if (![CommandType.any, CommandType.separated, CommandType.slash].includes(commandInstance.type))
32
- return;
33
- if (commandInstance.type === CommandType.separated || commandInstance.type === CommandType.slash) {
34
- await commandInstance.executeSlashCommand({ client, interaction, args, framework, guildSettings });
35
- }
36
- else {
37
- await commandInstance.execute({ client, interaction, args, framework, guildSettings });
38
- }
39
- }
40
- else if (interaction.isButton()) {
41
- }
42
- else if (interaction.isSelectMenu()) {
43
- let path = interaction.customId.split('.');
44
- const command = framework.commands.get(path[0]);
45
- if (command.selectMenu) {
46
- command.selectMenu({ path, interaction, client, framework, guildSettings });
47
- }
48
- }
49
- }
50
- }
1
+ import { CommandType } from "../../../types/CommandType.js";
2
+ import { FrameworkEvent } from "../../../types/FrameworkEvent.js";
3
+ export class InteractionCreate extends FrameworkEvent {
4
+ once = false;
5
+ async execute({ interaction, client, framework }) {
6
+ let guildSettings;
7
+ if (interaction.guildId) {
8
+ guildSettings = await framework.getGuildSettings(interaction.guildId);
9
+ }
10
+ if (interaction.isCommand()) {
11
+ if (!framework.commands.has(interaction.commandName))
12
+ return;
13
+ const commandInstance = framework.commands.get(interaction.commandName);
14
+ let args = new Map();
15
+ commandInstance.args.forEach(arg => {
16
+ let option = interaction.options.get(arg.name);
17
+ if (option) {
18
+ switch (arg.type) {
19
+ case "user":
20
+ args.set(arg.name, option.user);
21
+ break;
22
+ case "member":
23
+ args.set(arg.name, option.member);
24
+ break;
25
+ default:
26
+ args.set(arg.name, option.value || option.user || option.role || option.channel || option.options || option.message || option.member || option.focused || option.autocomplete || option.attachment);
27
+ break;
28
+ }
29
+ }
30
+ });
31
+ if (![CommandType.any, CommandType.separated, CommandType.slash].includes(commandInstance.type))
32
+ return;
33
+ if (commandInstance.type === CommandType.separated || commandInstance.type === CommandType.slash) {
34
+ await commandInstance.executeSlashCommand({ client, interaction, args, framework, guildSettings });
35
+ }
36
+ else {
37
+ await commandInstance.execute({ client, interaction, args, framework, guildSettings });
38
+ }
39
+ }
40
+ else if (interaction.isButton()) {
41
+ }
42
+ else if (interaction.isSelectMenu()) {
43
+ let path = interaction.customId.split('.');
44
+ const command = framework.commands.get(path[0]);
45
+ if (command.selectMenu) {
46
+ command.selectMenu({ path, interaction, client, framework, guildSettings });
47
+ }
48
+ }
49
+ }
50
+ }
@@ -1,16 +1,16 @@
1
- import { ActionRowBuilder, EmbedBuilder } from "discord.js";
2
- import { EventParameters } from "../../../types/EventParameters.js";
3
- import { FrameworkEvent } from "../../../types/FrameworkEvent.js";
4
- export declare class MessageCreate extends FrameworkEvent {
5
- once: boolean;
6
- execute({ message, client, framework }: EventParameters): Promise<import("discord.js").Message<boolean>>;
7
- autocorrect(str: string, words: string[]): any;
8
- getErrorEmbed(error: any, parse: any): {
9
- embeds: EmbedBuilder[];
10
- components: ActionRowBuilder<import("discord.js").AnyComponentBuilder>[];
11
- allowedMentions: {
12
- repliedUser: boolean;
13
- };
14
- };
15
- parseError(error: any): any;
16
- }
1
+ import { ActionRowBuilder, EmbedBuilder } from "discord.js";
2
+ import { EventParameters } from "../../../types/EventParameters.js";
3
+ import { FrameworkEvent } from "../../../types/FrameworkEvent.js";
4
+ export declare class MessageCreate extends FrameworkEvent {
5
+ once: boolean;
6
+ execute({ message, client, framework }: EventParameters): Promise<import("discord.js").Message<boolean>>;
7
+ autocorrect(str: string, words: string[]): any;
8
+ getErrorEmbed(error: any, parse: any): {
9
+ embeds: EmbedBuilder[];
10
+ components: ActionRowBuilder<import("discord.js").AnyComponentBuilder>[];
11
+ allowedMentions: {
12
+ repliedUser: boolean;
13
+ };
14
+ };
15
+ parseError(error: any): any;
16
+ }
@@ -1,233 +1,233 @@
1
- import { ActionRowBuilder, ButtonBuilder, ButtonStyle, EmbedBuilder, PermissionsBitField } from "discord.js";
2
- import { FrameworkEvent } from "../../../types/FrameworkEvent.js";
3
- import { ZumitoFramework } from "../../../ZumitoFramework.js";
4
- import leven from 'leven';
5
- import ErrorStackParser from 'error-stack-parser';
6
- import * as url from 'url';
7
- import path from "path";
8
- export class MessageCreate extends FrameworkEvent {
9
- once = false;
10
- async execute({ message, client, framework }) {
11
- let channel = message.channel;
12
- let prefix = framework.settings.defaultPrefix;
13
- const args = ZumitoFramework.splitCommandLine(message.content.slice(prefix.length));
14
- const command = args.shift().toLowerCase();
15
- let commandInstance;
16
- if (message.content.startsWith(prefix)) {
17
- if (!framework.commands.has(command)) {
18
- let commandNames = Array.from(framework.commands.keys());
19
- var correctedCommand = this.autocorrect(command, commandNames);
20
- if (framework.commands.has(correctedCommand)) {
21
- commandInstance = framework.commands.get(correctedCommand);
22
- }
23
- else {
24
- return; // Command not found
25
- }
26
- }
27
- else {
28
- commandInstance = framework.commands.get(command);
29
- }
30
- if (message.guild == null && commandInstance.dm == false)
31
- return;
32
- if (commandInstance.adminOnly || commandInstance.userPermissions.length > 0) {
33
- let denied = false;
34
- if (framework.memberHasPermission(message.member, message.channel, PermissionsBitField.Flags.Administrator) || message.member.id != message.guild.ownerId) {
35
- if (commandInstance.userPermissions.length > 0) {
36
- commandInstance.userPermissions.forEach(permission => {
37
- if (!framework.memberHasPermission(message.member, message.channel, permission)) {
38
- denied = true;
39
- }
40
- });
41
- }
42
- }
43
- if (denied) {
44
- return message.reply({
45
- content: 'You do not have permission to use this command.',
46
- allowedMentions: {
47
- repliedUser: false,
48
- }
49
- });
50
- }
51
- }
52
- if (message.channel.isTextBased) {
53
- let channel = message.channel;
54
- // Check command is nsfw and if channel is allowed
55
- if (commandInstance.nsfw && !channel.nsfw && !channel.permissionsFor(message.member).has(PermissionsBitField.Flags.Administrator) && message.member.id != message.guild.ownerId) {
56
- return message.reply({
57
- content: 'This command is nsfw and this channel is not nsfw.',
58
- allowedMentions: {
59
- repliedUser: false,
60
- }
61
- });
62
- }
63
- }
64
- try {
65
- let guildSettings = await framework.getGuildSettings(message.guildId);
66
- let parsedArgs = new Map();
67
- let userMentionCount = 0;
68
- for (let i = 0; i < args.length; i++) {
69
- let arg = args[i];
70
- let type = commandInstance.args[i]?.type;
71
- if (type) {
72
- if (type == 'member' || type == 'user') {
73
- const member = await message.guild.members.cache.get(arg.replace(/[<@!>]/g, ''));
74
- if (member) {
75
- if (type == 'user') {
76
- parsedArgs.set(commandInstance.args[i].name, member.user);
77
- }
78
- else {
79
- parsedArgs.set(commandInstance.args[i].name, member);
80
- }
81
- }
82
- else {
83
- return message.reply({
84
- content: 'Invalid user.',
85
- allowedMentions: {
86
- repliedUser: false,
87
- }
88
- });
89
- }
90
- }
91
- else if (type == 'string') {
92
- parsedArgs.set(commandInstance.args?.[i]?.name || i.toString(), arg);
93
- }
94
- }
95
- }
96
- await commandInstance.execute({
97
- message,
98
- args: parsedArgs,
99
- client: framework.client,
100
- framework: framework,
101
- guildSettings: guildSettings,
102
- });
103
- if (!message.channel.isDMBased && !message.deletable && (false)) { // false = settings.deleteCommands
104
- try {
105
- message.delete().catch(function () {
106
- console.error('can\'t delete user command');
107
- });
108
- const metadata = await fetch('https://tulipo.ga/api/last_command/' + command).then(res => res.json());
109
- }
110
- catch (err) {
111
- console.error(err.name, err.message);
112
- }
113
- }
114
- }
115
- catch (error) {
116
- let content = await this.getErrorEmbed({
117
- name: error.name,
118
- message: error.message,
119
- command: commandInstance,
120
- args: args,
121
- stack: error.stack,
122
- }, true);
123
- try {
124
- message.reply(content);
125
- }
126
- catch (e) {
127
- channel.send(content);
128
- }
129
- }
130
- }
131
- }
132
- autocorrect(str, words) {
133
- var distance, bestWord, i, word, min;
134
- var dictionary = words || [];
135
- var len = dictionary.length;
136
- for (i = 0; i < len; i++) {
137
- word = dictionary[i];
138
- distance = leven(str, word);
139
- if (distance === 0) {
140
- return word;
141
- }
142
- else if (min === undefined || distance < min) {
143
- min = distance;
144
- bestWord = word;
145
- }
146
- }
147
- return bestWord;
148
- }
149
- getErrorEmbed(error, parse) {
150
- let parsedError;
151
- if (parse) {
152
- parsedError = this.parseError(error);
153
- }
154
- else {
155
- parsedError = error;
156
- }
157
- let embed = new EmbedBuilder()
158
- .setTitle('Error')
159
- .setDescription('An error has occured while executing this command.')
160
- .setTimestamp()
161
- .addFields([{
162
- name: 'Command:',
163
- value: (error.command.name || 'Not defined')
164
- }])
165
- .addFields([{
166
- name: 'Arguments:',
167
- value: (error.args.toString() || 'None')
168
- }])
169
- .addFields([{
170
- name: 'Error name:',
171
- value: (error.name || 'Not defined')
172
- }])
173
- .addFields([{
174
- name: 'Error message:',
175
- value: (error.message || 'Not defined')
176
- }]);
177
- if (error.possibleSolutions !== undefined) {
178
- error.possibleSolutions.forEach((solution) => {
179
- embed.addFields([{
180
- name: 'Posible solution:',
181
- value: solution
182
- }]);
183
- });
184
- }
185
- let stackFrames = ErrorStackParser.parse(error).filter(e => !e.fileName.includes('node_modules') && !e.fileName.includes('node:internal'));
186
- let stack = '';
187
- const __dirname = url.fileURLToPath(new URL('.', import.meta.url));
188
- let path1 = path.resolve('./');
189
- let path2 = path1.replaceAll('\\', '/');
190
- stackFrames.forEach((frame) => {
191
- stack += `[${frame.fileName.replace(path1, '').replace(path2, '').replace('file://', '')}:${frame.lineNumber}](https://zumito.ga/redirect?url=vscode://file/${frame.fileName.replace('file://', '')}:${frame.lineNumber}) ${frame.functionName}()\n`;
192
- });
193
- if (error.stack !== undefined) {
194
- embed.addFields([{
195
- name: 'Call stack:',
196
- value: stack || error.stack || error.stack.toString()
197
- }]);
198
- }
199
- if (error.details !== undefined) {
200
- error.details.forEach((detail) => {
201
- embed.addFields([{
202
- name: 'Detail:',
203
- value: detail
204
- }]);
205
- });
206
- }
207
- const body = `\n\n\n---\nComand:\`\`\`${error.command.name || 'not defined'}\`\`\`\nArguments:\`\`\`${error.args.toString() || 'none'}\`\`\`\nError:\`\`\`${error.name || 'not defined'}\`\`\`\nError message:\`\`\`${error.message || 'not defined'}\`\`\`\n`;
208
- const requestUrl = `https://github.com/fernandomema/Zumito/issues/new?body=${encodeURIComponent(body)}`;
209
- const row = new ActionRowBuilder()
210
- .addComponents(new ButtonBuilder()
211
- .setStyle(ButtonStyle.Link)
212
- .setLabel('Report error')
213
- .setEmoji('975645505302437978')
214
- .setURL(requestUrl));
215
- return {
216
- embeds: [embed],
217
- components: [row],
218
- allowedMentions: {
219
- repliedUser: false
220
- }
221
- };
222
- }
223
- parseError(error) {
224
- error.possibleSolutions = [];
225
- if (/(?:^|(?<= ))(EmbedBuilder|Discord|ActionRowBuilder|ButtonBuilder|MessageSelectMenu)(?:(?= )|$) is not defined/gm.test(error.message)) {
226
- error.possibleSolutions.push('const { ' + error.message.split(" ")[0] + ' } = require(\'discord.js\');');
227
- }
228
- else if (error.message.includes('A custom id and url cannot both be specified')) {
229
- error.possibleSolutions.push("Remove .setCustomId(...) or .setURL(...)");
230
- }
231
- return error;
232
- }
233
- }
1
+ import { ActionRowBuilder, ButtonBuilder, ButtonStyle, EmbedBuilder, PermissionsBitField } from "discord.js";
2
+ import { FrameworkEvent } from "../../../types/FrameworkEvent.js";
3
+ import { ZumitoFramework } from "../../../ZumitoFramework.js";
4
+ import leven from 'leven';
5
+ import ErrorStackParser from 'error-stack-parser';
6
+ import * as url from 'url';
7
+ import path from "path";
8
+ export class MessageCreate extends FrameworkEvent {
9
+ once = false;
10
+ async execute({ message, client, framework }) {
11
+ let channel = message.channel;
12
+ let prefix = framework.settings.defaultPrefix;
13
+ const args = ZumitoFramework.splitCommandLine(message.content.slice(prefix.length));
14
+ const command = args.shift().toLowerCase();
15
+ let commandInstance;
16
+ if (message.content.startsWith(prefix)) {
17
+ if (!framework.commands.has(command)) {
18
+ let commandNames = Array.from(framework.commands.keys());
19
+ var correctedCommand = this.autocorrect(command, commandNames);
20
+ if (framework.commands.has(correctedCommand)) {
21
+ commandInstance = framework.commands.get(correctedCommand);
22
+ }
23
+ else {
24
+ return; // Command not found
25
+ }
26
+ }
27
+ else {
28
+ commandInstance = framework.commands.get(command);
29
+ }
30
+ if (message.guild == null && commandInstance.dm == false)
31
+ return;
32
+ if (commandInstance.adminOnly || commandInstance.userPermissions.length > 0) {
33
+ let denied = false;
34
+ if (framework.memberHasPermission(message.member, message.channel, PermissionsBitField.Flags.Administrator) || message.member.id != message.guild.ownerId) {
35
+ if (commandInstance.userPermissions.length > 0) {
36
+ commandInstance.userPermissions.forEach(permission => {
37
+ if (!framework.memberHasPermission(message.member, message.channel, permission)) {
38
+ denied = true;
39
+ }
40
+ });
41
+ }
42
+ }
43
+ if (denied) {
44
+ return message.reply({
45
+ content: 'You do not have permission to use this command.',
46
+ allowedMentions: {
47
+ repliedUser: false,
48
+ }
49
+ });
50
+ }
51
+ }
52
+ if (message.channel.isTextBased) {
53
+ let channel = message.channel;
54
+ // Check command is nsfw and if channel is allowed
55
+ if (commandInstance.nsfw && !channel.nsfw && !channel.permissionsFor(message.member).has(PermissionsBitField.Flags.Administrator) && message.member.id != message.guild.ownerId) {
56
+ return message.reply({
57
+ content: 'This command is nsfw and this channel is not nsfw.',
58
+ allowedMentions: {
59
+ repliedUser: false,
60
+ }
61
+ });
62
+ }
63
+ }
64
+ try {
65
+ let guildSettings = await framework.getGuildSettings(message.guildId);
66
+ let parsedArgs = new Map();
67
+ let userMentionCount = 0;
68
+ for (let i = 0; i < args.length; i++) {
69
+ let arg = args[i];
70
+ let type = commandInstance.args[i]?.type;
71
+ if (type) {
72
+ if (type == 'member' || type == 'user') {
73
+ const member = await message.guild.members.cache.get(arg.replace(/[<@!>]/g, ''));
74
+ if (member) {
75
+ if (type == 'user') {
76
+ parsedArgs.set(commandInstance.args[i].name, member.user);
77
+ }
78
+ else {
79
+ parsedArgs.set(commandInstance.args[i].name, member);
80
+ }
81
+ }
82
+ else {
83
+ return message.reply({
84
+ content: 'Invalid user.',
85
+ allowedMentions: {
86
+ repliedUser: false,
87
+ }
88
+ });
89
+ }
90
+ }
91
+ else if (type == 'string') {
92
+ parsedArgs.set(commandInstance.args?.[i]?.name || i.toString(), arg);
93
+ }
94
+ }
95
+ }
96
+ await commandInstance.execute({
97
+ message,
98
+ args: parsedArgs,
99
+ client: framework.client,
100
+ framework: framework,
101
+ guildSettings: guildSettings,
102
+ });
103
+ if (!message.channel.isDMBased && !message.deletable && (false)) { // false = settings.deleteCommands
104
+ try {
105
+ message.delete().catch(function () {
106
+ console.error('can\'t delete user command');
107
+ });
108
+ const metadata = await fetch('https://tulipo.ga/api/last_command/' + command).then(res => res.json());
109
+ }
110
+ catch (err) {
111
+ console.error(err.name, err.message);
112
+ }
113
+ }
114
+ }
115
+ catch (error) {
116
+ let content = await this.getErrorEmbed({
117
+ name: error.name,
118
+ message: error.message,
119
+ command: commandInstance,
120
+ args: args,
121
+ stack: error.stack,
122
+ }, true);
123
+ try {
124
+ message.reply(content);
125
+ }
126
+ catch (e) {
127
+ channel.send(content);
128
+ }
129
+ }
130
+ }
131
+ }
132
+ autocorrect(str, words) {
133
+ var distance, bestWord, i, word, min;
134
+ var dictionary = words || [];
135
+ var len = dictionary.length;
136
+ for (i = 0; i < len; i++) {
137
+ word = dictionary[i];
138
+ distance = leven(str, word);
139
+ if (distance === 0) {
140
+ return word;
141
+ }
142
+ else if (min === undefined || distance < min) {
143
+ min = distance;
144
+ bestWord = word;
145
+ }
146
+ }
147
+ return bestWord;
148
+ }
149
+ getErrorEmbed(error, parse) {
150
+ let parsedError;
151
+ if (parse) {
152
+ parsedError = this.parseError(error);
153
+ }
154
+ else {
155
+ parsedError = error;
156
+ }
157
+ let embed = new EmbedBuilder()
158
+ .setTitle('Error')
159
+ .setDescription('An error has occured while executing this command.')
160
+ .setTimestamp()
161
+ .addFields([{
162
+ name: 'Command:',
163
+ value: (error.command.name || 'Not defined')
164
+ }])
165
+ .addFields([{
166
+ name: 'Arguments:',
167
+ value: (error.args.toString() || 'None')
168
+ }])
169
+ .addFields([{
170
+ name: 'Error name:',
171
+ value: (error.name || 'Not defined')
172
+ }])
173
+ .addFields([{
174
+ name: 'Error message:',
175
+ value: (error.message || 'Not defined')
176
+ }]);
177
+ if (error.possibleSolutions !== undefined) {
178
+ error.possibleSolutions.forEach((solution) => {
179
+ embed.addFields([{
180
+ name: 'Posible solution:',
181
+ value: solution
182
+ }]);
183
+ });
184
+ }
185
+ let stackFrames = ErrorStackParser.parse(error).filter(e => !e.fileName.includes('node_modules') && !e.fileName.includes('node:internal'));
186
+ let stack = '';
187
+ const __dirname = url.fileURLToPath(new URL('.', import.meta.url));
188
+ let path1 = path.resolve('./');
189
+ let path2 = path1.replaceAll('\\', '/');
190
+ stackFrames.forEach((frame) => {
191
+ stack += `[${frame.fileName.replace(path1, '').replace(path2, '').replace('file://', '')}:${frame.lineNumber}](https://zumito.ga/redirect?url=vscode://file/${frame.fileName.replace('file://', '')}:${frame.lineNumber}) ${frame.functionName}()\n`;
192
+ });
193
+ if (error.stack !== undefined) {
194
+ embed.addFields([{
195
+ name: 'Call stack:',
196
+ value: stack || error.stack || error.stack.toString()
197
+ }]);
198
+ }
199
+ if (error.details !== undefined) {
200
+ error.details.forEach((detail) => {
201
+ embed.addFields([{
202
+ name: 'Detail:',
203
+ value: detail
204
+ }]);
205
+ });
206
+ }
207
+ const body = `\n\n\n---\nComand:\`\`\`${error.command.name || 'not defined'}\`\`\`\nArguments:\`\`\`${error.args.toString() || 'none'}\`\`\`\nError:\`\`\`${error.name || 'not defined'}\`\`\`\nError message:\`\`\`${error.message || 'not defined'}\`\`\`\n`;
208
+ const requestUrl = `https://github.com/fernandomema/Zumito/issues/new?body=${encodeURIComponent(body)}`;
209
+ const row = new ActionRowBuilder()
210
+ .addComponents(new ButtonBuilder()
211
+ .setStyle(ButtonStyle.Link)
212
+ .setLabel('Report error')
213
+ .setEmoji('975645505302437978')
214
+ .setURL(requestUrl));
215
+ return {
216
+ embeds: [embed],
217
+ components: [row],
218
+ allowedMentions: {
219
+ repliedUser: false
220
+ }
221
+ };
222
+ }
223
+ parseError(error) {
224
+ error.possibleSolutions = [];
225
+ if (/(?:^|(?<= ))(EmbedBuilder|Discord|ActionRowBuilder|ButtonBuilder|MessageSelectMenu)(?:(?= )|$) is not defined/gm.test(error.message)) {
226
+ error.possibleSolutions.push('const { ' + error.message.split(" ")[0] + ' } = require(\'discord.js\');');
227
+ }
228
+ else if (error.message.includes('A custom id and url cannot both be specified')) {
229
+ error.possibleSolutions.push("Remove .setCustomId(...) or .setURL(...)");
230
+ }
231
+ return error;
232
+ }
233
+ }