discord-bot-shared 0.9.1 → 0.11.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +1 -1
- package/README.md +2 -0
- package/dist/bot.js +26 -24
- package/dist/command-manager.js +97 -61
- package/dist/event-manager.js +22 -17
- package/dist/index.js +3 -3
- package/dist/types/bot.d.ts +20 -19
- package/dist/types/command-manager.d.ts +20 -21
- package/dist/types/event-manager.d.ts +20 -12
- package/dist/types/index.d.ts +4 -4
- package/dist/types/util.d.ts +16 -16
- package/dist/util.js +22 -15
- package/package.json +18 -21
package/LICENSE
CHANGED
package/README.md
CHANGED
package/dist/bot.js
CHANGED
|
@@ -1,26 +1,28 @@
|
|
|
1
|
-
import { REST } from "
|
|
2
|
-
import
|
|
3
|
-
import
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
1
|
+
import { Client, Events, REST } from "discord.js";
|
|
2
|
+
import CommandManager from "./command-manager.js";
|
|
3
|
+
import EventManager from "./event-manager.js";
|
|
4
|
+
class Bot {
|
|
5
|
+
#discord;
|
|
6
|
+
commands;
|
|
7
|
+
events;
|
|
8
|
+
constructor(options) {
|
|
9
|
+
this.#discord = {
|
|
10
|
+
applicationId: options.applicationId,
|
|
11
|
+
token: options.token,
|
|
12
|
+
client: new Client(options.clientOptions),
|
|
13
|
+
rest: new REST().setToken(options.token),
|
|
14
|
+
};
|
|
15
|
+
this.commands = new CommandManager(this.#discord);
|
|
16
|
+
this.events = new EventManager(this.#discord);
|
|
17
|
+
}
|
|
18
|
+
async login() {
|
|
19
|
+
this.#discord.client.once(Events.ClientReady, () => {
|
|
20
|
+
console.log("Client is ready.");
|
|
21
|
+
});
|
|
22
|
+
this.commands._listen();
|
|
23
|
+
this.events._listen();
|
|
24
|
+
await this.#discord.client.login(this.#discord.token);
|
|
15
25
|
}
|
|
16
|
-
this.commands = new CommandManager(this.#discord)
|
|
17
|
-
this.events = new EventManager(this.#discord)
|
|
18
|
-
}
|
|
19
|
-
async login() {
|
|
20
|
-
this.#discord.client.once("ready", () => console.log("Client is ready."))
|
|
21
|
-
await this.commands._register()
|
|
22
|
-
this.commands._listen()
|
|
23
|
-
await this.#discord.client.login(this.#discord.token)
|
|
24
|
-
}
|
|
25
26
|
}
|
|
26
|
-
|
|
27
|
+
export default Bot;
|
|
28
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYm90LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL2JvdC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsTUFBTSxFQUFpQixNQUFNLEVBQUUsSUFBSSxFQUFFLE1BQU0sWUFBWSxDQUFBO0FBQ2hFLE9BQU8sY0FBYyxNQUFNLHNCQUFzQixDQUFBO0FBQ2pELE9BQU8sWUFBWSxNQUFNLG9CQUFvQixDQUFBO0FBZTdDLE1BQU0sR0FBRztJQUNQLFFBQVEsQ0FBZ0I7SUFFZixRQUFRLENBQWdCO0lBQ3hCLE1BQU0sQ0FBYztJQUU3QixZQUFZLE9BQW1CO1FBQzdCLElBQUksQ0FBQyxRQUFRLEdBQUc7WUFDZCxhQUFhLEVBQUUsT0FBTyxDQUFDLGFBQWE7WUFDcEMsS0FBSyxFQUFFLE9BQU8sQ0FBQyxLQUFLO1lBQ3BCLE1BQU0sRUFBRSxJQUFJLE1BQU0sQ0FBQyxPQUFPLENBQUMsYUFBYSxDQUFDO1lBQ3pDLElBQUksRUFBRSxJQUFJLElBQUksRUFBRSxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDO1NBQ3pDLENBQUE7UUFFRCxJQUFJLENBQUMsUUFBUSxHQUFHLElBQUksY0FBYyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQTtRQUNqRCxJQUFJLENBQUMsTUFBTSxHQUFHLElBQUksWUFBWSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQTtJQUMvQyxDQUFDO0lBRUQsS0FBSyxDQUFDLEtBQUs7UUFDVCxJQUFJLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLFdBQVcsRUFBRSxHQUFHLEVBQUU7WUFDakQsT0FBTyxDQUFDLEdBQUcsQ0FBQyxrQkFBa0IsQ0FBQyxDQUFBO1FBQ2pDLENBQUMsQ0FBQyxDQUFBO1FBRUYsSUFBSSxDQUFDLFFBQVEsQ0FBQyxPQUFPLEVBQUUsQ0FBQTtRQUN2QixJQUFJLENBQUMsTUFBTSxDQUFDLE9BQU8sRUFBRSxDQUFBO1FBQ3JCLE1BQU0sSUFBSSxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUE7SUFDdkQsQ0FBQztDQUNGO0FBRUQsZUFBZSxHQUFHLENBQUEifQ==
|
package/dist/command-manager.js
CHANGED
|
@@ -1,65 +1,101 @@
|
|
|
1
|
-
import { Routes } from "discord
|
|
2
|
-
import {
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
}
|
|
10
|
-
/*
|
|
11
|
-
* Add a command
|
|
12
|
-
*/
|
|
13
|
-
add(command) {
|
|
14
|
-
if (!command.command.name) {
|
|
15
|
-
throw new Error("a command is missing a name")
|
|
1
|
+
import { Collection, Events, Routes, } from "discord.js";
|
|
2
|
+
import { UserError } from "./util.js";
|
|
3
|
+
class CommandManager {
|
|
4
|
+
#commands = new Collection();
|
|
5
|
+
#globalPreRunHook;
|
|
6
|
+
#discord;
|
|
7
|
+
constructor(discord) {
|
|
8
|
+
this.#discord = discord;
|
|
16
9
|
}
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
const guild = await this.discord.client.guilds.fetch(interaction.guildId)
|
|
38
|
-
const context = {
|
|
39
|
-
guild,
|
|
10
|
+
/*
|
|
11
|
+
* Add a command
|
|
12
|
+
*/
|
|
13
|
+
add(command) {
|
|
14
|
+
this.#commands.set(command.command.name, command);
|
|
15
|
+
}
|
|
16
|
+
setGlobalPreRunHook(hook) {
|
|
17
|
+
this.#globalPreRunHook = hook;
|
|
18
|
+
}
|
|
19
|
+
async register() {
|
|
20
|
+
const payload = this.#commands.map((c) => c.command);
|
|
21
|
+
const route = Routes.applicationCommands(this.#discord.applicationId);
|
|
22
|
+
await this.#discord.rest.put(route, { body: payload });
|
|
23
|
+
console.log(`Registered ${this.#commands.size} (/) commands.`);
|
|
24
|
+
}
|
|
25
|
+
async unregisterGuildCommands() {
|
|
26
|
+
const guilds = await this.#discord.client.guilds.fetch().catch(console.error);
|
|
27
|
+
if (!guilds || !this.#discord.client.isReady()) {
|
|
28
|
+
console.error("Unable to unregister guild commands. Client is not ready. Try running Bot.login() first.");
|
|
29
|
+
return;
|
|
40
30
|
}
|
|
41
|
-
const
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
31
|
+
for (const guild of guilds.values()) {
|
|
32
|
+
const route = Routes.applicationGuildCommands(this.#discord.applicationId, guild.id);
|
|
33
|
+
await this.#discord.rest.put(route, { body: [] });
|
|
34
|
+
console.log(`Unregistered commands from guild: ${guild.name}`);
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
async unregisterApplicationCommands() {
|
|
38
|
+
const route = Routes.applicationCommands(this.#discord.applicationId);
|
|
39
|
+
await this.#discord.rest.put(route, { body: [] });
|
|
40
|
+
console.log("Unregistered application commands.");
|
|
41
|
+
}
|
|
42
|
+
_listen() {
|
|
43
|
+
this.#discord.client.on(Events.InteractionCreate, async (interaction) => {
|
|
44
|
+
if (!interaction.isChatInputCommand())
|
|
45
|
+
return;
|
|
46
|
+
if (!interaction.guildId)
|
|
47
|
+
return;
|
|
48
|
+
if (!interaction.inCachedGuild())
|
|
49
|
+
await interaction.client.guilds.fetch(interaction.guildId).catch(console.error);
|
|
50
|
+
if (!interaction.inCachedGuild()) {
|
|
51
|
+
this.interactionReply(interaction, "Guild is not cached. Try again.");
|
|
52
|
+
return;
|
|
53
|
+
}
|
|
54
|
+
const command = this.#commands.get(interaction.commandName);
|
|
55
|
+
if (!command) {
|
|
56
|
+
this.interactionReply(interaction, `Failed to get command with name: ${interaction.commandName}`);
|
|
57
|
+
return;
|
|
58
|
+
}
|
|
59
|
+
if (!(await this.checkRoles(command, interaction))) {
|
|
60
|
+
this.interactionReply(interaction, "You do not have one of the required roles to run this command.");
|
|
61
|
+
return;
|
|
62
|
+
}
|
|
63
|
+
try {
|
|
64
|
+
const shouldContinue = this.#globalPreRunHook ? await this.#globalPreRunHook(interaction) : true;
|
|
65
|
+
if (!shouldContinue)
|
|
66
|
+
return;
|
|
67
|
+
await command.run(interaction);
|
|
68
|
+
}
|
|
69
|
+
catch (error) {
|
|
70
|
+
this.interactionReply(interaction, error);
|
|
71
|
+
}
|
|
72
|
+
});
|
|
73
|
+
console.log("Listening for commands.");
|
|
74
|
+
}
|
|
75
|
+
async checkRoles(command, interaction) {
|
|
76
|
+
if (!command.requiredRoles)
|
|
77
|
+
return true;
|
|
78
|
+
if (command.requiredRoles.length > 0) {
|
|
79
|
+
const member = await interaction.guild.members.fetch(interaction.user).catch(console.error);
|
|
80
|
+
if (!member)
|
|
81
|
+
return;
|
|
82
|
+
return member.roles.cache.some((role) => command.requiredRoles ? command.requiredRoles.includes(role.name) : false);
|
|
83
|
+
}
|
|
84
|
+
return false;
|
|
85
|
+
}
|
|
86
|
+
interactionReply(interaction, error) {
|
|
87
|
+
let errorMessage = "";
|
|
88
|
+
if (error instanceof UserError)
|
|
89
|
+
errorMessage = error.message;
|
|
90
|
+
else if (error instanceof Error && error.stack)
|
|
91
|
+
errorMessage = error.stack;
|
|
92
|
+
else
|
|
93
|
+
errorMessage = String(error);
|
|
94
|
+
const message = `There was an error while running this command.\n\`\`\`${errorMessage}\`\`\``;
|
|
95
|
+
interaction.deferred
|
|
96
|
+
? void interaction.editReply(message).catch(console.error)
|
|
97
|
+
: void interaction.reply({ content: message, ephemeral: true }).catch(console.error);
|
|
56
98
|
}
|
|
57
|
-
return false
|
|
58
|
-
}
|
|
59
|
-
interactionReply(interaction, message) {
|
|
60
|
-
interaction.deferred
|
|
61
|
-
? void interaction.editReply(message).catch(console.error)
|
|
62
|
-
: void interaction.reply({ content: message, ephemeral: true }).catch(console.error)
|
|
63
|
-
}
|
|
64
99
|
}
|
|
65
|
-
|
|
100
|
+
export default CommandManager;
|
|
101
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29tbWFuZC1tYW5hZ2VyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL2NvbW1hbmQtbWFuYWdlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBRUwsVUFBVSxFQUNWLE1BQU0sRUFFTixNQUFNLEdBQ1AsTUFBTSxZQUFZLENBQUE7QUFFbkIsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLFdBQVcsQ0FBQTtBQVVyQyxNQUFNLGNBQWM7SUFDbEIsU0FBUyxHQUFHLElBQUksVUFBVSxFQUFtQixDQUFBO0lBQzdDLGlCQUFpQixDQUFjO0lBQy9CLFFBQVEsQ0FBZ0I7SUFFeEIsWUFBWSxPQUF1QjtRQUNqQyxJQUFJLENBQUMsUUFBUSxHQUFHLE9BQU8sQ0FBQTtJQUN6QixDQUFDO0lBRUQ7O09BRUc7SUFDSCxHQUFHLENBQUMsT0FBZ0I7UUFDbEIsSUFBSSxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxJQUFJLEVBQUUsT0FBTyxDQUFDLENBQUE7SUFDbkQsQ0FBQztJQUVELG1CQUFtQixDQUFDLElBQWlCO1FBQ25DLElBQUksQ0FBQyxpQkFBaUIsR0FBRyxJQUFJLENBQUE7SUFDL0IsQ0FBQztJQUVELEtBQUssQ0FBQyxRQUFRO1FBQ1osTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQTtRQUNwRCxNQUFNLEtBQUssR0FBRyxNQUFNLENBQUMsbUJBQW1CLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxhQUFhLENBQUMsQ0FBQTtRQUNyRSxNQUFNLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxLQUFLLEVBQUUsRUFBRSxJQUFJLEVBQUUsT0FBTyxFQUFFLENBQUMsQ0FBQTtRQUV0RCxPQUFPLENBQUMsR0FBRyxDQUFDLGNBQWMsSUFBSSxD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
|
package/dist/event-manager.js
CHANGED
|
@@ -1,18 +1,23 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
1
|
+
class EventManager {
|
|
2
|
+
#events = [];
|
|
3
|
+
#discord;
|
|
4
|
+
constructor(discord) {
|
|
5
|
+
this.#discord = discord;
|
|
6
|
+
}
|
|
7
|
+
/*
|
|
8
|
+
* Add an event listener
|
|
9
|
+
*/
|
|
10
|
+
add(event) {
|
|
11
|
+
this.#events.push(event);
|
|
12
|
+
}
|
|
13
|
+
_listen() {
|
|
14
|
+
for (const event of this.#events) {
|
|
15
|
+
this.#discord.client.on(event.event, (...args) => {
|
|
16
|
+
void event.handler(this.#discord.client, ...args).catch(console.error);
|
|
17
|
+
});
|
|
18
|
+
}
|
|
19
|
+
console.log(`Listening for (${this.#events.length}) events.`);
|
|
20
|
+
}
|
|
17
21
|
}
|
|
18
|
-
|
|
22
|
+
export default EventManager;
|
|
23
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXZlbnQtbWFuYWdlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9ldmVudC1tYW5hZ2VyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQW1CQSxNQUFNLFlBQVk7SUFDaEIsT0FBTyxHQUFrQixFQUFFLENBQUE7SUFDM0IsUUFBUSxDQUFnQjtJQUV4QixZQUFZLE9BQXVCO1FBQ2pDLElBQUksQ0FBQyxRQUFRLEdBQUcsT0FBTyxDQUFBO0lBQ3pCLENBQUM7SUFFRDs7T0FFRztJQUNILEdBQUcsQ0FBd0IsS0FBcUI7UUFDOUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUE7SUFDMUIsQ0FBQztJQUVELE9BQU87UUFDTCxLQUFLLE1BQU0sS0FBSyxJQUFJLElBQUksQ0FBQyxPQUFPLEVBQUU7WUFDaEMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLEtBQUssQ0FBQyxLQUFLLEVBQUUsQ0FBQyxHQUFHLElBQUksRUFBRSxFQUFFO2dCQUMvQyxLQUFNLEtBQUssQ0FBQyxPQUF3QixDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsTUFBTSxFQUFFLEdBQUcsSUFBSSxDQUFDLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQTtZQUMxRixDQUFDLENBQUMsQ0FBQTtTQUNIO1FBQ0QsT0FBTyxDQUFDLEdBQUcsQ0FBQyxrQkFBa0IsSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLFdBQVcsQ0FBQyxDQUFBO0lBQy9ELENBQUM7Q0FDRjtBQU1ELGVBQWUsWUFBWSxDQUFBIn0=
|
package/dist/index.js
CHANGED
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
export {
|
|
2
|
-
export { getChannel,
|
|
3
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
1
|
+
export { default } from "./bot.js";
|
|
2
|
+
export { getChannel, throwError, throwUserError } from "./util.js";
|
|
3
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLFVBQVUsQ0FBQTtBQUdsQyxPQUFPLEVBQUUsVUFBVSxFQUFFLFVBQVUsRUFBRSxjQUFjLEVBQUUsTUFBTSxXQUFXLENBQUEifQ==
|
package/dist/types/bot.d.ts
CHANGED
|
@@ -1,22 +1,23 @@
|
|
|
1
|
-
import { REST } from "
|
|
2
|
-
import
|
|
3
|
-
import
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
clientOptions: ClientOptions
|
|
1
|
+
import { Client, ClientOptions, REST } from "discord.js";
|
|
2
|
+
import CommandManager from "./command-manager.js";
|
|
3
|
+
import EventManager from "./event-manager.js";
|
|
4
|
+
interface BotOptions {
|
|
5
|
+
applicationId: string;
|
|
6
|
+
token: string;
|
|
7
|
+
clientOptions: ClientOptions;
|
|
9
8
|
}
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
9
|
+
interface DiscordContext {
|
|
10
|
+
applicationId: string;
|
|
11
|
+
token: string;
|
|
12
|
+
client: Client;
|
|
13
|
+
rest: REST;
|
|
15
14
|
}
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
15
|
+
declare class Bot {
|
|
16
|
+
#private;
|
|
17
|
+
readonly commands: CommandManager;
|
|
18
|
+
readonly events: EventManager;
|
|
19
|
+
constructor(options: BotOptions);
|
|
20
|
+
login(): Promise<void>;
|
|
22
21
|
}
|
|
22
|
+
export default Bot;
|
|
23
|
+
export type { BotOptions, DiscordContext };
|
|
@@ -1,23 +1,22 @@
|
|
|
1
|
-
import { RESTPostAPIChatInputApplicationCommandsJSONBody } from "discord
|
|
2
|
-
import {
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
run: (context: CommandContext, interaction: ChatInputCommandInteraction) => void | Promise<void>
|
|
1
|
+
import { ChatInputCommandInteraction, RESTPostAPIChatInputApplicationCommandsJSONBody } from "discord.js";
|
|
2
|
+
import { DiscordContext } from "./bot.js";
|
|
3
|
+
interface Command {
|
|
4
|
+
requiredRoles?: string[];
|
|
5
|
+
command: RESTPostAPIChatInputApplicationCommandsJSONBody;
|
|
6
|
+
run: (interaction: ChatInputCommandInteraction<"cached">) => void | Promise<void>;
|
|
8
7
|
}
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
private checkRoles
|
|
22
|
-
private interactionReply
|
|
8
|
+
type CommandHook = (interaction: ChatInputCommandInteraction<"cached">) => Promise<boolean>;
|
|
9
|
+
declare class CommandManager {
|
|
10
|
+
#private;
|
|
11
|
+
constructor(discord: DiscordContext);
|
|
12
|
+
add(command: Command): void;
|
|
13
|
+
setGlobalPreRunHook(hook: CommandHook): void;
|
|
14
|
+
register(): Promise<void>;
|
|
15
|
+
unregisterGuildCommands(): Promise<void>;
|
|
16
|
+
unregisterApplicationCommands(): Promise<void>;
|
|
17
|
+
_listen(): void;
|
|
18
|
+
private checkRoles;
|
|
19
|
+
private interactionReply;
|
|
23
20
|
}
|
|
21
|
+
export default CommandManager;
|
|
22
|
+
export type { Command, CommandHook };
|
|
@@ -1,14 +1,22 @@
|
|
|
1
|
-
import { Client, ClientEvents } from "discord.js"
|
|
2
|
-
import { DiscordContext } from "./bot.js"
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
1
|
+
import { Client, ClientEvents, Events } from "discord.js";
|
|
2
|
+
import { DiscordContext } from "./bot.js";
|
|
3
|
+
type ValidEvents = Exclude<Events, Events.VoiceServerUpdate | Events.Raw>;
|
|
4
|
+
type EventHandler<E extends ValidEvents = ValidEvents> = (client: Client<true>, ...args: ClientEvents[E]) => Promise<void>;
|
|
5
|
+
type EventHandlerMap = {
|
|
6
|
+
[E in ValidEvents]: EventHandler<E>;
|
|
7
|
+
};
|
|
8
|
+
interface SingleEvent<E extends ValidEvents = ValidEvents> {
|
|
9
|
+
event: E;
|
|
10
|
+
handler: EventHandlerMap[E];
|
|
6
11
|
}
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
constructor(discord: DiscordContext)
|
|
13
|
-
add<K extends keyof ClientEvents>(event: Event<K>): void
|
|
12
|
+
declare class EventManager {
|
|
13
|
+
#private;
|
|
14
|
+
constructor(discord: DiscordContext);
|
|
15
|
+
add<N extends ValidEvents>(event: SingleEvent<N>): void;
|
|
16
|
+
_listen(): void;
|
|
14
17
|
}
|
|
18
|
+
type Event = {
|
|
19
|
+
[E in ValidEvents]: SingleEvent<E>;
|
|
20
|
+
}[ValidEvents];
|
|
21
|
+
export default EventManager;
|
|
22
|
+
export type { Event };
|
package/dist/types/index.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
export {
|
|
2
|
-
export { Command,
|
|
3
|
-
export { Event
|
|
4
|
-
export { getChannel,
|
|
1
|
+
export { default } from "./bot.js";
|
|
2
|
+
export type { Command, CommandHook } from "./command-manager.js";
|
|
3
|
+
export type { Event } from "./event-manager.js";
|
|
4
|
+
export { getChannel, throwError, throwUserError } from "./util.js";
|
package/dist/types/util.d.ts
CHANGED
|
@@ -1,16 +1,16 @@
|
|
|
1
|
-
import {
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
):
|
|
13
|
-
declare
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
export {
|
|
1
|
+
import { CategoryChannel, ChannelType, ForumChannel, Guild, NewsChannel, StageChannel, TextChannel, VoiceChannel } from "discord.js";
|
|
2
|
+
interface ChannelTypeToChannelMap {
|
|
3
|
+
[ChannelType.GuildCategory]: CategoryChannel;
|
|
4
|
+
[ChannelType.GuildAnnouncement]: NewsChannel;
|
|
5
|
+
[ChannelType.GuildStageVoice]: StageChannel;
|
|
6
|
+
[ChannelType.GuildText]: TextChannel;
|
|
7
|
+
[ChannelType.GuildVoice]: VoiceChannel;
|
|
8
|
+
[ChannelType.GuildForum]: ForumChannel;
|
|
9
|
+
}
|
|
10
|
+
declare function getChannel<T extends keyof ChannelTypeToChannelMap>(guild: Guild, channelNameOrId: string, channelType: T): Promise<ChannelTypeToChannelMap[T]>;
|
|
11
|
+
declare function throwError(error: string): never;
|
|
12
|
+
declare function throwUserError(error: string): never;
|
|
13
|
+
declare class UserError extends Error {
|
|
14
|
+
constructor(message: string);
|
|
15
|
+
}
|
|
16
|
+
export { UserError, getChannel, throwError, throwUserError };
|
package/dist/util.js
CHANGED
|
@@ -1,20 +1,27 @@
|
|
|
1
|
-
import { ChannelType } from "discord.js"
|
|
1
|
+
import { ChannelType, } from "discord.js";
|
|
2
2
|
async function getChannel(guild, channelNameOrId, channelType) {
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
3
|
+
const channels = await guild.channels.fetch();
|
|
4
|
+
let channel;
|
|
5
|
+
channel = channels.find((channel) => (channel ? channel.name === channelNameOrId : false));
|
|
6
|
+
if (channel && channel.type === channelType)
|
|
7
|
+
return channel;
|
|
8
|
+
channel = channels.get(channelNameOrId);
|
|
9
|
+
if (channel && channel.type === channelType)
|
|
10
|
+
return channel;
|
|
11
|
+
throwError(`Failed to get channel: ${channelNameOrId}`);
|
|
9
12
|
}
|
|
10
|
-
function
|
|
11
|
-
|
|
13
|
+
function throwError(error) {
|
|
14
|
+
throw new Error(error);
|
|
12
15
|
}
|
|
13
|
-
function
|
|
14
|
-
|
|
16
|
+
function throwUserError(error) {
|
|
17
|
+
throw new UserError(error);
|
|
15
18
|
}
|
|
16
|
-
|
|
17
|
-
|
|
19
|
+
class UserError extends Error {
|
|
20
|
+
constructor(message) {
|
|
21
|
+
super(message);
|
|
22
|
+
this.name = this.constructor.name;
|
|
23
|
+
Object.setPrototypeOf(this, new.target.prototype);
|
|
24
|
+
}
|
|
18
25
|
}
|
|
19
|
-
export {
|
|
20
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
26
|
+
export { UserError, getChannel, throwError, throwUserError };
|
|
27
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXRpbC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy91dGlsLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFFTCxXQUFXLEdBUVosTUFBTSxZQUFZLENBQUE7QUFXbkIsS0FBSyxVQUFVLFVBQVUsQ0FDdkIsS0FBWSxFQUNaLGVBQXVCLEVBQ3ZCLFdBQWM7SUFFZCxNQUFNLFFBQVEsR0FBRyxNQUFNLEtBQUssQ0FBQyxRQUFRLENBQUMsS0FBSyxFQUFFLENBQUE7SUFFN0MsSUFBSSxPQUFzRCxDQUFBO0lBQzFELE9BQU8sR0FBRyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUMsT0FBTyxFQUFFLEVBQUUsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLElBQUksS0FBSyxlQUFlLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUE7SUFDMUYsSUFBSSxPQUFPLElBQUksT0FBTyxDQUFDLElBQUksS0FBSyxXQUFXO1FBQUUsT0FBTyxPQUFxQyxDQUFBO0lBRXpGLE9BQU8sR0FBRyxRQUFRLENBQUMsR0FBRyxDQUFDLGVBQWUsQ0FBQyxDQUFBO0lBQ3ZDLElBQUksT0FBTyxJQUFJLE9BQU8sQ0FBQyxJQUFJLEtBQUssV0FBVztRQUFFLE9BQU8sT0FBcUMsQ0FBQTtJQUV6RixVQUFVLENBQUMsMEJBQTBCLGVBQWUsRUFBRSxDQUFDLENBQUE7QUFDekQsQ0FBQztBQUVELFNBQVMsVUFBVSxDQUFDLEtBQWE7SUFDL0IsTUFBTSxJQUFJLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQTtBQUN4QixDQUFDO0FBRUQsU0FBUyxjQUFjLENBQUMsS0FBYTtJQUNuQyxNQUFNLElBQUksU0FBUyxDQUFDLEtBQUssQ0FBQyxDQUFBO0FBQzVCLENBQUM7QUFFRCxNQUFNLFNBQVUsU0FBUSxLQUFLO0lBQzNCLFlBQVksT0FBZTtRQUN6QixLQUFLLENBQUMsT0FBTyxDQUFDLENBQUE7UUFDZCxJQUFJLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFBO1FBRWpDLE1BQU0sQ0FBQyxjQUFjLENBQUMsSUFBSSxFQUFFLEdBQUcsQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLENBQUE7SUFDbkQsQ0FBQztDQUNGO0FBRUQsT0FBTyxFQUFFLFNBQVMsRUFBRSxVQUFVLEVBQUUsVUFBVSxFQUFFLGNBQWMsRUFBRSxDQUFBIn0=
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "discord-bot-shared",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.11.0",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"description": "Modules for creating discord bots.",
|
|
6
6
|
"repository": "github:adamhl8/discord-bot-shared",
|
|
@@ -13,31 +13,28 @@
|
|
|
13
13
|
"README.md",
|
|
14
14
|
"LICENSE"
|
|
15
15
|
],
|
|
16
|
-
"
|
|
17
|
-
"
|
|
18
|
-
"discord-api-types": "^0.37.23",
|
|
19
|
-
"discord.js": "^14.7.1"
|
|
16
|
+
"peerDependencies": {
|
|
17
|
+
"discord.js": ">14.0.0"
|
|
20
18
|
},
|
|
21
19
|
"devDependencies": {
|
|
22
|
-
"@types/node": "^
|
|
23
|
-
"@typescript-eslint/eslint-plugin": "^
|
|
24
|
-
"@typescript-eslint/parser": "^
|
|
25
|
-
"
|
|
26
|
-
"eslint
|
|
27
|
-
"eslint-
|
|
28
|
-
"eslint-plugin-
|
|
29
|
-
"eslint-plugin-
|
|
30
|
-
"
|
|
31
|
-
"prettier": "^2.
|
|
32
|
-
"prettier-plugin-
|
|
33
|
-
"prettier-plugin-
|
|
34
|
-
"
|
|
35
|
-
"typescript": "^4.9.4"
|
|
20
|
+
"@types/node": "^20.6.0",
|
|
21
|
+
"@typescript-eslint/eslint-plugin": "^6.6.0",
|
|
22
|
+
"@typescript-eslint/parser": "^6.6.0",
|
|
23
|
+
"discord.js": "^14.13.0",
|
|
24
|
+
"eslint": "^8.49.0",
|
|
25
|
+
"eslint-config-prettier": "^9.0.0",
|
|
26
|
+
"eslint-plugin-sonarjs": "^0.21.0",
|
|
27
|
+
"eslint-plugin-unicorn": "^48.0.1",
|
|
28
|
+
"prettier": "^3.0.3",
|
|
29
|
+
"prettier-plugin-organize-imports": "^3.2.3",
|
|
30
|
+
"prettier-plugin-pkg": "^0.18.0",
|
|
31
|
+
"prettier-plugin-sh": "^0.13.1",
|
|
32
|
+
"typescript": "^5.2.2"
|
|
36
33
|
},
|
|
37
34
|
"scripts": {
|
|
38
|
-
"build": "rm -rf dist &&
|
|
35
|
+
"build": "rm -rf dist && tsc",
|
|
39
36
|
"format": "prettier --write .",
|
|
40
|
-
"lint": "eslint
|
|
37
|
+
"lint": "eslint ./src/",
|
|
41
38
|
"prepublish": "pnpm build"
|
|
42
39
|
}
|
|
43
40
|
}
|