import { Client, Intents } from "discord.js"; import { readdirSync } from "fs"; import { Komand, ListenerFunkce, Modul, SuperListenerFunkce } from "./utils/types"; import { formatCas, loadEnv, oddiakritikovat } from "./utils/utils.js"; const ints = Intents.FLAGS; const client = new Client({ intents: [ints.GUILDS, ints.GUILD_VOICE_STATES, ints.GUILD_PRESENCES, ints.GUILD_MESSAGES] }); loadEnv(); const prefix = process.env.prefix || "more"; const modulFolder = `${__dirname}/modules/`; const eventy: Record = {}; const superEventy: Record = {}; const komandy: Record = {}; const aliasy: Record = {}; let spink = false; const kuldan_log: Record> = {}; const runEvent = (name: string, args: any[]) => { for (const listener of superEventy[name] || []) { if (!listener) continue; if (listener(...args)) return true; } eventy[name]?.forEach(listener => { listener(...args); }); }; readdirSync(modulFolder).forEach(soubor => { if (!soubor.endsWith(".js")) return; const modul: Modul = require(`${modulFolder}${soubor}`); console.log(`Loaded: ${modulFolder}${soubor}`); modul.client = client; Object.keys(modul).forEach(name => { const regex = /^(?super_)?on_(?.+)/.exec(name); if (regex) { const groups = regex.groups!; const ev = groups.s ? superEventy : eventy; if (!ev[groups.h]) { ev[groups.h] = []; if (groups.h != "message") client.on(groups.h, (...args) => void runEvent(groups.h, args)); } const n = modul[name]; if (typeof n == "object") { const prev = ev[groups.h][n.pos] as SuperListenerFunkce | undefined; ev[groups.h][n.pos] = n.fun; if (prev) ev[groups.h].push(prev); } else ev[groups.h].push(n); } else if (name === "more_komandy") { Object.keys(modul[name]).forEach(cmdName => { const value = modul[name][cmdName]; if (typeof value !== "object") { komandy[cmdName] = { run: value }; } else { komandy[cmdName] = { run: value.run, cd: value.cd }; value.als?.forEach(al => aliasy[al] = cmdName); } }); } }); }); const maKuldan = (id: string, komand: string, kuldan_komandu: number) => { if (!kuldan_log[komand]) kuldan_log[komand] = {}; const cas_ted = Date.now() / 1000; const rozdil = cas_ted - kuldan_log[komand][id]; if (rozdil < kuldan_komandu) return kuldan_komandu - rozdil; kuldan_log[komand][id] = cas_ted; return 0; }; client.on("messageCreate", async mes => { if (process.env.ignoreMess) return; const [mes_prefix, komandSDiakritikou, ...args] = mes.content.split(" "); if (oddiakritikovat(mes_prefix.toLowerCase()) != prefix) return void runEvent("message", [mes]); if (!komandSDiakritikou) return void mes.channel.send("coe voe"); const komand = oddiakritikovat(komandSDiakritikou).toLowerCase(); const celArgs = args.join(" "); const cmdName = aliasy[komand] ?? komand; if (runEvent("message", [mes, cmdName])) return; const cmd = komandy[cmdName]; if (!cmd) return void mes.channel.send("co to znamena ti gadzovko"); if (cmd.cd) { const zbyva = Math.round(maKuldan(mes.author.id, cmdName, cmd.cd)); if (zbyva) return void mes.channel.send(`si kkt vole maz kuldan jeste ${formatCas(zbyva)}`); } const akce = cmd.run; if (typeof akce === "string") return void mes.channel.send(akce); const result = await akce(celArgs, mes); if (result && !(result instanceof Promise)) mes.channel.send(result); }); client.login(process.env.token);