@ninenity/neutrun 1.0.0
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/README.md +5 -0
- package/dist/CLI/Bootstrap.d.ts +2 -0
- package/dist/CLI/Bootstrap.d.ts.map +1 -0
- package/dist/CLI/Bootstrap.js +71 -0
- package/dist/CLI/Bootstrap.js.map +1 -0
- package/dist/CLI/Localize.d.ts +2 -0
- package/dist/CLI/Localize.d.ts.map +1 -0
- package/dist/CLI/Localize.js +248 -0
- package/dist/CLI/Localize.js.map +1 -0
- package/dist/CLI/Translate.d.ts +2 -0
- package/dist/CLI/Translate.d.ts.map +1 -0
- package/dist/CLI/Translate.js +82 -0
- package/dist/CLI/Translate.js.map +1 -0
- package/dist/CLI/bin.d.ts +3 -0
- package/dist/CLI/bin.d.ts.map +1 -0
- package/dist/CLI/bin.js +36 -0
- package/dist/CLI/bin.js.map +1 -0
- package/dist/Emojis/EmojiLoader.d.ts +4 -0
- package/dist/Emojis/EmojiLoader.d.ts.map +1 -0
- package/dist/Emojis/EmojiLoader.js +262 -0
- package/dist/Emojis/EmojiLoader.js.map +1 -0
- package/dist/Emojis/Pool.d.ts +3 -0
- package/dist/Emojis/Pool.d.ts.map +1 -0
- package/dist/Emojis/Pool.js +33 -0
- package/dist/Emojis/Pool.js.map +1 -0
- package/dist/Emojis/index.d.ts +3 -0
- package/dist/Emojis/index.d.ts.map +1 -0
- package/dist/Emojis/index.js +9 -0
- package/dist/Emojis/index.js.map +1 -0
- package/dist/Emojis/types.d.ts +15 -0
- package/dist/Emojis/types.d.ts.map +1 -0
- package/dist/Emojis/types.js +3 -0
- package/dist/Emojis/types.js.map +1 -0
- package/dist/I18n/index.d.ts +34 -0
- package/dist/I18n/index.d.ts.map +1 -0
- package/dist/I18n/index.js +77 -0
- package/dist/I18n/index.js.map +1 -0
- package/dist/Logger/Color.d.ts +15 -0
- package/dist/Logger/Color.d.ts.map +1 -0
- package/dist/Logger/Color.js +54 -0
- package/dist/Logger/Color.js.map +1 -0
- package/dist/Logger/index.d.ts +38 -0
- package/dist/Logger/index.d.ts.map +1 -0
- package/dist/Logger/index.js +577 -0
- package/dist/Logger/index.js.map +1 -0
- package/dist/Modules/Bots/index.d.ts +4 -0
- package/dist/Modules/Bots/index.d.ts.map +1 -0
- package/dist/Modules/Bots/index.js +45 -0
- package/dist/Modules/Bots/index.js.map +1 -0
- package/dist/Modules/Component/index.d.ts +14 -0
- package/dist/Modules/Component/index.d.ts.map +1 -0
- package/dist/Modules/Component/index.js +32 -0
- package/dist/Modules/Component/index.js.map +1 -0
- package/dist/Modules/Config/index.d.ts +5 -0
- package/dist/Modules/Config/index.d.ts.map +1 -0
- package/dist/Modules/Config/index.js +13 -0
- package/dist/Modules/Config/index.js.map +1 -0
- package/dist/Modules/Database/index.d.ts +15 -0
- package/dist/Modules/Database/index.d.ts.map +1 -0
- package/dist/Modules/Database/index.js +22 -0
- package/dist/Modules/Database/index.js.map +1 -0
- package/dist/Modules/Diagnostics/ModuleDiagnostics.d.ts +18 -0
- package/dist/Modules/Diagnostics/ModuleDiagnostics.d.ts.map +1 -0
- package/dist/Modules/Diagnostics/ModuleDiagnostics.js +101 -0
- package/dist/Modules/Diagnostics/ModuleDiagnostics.js.map +1 -0
- package/dist/Modules/Diagnostics/index.d.ts +3 -0
- package/dist/Modules/Diagnostics/index.d.ts.map +1 -0
- package/dist/Modules/Diagnostics/index.js +7 -0
- package/dist/Modules/Diagnostics/index.js.map +1 -0
- package/dist/Modules/Logs/index.d.ts +4 -0
- package/dist/Modules/Logs/index.d.ts.map +1 -0
- package/dist/Modules/Logs/index.js +11 -0
- package/dist/Modules/Logs/index.js.map +1 -0
- package/dist/Modules/Storage/index.d.ts +3 -0
- package/dist/Modules/Storage/index.d.ts.map +1 -0
- package/dist/Modules/Storage/index.js +11 -0
- package/dist/Modules/Storage/index.js.map +1 -0
- package/dist/Modules/index.d.ts +8 -0
- package/dist/Modules/index.d.ts.map +1 -0
- package/dist/Modules/index.js +45 -0
- package/dist/Modules/index.js.map +1 -0
- package/dist/Shared/Autocomplete.d.ts +31 -0
- package/dist/Shared/Autocomplete.d.ts.map +1 -0
- package/dist/Shared/Autocomplete.js +37 -0
- package/dist/Shared/Autocomplete.js.map +1 -0
- package/dist/Shared/ChannelLoader.d.ts +4 -0
- package/dist/Shared/ChannelLoader.d.ts.map +1 -0
- package/dist/Shared/ChannelLoader.js +133 -0
- package/dist/Shared/ChannelLoader.js.map +1 -0
- package/dist/Shared/Client.d.ts +30 -0
- package/dist/Shared/Client.d.ts.map +1 -0
- package/dist/Shared/Client.js +517 -0
- package/dist/Shared/Client.js.map +1 -0
- package/dist/Shared/ComponentAutoDeploy.d.ts +3 -0
- package/dist/Shared/ComponentAutoDeploy.d.ts.map +1 -0
- package/dist/Shared/ComponentAutoDeploy.js +230 -0
- package/dist/Shared/ComponentAutoDeploy.js.map +1 -0
- package/dist/Shared/ComponentRuntime.d.ts +43 -0
- package/dist/Shared/ComponentRuntime.d.ts.map +1 -0
- package/dist/Shared/ComponentRuntime.js +393 -0
- package/dist/Shared/ComponentRuntime.js.map +1 -0
- package/dist/Shared/Config.d.ts +6 -0
- package/dist/Shared/Config.d.ts.map +1 -0
- package/dist/Shared/Config.js +15 -0
- package/dist/Shared/Config.js.map +1 -0
- package/dist/Shared/ConfigLoader.d.ts +2 -0
- package/dist/Shared/ConfigLoader.d.ts.map +1 -0
- package/dist/Shared/ConfigLoader.js +74 -0
- package/dist/Shared/ConfigLoader.js.map +1 -0
- package/dist/Shared/ConfigProxy.d.ts +2 -0
- package/dist/Shared/ConfigProxy.d.ts.map +1 -0
- package/dist/Shared/ConfigProxy.js +46 -0
- package/dist/Shared/ConfigProxy.js.map +1 -0
- package/dist/Shared/ConsoleLog.d.ts +7 -0
- package/dist/Shared/ConsoleLog.d.ts.map +1 -0
- package/dist/Shared/ConsoleLog.js +23 -0
- package/dist/Shared/ConsoleLog.js.map +1 -0
- package/dist/Shared/CooldownManager.d.ts +16 -0
- package/dist/Shared/CooldownManager.d.ts.map +1 -0
- package/dist/Shared/CooldownManager.js +167 -0
- package/dist/Shared/CooldownManager.js.map +1 -0
- package/dist/Shared/Definer.d.ts +10 -0
- package/dist/Shared/Definer.d.ts.map +1 -0
- package/dist/Shared/Definer.js +711 -0
- package/dist/Shared/Definer.js.map +1 -0
- package/dist/Shared/EventBus.d.ts +48 -0
- package/dist/Shared/EventBus.d.ts.map +1 -0
- package/dist/Shared/EventBus.js +181 -0
- package/dist/Shared/EventBus.js.map +1 -0
- package/dist/Shared/InteractionContext.d.ts +12 -0
- package/dist/Shared/InteractionContext.d.ts.map +1 -0
- package/dist/Shared/InteractionContext.js +34 -0
- package/dist/Shared/InteractionContext.js.map +1 -0
- package/dist/Shared/InteractionManager.d.ts +27 -0
- package/dist/Shared/InteractionManager.d.ts.map +1 -0
- package/dist/Shared/InteractionManager.js +256 -0
- package/dist/Shared/InteractionManager.js.map +1 -0
- package/dist/Shared/LocalBotRegistry.d.ts +14 -0
- package/dist/Shared/LocalBotRegistry.d.ts.map +1 -0
- package/dist/Shared/LocalBotRegistry.js +140 -0
- package/dist/Shared/LocalBotRegistry.js.map +1 -0
- package/dist/Shared/LogTransport.d.ts +49 -0
- package/dist/Shared/LogTransport.d.ts.map +1 -0
- package/dist/Shared/LogTransport.js +357 -0
- package/dist/Shared/LogTransport.js.map +1 -0
- package/dist/Shared/Neutrun.d.ts +55 -0
- package/dist/Shared/Neutrun.d.ts.map +1 -0
- package/dist/Shared/Neutrun.js +269 -0
- package/dist/Shared/Neutrun.js.map +1 -0
- package/dist/Shared/Plugin.d.ts +8 -0
- package/dist/Shared/Plugin.d.ts.map +1 -0
- package/dist/Shared/Plugin.js +3 -0
- package/dist/Shared/Plugin.js.map +1 -0
- package/dist/Shared/Pool.d.ts +3 -0
- package/dist/Shared/Pool.d.ts.map +1 -0
- package/dist/Shared/Pool.js +29 -0
- package/dist/Shared/Pool.js.map +1 -0
- package/dist/Shared/ProcessManager.d.ts +11 -0
- package/dist/Shared/ProcessManager.d.ts.map +1 -0
- package/dist/Shared/ProcessManager.js +56 -0
- package/dist/Shared/ProcessManager.js.map +1 -0
- package/dist/Shared/QueueManager.d.ts +9 -0
- package/dist/Shared/QueueManager.d.ts.map +1 -0
- package/dist/Shared/QueueManager.js +65 -0
- package/dist/Shared/QueueManager.js.map +1 -0
- package/dist/Shared/RoleLoader.d.ts +4 -0
- package/dist/Shared/RoleLoader.d.ts.map +1 -0
- package/dist/Shared/RoleLoader.js +138 -0
- package/dist/Shared/RoleLoader.js.map +1 -0
- package/dist/Shared/Supervisor.d.ts +67 -0
- package/dist/Shared/Supervisor.d.ts.map +1 -0
- package/dist/Shared/Supervisor.js +308 -0
- package/dist/Shared/Supervisor.js.map +1 -0
- package/dist/Shared/TelemetryService.d.ts +63 -0
- package/dist/Shared/TelemetryService.d.ts.map +1 -0
- package/dist/Shared/TelemetryService.js +631 -0
- package/dist/Shared/TelemetryService.js.map +1 -0
- package/dist/Shared/Utils.d.ts +94 -0
- package/dist/Shared/Utils.d.ts.map +1 -0
- package/dist/Shared/Utils.js +390 -0
- package/dist/Shared/Utils.js.map +1 -0
- package/dist/Shared/WebSocket.d.ts +15 -0
- package/dist/Shared/WebSocket.d.ts.map +1 -0
- package/dist/Shared/WebSocket.js +599 -0
- package/dist/Shared/WebSocket.js.map +1 -0
- package/dist/Types/Client.Type.d.ts +130 -0
- package/dist/Types/Client.Type.d.ts.map +1 -0
- package/dist/Types/Client.Type.js +182 -0
- package/dist/Types/Client.Type.js.map +1 -0
- package/dist/Types/Command.Type.d.ts +28 -0
- package/dist/Types/Command.Type.d.ts.map +1 -0
- package/dist/Types/Command.Type.js +4 -0
- package/dist/Types/Command.Type.js.map +1 -0
- package/dist/Types/Definer.Type.d.ts +37 -0
- package/dist/Types/Definer.Type.d.ts.map +1 -0
- package/dist/Types/Definer.Type.js +4 -0
- package/dist/Types/Definer.Type.js.map +1 -0
- package/dist/Types/InputInteraction.Type.d.ts +90 -0
- package/dist/Types/InputInteraction.Type.d.ts.map +1 -0
- package/dist/Types/InputInteraction.Type.js +339 -0
- package/dist/Types/InputInteraction.Type.js.map +1 -0
- package/dist/Types/Interaction.Type.d.ts +47 -0
- package/dist/Types/Interaction.Type.d.ts.map +1 -0
- package/dist/Types/Interaction.Type.js +4 -0
- package/dist/Types/Interaction.Type.js.map +1 -0
- package/dist/Types/Log.Type.d.ts +28 -0
- package/dist/Types/Log.Type.d.ts.map +1 -0
- package/dist/Types/Log.Type.js +3 -0
- package/dist/Types/Log.Type.js.map +1 -0
- package/dist/Types/Permission.Type.d.ts +17 -0
- package/dist/Types/Permission.Type.d.ts.map +1 -0
- package/dist/Types/Permission.Type.js +13 -0
- package/dist/Types/Permission.Type.js.map +1 -0
- package/dist/Types/PrefixCommandBuilder.Type.d.ts +81 -0
- package/dist/Types/PrefixCommandBuilder.Type.d.ts.map +1 -0
- package/dist/Types/PrefixCommandBuilder.Type.js +203 -0
- package/dist/Types/PrefixCommandBuilder.Type.js.map +1 -0
- package/dist/Types/TaskDefiner.Type.d.ts +14 -0
- package/dist/Types/TaskDefiner.Type.d.ts.map +1 -0
- package/dist/Types/TaskDefiner.Type.js +4 -0
- package/dist/Types/TaskDefiner.Type.js.map +1 -0
- package/dist/index.d.ts +44 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +122 -0
- package/dist/index.js.map +1 -0
- package/package.json +55 -0
|
@@ -0,0 +1,711 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
36
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
37
|
+
};
|
|
38
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
39
|
+
exports.StartTasksScheduler = exports.RegisterSlashCommands = exports.Setup = exports.StopTasksForClient = exports.StopTaskTimer = exports.StartTaskTimer = exports.ExecuteTask = void 0;
|
|
40
|
+
// --------------------------------------------------------------------------------
|
|
41
|
+
const discord_js_1 = require("discord.js");
|
|
42
|
+
const InputInteraction_Type_1 = require("../Types/InputInteraction.Type");
|
|
43
|
+
const Permission_Type_1 = require("../Types/Permission.Type");
|
|
44
|
+
const InteractionContext_1 = require("./InteractionContext");
|
|
45
|
+
const InteractionManager_1 = __importDefault(require("./InteractionManager"));
|
|
46
|
+
const ConsoleLog_1 = require("./ConsoleLog");
|
|
47
|
+
const Color_1 = __importDefault(require("../Logger/Color"));
|
|
48
|
+
const CooldownManager_1 = __importDefault(require("./CooldownManager"));
|
|
49
|
+
const QueueManager_1 = __importDefault(require("./QueueManager"));
|
|
50
|
+
const I18n_1 = __importDefault(require("../I18n"));
|
|
51
|
+
const InputInteraction_Type_2 = require("../Types/InputInteraction.Type");
|
|
52
|
+
const TelemetryService_1 = __importDefault(require("./TelemetryService"));
|
|
53
|
+
const ComponentRuntime = __importStar(require("./ComponentRuntime"));
|
|
54
|
+
const RoleLoader_1 = __importDefault(require("./RoleLoader"));
|
|
55
|
+
const ChannelLoader_1 = __importDefault(require("./ChannelLoader"));
|
|
56
|
+
const WebSocket = __importStar(require("./WebSocket"));
|
|
57
|
+
// --------------------------------------------------------------------------------
|
|
58
|
+
const ProcessCooldown = async (interaction, commandId, definer) => {
|
|
59
|
+
const userId = interaction.user.id;
|
|
60
|
+
const guildId = interaction.guildId || interaction.guild?.id || undefined;
|
|
61
|
+
const globalCooldown = CooldownManager_1.default.check(userId, 'global');
|
|
62
|
+
if (globalCooldown) {
|
|
63
|
+
TelemetryService_1.default.registerCounter('cooldownGlobalRejections');
|
|
64
|
+
const Reply = {
|
|
65
|
+
content: `Você está em cooldown global. Aguarde ${globalCooldown.formatted}.`,
|
|
66
|
+
allowedMentions: { parse: [] },
|
|
67
|
+
flags: 64
|
|
68
|
+
};
|
|
69
|
+
if (interaction.reply)
|
|
70
|
+
await interaction.reply(Reply).catch(() => { });
|
|
71
|
+
return false;
|
|
72
|
+
}
|
|
73
|
+
const cmdCooldown = CooldownManager_1.default.check(userId, commandId, guildId);
|
|
74
|
+
if (cmdCooldown) {
|
|
75
|
+
TelemetryService_1.default.registerCounter('cooldownRejections');
|
|
76
|
+
const Reply = {
|
|
77
|
+
content: `Aguarde ${cmdCooldown.formatted} para usar este comando novamente.`,
|
|
78
|
+
allowedMentions: { parse: [] },
|
|
79
|
+
flags: 64
|
|
80
|
+
};
|
|
81
|
+
if (interaction.reply)
|
|
82
|
+
await interaction.reply(Reply).catch(() => { });
|
|
83
|
+
return false;
|
|
84
|
+
}
|
|
85
|
+
if (definer.cooldown) {
|
|
86
|
+
let duration = null;
|
|
87
|
+
if (Array.isArray(definer.cooldown)) {
|
|
88
|
+
const userRoles = interaction.member?.roles?.cache?.map((R) => R.id) || [];
|
|
89
|
+
duration = CooldownManager_1.default.resolveLowestDuration(userRoles, definer.cooldown);
|
|
90
|
+
}
|
|
91
|
+
else {
|
|
92
|
+
duration = definer.cooldown;
|
|
93
|
+
}
|
|
94
|
+
if (duration) {
|
|
95
|
+
CooldownManager_1.default.set(userId, commandId, duration, guildId);
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
return true;
|
|
99
|
+
};
|
|
100
|
+
const ProcessQueue = async (interaction, commandId, definer, execute) => {
|
|
101
|
+
if (definer.queue) {
|
|
102
|
+
TelemetryService_1.default.registerCounter('queuedCommands');
|
|
103
|
+
// Prefixo "cmd:" isola as filas automáticas dos definers das filas
|
|
104
|
+
// manuais de client.queue(<name>): sem ele, `queue: 'guild'` colidiria
|
|
105
|
+
// com uma fila manual de mesmo nome no mesmo escopo.
|
|
106
|
+
let key = `cmd:${commandId}`;
|
|
107
|
+
if (definer.queue === 'user') {
|
|
108
|
+
// User queues are isolated by guild. Use global-user when an old bot
|
|
109
|
+
// explicitly needs one user queue shared across every guild.
|
|
110
|
+
key += `:user:${interaction.guildId || 'dm'}:${interaction.user.id}`;
|
|
111
|
+
}
|
|
112
|
+
else if (definer.queue === 'channel')
|
|
113
|
+
key += `:channel:${interaction.channelId}`;
|
|
114
|
+
else if (definer.queue === 'guild')
|
|
115
|
+
key += `:guild:${interaction.guildId || 'dm'}`;
|
|
116
|
+
else if (definer.queue === 'global-user')
|
|
117
|
+
key += `:user:${interaction.user.id}`;
|
|
118
|
+
else
|
|
119
|
+
key += `:${definer.queue}`;
|
|
120
|
+
await QueueManager_1.default.enqueue(key, execute);
|
|
121
|
+
}
|
|
122
|
+
else {
|
|
123
|
+
await execute();
|
|
124
|
+
}
|
|
125
|
+
};
|
|
126
|
+
const SafeAsyncListener = (label, handler) => (...args) => {
|
|
127
|
+
const guildId = args
|
|
128
|
+
.map((arg) => arg?.guildId || arg?.guild?.id || arg?.member?.guild?.id || undefined)
|
|
129
|
+
.find(Boolean);
|
|
130
|
+
void Promise.resolve()
|
|
131
|
+
.then(() => guildId
|
|
132
|
+
? (0, InteractionContext_1.RunWithGuild)(String(guildId), () => handler(...args))
|
|
133
|
+
: handler(...args))
|
|
134
|
+
.catch((error) => {
|
|
135
|
+
(0, ConsoleLog_1.logError)(`Erro no listener ${label}: ${error?.message || error}`, 'Events');
|
|
136
|
+
});
|
|
137
|
+
};
|
|
138
|
+
const RegisterSlashCommands = async (client) => {
|
|
139
|
+
const Token = process.env.BOT_TOKEN;
|
|
140
|
+
const ApplicationId = client.application?.id || client.user?.id;
|
|
141
|
+
if (Token && ApplicationId) {
|
|
142
|
+
const Rest = new discord_js_1.REST({ version: '10' }).setToken(Token);
|
|
143
|
+
const GlobalCommands = client.slashCommands
|
|
144
|
+
.filter((d) => d.global === true)
|
|
145
|
+
.map((d) => d.data.toJSON());
|
|
146
|
+
const GuildCommands = client.slashCommands
|
|
147
|
+
.filter((d) => d.global !== true)
|
|
148
|
+
.map((d) => d.data.toJSON());
|
|
149
|
+
const GlobalContextMenuCommands = client.contextMenuCommands
|
|
150
|
+
.filter((d) => d.global === true)
|
|
151
|
+
.map((d) => d.data.toJSON());
|
|
152
|
+
const GuildContextMenuCommands = client.contextMenuCommands
|
|
153
|
+
.filter((d) => d.global !== true)
|
|
154
|
+
.map((d) => d.data.toJSON());
|
|
155
|
+
try {
|
|
156
|
+
await Rest.put(discord_js_1.Routes.applicationCommands(ApplicationId), {
|
|
157
|
+
body: [...GlobalCommands, ...GlobalContextMenuCommands]
|
|
158
|
+
});
|
|
159
|
+
const Total = GlobalCommands.length + GlobalContextMenuCommands.length;
|
|
160
|
+
if (Total > 0) {
|
|
161
|
+
(0, ConsoleLog_1.logSuccess)(`${(0, Color_1.default)(String(Total), 'cyan', 'bold')} comandos globais registrados`);
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
catch (error) {
|
|
165
|
+
(0, ConsoleLog_1.logError)('Erro ao registrar comandos globais');
|
|
166
|
+
}
|
|
167
|
+
const Guilds = client.guilds.cache;
|
|
168
|
+
for (const [GuildId, Guild] of Guilds) {
|
|
169
|
+
try {
|
|
170
|
+
await Rest.put(discord_js_1.Routes.applicationGuildCommands(ApplicationId, GuildId), {
|
|
171
|
+
body: [...GuildCommands, ...GuildContextMenuCommands]
|
|
172
|
+
});
|
|
173
|
+
const Total = GuildCommands.length + GuildContextMenuCommands.length;
|
|
174
|
+
if (Total > 0) {
|
|
175
|
+
(0, ConsoleLog_1.logSuccess)(`${(0, Color_1.default)(String(Total), 'cyan', 'bold')} comandos registrados`, 'Loader');
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
catch (error) {
|
|
179
|
+
(0, ConsoleLog_1.logError)(`Erro ao registrar comandos em ${Guild.name}`);
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
}
|
|
183
|
+
};
|
|
184
|
+
exports.RegisterSlashCommands = RegisterSlashCommands;
|
|
185
|
+
const ParseTimeoutMs = (timeout) => {
|
|
186
|
+
if (typeof timeout === 'number')
|
|
187
|
+
return timeout;
|
|
188
|
+
const str = String(timeout).trim().toLowerCase();
|
|
189
|
+
const match = str.match(/^(\d+)\s*(s|sec|seconds|m|min|minutes|h|hour|hours|d|day|days)?$/);
|
|
190
|
+
if (!match) {
|
|
191
|
+
const parsed = Number(str);
|
|
192
|
+
return isNaN(parsed) ? 60000 : parsed;
|
|
193
|
+
}
|
|
194
|
+
const value = parseInt(match[1], 10);
|
|
195
|
+
const unit = match[2];
|
|
196
|
+
switch (unit) {
|
|
197
|
+
case 's':
|
|
198
|
+
case 'sec':
|
|
199
|
+
case 'seconds':
|
|
200
|
+
return value * 1000;
|
|
201
|
+
case 'm':
|
|
202
|
+
case 'min':
|
|
203
|
+
case 'minutes':
|
|
204
|
+
return value * 60 * 1000;
|
|
205
|
+
case 'h':
|
|
206
|
+
case 'hour':
|
|
207
|
+
case 'hours':
|
|
208
|
+
return value * 60 * 60 * 1000;
|
|
209
|
+
case 'd':
|
|
210
|
+
case 'day':
|
|
211
|
+
case 'days':
|
|
212
|
+
return value * 24 * 60 * 60 * 1000;
|
|
213
|
+
default:
|
|
214
|
+
return value;
|
|
215
|
+
}
|
|
216
|
+
};
|
|
217
|
+
const activeTaskTimers = new Map();
|
|
218
|
+
const runningTasks = new Set();
|
|
219
|
+
const taskKey = (client, taskId) => `${client.runtimeKey || 'default'}:${taskId}`;
|
|
220
|
+
const ExecuteTask = async (client, task) => {
|
|
221
|
+
const startedAt = Date.now();
|
|
222
|
+
try {
|
|
223
|
+
if (task.scope !== 'guild') {
|
|
224
|
+
await task.execute(client);
|
|
225
|
+
}
|
|
226
|
+
else {
|
|
227
|
+
for (const guildId of client.guilds.cache.keys()) {
|
|
228
|
+
await (0, InteractionContext_1.RunWithGuild)(guildId, () => task.execute(client, guildId));
|
|
229
|
+
}
|
|
230
|
+
}
|
|
231
|
+
TelemetryService_1.default.registerAction('job', task.id, true, {}, undefined, Date.now() - startedAt);
|
|
232
|
+
}
|
|
233
|
+
catch (error) {
|
|
234
|
+
TelemetryService_1.default.registerAction('job', task.id, false, {}, String(error), Date.now() - startedAt);
|
|
235
|
+
throw error;
|
|
236
|
+
}
|
|
237
|
+
};
|
|
238
|
+
exports.ExecuteTask = ExecuteTask;
|
|
239
|
+
const StartTaskTimer = (client, taskId) => {
|
|
240
|
+
const task = client.tasks.get(taskId);
|
|
241
|
+
if (!task)
|
|
242
|
+
throw new Error(`Task "${taskId}" não está registrada.`);
|
|
243
|
+
const scopedTaskId = taskKey(client, taskId);
|
|
244
|
+
if (activeTaskTimers.has(scopedTaskId)) {
|
|
245
|
+
clearInterval(activeTaskTimers.get(scopedTaskId));
|
|
246
|
+
activeTaskTimers.delete(scopedTaskId);
|
|
247
|
+
}
|
|
248
|
+
const timeoutMs = Math.max(1_000, ParseTimeoutMs(task.timeout));
|
|
249
|
+
const timer = setInterval(async () => {
|
|
250
|
+
if (runningTasks.has(scopedTaskId))
|
|
251
|
+
return;
|
|
252
|
+
runningTasks.add(scopedTaskId);
|
|
253
|
+
try {
|
|
254
|
+
await (0, exports.ExecuteTask)(client, task);
|
|
255
|
+
}
|
|
256
|
+
catch (error) {
|
|
257
|
+
(0, ConsoleLog_1.logError)(`Erro ao executar task ${(0, Color_1.default)(taskId, 'cyan', 'bold')}: ${error}`);
|
|
258
|
+
}
|
|
259
|
+
finally {
|
|
260
|
+
runningTasks.delete(scopedTaskId);
|
|
261
|
+
}
|
|
262
|
+
}, timeoutMs);
|
|
263
|
+
timer.unref?.();
|
|
264
|
+
activeTaskTimers.set(scopedTaskId, timer);
|
|
265
|
+
(0, ConsoleLog_1.logInfo)(`Task ativada/iniciada: ${(0, Color_1.default)(taskId, 'cyan', 'bold')} (${timeoutMs}ms)`);
|
|
266
|
+
};
|
|
267
|
+
exports.StartTaskTimer = StartTaskTimer;
|
|
268
|
+
const StopTaskTimer = (taskId, runtimeKey) => {
|
|
269
|
+
const scopedTaskId = runtimeKey
|
|
270
|
+
? `${runtimeKey}:${taskId}`
|
|
271
|
+
: Array.from(activeTaskTimers.keys()).find((key) => key.endsWith(`:${taskId}`)) || taskId;
|
|
272
|
+
const timer = activeTaskTimers.get(scopedTaskId);
|
|
273
|
+
if (timer) {
|
|
274
|
+
clearInterval(timer);
|
|
275
|
+
activeTaskTimers.delete(scopedTaskId);
|
|
276
|
+
(0, ConsoleLog_1.logInfo)(`Task pausada/parada: ${(0, Color_1.default)(taskId, 'cyan', 'bold')}`);
|
|
277
|
+
}
|
|
278
|
+
};
|
|
279
|
+
exports.StopTaskTimer = StopTaskTimer;
|
|
280
|
+
const StopTasksForClient = (runtimeKey) => {
|
|
281
|
+
const prefix = `${runtimeKey}:`;
|
|
282
|
+
for (const [key, timer] of activeTaskTimers.entries()) {
|
|
283
|
+
if (!key.startsWith(prefix))
|
|
284
|
+
continue;
|
|
285
|
+
clearInterval(timer);
|
|
286
|
+
activeTaskTimers.delete(key);
|
|
287
|
+
}
|
|
288
|
+
for (const key of Array.from(runningTasks)) {
|
|
289
|
+
if (key.startsWith(prefix))
|
|
290
|
+
runningTasks.delete(key);
|
|
291
|
+
}
|
|
292
|
+
};
|
|
293
|
+
exports.StopTasksForClient = StopTasksForClient;
|
|
294
|
+
const StartTasksScheduler = (client) => {
|
|
295
|
+
if (!client.tasks || client.tasks.size === 0)
|
|
296
|
+
return;
|
|
297
|
+
client.tasks.forEach((task, taskId) => {
|
|
298
|
+
if (task.runOnStart) {
|
|
299
|
+
void Promise.resolve()
|
|
300
|
+
.then(() => (0, exports.ExecuteTask)(client, task))
|
|
301
|
+
.catch((err) => (0, ConsoleLog_1.logError)(`Erro na execução inicial da task ${taskId}: ${err}`));
|
|
302
|
+
}
|
|
303
|
+
if (task.started !== false) {
|
|
304
|
+
(0, exports.StartTaskTimer)(client, taskId);
|
|
305
|
+
}
|
|
306
|
+
else {
|
|
307
|
+
(0, ConsoleLog_1.logInfo)(`Task registrada (aguardando acionamento manual via runTask/startTask): ${(0, Color_1.default)(taskId, 'cyan', 'bold')}`);
|
|
308
|
+
}
|
|
309
|
+
});
|
|
310
|
+
};
|
|
311
|
+
exports.StartTasksScheduler = StartTasksScheduler;
|
|
312
|
+
const Setup = async (client) => {
|
|
313
|
+
// Graceful Shutdown
|
|
314
|
+
const shutdownHandler = async () => {
|
|
315
|
+
(0, ConsoleLog_1.logInfo)('Encerrando serviços e finalizando aplicação...', 'Shutdown');
|
|
316
|
+
(0, exports.StopTasksForClient)(client.runtimeKey || 'default');
|
|
317
|
+
await client.destroy();
|
|
318
|
+
process.exit(0);
|
|
319
|
+
};
|
|
320
|
+
process.once('SIGINT', shutdownHandler);
|
|
321
|
+
process.once('SIGTERM', shutdownHandler);
|
|
322
|
+
client._on(discord_js_1.Events.GuildCreate, SafeAsyncListener('GuildCreate', async (guild) => {
|
|
323
|
+
TelemetryService_1.default.registerEvent('discord:guildCreate');
|
|
324
|
+
TelemetryService_1.default.registerCounter('guildsJoined');
|
|
325
|
+
(0, ConsoleLog_1.logInfo)(`Adicionado em uma nova guild: ${guild.name}. Sincronizando comandos...`);
|
|
326
|
+
await (0, RoleLoader_1.default)(client);
|
|
327
|
+
await (0, ChannelLoader_1.default)(client);
|
|
328
|
+
await WebSocket.SendResourceSnapshot();
|
|
329
|
+
await RegisterSlashCommands(client);
|
|
330
|
+
}));
|
|
331
|
+
client._on(discord_js_1.Events.GuildDelete, SafeAsyncListener('GuildDelete', async () => {
|
|
332
|
+
TelemetryService_1.default.registerEvent('discord:guildDelete');
|
|
333
|
+
TelemetryService_1.default.registerCounter('guildsLeft');
|
|
334
|
+
await (0, RoleLoader_1.default)(client);
|
|
335
|
+
await (0, ChannelLoader_1.default)(client);
|
|
336
|
+
await WebSocket.SendResourceSnapshot();
|
|
337
|
+
}));
|
|
338
|
+
client.registeredEvents.forEach((definers, eventName) => {
|
|
339
|
+
definers.forEach((definer) => {
|
|
340
|
+
client._on(eventName, SafeAsyncListener(`event:${eventName}`, async (...args) => {
|
|
341
|
+
const startedAt = Date.now();
|
|
342
|
+
try {
|
|
343
|
+
await definer.execute(...args);
|
|
344
|
+
TelemetryService_1.default.registerEvent(`discord:${eventName}`, {
|
|
345
|
+
durationMs: Date.now() - startedAt
|
|
346
|
+
});
|
|
347
|
+
}
|
|
348
|
+
catch (error) {
|
|
349
|
+
TelemetryService_1.default.registerEvent(`discord:${eventName}`, {
|
|
350
|
+
error: true,
|
|
351
|
+
durationMs: Date.now() - startedAt
|
|
352
|
+
});
|
|
353
|
+
throw error;
|
|
354
|
+
}
|
|
355
|
+
}));
|
|
356
|
+
});
|
|
357
|
+
});
|
|
358
|
+
client.registeredOnceEvents.forEach((definers, eventName) => {
|
|
359
|
+
definers.forEach((definer) => {
|
|
360
|
+
client._once(eventName, SafeAsyncListener(`once:${eventName}`, async (...args) => {
|
|
361
|
+
const startedAt = Date.now();
|
|
362
|
+
try {
|
|
363
|
+
await definer.execute(...args);
|
|
364
|
+
TelemetryService_1.default.registerEvent(`discord:once:${eventName}`, {
|
|
365
|
+
durationMs: Date.now() - startedAt
|
|
366
|
+
});
|
|
367
|
+
}
|
|
368
|
+
catch (error) {
|
|
369
|
+
TelemetryService_1.default.registerEvent(`discord:once:${eventName}`, {
|
|
370
|
+
error: true,
|
|
371
|
+
durationMs: Date.now() - startedAt
|
|
372
|
+
});
|
|
373
|
+
throw error;
|
|
374
|
+
}
|
|
375
|
+
}));
|
|
376
|
+
});
|
|
377
|
+
});
|
|
378
|
+
client._on(discord_js_1.Events.InteractionCreate, SafeAsyncListener('InteractionCreate', async (interaction) => {
|
|
379
|
+
TelemetryService_1.default.registerCounter('interactionsSeen');
|
|
380
|
+
if (interaction.isAutocomplete()) {
|
|
381
|
+
const Command = client.slashCommands.get(interaction.commandName);
|
|
382
|
+
if (!Command?.autocomplete) {
|
|
383
|
+
// Autocomplete sem handler não pode ficar sem resposta: o Discord
|
|
384
|
+
// exibe "carregando" eternamente para o usuário.
|
|
385
|
+
await interaction.respond([]).catch(() => { });
|
|
386
|
+
return;
|
|
387
|
+
}
|
|
388
|
+
TelemetryService_1.default.registerCounter('autocompleteRequests');
|
|
389
|
+
const autocompleteStartedAt = Date.now();
|
|
390
|
+
try {
|
|
391
|
+
await Command.autocomplete(interaction);
|
|
392
|
+
TelemetryService_1.default.registerAction('autocomplete', interaction.commandName, true, { user: interaction.user.id, guild: interaction.guildId }, undefined, Date.now() - autocompleteStartedAt);
|
|
393
|
+
}
|
|
394
|
+
catch (error) {
|
|
395
|
+
(0, ConsoleLog_1.logError)(`Erro no autocomplete do comando ${(0, Color_1.default)(interaction.commandName, 'cyan', 'bold')}: ${error}`);
|
|
396
|
+
TelemetryService_1.default.registerAction('autocomplete', interaction.commandName, false, { user: interaction.user.id, guild: interaction.guildId }, String(error), Date.now() - autocompleteStartedAt);
|
|
397
|
+
}
|
|
398
|
+
return;
|
|
399
|
+
}
|
|
400
|
+
if (interaction.isChatInputCommand()) {
|
|
401
|
+
const Command = client.slashCommands.get(interaction.commandName);
|
|
402
|
+
if (!Command) {
|
|
403
|
+
// Comando removido/renomeado após o Discord cachear a entrada:
|
|
404
|
+
// responder, não deixar a interação morrer com "falhou".
|
|
405
|
+
TelemetryService_1.default.registerCounter('unknownCommandInteractions');
|
|
406
|
+
await interaction
|
|
407
|
+
.reply({
|
|
408
|
+
content: 'Este comando não está mais disponível. Tente novamente em instantes.',
|
|
409
|
+
flags: 64
|
|
410
|
+
})
|
|
411
|
+
.catch(() => { });
|
|
412
|
+
return;
|
|
413
|
+
}
|
|
414
|
+
const CreateRequire = (options) => {
|
|
415
|
+
const Member = interaction.member;
|
|
416
|
+
const ChannelId = interaction.channelId;
|
|
417
|
+
if (options.roles && Member) {
|
|
418
|
+
const RoleIds = Member.roles?.cache?.map((R) => R.id) || [];
|
|
419
|
+
if ('any' in options.roles) {
|
|
420
|
+
const HasAny = options.roles.any.some((Id) => RoleIds.includes(Id));
|
|
421
|
+
if (!HasAny) {
|
|
422
|
+
throw new Permission_Type_1.PermissionError(options.message ||
|
|
423
|
+
'Você não tem o cargo necessário para usar este comando.');
|
|
424
|
+
}
|
|
425
|
+
}
|
|
426
|
+
if ('all' in options.roles) {
|
|
427
|
+
const HasAll = options.roles.all.every((Id) => RoleIds.includes(Id));
|
|
428
|
+
if (!HasAll) {
|
|
429
|
+
throw new Permission_Type_1.PermissionError(options.message ||
|
|
430
|
+
'Você não tem o cargo necessário para usar este comando.');
|
|
431
|
+
}
|
|
432
|
+
}
|
|
433
|
+
if ('min' in options.roles) {
|
|
434
|
+
const Count = options.roles.from.filter((Id) => RoleIds.includes(Id)).length;
|
|
435
|
+
if (Count < options.roles.min) {
|
|
436
|
+
throw new Permission_Type_1.PermissionError(options.message ||
|
|
437
|
+
'Você não tem o cargo necessário para usar este comando.');
|
|
438
|
+
}
|
|
439
|
+
}
|
|
440
|
+
}
|
|
441
|
+
if (options.channels && ChannelId) {
|
|
442
|
+
if ('any' in options.channels) {
|
|
443
|
+
const InAny = options.channels.any.includes(ChannelId);
|
|
444
|
+
if (!InAny) {
|
|
445
|
+
throw new Permission_Type_1.PermissionError(options.message ||
|
|
446
|
+
'Este comando não pode ser usado neste canal.');
|
|
447
|
+
}
|
|
448
|
+
}
|
|
449
|
+
if ('all' in options.channels) {
|
|
450
|
+
const InAll = options.channels.all.includes(ChannelId);
|
|
451
|
+
if (!InAll) {
|
|
452
|
+
throw new Permission_Type_1.PermissionError(options.message ||
|
|
453
|
+
'Este comando não pode ser usado neste canal.');
|
|
454
|
+
}
|
|
455
|
+
}
|
|
456
|
+
if ('min' in options.channels) {
|
|
457
|
+
const Count = options.channels.from.filter((Id) => Id === ChannelId).length;
|
|
458
|
+
if (Count < options.channels.min) {
|
|
459
|
+
throw new Permission_Type_1.PermissionError(options.message ||
|
|
460
|
+
'Este comando não pode ser usado neste canal.');
|
|
461
|
+
}
|
|
462
|
+
}
|
|
463
|
+
}
|
|
464
|
+
return Promise.resolve(true);
|
|
465
|
+
};
|
|
466
|
+
const Ctx = ComponentRuntime.attachRequests(Object.assign(interaction, {
|
|
467
|
+
Type: 'Slash',
|
|
468
|
+
require: CreateRequire,
|
|
469
|
+
t: (key, params, locale) => {
|
|
470
|
+
return I18n_1.default.t(key, params, locale || interaction.locale || interaction.guild?.preferredLocale);
|
|
471
|
+
}
|
|
472
|
+
}), client.runtimeKey);
|
|
473
|
+
Ctx.options = (0, InputInteraction_Type_2.ProxyOptions)(Ctx.options);
|
|
474
|
+
try {
|
|
475
|
+
const canExecute = await ProcessCooldown(Ctx, interaction.commandName, Command);
|
|
476
|
+
if (!canExecute)
|
|
477
|
+
return;
|
|
478
|
+
const executeAction = async () => {
|
|
479
|
+
// A medição começa aqui para excluir o tempo de espera na fila.
|
|
480
|
+
const handlerStartedAt = Date.now();
|
|
481
|
+
await (0, InteractionContext_1.RunWith)(Ctx, () => Command.execute(Ctx));
|
|
482
|
+
TelemetryService_1.default.registerAction('slash', interaction.commandName, true, {
|
|
483
|
+
user: interaction.user.id,
|
|
484
|
+
guild: interaction.guildId,
|
|
485
|
+
params: interaction.options.data
|
|
486
|
+
}, undefined, Date.now() - handlerStartedAt);
|
|
487
|
+
};
|
|
488
|
+
await ProcessQueue(Ctx, interaction.commandName, Command, executeAction);
|
|
489
|
+
TelemetryService_1.default.registerCounter('slashHandled');
|
|
490
|
+
}
|
|
491
|
+
catch (error) {
|
|
492
|
+
if (error instanceof Permission_Type_1.PermissionError) {
|
|
493
|
+
TelemetryService_1.default.registerCounter('permissionRejections');
|
|
494
|
+
const Reply = { content: error.message, flags: 64 };
|
|
495
|
+
if (interaction.replied || interaction.deferred) {
|
|
496
|
+
await interaction.followUp(Reply).catch(() => { });
|
|
497
|
+
}
|
|
498
|
+
else {
|
|
499
|
+
await interaction.reply(Reply).catch(() => { });
|
|
500
|
+
}
|
|
501
|
+
return;
|
|
502
|
+
}
|
|
503
|
+
(0, ConsoleLog_1.logError)(`Erro no slash command ${(0, Color_1.default)(interaction.commandName, 'cyan', 'bold')}: ${error}`);
|
|
504
|
+
TelemetryService_1.default.registerAction('slash', interaction.commandName, false, {
|
|
505
|
+
user: interaction.user.id,
|
|
506
|
+
guild: interaction.guildId,
|
|
507
|
+
params: interaction.options.data
|
|
508
|
+
}, String(error));
|
|
509
|
+
const Reply = { content: 'Erro ao executar comando', flags: 64 };
|
|
510
|
+
if (interaction.replied || interaction.deferred) {
|
|
511
|
+
await interaction.followUp(Reply).catch(() => { });
|
|
512
|
+
}
|
|
513
|
+
else {
|
|
514
|
+
await interaction.reply(Reply).catch(() => { });
|
|
515
|
+
}
|
|
516
|
+
}
|
|
517
|
+
return;
|
|
518
|
+
}
|
|
519
|
+
if (interaction.isContextMenuCommand()) {
|
|
520
|
+
const Command = client.contextMenuCommands.get(interaction.commandName);
|
|
521
|
+
if (!Command)
|
|
522
|
+
return;
|
|
523
|
+
const Ctx = ComponentRuntime.attachRequests((0, InputInteraction_Type_1.CreateContextMenuInputCommandInteraction)(interaction), client.runtimeKey);
|
|
524
|
+
try {
|
|
525
|
+
const handlerStartedAt = Date.now();
|
|
526
|
+
await (0, InteractionContext_1.RunWith)(Ctx, () => Command.execute(Ctx));
|
|
527
|
+
TelemetryService_1.default.registerAction('context', interaction.commandName, true, {
|
|
528
|
+
user: interaction.user.id,
|
|
529
|
+
guild: interaction.guildId
|
|
530
|
+
}, undefined, Date.now() - handlerStartedAt);
|
|
531
|
+
}
|
|
532
|
+
catch (error) {
|
|
533
|
+
if (error instanceof Permission_Type_1.PermissionError) {
|
|
534
|
+
TelemetryService_1.default.registerCounter('permissionRejections');
|
|
535
|
+
const Reply = { content: error.message, flags: 64 };
|
|
536
|
+
if (interaction.replied || interaction.deferred) {
|
|
537
|
+
await interaction.followUp(Reply).catch(() => { });
|
|
538
|
+
}
|
|
539
|
+
else {
|
|
540
|
+
await interaction.reply(Reply).catch(() => { });
|
|
541
|
+
}
|
|
542
|
+
return;
|
|
543
|
+
}
|
|
544
|
+
(0, ConsoleLog_1.logError)(`Erro no context menu ${(0, Color_1.default)(interaction.commandName, 'cyan', 'bold')}: ${error}`);
|
|
545
|
+
TelemetryService_1.default.registerAction('context', interaction.commandName, false, {
|
|
546
|
+
user: interaction.user.id,
|
|
547
|
+
guild: interaction.guildId
|
|
548
|
+
}, String(error));
|
|
549
|
+
const Reply = { content: 'Erro ao executar comando', flags: 64 };
|
|
550
|
+
if (interaction.replied || interaction.deferred) {
|
|
551
|
+
await interaction.followUp(Reply).catch(() => { });
|
|
552
|
+
}
|
|
553
|
+
else {
|
|
554
|
+
await interaction.reply(Reply).catch(() => { });
|
|
555
|
+
}
|
|
556
|
+
}
|
|
557
|
+
return;
|
|
558
|
+
}
|
|
559
|
+
if (interaction.isModalSubmit()) {
|
|
560
|
+
const Modal = client.modals.get(interaction.customId);
|
|
561
|
+
if (!Modal) {
|
|
562
|
+
// Modal sem handler registrado (ex.: removido após restart):
|
|
563
|
+
// responder evita o "falha na interação" para o usuário.
|
|
564
|
+
TelemetryService_1.default.registerCounter('unknownModalSubmits');
|
|
565
|
+
await interaction
|
|
566
|
+
.reply({
|
|
567
|
+
content: 'Este formulário não está mais disponível.',
|
|
568
|
+
flags: 64
|
|
569
|
+
})
|
|
570
|
+
.catch(() => { });
|
|
571
|
+
return;
|
|
572
|
+
}
|
|
573
|
+
TelemetryService_1.default.registerCounter('modalSubmits');
|
|
574
|
+
const handlerStartedAt = Date.now();
|
|
575
|
+
try {
|
|
576
|
+
await Modal.execute(interaction);
|
|
577
|
+
TelemetryService_1.default.registerAction('modal', interaction.customId, true, { user: interaction.user.id, guild: interaction.guildId }, undefined, Date.now() - handlerStartedAt);
|
|
578
|
+
}
|
|
579
|
+
catch (error) {
|
|
580
|
+
(0, ConsoleLog_1.logError)(`Erro no modal ${(0, Color_1.default)(interaction.customId, 'cyan', 'bold')}: ${error}`);
|
|
581
|
+
TelemetryService_1.default.registerAction('modal', interaction.customId, false, { user: interaction.user.id, guild: interaction.guildId }, String(error), Date.now() - handlerStartedAt);
|
|
582
|
+
const Reply = { content: 'Erro ao processar modal', flags: 64 };
|
|
583
|
+
if (interaction.replied || interaction.deferred) {
|
|
584
|
+
await interaction.followUp(Reply).catch(() => { });
|
|
585
|
+
}
|
|
586
|
+
else {
|
|
587
|
+
await interaction.reply(Reply).catch(() => { });
|
|
588
|
+
}
|
|
589
|
+
}
|
|
590
|
+
return;
|
|
591
|
+
}
|
|
592
|
+
if (interaction.isButton() || interaction.isAnySelectMenu()) {
|
|
593
|
+
TelemetryService_1.default.registerCounter('componentInteractions');
|
|
594
|
+
const ActiveComponent = InteractionManager_1.default.FindActive(interaction.customId, interaction, client.runtimeKey);
|
|
595
|
+
if (!ActiveComponent) {
|
|
596
|
+
const runtimeStartedAt = Date.now();
|
|
597
|
+
try {
|
|
598
|
+
if (await ComponentRuntime.resolve(interaction, client.runtimeKey)) {
|
|
599
|
+
TelemetryService_1.default.registerAction('component', interaction.customId, true, { user: interaction.user.id, guild: interaction.guildId, runtime: 'componentb' }, undefined, Date.now() - runtimeStartedAt);
|
|
600
|
+
return;
|
|
601
|
+
}
|
|
602
|
+
}
|
|
603
|
+
catch (error) {
|
|
604
|
+
(0, ConsoleLog_1.logError)(`Erro no runtime da ComponentB ${(0, Color_1.default)(interaction.customId, 'cyan', 'bold')}: ${error?.message || error}`, 'ComponentB');
|
|
605
|
+
TelemetryService_1.default.registerAction('component', interaction.customId, false, { user: interaction.user.id, guild: interaction.guildId, runtime: 'componentb' }, String(error?.message || error), Date.now() - runtimeStartedAt);
|
|
606
|
+
if (!interaction.replied && !interaction.deferred) {
|
|
607
|
+
await interaction.reply({
|
|
608
|
+
content: 'Não foi possível processar este componente.',
|
|
609
|
+
flags: 64
|
|
610
|
+
}).catch(() => { });
|
|
611
|
+
}
|
|
612
|
+
}
|
|
613
|
+
return;
|
|
614
|
+
}
|
|
615
|
+
if (ActiveComponent.user &&
|
|
616
|
+
ActiveComponent.user !== interaction.user.id) {
|
|
617
|
+
TelemetryService_1.default.registerCounter('componentUserMismatches');
|
|
618
|
+
await interaction
|
|
619
|
+
.reply({
|
|
620
|
+
content: 'Você não pode interagir com este componente.',
|
|
621
|
+
flags: 64
|
|
622
|
+
})
|
|
623
|
+
.catch(() => { });
|
|
624
|
+
return;
|
|
625
|
+
}
|
|
626
|
+
const handlerStartedAt = Date.now();
|
|
627
|
+
try {
|
|
628
|
+
if (ActiveComponent.definer.Execute) {
|
|
629
|
+
const Ctx = InteractionManager_1.default.CreateContext(interaction);
|
|
630
|
+
await ActiveComponent.definer.Execute(Ctx);
|
|
631
|
+
}
|
|
632
|
+
else {
|
|
633
|
+
await InteractionManager_1.default.ResolveActive(interaction.customId, interaction, client.runtimeKey);
|
|
634
|
+
}
|
|
635
|
+
TelemetryService_1.default.registerAction('component', interaction.customId, true, { user: interaction.user.id, guild: interaction.guildId }, undefined, Date.now() - handlerStartedAt);
|
|
636
|
+
}
|
|
637
|
+
catch (error) {
|
|
638
|
+
(0, ConsoleLog_1.logError)(`Erro no componente ${(0, Color_1.default)(interaction.customId, 'cyan', 'bold')}: ${error}`);
|
|
639
|
+
TelemetryService_1.default.registerAction('component', interaction.customId, false, { user: interaction.user.id, guild: interaction.guildId }, String(error), Date.now() - handlerStartedAt);
|
|
640
|
+
const Reply = {
|
|
641
|
+
content: 'Erro ao processar componente',
|
|
642
|
+
flags: 64
|
|
643
|
+
};
|
|
644
|
+
if (interaction.replied || interaction.deferred) {
|
|
645
|
+
await interaction.followUp(Reply).catch(() => { });
|
|
646
|
+
}
|
|
647
|
+
else {
|
|
648
|
+
await interaction.reply(Reply).catch(() => { });
|
|
649
|
+
}
|
|
650
|
+
}
|
|
651
|
+
return;
|
|
652
|
+
}
|
|
653
|
+
}));
|
|
654
|
+
const Prefix = process.env.PREFIX || '!';
|
|
655
|
+
client._on(discord_js_1.Events.MessageCreate, SafeAsyncListener('MessageCreate', async (message) => {
|
|
656
|
+
if (message.author.bot)
|
|
657
|
+
return;
|
|
658
|
+
TelemetryService_1.default.registerCounter('messagesSeen');
|
|
659
|
+
if (!message.content.startsWith(Prefix))
|
|
660
|
+
return;
|
|
661
|
+
const Args = message.content.slice(Prefix.length).trim().split(/ +/);
|
|
662
|
+
const CommandName = Args.shift()?.toLowerCase();
|
|
663
|
+
if (!CommandName)
|
|
664
|
+
return;
|
|
665
|
+
let Command = client.prefixCommands.get(CommandName);
|
|
666
|
+
if (!Command) {
|
|
667
|
+
Command = client.prefixCommands.find((cmd) => {
|
|
668
|
+
const Config = cmd.data.toConfig();
|
|
669
|
+
return Config.Aliases.some((A) => A.toLowerCase() === CommandName);
|
|
670
|
+
});
|
|
671
|
+
}
|
|
672
|
+
if (!Command)
|
|
673
|
+
return;
|
|
674
|
+
const Config = Command.data.toConfig();
|
|
675
|
+
const Ctx = ComponentRuntime.attachRequests((0, InputInteraction_Type_1.CreatePrefixInputCommandInteraction)(message, Args, Config, Config.Name, client.runtimeKey), client.runtimeKey);
|
|
676
|
+
try {
|
|
677
|
+
const canExecute = await ProcessCooldown(Ctx, Config.Name, Command);
|
|
678
|
+
if (!canExecute)
|
|
679
|
+
return;
|
|
680
|
+
const executeAction = async () => {
|
|
681
|
+
const handlerStartedAt = Date.now();
|
|
682
|
+
await (0, InteractionContext_1.RunWith)(Ctx, () => Command.execute(Ctx));
|
|
683
|
+
TelemetryService_1.default.registerAction('prefix', Config.Name, true, {
|
|
684
|
+
user: message.author.id,
|
|
685
|
+
guild: message.guildId,
|
|
686
|
+
params: Args
|
|
687
|
+
}, undefined, Date.now() - handlerStartedAt);
|
|
688
|
+
};
|
|
689
|
+
await ProcessQueue(Ctx, Config.Name, Command, executeAction);
|
|
690
|
+
TelemetryService_1.default.registerCounter('prefixHandled');
|
|
691
|
+
}
|
|
692
|
+
catch (error) {
|
|
693
|
+
if (error instanceof Permission_Type_1.PermissionError) {
|
|
694
|
+
TelemetryService_1.default.registerCounter('permissionRejections');
|
|
695
|
+
await message.reply(error.message).catch(() => { });
|
|
696
|
+
return;
|
|
697
|
+
}
|
|
698
|
+
const errorMessage = error instanceof Error ? error.message : String(error);
|
|
699
|
+
(0, ConsoleLog_1.logError)(`Erro no prefix command ${(0, Color_1.default)(Config.Name, 'cyan', 'bold')}: ${errorMessage}`);
|
|
700
|
+
TelemetryService_1.default.registerAction('prefix', Config.Name, false, {
|
|
701
|
+
user: message.author.id,
|
|
702
|
+
guild: message.guildId,
|
|
703
|
+
params: Args
|
|
704
|
+
}, String(error));
|
|
705
|
+
await message.reply('Erro ao executar comando').catch(() => { });
|
|
706
|
+
}
|
|
707
|
+
}));
|
|
708
|
+
};
|
|
709
|
+
exports.Setup = Setup;
|
|
710
|
+
// --------------------------------------------------------------------------------
|
|
711
|
+
//# sourceMappingURL=Definer.js.map
|