mirror of
https://github.com/keanuplayz/TravBot-v3.git
synced 2024-08-15 02:33:12 +00:00
Relocated loadCommands and loadEvents
This commit is contained in:
parent
7193c9e70a
commit
14f78a91dc
6 changed files with 59 additions and 53 deletions
|
@ -1,6 +1,6 @@
|
|||
import Command from "../core/command";
|
||||
import {CommonLibrary} from "../core/lib";
|
||||
import FileManager from "../core/storage";
|
||||
import {loadCommands} from "../core/command";
|
||||
|
||||
const types = ["user", "number", "any"];
|
||||
|
||||
|
@ -9,7 +9,7 @@ export default new Command({
|
|||
usage: "([command, [subcommand/type], ...])",
|
||||
async run($: CommonLibrary): Promise<any>
|
||||
{
|
||||
const commands = await FileManager.loadCommands();
|
||||
const commands = await loadCommands();
|
||||
const list: string[] = [];
|
||||
|
||||
for(const [header, command] of commands)
|
||||
|
@ -22,7 +22,7 @@ export default new Command({
|
|||
any: new Command({
|
||||
async run($: CommonLibrary): Promise<any>
|
||||
{
|
||||
const commands = await FileManager.loadCommands();
|
||||
const commands = await loadCommands();
|
||||
let header = $.args.shift();
|
||||
let command = commands.get(header);
|
||||
|
||||
|
|
|
@ -1,4 +1,7 @@
|
|||
import {isType, parseVars, CommonLibrary} from "./lib";
|
||||
import $, {isType, parseVars, CommonLibrary} from "./lib";
|
||||
import {Collection} from "discord.js";
|
||||
import Storage, {generateHandler} from "./storage";
|
||||
import {existsSync, writeFile} from "fs";
|
||||
|
||||
// Permission levels starting from zero then increasing, allowing for numerical comparisons.
|
||||
// Note: For my bot, there really isn't much purpose to doing so, as it's just one command. And plus, if you're doing stuff like moderation commands, it's probably better to make a permissions system that allows for you to separate permissions into different trees. After all, it'd be a really bad idea to allow a bot mechanic to ban users.
|
||||
|
@ -94,6 +97,31 @@ export default class Command
|
|||
return true;
|
||||
}*/
|
||||
|
||||
let commands: Collection<string, Command> | null = null;
|
||||
|
||||
/** Returns the cache of the commands if it exists and searches the directory if not. */
|
||||
// Fun, Miscellaneous (default), Music, System, Utility
|
||||
export async function loadCommands(): Promise<Collection<string, Command>>
|
||||
{
|
||||
if(commands)
|
||||
return commands;
|
||||
|
||||
if(process.argv[2] === "dev" && !existsSync("src/commands/test.ts"))
|
||||
writeFile("src/commands/test.ts", template, generateHandler('"test.ts" (testing/template command) successfully generated.'));
|
||||
|
||||
commands = new Collection();
|
||||
|
||||
for(const file of Storage.open("dist/commands", (filename: string) => filename.endsWith(".js")))
|
||||
{
|
||||
const header = file.substring(0, file.indexOf(".js"));
|
||||
const command = (await import(`../commands/${header}`)).default;
|
||||
commands.set(header, command);
|
||||
$.log(`Loading Command: ${header}`);
|
||||
}
|
||||
|
||||
return commands;
|
||||
}
|
||||
|
||||
// The template should be built with a reductionist mentality.
|
||||
// Provide everything the user needs and then let them remove whatever they want.
|
||||
// That way, they aren't focusing on what's missing, but rather what they need for their command.
|
||||
|
|
|
@ -1,7 +1,9 @@
|
|||
import {Client} from "discord.js";
|
||||
import Storage from "./storage";
|
||||
import $ from "./lib";
|
||||
|
||||
// Last Updated: Discord.js v12.2.0
|
||||
export const EVENTS = ["channelCreate", "channelDelete", "channelPinsUpdate", "channelUpdate", "debug", "warn", "disconnect", "emojiCreate", "emojiDelete", "emojiUpdate", "error", "guildBanAdd", "guildBanRemove", "guildCreate", "guildDelete", "guildUnavailable", "guildIntegrationsUpdate", "guildMemberAdd", "guildMemberAvailable", "guildMemberRemove", "guildMembersChunk", "guildMemberSpeaking", "guildMemberUpdate", "guildUpdate", "inviteCreate", "inviteDelete", "message", "messageDelete", "messageReactionRemoveAll", "messageReactionRemoveEmoji", "messageDeleteBulk", "messageReactionAdd", "messageReactionRemove", "messageUpdate", "presenceUpdate", "rateLimit", "ready", "invalidated", "roleCreate", "roleDelete", "roleUpdate", "typingStart", "userUpdate", "voiceStateUpdate", "webhookUpdate", "shardDisconnect", "shardError", "shardReady", "shardReconnecting", "shardResume"];
|
||||
const EVENTS = ["channelCreate", "channelDelete", "channelPinsUpdate", "channelUpdate", "debug", "warn", "disconnect", "emojiCreate", "emojiDelete", "emojiUpdate", "error", "guildBanAdd", "guildBanRemove", "guildCreate", "guildDelete", "guildUnavailable", "guildIntegrationsUpdate", "guildMemberAdd", "guildMemberAvailable", "guildMemberRemove", "guildMembersChunk", "guildMemberSpeaking", "guildMemberUpdate", "guildUpdate", "inviteCreate", "inviteDelete", "message", "messageDelete", "messageReactionRemoveAll", "messageReactionRemoveEmoji", "messageDeleteBulk", "messageReactionAdd", "messageReactionRemove", "messageUpdate", "presenceUpdate", "rateLimit", "ready", "invalidated", "roleCreate", "roleDelete", "roleUpdate", "typingStart", "userUpdate", "voiceStateUpdate", "webhookUpdate", "shardDisconnect", "shardError", "shardReady", "shardReconnecting", "shardResume"];
|
||||
|
||||
interface EventOptions
|
||||
{
|
||||
|
@ -28,4 +30,21 @@ export default class Event
|
|||
if(this.once)
|
||||
client.once(event as any, this.once as any);
|
||||
}
|
||||
}
|
||||
|
||||
export async function loadEvents(client: Client)
|
||||
{
|
||||
for(const file of Storage.open("dist/events", (filename: string) => filename.endsWith(".js")))
|
||||
{
|
||||
const header = file.substring(0, file.indexOf(".js"));
|
||||
const event = (await import(`../events/${header}`)).default;
|
||||
|
||||
if(EVENTS.includes(header))
|
||||
{
|
||||
event.attach(client, header);
|
||||
$.log(`Loading Event: ${header}`);
|
||||
}
|
||||
else
|
||||
$.warn(`"${header}" is not a valid event type! Did you misspell it? (Note: If you fixed the issue, delete "dist" because the compiler won't automatically delete any extra files.)`);
|
||||
}
|
||||
}
|
|
@ -1,10 +1,5 @@
|
|||
import fs from "fs";
|
||||
import $ from "./lib";
|
||||
import {Collection, Client} from "discord.js";
|
||||
import Command, {template} from "../core/command";
|
||||
import {EVENTS} from "./event";
|
||||
|
||||
let commands: Collection<string, Command>|null = null;
|
||||
|
||||
const Storage = {
|
||||
read(header: string): object
|
||||
|
@ -73,47 +68,10 @@ const Storage = {
|
|||
{
|
||||
if(fs.existsSync(path) && fs.readdirSync(path).length === 0)
|
||||
fs.rmdir(path, generateHandler(`"${path}" successfully closed.`));
|
||||
},
|
||||
/** Returns the cache of the commands if it exists and searches the directory if not. */
|
||||
async loadCommands(): Promise<Collection<string, Command>>
|
||||
{
|
||||
if(commands)
|
||||
return commands;
|
||||
|
||||
if(process.argv[2] === "dev" && !fs.existsSync("src/commands/test.ts"))
|
||||
fs.writeFile("src/commands/test.ts", template, generateHandler('"test.ts" (testing/template command) successfully generated.'));
|
||||
|
||||
commands = new Collection();
|
||||
|
||||
for(const file of Storage.open("dist/commands", (filename: string) => filename.endsWith(".js")))
|
||||
{
|
||||
const header = file.substring(0, file.indexOf(".js"));
|
||||
const command = (await import(`../commands/${header}`)).default;
|
||||
commands.set(header, command);
|
||||
$.log(`Loading Command: ${header}`);
|
||||
}
|
||||
|
||||
return commands;
|
||||
},
|
||||
async loadEvents(client: Client)
|
||||
{
|
||||
for(const file of Storage.open("dist/events", (filename: string) => filename.endsWith(".js")))
|
||||
{
|
||||
const header = file.substring(0, file.indexOf(".js"));
|
||||
const event = (await import(`../events/${header}`)).default;
|
||||
|
||||
if(EVENTS.includes(header))
|
||||
{
|
||||
event.attach(client, header);
|
||||
$.log(`Loading Event: ${header}`);
|
||||
}
|
||||
else
|
||||
$.warn(`"${header}" is not a valid event type! Did you misspell it? (Note: If you fixed the issue, delete "dist" because the compiler won't automatically delete any extra files.)`);
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
function generateHandler(message: string)
|
||||
export function generateHandler(message: string)
|
||||
{
|
||||
return (error: Error|null) => {
|
||||
if(error)
|
||||
|
|
|
@ -2,8 +2,8 @@ import Event from "../core/event";
|
|||
import Command from "../core/command";
|
||||
import $ from "../core/lib";
|
||||
import {Message, Permissions, Collection} from "discord.js";
|
||||
import FileManager from "../core/storage";
|
||||
import {Config, Storage} from "../core/structures";
|
||||
import {loadCommands} from "../core/command";
|
||||
|
||||
// It's a rather hacky solution, but since there's no top-level await, I just have to make the loading conditional.
|
||||
let commands: Collection<string, Command>|null = null;
|
||||
|
@ -13,7 +13,7 @@ export default new Event({
|
|||
{
|
||||
// Load commands if it hasn't already done so. Luckily, it's called once at most.
|
||||
if(!commands)
|
||||
commands = await FileManager.loadCommands();
|
||||
commands = await loadCommands();
|
||||
|
||||
// Message Setup //
|
||||
if(message.author.bot)
|
||||
|
|
|
@ -1,7 +1,8 @@
|
|||
import {Client} from "discord.js";
|
||||
import setup from "./setup";
|
||||
import FileManager from "./core/storage";
|
||||
import {Config} from "./core/structures";
|
||||
import {loadCommands} from "./core/command";
|
||||
import {loadEvents} from "./core/event";
|
||||
|
||||
// This is here in order to make it much less of a headache to access the client from other files.
|
||||
// This of course won't actually do anything until the setup process is complete and it logs in.
|
||||
|
@ -9,7 +10,7 @@ export const client = new Client();
|
|||
|
||||
// Begin the command loading here rather than when it's needed like in the message event.
|
||||
setup.init().then(() => {
|
||||
FileManager.loadCommands();
|
||||
FileManager.loadEvents(client);
|
||||
loadCommands();
|
||||
loadEvents(client);
|
||||
client.login(Config.token).catch(setup.again);
|
||||
});
|
Loading…
Reference in a new issue