discord-bot-shared 0.10.0 → 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/dist/bot.js CHANGED
@@ -1,7 +1,7 @@
1
1
  import { Client, Events, REST } from "discord.js";
2
- import { CommandManager } from "./command-manager.js";
3
- import { EventManager } from "./event-manager.js";
4
- export class Bot {
2
+ import CommandManager from "./command-manager.js";
3
+ import EventManager from "./event-manager.js";
4
+ class Bot {
5
5
  #discord;
6
6
  commands;
7
7
  events;
@@ -19,9 +19,10 @@ export class Bot {
19
19
  this.#discord.client.once(Events.ClientReady, () => {
20
20
  console.log("Client is ready.");
21
21
  });
22
- await this.commands._register();
23
22
  this.commands._listen();
23
+ this.events._listen();
24
24
  await this.#discord.client.login(this.#discord.token);
25
25
  }
26
26
  }
27
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYm90LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL2JvdC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsTUFBTSxFQUFpQixNQUFNLEVBQUUsSUFBSSxFQUFFLE1BQU0sWUFBWSxDQUFBO0FBQ2hFLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQTtBQUNyRCxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sb0JBQW9CLENBQUE7QUFlakQsTUFBTSxPQUFPLEdBQUc7SUFDZCxRQUFRLENBQWdCO0lBRWYsUUFBUSxDQUFnQjtJQUN4QixNQUFNLENBQWM7SUFFN0IsWUFBWSxPQUFtQjtRQUM3QixJQUFJLENBQUMsUUFBUSxHQUFHO1lBQ2QsYUFBYSxFQUFFLE9BQU8sQ0FBQyxhQUFhO1lBQ3BDLEtBQUssRUFBRSxPQUFPLENBQUMsS0FBSztZQUNwQixNQUFNLEVBQUUsSUFBSSxNQUFNLENBQUMsT0FBTyxDQUFDLGFBQWEsQ0FBQztZQUN6QyxJQUFJLEVBQUUsSUFBSSxJQUFJLEVBQUUsQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQztTQUN6QyxDQUFBO1FBRUQsSUFBSSxDQUFDLFFBQVEsR0FBRyxJQUFJLGNBQWMsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUE7UUFDakQsSUFBSSxDQUFDLE1BQU0sR0FBRyxJQUFJLFlBQVksQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUE7SUFDL0MsQ0FBQztJQUVELEtBQUssQ0FBQyxLQUFLO1FBQ1QsSUFBSSxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxXQUFXLEVBQUUsR0FBRyxFQUFFO1lBQ2pELE9BQU8sQ0FBQyxHQUFHLENBQUMsa0JBQWtCLENBQUMsQ0FBQTtRQUNqQyxDQUFDLENBQUMsQ0FBQTtRQUVGLE1BQU0sSUFBSSxDQUFDLFFBQVEsQ0FBQyxTQUFTLEVBQUUsQ0FBQTtRQUMvQixJQUFJLENBQUMsUUFBUSxDQUFDLE9BQU8sRUFBRSxDQUFBO1FBRXZCLE1BQU0sSUFBSSxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUE7SUFDdkQsQ0FBQztDQUNGIn0=
27
+ export default Bot;
28
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYm90LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL2JvdC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsTUFBTSxFQUFpQixNQUFNLEVBQUUsSUFBSSxFQUFFLE1BQU0sWUFBWSxDQUFBO0FBQ2hFLE9BQU8sY0FBYyxNQUFNLHNCQUFzQixDQUFBO0FBQ2pELE9BQU8sWUFBWSxNQUFNLG9CQUFvQixDQUFBO0FBZTdDLE1BQU0sR0FBRztJQUNQLFFBQVEsQ0FBZ0I7SUFFZixRQUFRLENBQWdCO0lBQ3hCLE1BQU0sQ0FBYztJQUU3QixZQUFZLE9BQW1CO1FBQzdCLElBQUksQ0FBQyxRQUFRLEdBQUc7WUFDZCxhQUFhLEVBQUUsT0FBTyxDQUFDLGFBQWE7WUFDcEMsS0FBSyxFQUFFLE9BQU8sQ0FBQyxLQUFLO1lBQ3BCLE1BQU0sRUFBRSxJQUFJLE1BQU0sQ0FBQyxPQUFPLENBQUMsYUFBYSxDQUFDO1lBQ3pDLElBQUksRUFBRSxJQUFJLElBQUksRUFBRSxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDO1NBQ3pDLENBQUE7UUFFRCxJQUFJLENBQUMsUUFBUSxHQUFHLElBQUksY0FBYyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQTtRQUNqRCxJQUFJLENBQUMsTUFBTSxHQUFHLElBQUksWUFBWSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQTtJQUMvQyxDQUFDO0lBRUQsS0FBSyxDQUFDLEtBQUs7UUFDVCxJQUFJLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLFdBQVcsRUFBRSxHQUFHLEVBQUU7WUFDakQsT0FBTyxDQUFDLEdBQUcsQ0FBQyxrQkFBa0IsQ0FBQyxDQUFBO1FBQ2pDLENBQUMsQ0FBQyxDQUFBO1FBRUYsSUFBSSxDQUFDLFFBQVEsQ0FBQyxPQUFPLEVBQUUsQ0FBQTtRQUN2QixJQUFJLENBQUMsTUFBTSxDQUFDLE9BQU8sRUFBRSxDQUFBO1FBQ3JCLE1BQU0sSUFBSSxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUE7SUFDdkQsQ0FBQztDQUNGO0FBRUQsZUFBZSxHQUFHLENBQUEifQ==
@@ -1,38 +1,59 @@
1
1
  import { Collection, Events, Routes, } from "discord.js";
