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 | ||||||
| { | { | ||||||
|  | @ -28,4 +30,21 @@ export default class Event | ||||||
| 		if(this.once) | 		if(this.once) | ||||||
| 			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…
	
	Add table
		Add a link
		
	
		Reference in a new issue