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 Command from "../core/command";
|
||||||
import {CommonLibrary} from "../core/lib";
|
import {CommonLibrary} from "../core/lib";
|
||||||
import FileManager from "../core/storage";
|
import {loadCommands} from "../core/command";
|
||||||
|
|
||||||
const types = ["user", "number", "any"];
|
const types = ["user", "number", "any"];
|
||||||
|
|
||||||
|
@ -9,7 +9,7 @@ export default new Command({
|
||||||
usage: "([command, [subcommand/type], ...])",
|
usage: "([command, [subcommand/type], ...])",
|
||||||
async run($: CommonLibrary): Promise<any>
|
async run($: CommonLibrary): Promise<any>
|
||||||
{
|
{
|
||||||
const commands = await FileManager.loadCommands();
|
const commands = await loadCommands();
|
||||||
const list: string[] = [];
|
const list: string[] = [];
|
||||||
|
|
||||||
for(const [header, command] of commands)
|
for(const [header, command] of commands)
|
||||||
|
@ -22,7 +22,7 @@ export default new Command({
|
||||||
any: new Command({
|
any: new Command({
|
||||||
async run($: CommonLibrary): Promise<any>
|
async run($: CommonLibrary): Promise<any>
|
||||||
{
|
{
|
||||||
const commands = await FileManager.loadCommands();
|
const commands = await loadCommands();
|
||||||
let header = $.args.shift();
|
let header = $.args.shift();
|
||||||
let command = commands.get(header);
|
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.
|
// 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.
|
// 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;
|
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.
|
// The template should be built with a reductionist mentality.
|
||||||
// Provide everything the user needs and then let them remove whatever they want.
|
// 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.
|
// 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 {Client} from "discord.js";
|
||||||
|
import Storage from "./storage";
|
||||||
|
import $ from "./lib";
|
||||||
|
|
||||||
// Last Updated: Discord.js v12.2.0
|
// 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
|
interface EventOptions
|
||||||
{
|
{
|
||||||
|
@ -29,3 +31,20 @@ export default class Event
|
||||||
client.once(event as any, this.once as any);
|
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 fs from "fs";
|
||||||
import $ from "./lib";
|
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 = {
|
const Storage = {
|
||||||
read(header: string): object
|
read(header: string): object
|
||||||
|
@ -73,47 +68,10 @@ const Storage = {
|
||||||
{
|
{
|
||||||
if(fs.existsSync(path) && fs.readdirSync(path).length === 0)
|
if(fs.existsSync(path) && fs.readdirSync(path).length === 0)
|
||||||
fs.rmdir(path, generateHandler(`"${path}" successfully closed.`));
|
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) => {
|
return (error: Error|null) => {
|
||||||
if(error)
|
if(error)
|
||||||
|
|
|
@ -2,8 +2,8 @@ import Event from "../core/event";
|
||||||
import Command from "../core/command";
|
import Command from "../core/command";
|
||||||
import $ from "../core/lib";
|
import $ from "../core/lib";
|
||||||
import {Message, Permissions, Collection} from "discord.js";
|
import {Message, Permissions, Collection} from "discord.js";
|
||||||
import FileManager from "../core/storage";
|
|
||||||
import {Config, Storage} from "../core/structures";
|
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.
|
// 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;
|
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.
|
// Load commands if it hasn't already done so. Luckily, it's called once at most.
|
||||||
if(!commands)
|
if(!commands)
|
||||||
commands = await FileManager.loadCommands();
|
commands = await loadCommands();
|
||||||
|
|
||||||
// Message Setup //
|
// Message Setup //
|
||||||
if(message.author.bot)
|
if(message.author.bot)
|
||||||
|
|
|
@ -1,7 +1,8 @@
|
||||||
import {Client} from "discord.js";
|
import {Client} from "discord.js";
|
||||||
import setup from "./setup";
|
import setup from "./setup";
|
||||||
import FileManager from "./core/storage";
|
|
||||||
import {Config} from "./core/structures";
|
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 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.
|
// 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.
|
// Begin the command loading here rather than when it's needed like in the message event.
|
||||||
setup.init().then(() => {
|
setup.init().then(() => {
|
||||||
FileManager.loadCommands();
|
loadCommands();
|
||||||
FileManager.loadEvents(client);
|
loadEvents(client);
|
||||||
client.login(Config.token).catch(setup.again);
|
client.login(Config.token).catch(setup.again);
|
||||||
});
|
});
|
Loading…
Reference in a new issue