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 +6 -5
- package/dist/command-manager.js +49 -23
- package/dist/event-manager.js +15 -10
- package/dist/index.js +3 -3
- package/dist/types/bot.d.ts +7 -5
- package/dist/types/command-manager.d.ts +10 -10
- package/dist/types/event-manager.d.ts +16 -10
- package/dist/types/index.d.ts +4 -4
- package/dist/types/util.d.ts +15 -6
- package/dist/util.js +13 -9
- package/package.json +8 -8
package/dist/bot.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { Client, Events, REST } from "discord.js";
|
|
2
|
-
import
|
|
3
|
-
import
|
|
4
|
-
|
|
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
|
-
|
|
27
|
+
export default Bot;
|
|
28
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYm90LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL2JvdC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsTUFBTSxFQUFpQixNQUFNLEVBQUUsSUFBSSxFQUFFLE1BQU0sWUFBWSxDQUFBO0FBQ2hFLE9BQU8sY0FBYyxNQUFNLHNCQUFzQixDQUFBO0FBQ2pELE9BQU8sWUFBWSxNQUFNLG9CQUFvQixDQUFBO0FBZTdDLE1BQU0sR0FBRztJQUNQLFFBQVEsQ0FBZ0I7SUFFZixRQUFRLENBQWdCO0lBQ3hCLE1BQU0sQ0FBYztJQUU3QixZQUFZLE9BQW1CO1FBQzdCLElBQUksQ0FBQyxRQUFRLEdBQUc7WUFDZCxhQUFhLEVBQUUsT0FBTyxDQUFDLGFBQWE7WUFDcEMsS0FBSyxFQUFFLE9BQU8sQ0FBQyxLQUFLO1lBQ3BCLE1BQU0sRUFBRSxJQUFJLE1BQU0sQ0FBQyxPQUFPLENBQUMsYUFBYSxDQUFDO1lBQ3pDLElBQUksRUFBRSxJQUFJLElBQUksRUFBRSxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDO1NBQ3pDLENBQUE7UUFFRCxJQUFJLENBQUMsUUFBUSxHQUFHLElBQUksY0FBYyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQTtRQUNqRCxJQUFJLENBQUMsTUFBTSxHQUFHLElBQUksWUFBWSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQTtJQUMvQyxDQUFDO0lBRUQsS0FBSyxDQUFDLEtBQUs7UUFDVCxJQUFJLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLFdBQVcsRUFBRSxHQUFHLEVBQUU7WUFDakQsT0FBTyxDQUFDLEdBQUcsQ0FBQyxrQkFBa0IsQ0FBQyxDQUFBO1FBQ2pDLENBQUMsQ0FBQyxDQUFBO1FBRUYsSUFBSSxDQUFDLFFBQVEsQ0FBQyxPQUFPLEVBQUUsQ0FBQTtRQUN2QixJQUFJLENBQUMsTUFBTSxDQUFDLE9BQU8sRUFBRSxDQUFBO1FBQ3JCLE1BQU0sSUFBSSxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUE7SUFDdkQsQ0FBQztDQUNGO0FBRUQsZUFBZSxHQUFHLENBQUEifQ==
|
package/dist/command-manager.js
CHANGED
|
@@ -1,38 +1,59 @@
|
|
|
1
1
|
import { Collection, Events, Routes, } from "discord.js";
|
|
2
|
-
|
|
3
|
-
|
|
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
|
|
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
|
|
19
|
+
async register() {
|
|
22
20
|
const payload = this.#commands.map((c) => c.command);
|
|
23
|
-
const route = Routes.applicationCommands(this
|
|
24
|
-
await this
|
|
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
|
|
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.
|
|
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,
|
|
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
|
|
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(
|
|
67
|
+
await command.run(interaction);
|
|
51
68
|
}
|
|
52
69
|
catch (error) {
|
|
53
|
-
|
|
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
|
|
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,
|
|
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
|
-
|
|
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
|
-
|
|
1
|
+
class EventManager {
|
|
2
|
+
#events = [];
|
|
3
|
+
#discord;
|
|
3
4
|
constructor(discord) {
|
|
4
|
-
this
|
|
5
|
+
this.#discord = discord;
|
|
5
6
|
}
|
|
6
7
|
/*
|
|
7
8
|
* Add an event listener
|
|
8
9
|
*/
|
|
9
10
|
add(event) {
|
|
10
|
-
this.
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
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
|
-
|
|
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,21 +1,23 @@
|
|
|
1
1
|
import { Client, ClientOptions, REST } from "discord.js";
|
|
2
|
-
import
|
|
3
|
-
import
|
|
4
|
-
|
|
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
|
-
|
|
9
|
+
interface DiscordContext {
|
|
10
10
|
applicationId: string;
|
|
11
11
|
token: string;
|
|
12
12
|
client: Client;
|
|
13
13
|
rest: REST;
|
|
14
14
|
}
|
|
15
|
-
|
|
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,
|
|
1
|
+
import { ChatInputCommandInteraction, RESTPostAPIChatInputApplicationCommandsJSONBody } from "discord.js";
|
|
2
2
|
import { DiscordContext } from "./bot.js";
|
|
3
|
-
|
|
3
|
+
interface Command {
|
|
4
4
|
requiredRoles?: string[];
|
|
5
5
|
command: RESTPostAPIChatInputApplicationCommandsJSONBody;
|
|
6
|
-
run: (
|
|
6
|
+
run: (interaction: ChatInputCommandInteraction<"cached">) => void | Promise<void>;
|
|
7
7
|
}
|
|
8
|
-
|
|
9
|
-
|
|
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
|
-
|
|
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
|
-
|
|
5
|
-
|
|
6
|
-
|
|
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
|
-
|
|
9
|
-
|
|
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:
|
|
15
|
+
add<N extends ValidEvents>(event: SingleEvent<N>): void;
|
|
16
|
+
_listen(): void;
|
|
15
17
|
}
|
|
16
|
-
|
|
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 type { Command,
|
|
3
|
-
export type { 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,7 +1,16 @@
|
|
|
1
|
-
import {
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
23
|
-
|
|
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.
|
|
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.
|
|
21
|
-
"@typescript-eslint/eslint-plugin": "^6.
|
|
22
|
-
"@typescript-eslint/parser": "^6.
|
|
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.
|
|
24
|
+
"eslint": "^8.49.0",
|
|
25
25
|
"eslint-config-prettier": "^9.0.0",
|
|
26
|
-
"eslint-plugin-sonarjs": "^0.
|
|
26
|
+
"eslint-plugin-sonarjs": "^0.21.0",
|
|
27
27
|
"eslint-plugin-unicorn": "^48.0.1",
|
|
28
|
-
"prettier": "^3.0.
|
|
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.
|
|
32
|
+
"typescript": "^5.2.2"
|
|
33
33
|
},
|
|
34
34
|
"scripts": {
|
|
35
35
|
"build": "rm -rf dist && tsc",
|