2
- export class CommandManager {
3
- discord;
2
+ import { UserError } from "./util.js";
3
+ class CommandManager {
4
4
  #commands = new Collection();
5
5
  #globalPreRunHook;
6
+ #discord;
6
7
  constructor(discord) {
7
- this.discord = discord;
8
+ this.#discord = discord;
8
9
  }
9
10
  /*
10
11
  * Add a command
11
12
  */
12
13
  add(command) {
13
- if (!command.command.name) {
14
- throw new Error("a command is missing a name");
15
- }
16
14
  this.#commands.set(command.command.name, command);
17
15
  }
18
16
  setGlobalPreRunHook(hook) {
19
17
  this.#globalPreRunHook = hook;
20
18
  }
21
- async _register() {
19
+ async register() {
22
20
  const payload = this.#commands.map((c) => c.command);
23
- const route = Routes.applicationCommands(this.discord.applicationId);
24
- await this.discord.rest.put(route, { body: payload });
21
+ const route = Routes.applicationCommands(this.#discord.applicationId);
22
+ await this.#discord.rest.put(route, { body: payload });
25
23
  console.log(`Registered ${this.#commands.size} (/) commands.`);
26
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;
30
+ }
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
+ }
27
42
  _listen() {
28
- this.discord.client.on(Events.InteractionCreate, async (interaction) => {
43
+ this.#discord.client.on(Events.InteractionCreate, async (interaction) => {
44
+ if (!interaction.isChatInputCommand())
45
+ return;
29
46
  if (!interaction.guildId)
30
47
  return;
31
- if (!interaction.isChatInputCommand())
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.");
32
52
  return;
53
+ }
33
54
  const command = this.#commands.get(interaction.commandName);
34
55
  if (!command) {
35
- this.interactionReply(interaction, "Unable to get command.");
56
+ this.interactionReply(interaction, `Failed to get command with name: ${interaction.commandName}`);
36
57
  return;
37
58
  }
38
59
  if (!(await this.checkRoles(command, interaction))) {
@@ -40,36 +61,41 @@ export class CommandManager {
40
61
  return;
41
62
  }
42
63
  try {
43
- const guild = await this.discord.client.guilds.fetch(interaction.guildId);
44
- const context = {
45
- guild,
46
- };
47
- const shouldContinue = this.#globalPreRunHook ? await this.#globalPreRunHook(context, interaction) : true;
64
+ const shouldContinue = this.#globalPreRunHook ? await this.#globalPreRunHook(interaction) : true;
48
65
  if (!shouldContinue)
49
66
  return;
50
- await command.run(context, interaction);
67
+ await command.run(interaction);
51
68
  }
52
69
  catch (error) {
53
- const errorMessage = error instanceof Error ? error.message : "";
54
- this.interactionReply(interaction, `There was an error while running this command.\n${errorMessage}`);
70
+ this.interactionReply(interaction, error);
55
71
  }
56
72
  });
73
+ console.log("Listening for commands.");
57
74
  }
58
75
  async checkRoles(command, interaction) {
59
76
  if (!command.requiredRoles)
60
77
  return true;
61
78
  if (command.requiredRoles.length > 0) {
62
- const member = await interaction.guild?.members.fetch(interaction.user).catch(console.error);
79
+ const member = await interaction.guild.members.fetch(interaction.user).catch(console.error);
63
80
  if (!member)
64
81
  return;
65
82
  return member.roles.cache.some((role) => command.requiredRoles ? command.requiredRoles.includes(role.name) : false);
66
83
  }
67
84
  return false;
68
85
  }
69
- interactionReply(interaction, message) {
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}\`\`\``;
70
95
  interaction.deferred
71
96
  ? void interaction.editReply(message).catch(console.error)
72
97
  : void interaction.reply({ content: message, ephemeral: true }).catch(console.error);
73
98
  }
74
99
  }
75
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29tbWFuZC1tYW5hZ2VyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL2NvbW1hbmQtbWFuYWdlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBRUwsVUFBVSxFQUNWLE1BQU0sRUFHTixNQUFNLEdBQ1AsTUFBTSxZQUFZLENBQUE7QUFlbkIsTUFBTSxPQUFPLGNBQWM7SUFJTDtJQUhwQixTQUFTLEdBQUcsSUFBSSxVQUFVLEVBQW1CLENBQUE7SUFDN0MsaUJBQWlCLENBQWM7SUFFL0IsWUFBb0IsT0FBdUI7UUFBdkIsWUFBTyxHQUFQLE9BQU8sQ0FBZ0I7SUFBRyxDQUFDO0lBRS9DOztPQUVHO0lBQ0gsR0FBRyxDQUFDLE9BQWdCO1FBQ2xCLElBQUksQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLElBQUksRUFBRTtZQUN6QixNQUFNLElBQUksS0FBSyxDQUFDLDZCQUE2QixDQUFDLENBQUE7U0FDL0M7UUFFRCxJQUFJLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLElBQUksRUFBRSxPQUFPLENBQUMsQ0FBQTtJQUNuRCxDQUFDO0lBRUQsbUJBQW1CLENBQUMsSUFBaUI7UUFDbkMsSUFBSSxDQUFDLGlCQUFpQixHQUFHLElBQUksQ0FBQTtJQUMvQixDQUFDO0lBRUQsS0FBSyxDQUFDLFNBQVM7UUFDYixNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFBO1FBQ3BELE1BQU0sS0FBSyxHQUFHLE1BQU0sQ0FBQyxtQkFBbUIsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLGFBQWEsQ0FBQyxDQUFBO1FBQ3BFLE1BQU0sSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEtBQUssRUFBRSxFQUFFLElBQUksRUFBRSxPQUFPLEVBQUUsQ0FBQyxDQUFB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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;
1
+ class EventManager {
2
+ #events = [];
3
+ #discord;
3
4
  constructor(discord) {
4
- this.discord = discord;
5
+ this.#discord = discord;
5
6
  }
6
7
  /*
7
8
  * Add an event listener
8
9
  */
9
10
  add(event) {
10
- this.discord.client.on(event.event, (...args) => {
11
- const context = {
12
- client: this.discord.client,
13
- };
14
- void event.handler(context, ...args).catch(console.error);
15
- });
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.`);
16
20
  }
17
21
  }
18
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXZlbnQtbWFuYWdlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9ldmVudC1tYW5hZ2VyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQWNBLE1BQU0sT0FBTyxZQUFZO0lBQ0g7SUFBcEIsWUFBb0IsT0FBdUI7UUFBdkIsWUFBTyxHQUFQLE9BQU8sQ0FBZ0I7SUFBRyxDQUFDO0lBRS9DOztPQUVHO0lBQ0gsR0FBRyxDQUF3QixLQUFlO1FBQ3hDLElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxLQUFLLENBQUMsS0FBSyxFQUFFLENBQUMsR0FBRyxJQUFJLEVBQUUsRUFBRTtZQUM5QyxNQUFNLE9BQU8sR0FBRztnQkFDZCxNQUFNLEVBQUUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNO2FBQzVCLENBQUE7WUFDRCxLQUFLLEtBQUssQ0FBQyxPQUFPLENBQUMsT0FBTyxFQUFFLEdBQUcsSUFBSSxDQUFDLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQTtRQUMzRCxDQUFDLENBQUMsQ0FBQTtJQUNKLENBQUM7Q0FDRiJ9
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,21 +1,23 @@
1
1
  import { Client, ClientOptions, REST } from "discord.js";
2
- import { CommandManager } from "./command-manager.js";
3
- import { EventManager } from "./event-manager.js";
4
- export interface BotOptions {
2
+ import CommandManager from "./command-manager.js";
3
+ import EventManager from "./event-manager.js";
4
+ interface BotOptions {
5
5
  applicationId: string;
6
6
  token: string;
7
7
  clientOptions: ClientOptions;
8
8
  }
9
- export interface DiscordContext {
9
+ interface DiscordContext {
10
10
  applicationId: string;
11
11
  token: string;
12
12
  client: Client;
13
13
  rest: REST;
14
14
  }
15
- export declare class Bot {
15
+ declare class Bot {
16
16
  #private;
17
17
  readonly commands: CommandManager;
18
18
  readonly events: EventManager;
19
19
  constructor(options: BotOptions);
20
20
  login(): Promise<void>;
21
21
  }
22
+ export default Bot;
23
+ export type { BotOptions, DiscordContext };
@@ -1,22 +1,22 @@
1
- import { ChatInputCommandInteraction, Guild, RESTPostAPIChatInputApplicationCommandsJSONBody } from "discord.js";
1
+ import { ChatInputCommandInteraction, RESTPostAPIChatInputApplicationCommandsJSONBody } from "discord.js";
2
2
  import { DiscordContext } from "./bot.js";
3
- export interface Command {
3
+ interface Command {
4
4
  requiredRoles?: string[];
5
5
  command: RESTPostAPIChatInputApplicationCommandsJSONBody;
6
- run: (context: CommandContext, interaction: ChatInputCommandInteraction) => void | Promise<void>;
6
+ run: (interaction: ChatInputCommandInteraction<"cached">) => void | Promise<void>;
7
7
  }
8
- export interface CommandContext {
9
- guild: Guild;
10
- }
11
- export type CommandHook = (context: CommandContext, interaction: ChatInputCommandInteraction) => Promise<boolean>;
12
- export declare class CommandManager {
8
+ type CommandHook = (interaction: ChatInputCommandInteraction<"cached">) => Promise<boolean>;
9
+ declare class CommandManager {
13
10
  #private;
14
- private discord;
15
11
  constructor(discord: DiscordContext);
16
12
  add(command: Command): void;
17
13
  setGlobalPreRunHook(hook: CommandHook): void;
18
- _register(): Promise<void>;
14
+ register(): Promise<void>;
15
+ unregisterGuildCommands(): Promise<void>;
16
+ unregisterApplicationCommands(): Promise<void>;
19
17
  _listen(): void;
20
18
  private checkRoles;
21
19
  private interactionReply;
22
20
  }
21
+ export default CommandManager;
22
+ export type { Command, CommandHook };
@@ -1,16 +1,22 @@
1
1
  import { Client, ClientEvents, Events } from "discord.js";
2
2
  import { DiscordContext } from "./bot.js";
3
3
  type ValidEvents = Exclude<Events, Events.VoiceServerUpdate | Events.Raw>;
4
- export interface Event<N extends ValidEvents = ValidEvents> {
5
- event: N;
6
- handler: (context: EventContext, ...args: ClientEvents[N]) => Promise<void>;
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];
7
11
  }
8
- export interface EventContext {
9
- client: Client;
10
- }
11
- export declare class EventManager {
12
- private discord;
12
+ declare class EventManager {
13
+ #private;
13
14
  constructor(discord: DiscordContext);
14
- add<N extends ValidEvents>(event: Event<N>): void;
15
+ add<N extends ValidEvents>(event: SingleEvent<N>): void;
16
+ _listen(): void;
15
17
  }
16
- export {};
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 type { Command, CommandContext, CommandHook } from "./command-manager.js";
3
- export type { 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,7 +1,16 @@
1
- import { APIPartialChannel, BaseChannel, CategoryChannel, ChannelType, Guild, NonThreadGuildBasedChannel, TextChannel } from "discord.js";
2
- type NonThreadGuildBasedChannelType = ChannelType.GuildText | ChannelType.GuildVoice | ChannelType.GuildAnnouncement | ChannelType.GuildStageVoice | ChannelType.GuildCategory;
3
- declare function getChannel<T extends NonThreadGuildBasedChannel>(guild: Guild, channelNameOrId: string, channelType: NonThreadGuildBasedChannelType): Promise<T>;
4
- declare function isTextChannel(channel: BaseChannel | APIPartialChannel): channel is TextChannel;
5
- declare function isCategoryChannel(channel: BaseChannel): channel is CategoryChannel;
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]>;
6
11
  declare function throwError(error: string): never;
7
- export { getChannel, isCategoryChannel, isTextChannel, throwError };
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
@@ -8,16 +8,20 @@ async function getChannel(guild, channelNameOrId, channelType) {
8
8
  channel = channels.get(channelNameOrId);
9
9
  if (channel && channel.type === channelType)
10
10
  return channel;
11
- throw new Error(`Unable to get channel: ${channelNameOrId}`);
12
- }
13
- function isTextChannel(channel) {
14
- return channel.type === ChannelType.GuildText;
15
- }
16
- function isCategoryChannel(channel) {
17
- return channel.type === ChannelType.GuildCategory;
11
+ throwError(`Failed to get channel: ${channelNameOrId}`);
18
12
  }
19
13
  function throwError(error) {
20
14
  throw new Error(error);
21
15
  }
22
- export { getChannel, isCategoryChannel, isTextChannel, throwError };
23
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXRpbC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy91dGlsLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFJTCxXQUFXLEdBSVosTUFBTSxZQUFZLENBQUE7QUFTbkIsS0FBSyxVQUFVLFVBQVUsQ0FDdkIsS0FBWSxFQUNaLGVBQXVCLEVBQ3ZCLFdBQTJDO0lBRTNDLE1BQU0sUUFBUSxHQUFHLE1BQU0sS0FBSyxDQUFDLFFBQVEsQ0FBQyxLQUFLLEVBQUUsQ0FBQTtJQUU3QyxJQUFJLE9BQXNELENBQUE7SUFDMUQsT0FBTyxHQUFHLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQyxPQUFPLEVBQUUsRUFBRSxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsSUFBSSxLQUFLLGVBQWUsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQTtJQUMxRixJQUFJLE9BQU8sSUFBSSxPQUFPLENBQUMsSUFBSSxLQUFLLFdBQVc7UUFBRSxPQUFPLE9BQVksQ0FBQTtJQUVoRSxPQUFPLEdBQUcsUUFBUSxDQUFDLEdBQUcsQ0FBQyxlQUFlLENBQUMsQ0FBQTtJQUN2QyxJQUFJLE9BQU8sSUFBSSxPQUFPLENBQUMsSUFBSSxLQUFLLFdBQVc7UUFBRSxPQUFPLE9BQVksQ0FBQTtJQUVoRSxNQUFNLElBQUksS0FBSyxDQUFDLDBCQUEwQixlQUFlLEVBQUUsQ0FBQyxDQUFBO0FBQzlELENBQUM7QUFFRCxTQUFTLGFBQWEsQ0FBQyxPQUF3QztJQUM3RCxPQUFPLE9BQU8sQ0FBQyxJQUFJLEtBQUssV0FBVyxDQUFDLFNBQVMsQ0FBQTtBQUMvQyxDQUFDO0FBRUQsU0FBUyxpQkFBaUIsQ0FBQyxPQUFvQjtJQUM3QyxPQUFPLE9BQU8sQ0FBQyxJQUFJLEtBQUssV0FBVyxDQUFDLGFBQWEsQ0FBQTtBQUNuRCxDQUFDO0FBRUQsU0FBUyxVQUFVLENBQUMsS0FBYTtJQUMvQixNQUFNLElBQUksS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFBO0FBQ3hCLENBQUM7QUFFRCxPQUFPLEVBQUUsVUFBVSxFQUFFLGlCQUFpQixFQUFFLGFBQWEsRUFBRSxVQUFVLEVBQUUsQ0FBQSJ9
16
+ function throwUserError(error) {
17
+ throw new UserError(error);
18
+ }
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
+ }
25
+ }
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.10.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",
@@ -17,19 +17,19 @@
17
17
  "discord.js": ">14.0.0"
18
18
  },
19
19
  "devDependencies": {
20
- "@types/node": "^20.5.1",
21
- "@typescript-eslint/eslint-plugin": "^6.4.0",
22
- "@typescript-eslint/parser": "^6.4.0",
20
+ "@types/node": "^20.6.0",
21
+ "@typescript-eslint/eslint-plugin": "^6.6.0",
22
+ "@typescript-eslint/parser": "^6.6.0",
23
23
  "discord.js": "^14.13.0",
24
- "eslint": "^8.47.0",
24
+ "eslint": "^8.49.0",
25
25
  "eslint-config-prettier": "^9.0.0",
26
- "eslint-plugin-sonarjs": "^0.20.0",
26
+ "eslint-plugin-sonarjs": "^0.21.0",
27
27
  "eslint-plugin-unicorn": "^48.0.1",
28
- "prettier": "^3.0.2",
28
+ "prettier": "^3.0.3",
29
29
  "prettier-plugin-organize-imports": "^3.2.3",
30
30
  "prettier-plugin-pkg": "^0.18.0",
31
31
  "prettier-plugin-sh": "^0.13.1",
32
- "typescript": "^5.1.6"
32
+ "typescript": "^5.2.2"
33
33
  },
34
34
  "scripts": {
35
35
  "build": "rm -rf dist && tsc",