UNPKG

@ad1m/djb

Version:

A streamlined library for creating Discord bots with Discord.js, featuring a simple command and event handler structure.

111 lines (106 loc) 3.42 kB
// src/handlers/event.ts import path2 from "node:path"; // src/utils/handler.ts import fs from "node:fs"; import path from "node:path"; // src/utils/url.ts import { fileURLToPath } from "url"; import { dirname, resolve } from "path"; var getCurrentModuleType = () => { if (typeof __dirname !== "undefined") { return "cjs"; } else if (typeof import.meta?.url !== "undefined") { return "esm"; } else { throw new Error("Unable to determine module type."); } }; var getCurrenDir = () => { const mType = getCurrentModuleType(); switch (mType) { case "cjs": return __dirname; case "esm": return dirname(fileURLToPath(import.meta.url)); } }; // src/utils/handler.ts import { pathToFileURL } from "node:url"; var EXT_PRIORITY = ["js", "mjs", "cjs"]; var loadFiles = async (dirPath) => { if (!fs.existsSync(dirPath)) return []; const entries = fs.readdirSync(dirPath, { withFileTypes: true, recursive: true }); const fileMap = /* @__PURE__ */ new Map(); for (const entry of entries) { if (entry.isDirectory()) continue; const match = entry.name.match(/^(.+)\.([^.]+)$/); if (!match) continue; const [, baseName, ext] = match; if (!EXT_PRIORITY.includes(ext)) continue; const existingEntry = fileMap.get(baseName); if (!existingEntry || EXT_PRIORITY.indexOf(ext) < EXT_PRIORITY.indexOf(existingEntry.name.split(".").pop())) { const entryPath = path.join(entry.parentPath, entry.name); const fileData = await import(pathToFileURL(entryPath).href); const resolvedFiledata = fileData.default?.default ? fileData.default : fileData; const file = { parent: path.basename(dirPath), name: entry.name.replace( new RegExp(`\\.(${EXT_PRIORITY.join("|")})$`), "" ), data: { config: resolvedFiledata?.config, execute: resolvedFiledata?.default && typeof resolvedFiledata.default === "function" ? resolvedFiledata.default : void 0 } }; fileMap.set(baseName, file); } } return fileMap.values(); }; // src/handlers/event.ts import CliTable3 from "cli-table3"; var EventHandler = async (client, appPath) => { const internalEventsPath = path2.join(getCurrenDir(), "..", "core-events"); const eventsPath = path2.join(appPath, "events"); const internalEvents = await loadFiles(internalEventsPath); const events = await loadFiles(eventsPath); const table = new CliTable3({ head: ["Group", "Name", "Event", "Status"] }); for (const event of [...internalEvents, ...events]) { const { data, name, parent } = event; if (!data?.config?.name) { table.push([ parent, `${name}`, "?", "\u274C Missing required 'name' config property" ]); continue; } if (!data?.execute) { table.push([ parent, `${name}`, data.config.name, "\u274C Missing required default execute function" ]); continue; } if (data.config.once) client.once(data.config.name, (...args) => data.execute(client, ...args)); else client.on(data.config.name, (...args) => data.execute(client, ...args)); table.push([parent, `${name}`, data.config.name, "\u2705 Loaded"]); } console.log("\n=== Events ==="); console.log(table.toString()); }; var event_default = EventHandler; export { event_default as default };