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 CHANGED
@@ -1,6 +1,6 @@
1
1
  MIT License
2
2
 
3
- Copyright (c) 2022 Adam
3
+ Copyright (c) 2023 adamhl8
4
4
 
5
5
  Permission is hereby granted, free of charge, to any person obtaining a copy
6
6
  of this software and associated documentation files (the "Software"), to deal
package/README.md CHANGED
@@ -1,5 +1,7 @@
1
1
  # discord-bot-shared
2
2
 
3
+ **This readme is currently out of date.**
4
+
3
5
  A module that makes creating discord.js bots a bit easier.
4
6
 
5
7
  ## Installation/Usage
package/dist/bot.js CHANGED
@@ -1,26 +1,28 @@
1
- import { REST } from "@discordjs/rest"
2
- import { Client } from "discord.js"
3
- import { CommandManager } from "./command-manager.js"
4
- import { EventManager } from "./event-manager.js"
5
- export class Bot {
6
- #discord
7
- commands
8
- events
9
- constructor(options) {
10
- this.#discord = {
11
- applicationId: options.applicationId,
12
- token: options.token,
13
- client: new Client(options.clientOptions),
14
- rest: new REST().setToken(options.token),
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
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYm90LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL2JvdC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsSUFBSSxFQUFFLE1BQU0saUJBQWlCLENBQUE7QUFDdEMsT0FBTyxFQUFFLE1BQU0sRUFBaUIsTUFBTSxZQUFZLENBQUE7QUFDbEQsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLHNCQUFzQixDQUFBO0FBQ3JELE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQTtBQWVqRCxNQUFNLE9BQU8sR0FBRztJQUNkLFFBQVEsQ0FBZ0I7SUFFZixRQUFRLENBQWdCO0lBQ3hCLE1BQU0sQ0FBYztJQUU3QixZQUFZLE9BQW1CO1FBQzdCLElBQUksQ0FBQyxRQUFRLEdBQUc7WUFDZCxhQUFhLEVBQUUsT0FBTyxDQUFDLGFBQWE7WUFDcEMsS0FBSyxFQUFFLE9BQU8sQ0FBQyxLQUFLO1lBQ3BCLE1BQU0sRUFBRSxJQUFJLE1BQU0sQ0FBQyxPQUFPLENBQUMsYUFBYSxDQUFDO1lBQ3pDLElBQUksRUFBRSxJQUFJLElBQUksRUFBRSxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDO1NBQ3pDLENBQUE7UUFFRCxJQUFJLENBQUMsUUFBUSxHQUFHLElBQUksY0FBYyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQTtRQUNqRCxJQUFJLENBQUMsTUFBTSxHQUFHLElBQUksWUFBWSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQTtJQUMvQyxDQUFDO0lBRUQsS0FBSyxDQUFDLEtBQUs7UUFDVCxJQUFJLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLEdBQUcsRUFBRSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsa0JBQWtCLENBQUMsQ0FBQyxDQUFBO1FBRXpFLE1BQU0sSUFBSSxDQUFDLFFBQVEsQ0FBQyxTQUFTLEVBQUUsQ0FBQTtRQUMvQixJQUFJLENBQUMsUUFBUSxDQUFDLE9BQU8sRUFBRSxDQUFBO1FBRXZCLE1BQU0sSUFBSSxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUE7SUFDdkQsQ0FBQztDQUNGIn0=
27
+ export default Bot;
28
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYm90LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL2JvdC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsTUFBTSxFQUFpQixNQUFNLEVBQUUsSUFBSSxFQUFFLE1BQU0sWUFBWSxDQUFBO0FBQ2hFLE9BQU8sY0FBYyxNQUFNLHNCQUFzQixDQUFBO0FBQ2pELE9BQU8sWUFBWSxNQUFNLG9CQUFvQixDQUFBO0FBZTdDLE1BQU0sR0FBRztJQUNQLFFBQVEsQ0FBZ0I7SUFFZixRQUFRLENBQWdCO0lBQ3hCLE1BQU0sQ0FBYztJQUU3QixZQUFZLE9BQW1CO1FBQzdCLElBQUksQ0FBQyxRQUFRLEdBQUc7WUFDZCxhQUFhLEVBQUUsT0FBTyxDQUFDLGFBQWE7WUFDcEMsS0FBSyxFQUFFLE9BQU8sQ0FBQyxLQUFLO1lBQ3BCLE1BQU0sRUFBRSxJQUFJLE1BQU0sQ0FBQyxPQUFPLENBQUMsYUFBYSxDQUFDO1lBQ3pDLElBQUksRUFBRSxJQUFJLElBQUksRUFBRSxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDO1NBQ3pDLENBQUE7UUFFRCxJQUFJLENBQUMsUUFBUSxHQUFHLElBQUksY0FBYyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQTtRQUNqRCxJQUFJLENBQUMsTUFBTSxHQUFHLElBQUksWUFBWSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQTtJQUMvQyxDQUFDO0lBRUQsS0FBSyxDQUFDLEtBQUs7UUFDVCxJQUFJLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLFdBQVcsRUFBRSxHQUFHLEVBQUU7WUFDakQsT0FBTyxDQUFDLEdBQUcsQ0FBQyxrQkFBa0IsQ0FBQyxDQUFBO1FBQ2pDLENBQUMsQ0FBQyxDQUFBO1FBRUYsSUFBSSxDQUFDLFFBQVEsQ0FBQyxPQUFPLEVBQUUsQ0FBQTtRQUN2QixJQUFJLENBQUMsTUFBTSxDQUFDLE9BQU8sRUFBRSxDQUFBO1FBQ3JCLE1BQU0sSUFBSSxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUE7SUFDdkQsQ0FBQztDQUNGO0FBRUQsZUFBZSxHQUFHLENBQUEifQ==
@@ -1,65 +1,101 @@
1
- import { Routes } from "discord-api-types/v10"
2
- import { Collection } from "discord.js"
3
- export class CommandManager {
4
- discord
5
- #commands = new Collection()
6
- #globalPreRunHook
7
- constructor(discord) {
8
- this.discord = discord
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
- this.#commands.set(command.command.name, command)
18
- }
19
- setGlobalPreRunHook(hook) {
20
- this.#globalPreRunHook = hook
21
- }
22
- async _register() {
23
- const payload = this.#commands.map((c) => c.command)
24
- const route = Routes.applicationCommands(this.discord.applicationId)
25
- await this.discord.rest.put(route, { body: payload })
26
- console.log(`Registered ${this.#commands.size} (/) commands.`)
27
- }
28
- _listen() {
29
- this.discord.client.on("interactionCreate", async (interaction) => {
30
- if (!interaction.guildId) return
31
- if (!interaction.isChatInputCommand()) return
32
- const command = this.#commands.get(interaction.commandName)
33
- if (!command) return this.interactionReply(interaction, "Unable to get command.")
34
- if (!(await this.checkRoles(command, interaction)))
35
- return this.interactionReply(interaction, "You do not have one of the required roles to run this command.")
36
- try {
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 shouldContinue = this.#globalPreRunHook ? await this.#globalPreRunHook(context, interaction) : true
42
- if (!shouldContinue) return
43
- await command.run(context, interaction)
44
- } catch (error) {
45
- const errorMessage = error instanceof Error ? error.message : ""
46
- this.interactionReply(interaction, `There was an error while running this command.\n${errorMessage}`)
47
- }
48
- })
49
- }
50
- async checkRoles(command, interaction) {
51
- if (!command.requiredRoles) return true
52
- if (command.requiredRoles.length > 0) {
53
- const member = await interaction.guild?.members.fetch(interaction.user).catch(console.error)
54
- if (!member) return
55
- return member.roles.cache.some((role) => (command.requiredRoles ? command.requiredRoles.includes(role.name) : false))
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
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29tbWFuZC1tYW5hZ2VyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL2NvbW1hbmQtbWFuYWdlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQW1ELE1BQU0sRUFBRSxNQUFNLHVCQUF1QixDQUFBO0FBQy9GLE9BQU8sRUFBK0IsVUFBVSxFQUFTLE1BQU0sWUFBWSxDQUFBO0FBZTNFLE1BQU0sT0FBTyxjQUFjO0lBSUw7SUFIcEIsU0FBUyxHQUFHLElBQUksVUFBVSxFQUFtQixDQUFBO0lBQzdDLGlCQUFpQixDQUFjO0lBRS9CLFlBQW9CLE9BQXVCO1FBQXZCLFlBQU8sR0FBUCxPQUFPLENBQWdCO0lBQUcsQ0FBQztJQUUvQzs7T0FFRztJQUNILEdBQUcsQ0FBQyxPQUFnQjtRQUNsQixJQUFJLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxJQUFJLEVBQUU7WUFDekIsTUFBTSxJQUFJLEtBQUssQ0FBQyw2QkFBNkIsQ0FBQyxDQUFBO1NBQy9DO1FBRUQsSUFBSSxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxJQUFJLEVBQUUsT0FBTyxDQUFDLENBQUE7SUFDbkQsQ0FBQztJQUVELG1CQUFtQixDQUFDLElBQWlCO1FBQ25DLElBQUksQ0FBQyxpQkFBaUIsR0FBRyxJQUFJLENBQUE7SUFDL0IsQ0FBQztJQUVELEtBQUssQ0FBQyxTQUFTO1FBQ2IsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQTtRQUNwRCxNQUFNLEtBQUssR0FBRyxNQUFNLENBQUMsbUJBQW1CLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxhQUFhLENBQUMsQ0FBQTtRQUNwRSxNQUFNLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxLQUFLLEVBQUUsRUFBRSxJQUFJ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
100
+ export default CommandManager;
101
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29tbWFuZC1tYW5hZ2VyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL2NvbW1hbmQtbWFuYWdlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBRUwsVUFBVSxFQUNWLE1BQU0sRUFFTixNQUFNLEdBQ1AsTUFBTSxZQUFZLENBQUE7QUFFbkIsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLFdBQVcsQ0FBQTtBQVVyQyxNQUFNLGNBQWM7SUFDbEIsU0FBUyxHQUFHLElBQUksVUFBVSxFQUFtQixDQUFBO0lBQzdDLGlCQUFpQixDQUFjO0lBQy9CLFFBQVEsQ0FBZ0I7SUFFeEIsWUFBWSxPQUF1QjtRQUNqQyxJQUFJLENBQUMsUUFBUSxHQUFHLE9BQU8sQ0FBQTtJQUN6QixDQUFDO0lBRUQ7O09BRUc7SUFDSCxHQUFHLENBQUMsT0FBZ0I7UUFDbEIsSUFBSSxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxJQUFJLEVBQUUsT0FBTyxDQUFDLENBQUE7SUFDbkQsQ0FBQztJQUVELG1CQUFtQixDQUFDLElBQWlCO1FBQ25DLElBQUksQ0FBQyxpQkFBaUIsR0FBRyxJQUFJLENBQUE7SUFDL0IsQ0FBQztJQUVELEtBQUssQ0FBQyxRQUFRO1FBQ1osTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQTtRQUNwRCxNQUFNLEtBQUssR0FBRyxNQUFNLENBQUMsbUJBQW1CLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxhQUFhLENBQUMsQ0FBQTtRQUNyRSxNQUFNLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxLQUFLLEVBQUUsRUFBRSxJQUFJLEVBQUUsT0FBTyxFQUFFLENBQUMsQ0FBQTtRQUV0RCxPQUFPLENBQUMsR0FBRyxDQUFDLGNBQWMsSUFBSSxD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
@@ -1,18 +1,23 @@
1
- export class EventManager {
2
- discord
3
- constructor(discord) {
4
- this.discord = discord
5
- }
6
- /*
7
- * Add an event listener
8
- */
9
- add(event) {
10
- this.discord.client.on(event.name, (...args) => {
11
- const context = {
12
- client: this.discord.client,
13
- }
14
- void event.handler(context, ...args).catch(console.error)
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
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXZlbnQtbWFuYWdlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9ldmVudC1tYW5hZ2VyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQVlBLE1BQU0sT0FBTyxZQUFZO0lBQ0g7SUFBcEIsWUFBb0IsT0FBdUI7UUFBdkIsWUFBTyxHQUFQLE9BQU8sQ0FBZ0I7SUFBRyxDQUFDO0lBRS9DOztPQUVHO0lBQ0gsR0FBRyxDQUErQixLQUFlO1FBQy9DLElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxLQUFLLENBQUMsSUFBSSxFQUFFLENBQUMsR0FBRyxJQUFJLEVBQUUsRUFBRTtZQUM3QyxNQUFNLE9BQU8sR0FBRztnQkFDZCxNQUFNLEVBQUUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNO2FBQzVCLENBQUE7WUFDRCxLQUFLLEtBQUssQ0FBQyxPQUFPLENBQUMsT0FBTyxFQUFFLEdBQUcsSUFBSSxDQUFDLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQTtRQUMzRCxDQUFDLENBQUMsQ0FBQTtJQUNKLENBQUM7Q0FDRiJ9
22
+ export default EventManager;
23
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXZlbnQtbWFuYWdlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9ldmVudC1tYW5hZ2VyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQW1CQSxNQUFNLFlBQVk7SUFDaEIsT0FBTyxHQUFrQixFQUFFLENBQUE7SUFDM0IsUUFBUSxDQUFnQjtJQUV4QixZQUFZLE9BQXVCO1FBQ2pDLElBQUksQ0FBQyxRQUFRLEdBQUcsT0FBTyxDQUFBO0lBQ3pCLENBQUM7SUFFRDs7T0FFRztJQUNILEdBQUcsQ0FBd0IsS0FBcUI7UUFDOUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUE7SUFDMUIsQ0FBQztJQUVELE9BQU87UUFDTCxLQUFLLE1BQU0sS0FBSyxJQUFJLElBQUksQ0FBQyxPQUFPLEVBQUU7WUFDaEMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLEtBQUssQ0FBQyxLQUFLLEVBQUUsQ0FBQyxHQUFHLElBQUksRUFBRSxFQUFFO2dCQUMvQyxLQUFNLEtBQUssQ0FBQyxPQUF3QixDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsTUFBTSxFQUFFLEdBQUcsSUFBSSxDQUFDLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQTtZQUMxRixDQUFDLENBQUMsQ0FBQTtTQUNIO1FBQ0QsT0FBTyxDQUFDLEdBQUcsQ0FBQyxrQkFBa0IsSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLFdBQVcsQ0FBQyxDQUFBO0lBQy9ELENBQUM7Q0FDRjtBQU1ELGVBQWUsWUFBWSxDQUFBIn0=
package/dist/index.js CHANGED
@@ -1,3 +1,3 @@
1
- export { Bot } from "./bot.js"
2
- export { getChannel, isCategoryChannel, isTextChannel, throwError } from "./util.js"
3
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLEdBQUcsRUFBRSxNQUFNLFVBQVUsQ0FBQTtBQUc5QixPQUFPLEVBQUUsVUFBVSxFQUFFLGlCQUFpQixFQUFFLGFBQWEsRUFBRSxVQUFVLEVBQUUsTUFBTSxXQUFXLENBQUEifQ==
1
+ export { default } from "./bot.js";
2
+ export { getChannel, throwError, throwUserError } from "./util.js";
3
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLFVBQVUsQ0FBQTtBQUdsQyxPQUFPLEVBQUUsVUFBVSxFQUFFLFVBQVUsRUFBRSxjQUFjLEVBQUUsTUFBTSxXQUFXLENBQUEifQ==
@@ -1,22 +1,23 @@
1
- import { REST } from "@discordjs/rest"
2
- import { Client, ClientOptions } from "discord.js"
3
- import { CommandManager } from "./command-manager.js"
4
- import { EventManager } from "./event-manager.js"
5
- export interface BotOptions {
6
- applicationId: string
7
- token: string
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
- export interface DiscordContext {
11
- applicationId: string
12
- token: string
13
- client: Client
14
- rest: REST
9
+ interface DiscordContext {
10
+ applicationId: string;
11
+ token: string;
12
+ client: Client;
13
+ rest: REST;
15
14
  }
16
- export declare class Bot {
17
- #private
18
- readonly commands: CommandManager
19
- readonly events: EventManager
20
- constructor(options: BotOptions)
21
- login(): Promise<void>
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-api-types/v10"
2
- import { ChatInputCommandInteraction, Guild } from "discord.js"
3
- import { DiscordContext } from "./bot.js"
4
- export interface Command {
5
- requiredRoles?: string[]
6
- command: RESTPostAPIChatInputApplicationCommandsJSONBody
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
- export interface CommandContext {
10
- guild: Guild
11
- }
12
- export type CommandHook = (context: CommandContext, interaction: ChatInputCommandInteraction) => Promise<boolean>
13
- export declare class CommandManager {
14
- #private
15
- private discord
16
- constructor(discord: DiscordContext)
17
- add(command: Command): void
18
- setGlobalPreRunHook(hook: CommandHook): void
19
- _register(): Promise<void>
20
- _listen(): void
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
- export interface Event<K extends keyof ClientEvents> {
4
- name: K
5
- handler: (context: EventContext, ...args: ClientEvents[K]) => Promise<void>
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
- export interface EventContext {
8
- client: Client
9
- }
10
- export declare class EventManager {
11
- private discord
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 };
@@ -1,4 +1,4 @@
1
- export { Bot } from "./bot.js"
2
- export { Command, CommandContext, CommandHook } from "./command-manager.js"
3
- export { Event, EventContext } from "./event-manager.js"
4
- export { getChannel, isCategoryChannel, isTextChannel, throwError } from "./util.js"
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";
@@ -1,16 +1,16 @@
1
- import { APIPartialChannel, BaseChannel, CategoryChannel, ChannelType, Guild, NonThreadGuildBasedChannel, TextChannel } from "discord.js"
2
- type NonThreadGuildBasedChannelType =
3
- | ChannelType.GuildText
4
- | ChannelType.GuildVoice
5
- | ChannelType.GuildNews
6
- | ChannelType.GuildStageVoice
7
- | ChannelType.GuildCategory
8
- declare function getChannel<T extends NonThreadGuildBasedChannel>(
9
- guild: Guild,
10
- channelNameOrId: string,
11
- channelType: NonThreadGuildBasedChannelType,
12
- ): Promise<T | undefined>
13
- declare function isTextChannel(channel: BaseChannel | APIPartialChannel): channel is TextChannel
14
- declare function isCategoryChannel(channel: BaseChannel): channel is CategoryChannel
15
- declare function throwError(error: string): never
16
- export { getChannel, isTextChannel, isCategoryChannel, throwError }
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
- const channels = await guild.channels.fetch()
4
- let channel
5
- channel = channels.find((channel) => (channel ? channel.name === channelNameOrId : false))
6
- if (channel) return channel.type === channelType ? channel : undefined
7
- channel = channels.get(channelNameOrId)
8
- if (channel) return channel.type === channelType ? channel : undefined
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 isTextChannel(channel) {
11
- return channel.type === ChannelType.GuildText
13
+ function throwError(error) {
14
+ throw new Error(error);
12
15
  }
13
- function isCategoryChannel(channel) {
14
- return channel.type === ChannelType.GuildCategory
16
+ function throwUserError(error) {
17
+ throw new UserError(error);
15
18
  }
16
- function throwError(error) {
17
- throw new Error(error)
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 { getChannel, isTextChannel, isCategoryChannel, throwError }
20
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXRpbC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy91dGlsLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBbUQsV0FBVyxFQUFrRCxNQUFNLFlBQVksQ0FBQTtBQVN6SSxLQUFLLFVBQVUsVUFBVSxDQUN2QixLQUFZLEVBQ1osZUFBdUIsRUFDdkIsV0FBMkM7SUFFM0MsTUFBTSxRQUFRLEdBQUcsTUFBTSxLQUFLLENBQUMsUUFBUSxDQUFDLEtBQUssRUFBRSxDQUFBO0lBRTdDLElBQUksT0FBc0QsQ0FBQTtJQUMxRCxPQUFPLEdBQUcsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDLE9BQU8sRUFBRSxFQUFFLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxJQUFJLEtBQUssZUFBZSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFBO0lBQzFGLElBQUksT0FBTztRQUFFLE9BQU8sT0FBTyxDQUFDLElBQUksS0FBSyxXQUFXLENBQUMsQ0FBQyxDQUFFLE9BQWEsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFBO0lBRTdFLE9BQU8sR0FBRyxRQUFRLENBQUMsR0FBRyxDQUFDLGVBQWUsQ0FBQyxDQUFBO0lBQ3ZDLElBQUksT0FBTztRQUFFLE9BQU8sT0FBTyxDQUFDLElBQUksS0FBSyxXQUFXLENBQUMsQ0FBQyxDQUFFLE9BQWEsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFBO0FBQy9FLENBQUM7QUFFRCxTQUFTLGFBQWEsQ0FBQyxPQUF3QztJQUM3RCxPQUFPLE9BQU8sQ0FBQyxJQUFJLEtBQUssV0FBVyxDQUFDLFNBQVMsQ0FBQTtBQUMvQyxDQUFDO0FBRUQsU0FBUyxpQkFBaUIsQ0FBQyxPQUFvQjtJQUM3QyxPQUFPLE9BQU8sQ0FBQyxJQUFJLEtBQUssV0FBVyxDQUFDLGFBQWEsQ0FBQTtBQUNuRCxDQUFDO0FBRUQsU0FBUyxVQUFVLENBQUMsS0FBYTtJQUMvQixNQUFNLElBQUksS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFBO0FBQ3hCLENBQUM7QUFFRCxPQUFPLEVBQUUsVUFBVSxFQUFFLGFBQWEsRUFBRSxpQkFBaUIsRUFBRSxVQUFVLEVBQUUsQ0FBQSJ9
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.9.1",
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
- "dependencies": {
17
- "@discordjs/rest": "^1.5.0",
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": "^18.11.17",
23
- "@typescript-eslint/eslint-plugin": "^5.46.1",
24
- "@typescript-eslint/parser": "^5.46.1",
25
- "eslint": "^8.30.0",
26
- "eslint-config-prettier": "^8.5.0",
27
- "eslint-formatter-pretty": "^4.1.0",
28
- "eslint-plugin-eslint-comments": "^3.2.0",
29
- "eslint-plugin-sonarjs": "^0.17.0",
30
- "eslint-plugin-unicorn": "^45.0.2",
31
- "prettier": "^2.8.1",
32
- "prettier-plugin-organize-imports": "^3.2.1",
33
- "prettier-plugin-pkg": "^0.17.1",
34
- "prettier-plugin-sh": "^0.12.8",
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 && pnpm lint && tsc && pnpm format",
35
+ "build": "rm -rf dist && tsc",
39
36
  "format": "prettier --write .",
40
- "lint": "eslint -f pretty .",
37
+ "lint": "eslint ./src/",
41
38
  "prepublish": "pnpm build"
42
39
  }
43
40
  }