You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
Natsuki/util/slashmanager.js

148 lines
5.5 KiB

3 years ago
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.SlashManager = void 0;
const fs = require("fs");
const rest_1 = require("@discordjs/rest");
const v9_1 = require("discord-api-types/v9");
class SlashManager {
constructor(client, commands, testServer) {
this.beforeHandle = () => { };
this.afterHandle = () => { };
this.initialized = false;
this.client = client;
this.commands = commands || [];
if (this.testServerId) {
this.testServerId = testServer;
}
this.rest = new rest_1.REST({ version: '9' }).setToken(this.client.token);
}
async register(commands) {
let trp = commands || this.commands;
let tr = Array.isArray(trp) ? this.getCommands(trp) : this.getCommand(trp);
return Array.isArray(tr)
3 years ago
? this.rest.put(v9_1.Routes.applicationCommands(this.client.user.id), { body: (() => { let t = []; tr.forEach(trt => t.push(this.commands[trt].command.toJSON())); return t; })() })
3 years ago
: this.commands[tr].registerGlobally();
}
;
async devRegister(commands) {
if (!this.testServerId) {
throw new Error("You tried to register commands to your test server, but don't have a test server ID set. Try running SlashManager#setTestServer() first!");
}
let trp = commands || this.commands;
let tr = Array.isArray(trp) ? this.getCommands(trp) : this.getCommand(trp);
return Array.isArray(tr)
? this.rest.put(v9_1.Routes.applicationGuildCommands(this.client.user.id, this.testServerId), { body: (() => { let t = []; tr.forEach(trt => t.push(this.commands[trt].command.toJSON())); return t; })() })
: this.commands[tr].registerToServer([this.testServerId]);
}
;
add(command, register) {
this.commands.push(command);
if (register) {
command.register(typeof register === 'boolean' ? 'global' : register);
}
return this;
}
;
remove(commands) {
let trp = commands || this.commands;
let tr = Array.isArray(trp) ? this.getCommands(trp) : this.getCommand(trp);
if (Array.isArray(tr)) {
tr.forEach(t => { this.commands.splice(t, 1); });
}
else {
this.commands.splice(tr, 1);
}
return this;
}
;
getCommand(command) {
let res;
if (typeof command === "string") {
this.commands.forEach(cmd => { if (cmd.name === command) {
res = cmd;
} });
if (!res) {
throw new Error(`Name '${command}' doesn't match any commands in your SlashManager.`);
}
}
else {
if (!this.commands.includes(command)) {
throw new Error(`The command you provided (with name '${command.name}') doesn't exist`);
}
res = command;
}
return this.commands.indexOf(res);
}
;
getCommands(commands) {
let res = [];
commands.forEach((cmd) => res.push(this.getCommand(cmd)));
return res;
}
;
init() {
if (this.initialized) {
this.disableHandling();
}
this.client.on("interactionCreate", (interaction) => this.handle(interaction));
return this;
}
;
disableHandling() {
this.client.removeListener('interactionCreate', this.handle);
return this;
}
;
setBeforeHandle(execute) {
this.beforeHandle = execute;
this.init();
return this;
}
;
setAfterHandle(execute) {
this.afterHandle = execute;
this.init();
return this;
}
;
setTestServer(id) {
this.testServerId = id;
return this;
}
;
async handle(interaction) {
this.beforeHandle(this.client, interaction);
let success = true;
// @ts-ignore
let defaultPrefix = this.client.misc.config.dev ? 'n!' : 'n?';
3 years ago
try {
await this.commands[this.getCommand(interaction.commandName)]
.respond(this.client, interaction, interaction.inGuild() ? interaction.guild : false,
// @ts-ignore
interaction.inGuild() ? this.client.guildconfig.prefixes.has(interaction.guild.id) ? this.client.guildconfig.prefixes.get(interaction.guild.id) !== null ? this.client.guildconfig.prefixes.get(interaction.guild.id) : defaultPrefix : defaultPrefix : defaultPrefix).catch((e) => { console.log(e); success = false; });
3 years ago
}
catch (e) {
success = false;
}
this.afterHandle(this.client, interaction, success);
}
;
importCommands(register = false, dir = './slash', log = () => { }) {
const search = (toSearch) => {
let cdir = fs.readdirSync(toSearch);
const commands = cdir.filter(file => file.endsWith('.js'));
for (const command of commands) {
const slashCommand = require(`../${toSearch}/${command}`)(this.client);
this.add(slashCommand, register);
log(slashCommand, this);
}
const subdirs = cdir.filter(file => fs.lstatSync(`${toSearch}/${file}`).isDirectory());
subdirs.forEach(subdir => search(`${toSearch}/${subdir}`));
};
search(dir);
3 years ago
return this;
}
;
}
exports.SlashManager = SlashManager;