UNPKG

@ayanaware/bentocord

Version:

Bentocord is a Bento plugin designed to rapidly build fully functional Discord Bots.

137 lines 5.82 kB
"use strict"; 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