@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
JavaScript
// 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
};