@ayanaware/bentocord
Version:
Bentocord is a Bento plugin designed to rapidly build fully functional Discord Bots.
137 lines • 5.82 kB
JavaScript
;
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
return c > 3 && r && Object.defineProperty(target, key, r), r;
};
var __metadata = (this && this.__metadata) || function (k, v) {
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.ComponentsManager = exports.ComponentManagerEvent = void 0;
const util = require("util");
const bento_1 = require("@ayanaware/bento");
const logger_api_1 = require("@ayanaware/logger-api");
const eris_1 = require("eris");
const Discord_1 = require("../discord/Discord");
const DiscordEvent_1 = require("../discord/constants/DiscordEvent");
const ButtonContext_1 = require("./contexts/ButtonContext");
const SelectContext_1 = require("./contexts/SelectContext");
const { ComponentTypes } = eris_1.Constants;
var ComponentManagerEvent;
(function (ComponentManagerEvent) {
/**
* Fired when a component handler was successfully executed
* @param ctx AnyComponentContext
* @param mili Miliseconds
*/
ComponentManagerEvent["COMPONENT_SUCCESS"] = "componentSuccess";
/**
* Fired when a component handler throws an error
* @param error Error
* @param ctx AnyComponentContext
* @param mili Miliseconds
*/
ComponentManagerEvent["COMPONENT_FAILURE"] = "componentFailure";
})(ComponentManagerEvent = exports.ComponentManagerEvent || (exports.ComponentManagerEvent = {}));
const log = logger_api_1.Logger.get();
class ComponentsManager {
constructor() {
this.name = '@ayanaware/bentocord:ComponentsManager';
this.prefixHandlers = new Map();
this.messageHandlers = new Map();
}
async onUnload() {
// close open handlers
for (const [id, [, close]] of [...this.messageHandlers, ...this.prefixHandlers]) {
if (!close)
continue;
try {
await close();
}
catch { /* NO-OP */ }
this.messageHandlers.delete(id);
this.prefixHandlers.delete(id);
}
}
hasPrefixHandler(prefix) {
return this.prefixHandlers.has(prefix);
}
addPrefixHandler(prefix, handler, close) {
if (this.hasPrefixHandler(prefix))
throw new Error(`Prefix handler already exists for "${prefix}"`);
if (!close)
close = async () => { };
this.prefixHandlers.set(prefix, [handler, close]);
}
removePrefixHandler(prefix) {
this.prefixHandlers.delete(prefix);
}
hasMessageHandler(messageId) {
return this.messageHandlers.has(messageId);
}
addMessageHandler(messageId, handler, close) {
if (this.hasMessageHandler(messageId))
throw new Error('MessageId has already been assigned a handler');
if (!close)
close = async () => { };
this.messageHandlers.set(messageId, [handler, close]);
}
removeMessageHandler(messageId) {
this.messageHandlers.delete(messageId);
}
async findHandler(ctx, customId) {
// check message handlers
const [messageHandler] = this.messageHandlers.get(ctx.messageId) ?? [];
if (messageHandler)
return messageHandler;
// attempt to find a prefix handler
if (!customId.prefix)
return null;
for (const [prefix, handler] of this.prefixHandlers.entries()) {
if (prefix !== customId.prefix)
continue;
return handler[0];
}
}
async handleInteraction(interaction) {
// Only handle Components
if (!(interaction instanceof eris_1.ComponentInteraction))
return;
let ctx;
if (interaction.data.component_type === ComponentTypes.BUTTON)
ctx = new ButtonContext_1.ButtonContext(this.api, interaction);
else if (interaction.data.component_type === ComponentTypes.SELECT_MENU)
ctx = new SelectContext_1.SelectContext(this.api, interaction);
await ctx.prepare();
const parsed = ctx.parseCustomId();
const handler = await this.findHandler(ctx, parsed);
if (!handler)
return;
const start = process.hrtime();
try {
await handler(ctx);
const end = process.hrtime(start);
const nano = end[0] * 1e9 + end[1];
const mili = nano / 1e6;
this.api.emit(ComponentManagerEvent.COMPONENT_SUCCESS, ctx, mili);
log.debug(`Component "${ctx.customId}" executed by "${ctx.userId}", took ${mili}ms`);
}
catch (e) {
const end = process.hrtime(start);
const nano = end[0] * 1e9 + end[1];
const mili = nano / 1e6;
this.api.emit(ComponentManagerEvent.COMPONENT_FAILURE, e, ctx, mili);
log.error(`Component handler error:\n${util.inspect(e)}`);
}
}
}
__decorate([
(0, bento_1.Subscribe)(Discord_1.Discord, DiscordEvent_1.DiscordEvent.INTERACTION_CREATE),
__metadata("design:type", Function),
__metadata("design:paramtypes", [Object]),
__metadata("design:returntype", Promise)
], ComponentsManager.prototype, "handleInteraction", null);
exports.ComponentsManager = ComponentsManager;
//# sourceMappingURL=ComponentsManager.js.map