@mostfeatured/dbi 0.1.46 → 0.2.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/src/DBI.d.ts.map +1 -0
- package/dist/src/DBI.js.map +1 -0
- package/dist/src/Events.d.ts.map +1 -0
- package/dist/src/Events.js.map +1 -0
- package/dist/src/index.d.ts.map +1 -0
- package/dist/src/index.js.map +1 -0
- package/dist/src/methods/handleMessageCommands.d.ts.map +1 -0
- package/dist/src/methods/handleMessageCommands.js.map +1 -0
- package/dist/src/methods/hookEventListeners.d.ts.map +1 -0
- package/dist/src/methods/hookEventListeners.js.map +1 -0
- package/dist/src/methods/hookInteractionListeners.d.ts.map +1 -0
- package/dist/{methods → src/methods}/hookInteractionListeners.js +22 -12
- package/dist/src/methods/hookInteractionListeners.js.map +1 -0
- package/dist/src/methods/publishInteractions.d.ts.map +1 -0
- package/dist/src/methods/publishInteractions.js.map +1 -0
- package/dist/src/types/ApplicationRoleConnectionMetadata.d.ts.map +1 -0
- package/dist/src/types/ApplicationRoleConnectionMetadata.js.map +1 -0
- package/dist/src/types/Builders/ButtonBuilder.d.ts.map +1 -0
- package/dist/src/types/Builders/ButtonBuilder.js.map +1 -0
- package/dist/src/types/Builders/ChannelSelectMenuBuilder.d.ts.map +1 -0
- package/dist/src/types/Builders/ChannelSelectMenuBuilder.js.map +1 -0
- package/dist/src/types/Builders/MentionableSelectMenuBuilder.d.ts.map +1 -0
- package/dist/src/types/Builders/MentionableSelectMenuBuilder.js.map +1 -0
- package/dist/src/types/Builders/ModalBuilder.d.ts.map +1 -0
- package/dist/src/types/Builders/ModalBuilder.js.map +1 -0
- package/dist/src/types/Builders/RoleSelectMenuBuilder.d.ts.map +1 -0
- package/dist/src/types/Builders/RoleSelectMenuBuilder.js.map +1 -0
- package/dist/src/types/Builders/StringSelectMenuBuilder.d.ts.map +1 -0
- package/dist/src/types/Builders/StringSelectMenuBuilder.js.map +1 -0
- package/dist/src/types/Builders/UserSelectMenuBuilder.d.ts.map +1 -0
- package/dist/src/types/Builders/UserSelectMenuBuilder.js.map +1 -0
- package/dist/src/types/ChatInput/ChatInput.d.ts.map +1 -0
- package/dist/src/types/ChatInput/ChatInput.js.map +1 -0
- package/dist/{types → src/types}/ChatInput/ChatInputOptions.d.ts +2 -2
- package/dist/src/types/ChatInput/ChatInputOptions.d.ts.map +1 -0
- package/dist/src/types/ChatInput/ChatInputOptions.js.map +1 -0
- package/dist/src/types/Components/Button.d.ts.map +1 -0
- package/dist/src/types/Components/Button.js.map +1 -0
- package/dist/src/types/Components/ChannelSelectMenu.d.ts.map +1 -0
- package/dist/src/types/Components/ChannelSelectMenu.js.map +1 -0
- package/dist/src/types/Components/HTMLComponentsV2/HTMLComponentsV2Handlers.d.ts.map +1 -0
- package/dist/src/types/Components/HTMLComponentsV2/HTMLComponentsV2Handlers.js.map +1 -0
- package/dist/src/types/Components/HTMLComponentsV2/index.d.ts +91 -0
- package/dist/src/types/Components/HTMLComponentsV2/index.d.ts.map +1 -0
- package/dist/src/types/Components/HTMLComponentsV2/index.js +300 -0
- package/dist/src/types/Components/HTMLComponentsV2/index.js.map +1 -0
- package/dist/src/types/Components/HTMLComponentsV2/parser.d.ts.map +1 -0
- package/dist/{types → src/types}/Components/HTMLComponentsV2/parser.js +11 -4
- package/dist/src/types/Components/HTMLComponentsV2/parser.js.map +1 -0
- package/dist/src/types/Components/HTMLComponentsV2/svelteParser.d.ts +35 -0
- package/dist/src/types/Components/HTMLComponentsV2/svelteParser.d.ts.map +1 -0
- package/dist/src/types/Components/HTMLComponentsV2/svelteParser.js +822 -0
- package/dist/src/types/Components/HTMLComponentsV2/svelteParser.js.map +1 -0
- package/dist/src/types/Components/HTMLComponentsV2/svelteRenderer.d.ts +24 -0
- package/dist/src/types/Components/HTMLComponentsV2/svelteRenderer.d.ts.map +1 -0
- package/dist/src/types/Components/HTMLComponentsV2/svelteRenderer.js +294 -0
- package/dist/src/types/Components/HTMLComponentsV2/svelteRenderer.js.map +1 -0
- package/dist/src/types/Components/MentionableSelectMenu.d.ts.map +1 -0
- package/dist/src/types/Components/MentionableSelectMenu.js.map +1 -0
- package/dist/src/types/Components/Modal.d.ts.map +1 -0
- package/dist/src/types/Components/Modal.js.map +1 -0
- package/dist/src/types/Components/RoleSelectMenu.d.ts.map +1 -0
- package/dist/src/types/Components/RoleSelectMenu.js.map +1 -0
- package/dist/src/types/Components/StringSelectMenu.d.ts.map +1 -0
- package/dist/src/types/Components/StringSelectMenu.js.map +1 -0
- package/dist/src/types/Components/UserSelectMenu.d.ts.map +1 -0
- package/dist/src/types/Components/UserSelectMenu.js.map +1 -0
- package/dist/src/types/Event.d.ts.map +1 -0
- package/dist/src/types/Event.js.map +1 -0
- package/dist/src/types/Interaction.d.ts.map +1 -0
- package/dist/src/types/Interaction.js.map +1 -0
- package/dist/src/types/other/CustomEvent.d.ts.map +1 -0
- package/dist/src/types/other/CustomEvent.js.map +1 -0
- package/dist/src/types/other/FakeMessageInteraction.d.ts.map +1 -0
- package/dist/src/types/other/FakeMessageInteraction.js.map +1 -0
- package/dist/src/types/other/InteractionLocale.d.ts.map +1 -0
- package/dist/src/types/other/InteractionLocale.js.map +1 -0
- package/dist/src/types/other/Locale.d.ts.map +1 -0
- package/dist/src/types/other/Locale.js.map +1 -0
- package/dist/src/types/other/MessageContextMenu.d.ts.map +1 -0
- package/dist/src/types/other/MessageContextMenu.js.map +1 -0
- package/dist/src/types/other/UserContextMenu.d.ts.map +1 -0
- package/dist/src/types/other/UserContextMenu.js.map +1 -0
- package/dist/src/utils/MemoryStore.d.ts.map +1 -0
- package/dist/src/utils/MemoryStore.js.map +1 -0
- package/dist/src/utils/UtilTypes.d.ts.map +1 -0
- package/dist/src/utils/UtilTypes.js.map +1 -0
- package/dist/src/utils/customId.d.ts.map +1 -0
- package/dist/src/utils/customId.js.map +1 -0
- package/dist/src/utils/permissions.d.ts.map +1 -0
- package/dist/src/utils/permissions.js.map +1 -0
- package/dist/src/utils/recursiveImport.d.ts.map +1 -0
- package/dist/src/utils/recursiveImport.js.map +1 -0
- package/dist/src/utils/recursiveUnload.d.ts.map +1 -0
- package/dist/src/utils/recursiveUnload.js.map +1 -0
- package/dist/src/utils/unloadModule.d.ts.map +1 -0
- package/dist/src/utils/unloadModule.js.map +1 -0
- package/dist/test/index.d.ts +2 -0
- package/dist/test/index.d.ts.map +1 -0
- package/dist/test/index.js +103 -0
- package/dist/test/index.js.map +1 -0
- package/docs/ADVANCED_FEATURES.md +836 -0
- package/docs/API_REFERENCE.md +925 -0
- package/docs/CHAT_INPUT.md +807 -0
- package/docs/COMPONENTS.md +1035 -0
- package/docs/EVENTS.md +564 -0
- package/docs/GETTING_STARTED.md +394 -0
- package/docs/LOCALIZATION.md +773 -0
- package/docs/README.md +341 -0
- package/docs/SVELTE_COMPONENTS.md +955 -0
- package/generated/globals.d.ts +1 -0
- package/generated/index.d.ts +30 -0
- package/generated/svelte-dbi.d.ts +588 -0
- package/package.json +57 -47
- package/readme.md +168 -491
- package/src/methods/hookInteractionListeners.ts +23 -12
- package/src/types/Components/HTMLComponentsV2/index.ts +353 -12
- package/src/types/Components/HTMLComponentsV2/parser.ts +14 -4
- package/src/types/Components/HTMLComponentsV2/svelteParser.ts +904 -0
- package/src/types/Components/HTMLComponentsV2/svelteRenderer.ts +332 -0
- package/test/index.ts +105 -0
- package/test/product-showcase.svelte +199 -0
- package/tsconfig.json +13 -3
- package/dist/DBI.d.ts.map +0 -1
- package/dist/DBI.js.map +0 -1
- package/dist/Events.d.ts.map +0 -1
- package/dist/Events.js.map +0 -1
- package/dist/index.d.ts.map +0 -1
- package/dist/index.js.map +0 -1
- package/dist/methods/handleMessageCommands.d.ts.map +0 -1
- package/dist/methods/handleMessageCommands.js.map +0 -1
- package/dist/methods/hookEventListeners.d.ts.map +0 -1
- package/dist/methods/hookEventListeners.js.map +0 -1
- package/dist/methods/hookInteractionListeners.d.ts.map +0 -1
- package/dist/methods/hookInteractionListeners.js.map +0 -1
- package/dist/methods/publishInteractions.d.ts.map +0 -1
- package/dist/methods/publishInteractions.js.map +0 -1
- package/dist/types/ApplicationRoleConnectionMetadata.d.ts.map +0 -1
- package/dist/types/ApplicationRoleConnectionMetadata.js.map +0 -1
- package/dist/types/Builders/ButtonBuilder.d.ts.map +0 -1
- package/dist/types/Builders/ButtonBuilder.js.map +0 -1
- package/dist/types/Builders/ChannelSelectMenuBuilder.d.ts.map +0 -1
- package/dist/types/Builders/ChannelSelectMenuBuilder.js.map +0 -1
- package/dist/types/Builders/MentionableSelectMenuBuilder.d.ts.map +0 -1
- package/dist/types/Builders/MentionableSelectMenuBuilder.js.map +0 -1
- package/dist/types/Builders/ModalBuilder.d.ts.map +0 -1
- package/dist/types/Builders/ModalBuilder.js.map +0 -1
- package/dist/types/Builders/RoleSelectMenuBuilder.d.ts.map +0 -1
- package/dist/types/Builders/RoleSelectMenuBuilder.js.map +0 -1
- package/dist/types/Builders/StringSelectMenuBuilder.d.ts.map +0 -1
- package/dist/types/Builders/StringSelectMenuBuilder.js.map +0 -1
- package/dist/types/Builders/UserSelectMenuBuilder.d.ts.map +0 -1
- package/dist/types/Builders/UserSelectMenuBuilder.js.map +0 -1
- package/dist/types/ChatInput/ChatInput.d.ts.map +0 -1
- package/dist/types/ChatInput/ChatInput.js.map +0 -1
- package/dist/types/ChatInput/ChatInputOptions.d.ts.map +0 -1
- package/dist/types/ChatInput/ChatInputOptions.js.map +0 -1
- package/dist/types/Components/Button.d.ts.map +0 -1
- package/dist/types/Components/Button.js.map +0 -1
- package/dist/types/Components/ChannelSelectMenu.d.ts.map +0 -1
- package/dist/types/Components/ChannelSelectMenu.js.map +0 -1
- package/dist/types/Components/HTMLComponentsV2/HTMLComponentsV2Handlers.d.ts.map +0 -1
- package/dist/types/Components/HTMLComponentsV2/HTMLComponentsV2Handlers.js.map +0 -1
- package/dist/types/Components/HTMLComponentsV2/index.d.ts +0 -19
- package/dist/types/Components/HTMLComponentsV2/index.d.ts.map +0 -1
- package/dist/types/Components/HTMLComponentsV2/index.js +0 -31
- package/dist/types/Components/HTMLComponentsV2/index.js.map +0 -1
- package/dist/types/Components/HTMLComponentsV2/parser.d.ts.map +0 -1
- package/dist/types/Components/HTMLComponentsV2/parser.js.map +0 -1
- package/dist/types/Components/MentionableSelectMenu.d.ts.map +0 -1
- package/dist/types/Components/MentionableSelectMenu.js.map +0 -1
- package/dist/types/Components/Modal.d.ts.map +0 -1
- package/dist/types/Components/Modal.js.map +0 -1
- package/dist/types/Components/RoleSelectMenu.d.ts.map +0 -1
- package/dist/types/Components/RoleSelectMenu.js.map +0 -1
- package/dist/types/Components/StringSelectMenu.d.ts.map +0 -1
- package/dist/types/Components/StringSelectMenu.js.map +0 -1
- package/dist/types/Components/UserSelectMenu.d.ts.map +0 -1
- package/dist/types/Components/UserSelectMenu.js.map +0 -1
- package/dist/types/Event.d.ts.map +0 -1
- package/dist/types/Event.js.map +0 -1
- package/dist/types/Interaction.d.ts.map +0 -1
- package/dist/types/Interaction.js.map +0 -1
- package/dist/types/other/CustomEvent.d.ts.map +0 -1
- package/dist/types/other/CustomEvent.js.map +0 -1
- package/dist/types/other/FakeMessageInteraction.d.ts.map +0 -1
- package/dist/types/other/FakeMessageInteraction.js.map +0 -1
- package/dist/types/other/InteractionLocale.d.ts.map +0 -1
- package/dist/types/other/InteractionLocale.js.map +0 -1
- package/dist/types/other/Locale.d.ts.map +0 -1
- package/dist/types/other/Locale.js.map +0 -1
- package/dist/types/other/MessageContextMenu.d.ts.map +0 -1
- package/dist/types/other/MessageContextMenu.js.map +0 -1
- package/dist/types/other/UserContextMenu.d.ts.map +0 -1
- package/dist/types/other/UserContextMenu.js.map +0 -1
- package/dist/utils/MemoryStore.d.ts.map +0 -1
- package/dist/utils/MemoryStore.js.map +0 -1
- package/dist/utils/UtilTypes.d.ts.map +0 -1
- package/dist/utils/UtilTypes.js.map +0 -1
- package/dist/utils/customId.d.ts.map +0 -1
- package/dist/utils/customId.js.map +0 -1
- package/dist/utils/permissions.d.ts.map +0 -1
- package/dist/utils/permissions.js.map +0 -1
- package/dist/utils/recursiveImport.d.ts.map +0 -1
- package/dist/utils/recursiveImport.js.map +0 -1
- package/dist/utils/recursiveUnload.d.ts.map +0 -1
- package/dist/utils/recursiveUnload.js.map +0 -1
- package/dist/utils/unloadModule.d.ts.map +0 -1
- package/dist/utils/unloadModule.js.map +0 -1
- package/examples/modal/dbi.js +0 -30
- package/examples/modal/login.js +0 -15
- package/examples/modal/package.json +0 -15
- package/examples/modal/publish.js +0 -13
- package/examples/modal/src/chatInput.js +0 -38
- package/examples/modal/src/components.js +0 -33
- package/examples/modal/src/event.js +0 -20
- package/examples/modal/src/interactionlocales.js +0 -24
- package/examples/modal/src/locales.js +0 -38
- package/examples/modal/src/modal.js +0 -28
- /package/dist/{DBI.d.ts → src/DBI.d.ts} +0 -0
- /package/dist/{DBI.js → src/DBI.js} +0 -0
- /package/dist/{Events.d.ts → src/Events.d.ts} +0 -0
- /package/dist/{Events.js → src/Events.js} +0 -0
- /package/dist/{data → src/data}/eventMap.json +0 -0
- /package/dist/{index.d.ts → src/index.d.ts} +0 -0
- /package/dist/{index.js → src/index.js} +0 -0
- /package/dist/{methods → src/methods}/handleMessageCommands.d.ts +0 -0
- /package/dist/{methods → src/methods}/handleMessageCommands.js +0 -0
- /package/dist/{methods → src/methods}/hookEventListeners.d.ts +0 -0
- /package/dist/{methods → src/methods}/hookEventListeners.js +0 -0
- /package/dist/{methods → src/methods}/hookInteractionListeners.d.ts +0 -0
- /package/dist/{methods → src/methods}/publishInteractions.d.ts +0 -0
- /package/dist/{methods → src/methods}/publishInteractions.js +0 -0
- /package/dist/{types → src/types}/ApplicationRoleConnectionMetadata.d.ts +0 -0
- /package/dist/{types → src/types}/ApplicationRoleConnectionMetadata.js +0 -0
- /package/dist/{types → src/types}/Builders/ButtonBuilder.d.ts +0 -0
- /package/dist/{types → src/types}/Builders/ButtonBuilder.js +0 -0
- /package/dist/{types → src/types}/Builders/ChannelSelectMenuBuilder.d.ts +0 -0
- /package/dist/{types → src/types}/Builders/ChannelSelectMenuBuilder.js +0 -0
- /package/dist/{types → src/types}/Builders/MentionableSelectMenuBuilder.d.ts +0 -0
- /package/dist/{types → src/types}/Builders/MentionableSelectMenuBuilder.js +0 -0
- /package/dist/{types → src/types}/Builders/ModalBuilder.d.ts +0 -0
- /package/dist/{types → src/types}/Builders/ModalBuilder.js +0 -0
- /package/dist/{types → src/types}/Builders/RoleSelectMenuBuilder.d.ts +0 -0
- /package/dist/{types → src/types}/Builders/RoleSelectMenuBuilder.js +0 -0
- /package/dist/{types → src/types}/Builders/StringSelectMenuBuilder.d.ts +0 -0
- /package/dist/{types → src/types}/Builders/StringSelectMenuBuilder.js +0 -0
- /package/dist/{types → src/types}/Builders/UserSelectMenuBuilder.d.ts +0 -0
- /package/dist/{types → src/types}/Builders/UserSelectMenuBuilder.js +0 -0
- /package/dist/{types → src/types}/ChatInput/ChatInput.d.ts +0 -0
- /package/dist/{types → src/types}/ChatInput/ChatInput.js +0 -0
- /package/dist/{types → src/types}/ChatInput/ChatInputOptions.js +0 -0
- /package/dist/{types → src/types}/Components/Button.d.ts +0 -0
- /package/dist/{types → src/types}/Components/Button.js +0 -0
- /package/dist/{types → src/types}/Components/ChannelSelectMenu.d.ts +0 -0
- /package/dist/{types → src/types}/Components/ChannelSelectMenu.js +0 -0
- /package/dist/{types → src/types}/Components/HTMLComponentsV2/HTMLComponentsV2Handlers.d.ts +0 -0
- /package/dist/{types → src/types}/Components/HTMLComponentsV2/HTMLComponentsV2Handlers.js +0 -0
- /package/dist/{types → src/types}/Components/HTMLComponentsV2/parser.d.ts +0 -0
- /package/dist/{types → src/types}/Components/MentionableSelectMenu.d.ts +0 -0
- /package/dist/{types → src/types}/Components/MentionableSelectMenu.js +0 -0
- /package/dist/{types → src/types}/Components/Modal.d.ts +0 -0
- /package/dist/{types → src/types}/Components/Modal.js +0 -0
- /package/dist/{types → src/types}/Components/RoleSelectMenu.d.ts +0 -0
- /package/dist/{types → src/types}/Components/RoleSelectMenu.js +0 -0
- /package/dist/{types → src/types}/Components/StringSelectMenu.d.ts +0 -0
- /package/dist/{types → src/types}/Components/StringSelectMenu.js +0 -0
- /package/dist/{types → src/types}/Components/UserSelectMenu.d.ts +0 -0
- /package/dist/{types → src/types}/Components/UserSelectMenu.js +0 -0
- /package/dist/{types → src/types}/Event.d.ts +0 -0
- /package/dist/{types → src/types}/Event.js +0 -0
- /package/dist/{types → src/types}/Interaction.d.ts +0 -0
- /package/dist/{types → src/types}/Interaction.js +0 -0
- /package/dist/{types → src/types}/other/CustomEvent.d.ts +0 -0
- /package/dist/{types → src/types}/other/CustomEvent.js +0 -0
- /package/dist/{types → src/types}/other/FakeMessageInteraction.d.ts +0 -0
- /package/dist/{types → src/types}/other/FakeMessageInteraction.js +0 -0
- /package/dist/{types → src/types}/other/InteractionLocale.d.ts +0 -0
- /package/dist/{types → src/types}/other/InteractionLocale.js +0 -0
- /package/dist/{types → src/types}/other/Locale.d.ts +0 -0
- /package/dist/{types → src/types}/other/Locale.js +0 -0
- /package/dist/{types → src/types}/other/MessageContextMenu.d.ts +0 -0
- /package/dist/{types → src/types}/other/MessageContextMenu.js +0 -0
- /package/dist/{types → src/types}/other/UserContextMenu.d.ts +0 -0
- /package/dist/{types → src/types}/other/UserContextMenu.js +0 -0
- /package/dist/{utils → src/utils}/MemoryStore.d.ts +0 -0
- /package/dist/{utils → src/utils}/MemoryStore.js +0 -0
- /package/dist/{utils → src/utils}/UtilTypes.d.ts +0 -0
- /package/dist/{utils → src/utils}/UtilTypes.js +0 -0
- /package/dist/{utils → src/utils}/customId.d.ts +0 -0
- /package/dist/{utils → src/utils}/customId.js +0 -0
- /package/dist/{utils → src/utils}/permissions.d.ts +0 -0
- /package/dist/{utils → src/utils}/permissions.js +0 -0
- /package/dist/{utils → src/utils}/recursiveImport.d.ts +0 -0
- /package/dist/{utils → src/utils}/recursiveImport.js +0 -0
- /package/dist/{utils → src/utils}/recursiveUnload.d.ts +0 -0
- /package/dist/{utils → src/utils}/recursiveUnload.js +0 -0
- /package/dist/{utils → src/utils}/unloadModule.d.ts +0 -0
- /package/dist/{utils → src/utils}/unloadModule.js +0 -0
|
@@ -0,0 +1,836 @@
|
|
|
1
|
+
# Advanced Features
|
|
2
|
+
|
|
3
|
+
This guide covers advanced DBI features including message commands, multi-client support, rate limiting, references, sharding, and more.
|
|
4
|
+
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
## Table of Contents
|
|
8
|
+
|
|
9
|
+
- [Message Commands](#message-commands)
|
|
10
|
+
- [Reference System](#reference-system)
|
|
11
|
+
- [Rate Limiting](#rate-limiting)
|
|
12
|
+
- [Multi-Client Support](#multi-client-support)
|
|
13
|
+
- [Sharding](#sharding)
|
|
14
|
+
- [Hot Reloading](#hot-reloading)
|
|
15
|
+
- [Persistent Store](#persistent-store)
|
|
16
|
+
- [Flag-based Loading](#flag-based-loading)
|
|
17
|
+
- [Data Management](#data-management)
|
|
18
|
+
|
|
19
|
+
---
|
|
20
|
+
|
|
21
|
+
## Message Commands
|
|
22
|
+
|
|
23
|
+
DBI can automatically convert slash commands to message-based commands, allowing users to use traditional prefix commands.
|
|
24
|
+
|
|
25
|
+
### Enabling Message Commands
|
|
26
|
+
|
|
27
|
+
```javascript
|
|
28
|
+
const dbi = createDBI("my-bot", {
|
|
29
|
+
discord: {
|
|
30
|
+
token: process.env.DISCORD_TOKEN,
|
|
31
|
+
options: {
|
|
32
|
+
intents: [
|
|
33
|
+
"Guilds",
|
|
34
|
+
"GuildMessages",
|
|
35
|
+
"MessageContent" // Required for message commands
|
|
36
|
+
]
|
|
37
|
+
}
|
|
38
|
+
},
|
|
39
|
+
|
|
40
|
+
// Enable message commands
|
|
41
|
+
messageCommands: {
|
|
42
|
+
// Prefixes to listen for
|
|
43
|
+
prefixes: ["!", ".", "?"],
|
|
44
|
+
|
|
45
|
+
// Or dynamic prefixes
|
|
46
|
+
// prefixes: async ({ message }) => {
|
|
47
|
+
// const guildPrefix = await getGuildPrefix(message.guild?.id);
|
|
48
|
+
// return [guildPrefix, "!"];
|
|
49
|
+
// },
|
|
50
|
+
|
|
51
|
+
// Type aliases for boolean parsing
|
|
52
|
+
typeAliases: {
|
|
53
|
+
booleans: {
|
|
54
|
+
"yes": true,
|
|
55
|
+
"no": false,
|
|
56
|
+
"true": true,
|
|
57
|
+
"false": false,
|
|
58
|
+
"on": true,
|
|
59
|
+
"off": false,
|
|
60
|
+
"1": true,
|
|
61
|
+
"0": false
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
},
|
|
65
|
+
|
|
66
|
+
defaults: {
|
|
67
|
+
messageCommands: {
|
|
68
|
+
// Content shown while processing
|
|
69
|
+
deferReplyContent: "Processing..."
|
|
70
|
+
// Or dynamic:
|
|
71
|
+
// deferReplyContent: ({ interaction }) => `Processing ${interaction.commandName}...`
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
});
|
|
75
|
+
```
|
|
76
|
+
|
|
77
|
+
### How It Works
|
|
78
|
+
|
|
79
|
+
Message commands emulate slash commands:
|
|
80
|
+
- `!ping` → `/ping`
|
|
81
|
+
- `!user info @John` → `/user info user:@John`
|
|
82
|
+
- `!ban @User spam` → `/ban user:@User reason:spam`
|
|
83
|
+
|
|
84
|
+
```javascript
|
|
85
|
+
dbi.register(({ ChatInput, ChatInputOptions }) => {
|
|
86
|
+
// This command works with both slash and message commands
|
|
87
|
+
ChatInput({
|
|
88
|
+
name: "greet",
|
|
89
|
+
description: "Greet someone",
|
|
90
|
+
options: [
|
|
91
|
+
ChatInputOptions.user({
|
|
92
|
+
name: "user",
|
|
93
|
+
description: "User to greet",
|
|
94
|
+
required: true
|
|
95
|
+
}),
|
|
96
|
+
ChatInputOptions.string({
|
|
97
|
+
name: "message",
|
|
98
|
+
description: "Custom message",
|
|
99
|
+
required: false
|
|
100
|
+
})
|
|
101
|
+
],
|
|
102
|
+
|
|
103
|
+
onExecute({ interaction }) {
|
|
104
|
+
const user = interaction.options.getUser("user");
|
|
105
|
+
const message = interaction.options.getString("message") || "Hello!";
|
|
106
|
+
|
|
107
|
+
interaction.reply(`${message} ${user}`);
|
|
108
|
+
}
|
|
109
|
+
});
|
|
110
|
+
});
|
|
111
|
+
|
|
112
|
+
// Usage:
|
|
113
|
+
// Slash: /greet user:@John message:Welcome!
|
|
114
|
+
// Message: !greet @John Welcome!
|
|
115
|
+
```
|
|
116
|
+
|
|
117
|
+
### Message Command Aliases
|
|
118
|
+
|
|
119
|
+
```javascript
|
|
120
|
+
dbi.register(({ ChatInput }) => {
|
|
121
|
+
ChatInput({
|
|
122
|
+
name: "help",
|
|
123
|
+
description: "Show help",
|
|
124
|
+
|
|
125
|
+
other: {
|
|
126
|
+
messageCommand: {
|
|
127
|
+
// Additional command aliases
|
|
128
|
+
aliases: ["h", "?", "commands", "cmds"],
|
|
129
|
+
|
|
130
|
+
// Set to true to disable message command for this
|
|
131
|
+
ignore: false
|
|
132
|
+
}
|
|
133
|
+
},
|
|
134
|
+
|
|
135
|
+
onExecute({ interaction }) {
|
|
136
|
+
interaction.reply("Help information...");
|
|
137
|
+
}
|
|
138
|
+
});
|
|
139
|
+
});
|
|
140
|
+
|
|
141
|
+
// Now works with: !help, !h, !?, !commands, !cmds
|
|
142
|
+
```
|
|
143
|
+
|
|
144
|
+
### Rest String Arguments
|
|
145
|
+
|
|
146
|
+
Capture remaining text in a single string:
|
|
147
|
+
|
|
148
|
+
```javascript
|
|
149
|
+
dbi.register(({ ChatInput, ChatInputOptions }) => {
|
|
150
|
+
ChatInput({
|
|
151
|
+
name: "say",
|
|
152
|
+
description: "Make the bot say something",
|
|
153
|
+
options: [
|
|
154
|
+
ChatInputOptions.string({
|
|
155
|
+
name: "message",
|
|
156
|
+
description: "The message",
|
|
157
|
+
required: true,
|
|
158
|
+
messageCommands: {
|
|
159
|
+
rest: true // Capture all remaining text
|
|
160
|
+
}
|
|
161
|
+
})
|
|
162
|
+
],
|
|
163
|
+
|
|
164
|
+
onExecute({ interaction }) {
|
|
165
|
+
const message = interaction.options.getString("message");
|
|
166
|
+
interaction.reply(message);
|
|
167
|
+
}
|
|
168
|
+
});
|
|
169
|
+
});
|
|
170
|
+
|
|
171
|
+
// !say Hello world, how are you?
|
|
172
|
+
// message = "Hello world, how are you?"
|
|
173
|
+
```
|
|
174
|
+
|
|
175
|
+
### Handling Message Command Errors
|
|
176
|
+
|
|
177
|
+
```javascript
|
|
178
|
+
const { ApplicationCommandOptionType } = require("discord.js");
|
|
179
|
+
|
|
180
|
+
// Argument validation error
|
|
181
|
+
dbi.events.on("messageCommandArgumentError", ({ message, error, dbiInteraction }) => {
|
|
182
|
+
const option = error.option;
|
|
183
|
+
const errorMessages = {
|
|
184
|
+
MissingRequiredOption: `Missing required argument: \`${option.name}\``,
|
|
185
|
+
MinLength: `\`${option.name}\` must be at least ${option.minLength} characters`,
|
|
186
|
+
MaxLength: `\`${option.name}\` must be at most ${option.maxLength} characters`,
|
|
187
|
+
InvalidChoice: `\`${option.name}\` must be one of: ${error.extra?.map(c => c.name).join(", ")}`,
|
|
188
|
+
InvalidInteger: `\`${option.name}\` must be a whole number`,
|
|
189
|
+
InvalidNumber: `\`${option.name}\` must be a number`,
|
|
190
|
+
InvalidBoolean: `\`${option.name}\` must be yes/no or true/false`,
|
|
191
|
+
InvalidUser: `\`${option.name}\` must be a valid user mention`,
|
|
192
|
+
InvalidChannel: `\`${option.name}\` must be a valid channel mention`,
|
|
193
|
+
InvalidRole: `\`${option.name}\` must be a valid role mention`
|
|
194
|
+
};
|
|
195
|
+
|
|
196
|
+
message.reply(`❌ ${errorMessages[error.type] || "Invalid argument"}`);
|
|
197
|
+
return false;
|
|
198
|
+
});
|
|
199
|
+
|
|
200
|
+
// DM usage when not allowed
|
|
201
|
+
dbi.events.on("messageCommandDirectMessageUsageError", ({ message }) => {
|
|
202
|
+
message.reply("❌ This command can only be used in servers.");
|
|
203
|
+
return false;
|
|
204
|
+
});
|
|
205
|
+
|
|
206
|
+
// Missing permissions
|
|
207
|
+
dbi.events.on("messageCommandDefaultMemberPermissionsError", ({ message, permissions }) => {
|
|
208
|
+
message.reply(`❌ You need these permissions: ${permissions.join(", ")}`);
|
|
209
|
+
return false;
|
|
210
|
+
});
|
|
211
|
+
```
|
|
212
|
+
|
|
213
|
+
---
|
|
214
|
+
|
|
215
|
+
## Reference System
|
|
216
|
+
|
|
217
|
+
The reference system allows passing data through Discord's component custom IDs.
|
|
218
|
+
|
|
219
|
+
### Custom ID Encoding
|
|
220
|
+
|
|
221
|
+
DBI encodes different types in the custom ID:
|
|
222
|
+
|
|
223
|
+
| Type | Encoding | Example |
|
|
224
|
+
|------|----------|---------|
|
|
225
|
+
| String | Raw | `"hello"` → `hello` |
|
|
226
|
+
| Number | `π` prefix | `42` → `π42` |
|
|
227
|
+
| BigInt | `ᙖ` prefix | `12345n` → `ᙖ12345` |
|
|
228
|
+
| Boolean | `𝞫` prefix | `true` → `𝞫1` |
|
|
229
|
+
| `undefined` | `🗶u` | `undefined` → `🗶u` |
|
|
230
|
+
| `null` | `🗶n` | `null` → `🗶n` |
|
|
231
|
+
| Object | `¤` + ref ID | `{...}` → `¤abc123` |
|
|
232
|
+
|
|
233
|
+
### Using References
|
|
234
|
+
|
|
235
|
+
```javascript
|
|
236
|
+
dbi.register(({ Button }) => {
|
|
237
|
+
Button({
|
|
238
|
+
name: "action",
|
|
239
|
+
options: { style: Discord.ButtonStyle.Primary, label: "Action" },
|
|
240
|
+
|
|
241
|
+
onExecute({ interaction, data }) {
|
|
242
|
+
// data is an array of the referenced values
|
|
243
|
+
const [userId, action, metadata] = data;
|
|
244
|
+
|
|
245
|
+
console.log(`User: ${userId}`); // string
|
|
246
|
+
console.log(`Action: ${action}`); // string
|
|
247
|
+
console.log(`Metadata:`, metadata); // object (if was object)
|
|
248
|
+
|
|
249
|
+
if (metadata?.$ref) {
|
|
250
|
+
// This is an object reference
|
|
251
|
+
console.log(`Ref ID: ${metadata.$ref}`);
|
|
252
|
+
|
|
253
|
+
// Clean up when done
|
|
254
|
+
metadata.$unRef();
|
|
255
|
+
}
|
|
256
|
+
|
|
257
|
+
interaction.reply("Done!");
|
|
258
|
+
}
|
|
259
|
+
});
|
|
260
|
+
});
|
|
261
|
+
|
|
262
|
+
// Creating the button:
|
|
263
|
+
const button = dbi.interaction("action").toJSON({
|
|
264
|
+
reference: {
|
|
265
|
+
data: [
|
|
266
|
+
"123456789", // String - encoded in custom ID
|
|
267
|
+
"approve", // String - encoded in custom ID
|
|
268
|
+
{ complex: "object", nested: {} } // Object - stored in memory
|
|
269
|
+
],
|
|
270
|
+
ttl: 300000 // Optional: auto-expire in 5 minutes
|
|
271
|
+
}
|
|
272
|
+
});
|
|
273
|
+
```
|
|
274
|
+
|
|
275
|
+
### Reference Configuration
|
|
276
|
+
|
|
277
|
+
```javascript
|
|
278
|
+
const dbi = createDBI("my-bot", {
|
|
279
|
+
references: {
|
|
280
|
+
autoClear: {
|
|
281
|
+
ttl: 3600000, // Default TTL: 1 hour
|
|
282
|
+
check: 60000 // Check every minute
|
|
283
|
+
}
|
|
284
|
+
}
|
|
285
|
+
});
|
|
286
|
+
```
|
|
287
|
+
|
|
288
|
+
### Manual Reference Management
|
|
289
|
+
|
|
290
|
+
```javascript
|
|
291
|
+
// Access references directly
|
|
292
|
+
const refs = dbi.data.refs;
|
|
293
|
+
|
|
294
|
+
// Get a reference
|
|
295
|
+
const ref = refs.get("refId");
|
|
296
|
+
console.log(ref.value); // The stored object
|
|
297
|
+
console.log(ref.at); // Timestamp when created
|
|
298
|
+
console.log(ref.ttl); // Time-to-live in ms
|
|
299
|
+
|
|
300
|
+
// Delete a reference
|
|
301
|
+
refs.delete("refId");
|
|
302
|
+
|
|
303
|
+
// Check if reference exists
|
|
304
|
+
refs.has("refId");
|
|
305
|
+
```
|
|
306
|
+
|
|
307
|
+
---
|
|
308
|
+
|
|
309
|
+
## Rate Limiting
|
|
310
|
+
|
|
311
|
+
DBI provides built-in rate limiting for interactions.
|
|
312
|
+
|
|
313
|
+
### Declarative Rate Limits
|
|
314
|
+
|
|
315
|
+
```javascript
|
|
316
|
+
dbi.register(({ ChatInput }) => {
|
|
317
|
+
ChatInput({
|
|
318
|
+
name: "daily",
|
|
319
|
+
description: "Claim daily reward",
|
|
320
|
+
|
|
321
|
+
// Static rate limits
|
|
322
|
+
rateLimits: [
|
|
323
|
+
{
|
|
324
|
+
type: "User",
|
|
325
|
+
duration: 86400000 // 24 hours in ms
|
|
326
|
+
}
|
|
327
|
+
],
|
|
328
|
+
|
|
329
|
+
onExecute({ interaction }) {
|
|
330
|
+
interaction.reply("Here's your daily reward! 🎁");
|
|
331
|
+
}
|
|
332
|
+
});
|
|
333
|
+
});
|
|
334
|
+
```
|
|
335
|
+
|
|
336
|
+
### Rate Limit Types
|
|
337
|
+
|
|
338
|
+
| Type | Description |
|
|
339
|
+
|------|-------------|
|
|
340
|
+
| `User` | Per-user across all servers |
|
|
341
|
+
| `Channel` | Per-channel |
|
|
342
|
+
| `Guild` | Per-server |
|
|
343
|
+
| `Member` | Per-member (user+guild combination) |
|
|
344
|
+
| `Message` | Per-message |
|
|
345
|
+
|
|
346
|
+
### Dynamic Rate Limits
|
|
347
|
+
|
|
348
|
+
```javascript
|
|
349
|
+
dbi.register(({ ChatInput }) => {
|
|
350
|
+
ChatInput({
|
|
351
|
+
name: "action",
|
|
352
|
+
description: "Do something",
|
|
353
|
+
|
|
354
|
+
async onExecute({ interaction, setRateLimit }) {
|
|
355
|
+
const isPremium = await checkPremium(interaction.user.id);
|
|
356
|
+
|
|
357
|
+
// Set different cooldowns based on status
|
|
358
|
+
if (isPremium) {
|
|
359
|
+
await setRateLimit("User", 30000); // 30 seconds for premium
|
|
360
|
+
} else {
|
|
361
|
+
await setRateLimit("User", 300000); // 5 minutes for free
|
|
362
|
+
}
|
|
363
|
+
|
|
364
|
+
// ... do the action
|
|
365
|
+
interaction.reply("Done!");
|
|
366
|
+
}
|
|
367
|
+
});
|
|
368
|
+
});
|
|
369
|
+
```
|
|
370
|
+
|
|
371
|
+
### Rate Limit Events
|
|
372
|
+
|
|
373
|
+
```javascript
|
|
374
|
+
dbi.events.on("interactionRateLimit", async ({
|
|
375
|
+
interaction,
|
|
376
|
+
dbiInteraction,
|
|
377
|
+
rateLimit,
|
|
378
|
+
remainingTime
|
|
379
|
+
}) => {
|
|
380
|
+
const seconds = Math.ceil(remainingTime / 1000);
|
|
381
|
+
const minutes = Math.floor(seconds / 60);
|
|
382
|
+
|
|
383
|
+
let timeText;
|
|
384
|
+
if (minutes > 0) {
|
|
385
|
+
timeText = `${minutes}m ${seconds % 60}s`;
|
|
386
|
+
} else {
|
|
387
|
+
timeText = `${seconds}s`;
|
|
388
|
+
}
|
|
389
|
+
|
|
390
|
+
await interaction.reply({
|
|
391
|
+
content: `⏳ Cooldown! Try again in **${timeText}**.`,
|
|
392
|
+
ephemeral: true
|
|
393
|
+
});
|
|
394
|
+
|
|
395
|
+
return false; // Don't execute
|
|
396
|
+
});
|
|
397
|
+
```
|
|
398
|
+
|
|
399
|
+
---
|
|
400
|
+
|
|
401
|
+
## Multi-Client Support
|
|
402
|
+
|
|
403
|
+
DBI supports running multiple Discord clients simultaneously.
|
|
404
|
+
|
|
405
|
+
### Configuration
|
|
406
|
+
|
|
407
|
+
```javascript
|
|
408
|
+
const dbi = createDBI("my-bot", {
|
|
409
|
+
discord: [
|
|
410
|
+
{
|
|
411
|
+
namespace: "main",
|
|
412
|
+
token: process.env.MAIN_BOT_TOKEN,
|
|
413
|
+
options: {
|
|
414
|
+
intents: ["Guilds", "GuildMessages"]
|
|
415
|
+
}
|
|
416
|
+
},
|
|
417
|
+
{
|
|
418
|
+
namespace: "music",
|
|
419
|
+
token: process.env.MUSIC_BOT_TOKEN,
|
|
420
|
+
options: {
|
|
421
|
+
intents: ["Guilds", "GuildVoiceStates"]
|
|
422
|
+
}
|
|
423
|
+
},
|
|
424
|
+
{
|
|
425
|
+
namespace: "moderation",
|
|
426
|
+
token: process.env.MOD_BOT_TOKEN,
|
|
427
|
+
options: {
|
|
428
|
+
intents: ["Guilds", "GuildMembers", "GuildBans"]
|
|
429
|
+
}
|
|
430
|
+
}
|
|
431
|
+
]
|
|
432
|
+
});
|
|
433
|
+
```
|
|
434
|
+
|
|
435
|
+
### Accessing Clients
|
|
436
|
+
|
|
437
|
+
```javascript
|
|
438
|
+
// Get first/default client
|
|
439
|
+
const defaultClient = dbi.client();
|
|
440
|
+
|
|
441
|
+
// Get specific client by namespace
|
|
442
|
+
const musicClient = dbi.client("music");
|
|
443
|
+
const modClient = dbi.client("moderation");
|
|
444
|
+
|
|
445
|
+
// Access Discord.js client
|
|
446
|
+
const discordClient = musicClient.client;
|
|
447
|
+
console.log(discordClient.user.tag);
|
|
448
|
+
|
|
449
|
+
// Get all clients
|
|
450
|
+
const allClients = dbi.data.clients;
|
|
451
|
+
|
|
452
|
+
// Round-robin selection
|
|
453
|
+
const nextClient = dbi.data.clients.next(); // Global round-robin
|
|
454
|
+
const nextMusic = dbi.data.clients.next("music"); // Key-specific round-robin
|
|
455
|
+
|
|
456
|
+
// Random client
|
|
457
|
+
const randomClient = dbi.data.clients.random();
|
|
458
|
+
const randomThree = dbi.data.clients.random(3); // Array of 3 random clients
|
|
459
|
+
```
|
|
460
|
+
|
|
461
|
+
### Publishing to Specific Clients
|
|
462
|
+
|
|
463
|
+
```javascript
|
|
464
|
+
dbi.register(({ ChatInput }) => {
|
|
465
|
+
ChatInput({
|
|
466
|
+
name: "play",
|
|
467
|
+
description: "Play music",
|
|
468
|
+
|
|
469
|
+
// Only publish to music bot
|
|
470
|
+
publish: "music",
|
|
471
|
+
|
|
472
|
+
onExecute({ interaction, clientNamespace }) {
|
|
473
|
+
console.log(`Handled by: ${clientNamespace}`);
|
|
474
|
+
// ...
|
|
475
|
+
}
|
|
476
|
+
});
|
|
477
|
+
});
|
|
478
|
+
```
|
|
479
|
+
|
|
480
|
+
### Events with Multiple Clients
|
|
481
|
+
|
|
482
|
+
```javascript
|
|
483
|
+
dbi.register(({ Event }) => {
|
|
484
|
+
Event({
|
|
485
|
+
name: "guildCreate",
|
|
486
|
+
id: "guild-logger",
|
|
487
|
+
|
|
488
|
+
// Control which client handles
|
|
489
|
+
triggerType: "OneByOneGlobal", // Default: sequential globally
|
|
490
|
+
// triggerType: "Random", // Random client
|
|
491
|
+
// triggerType: "First", // Always first client
|
|
492
|
+
|
|
493
|
+
onExecute({ guild, nextClient }) {
|
|
494
|
+
console.log(`${nextClient.namespace} joined: ${guild.name}`);
|
|
495
|
+
}
|
|
496
|
+
});
|
|
497
|
+
});
|
|
498
|
+
```
|
|
499
|
+
|
|
500
|
+
---
|
|
501
|
+
|
|
502
|
+
## Sharding
|
|
503
|
+
|
|
504
|
+
DBI supports both default Discord.js sharding and discord-hybrid-sharding.
|
|
505
|
+
|
|
506
|
+
### Default Sharding
|
|
507
|
+
|
|
508
|
+
```javascript
|
|
509
|
+
const dbi = createDBI("my-bot", {
|
|
510
|
+
sharding: "default",
|
|
511
|
+
discord: {
|
|
512
|
+
token: process.env.DISCORD_TOKEN,
|
|
513
|
+
options: {
|
|
514
|
+
intents: ["Guilds"]
|
|
515
|
+
}
|
|
516
|
+
}
|
|
517
|
+
});
|
|
518
|
+
```
|
|
519
|
+
|
|
520
|
+
### Hybrid Sharding
|
|
521
|
+
|
|
522
|
+
For discord-hybrid-sharding (recommended for large bots):
|
|
523
|
+
|
|
524
|
+
```javascript
|
|
525
|
+
const dbi = createDBI("my-bot", {
|
|
526
|
+
sharding: "hybrid",
|
|
527
|
+
discord: {
|
|
528
|
+
token: process.env.DISCORD_TOKEN,
|
|
529
|
+
options: {
|
|
530
|
+
intents: ["Guilds"]
|
|
531
|
+
}
|
|
532
|
+
}
|
|
533
|
+
});
|
|
534
|
+
|
|
535
|
+
// Access cluster info
|
|
536
|
+
if (dbi.cluster) {
|
|
537
|
+
console.log(`Cluster ID: ${dbi.cluster.id}`);
|
|
538
|
+
console.log(`Shard IDs: ${dbi.cluster.shards}`);
|
|
539
|
+
}
|
|
540
|
+
```
|
|
541
|
+
|
|
542
|
+
### Shard Manager (separate file)
|
|
543
|
+
|
|
544
|
+
```javascript
|
|
545
|
+
const { ClusterManager } = require("discord-hybrid-sharding");
|
|
546
|
+
|
|
547
|
+
const manager = new ClusterManager("./bot.js", {
|
|
548
|
+
totalShards: "auto",
|
|
549
|
+
shardsPerClusters: 2,
|
|
550
|
+
token: process.env.DISCORD_TOKEN
|
|
551
|
+
});
|
|
552
|
+
|
|
553
|
+
manager.on("clusterCreate", cluster => {
|
|
554
|
+
console.log(`Launched cluster ${cluster.id}`);
|
|
555
|
+
});
|
|
556
|
+
|
|
557
|
+
manager.spawn();
|
|
558
|
+
```
|
|
559
|
+
|
|
560
|
+
---
|
|
561
|
+
|
|
562
|
+
## Hot Reloading
|
|
563
|
+
|
|
564
|
+
DBI supports unloading and reloading features dynamically.
|
|
565
|
+
|
|
566
|
+
### Using onUnload
|
|
567
|
+
|
|
568
|
+
```javascript
|
|
569
|
+
dbi.register(({ ChatInput, Event, onUnload }) => {
|
|
570
|
+
let interval;
|
|
571
|
+
|
|
572
|
+
Event({
|
|
573
|
+
name: "clientReady",
|
|
574
|
+
id: "stats-updater",
|
|
575
|
+
|
|
576
|
+
onExecute({ client }) {
|
|
577
|
+
interval = setInterval(() => {
|
|
578
|
+
updateStats(client);
|
|
579
|
+
}, 60000);
|
|
580
|
+
}
|
|
581
|
+
});
|
|
582
|
+
|
|
583
|
+
// Cleanup when unloading
|
|
584
|
+
onUnload(() => {
|
|
585
|
+
if (interval) {
|
|
586
|
+
clearInterval(interval);
|
|
587
|
+
}
|
|
588
|
+
console.log("Stats updater cleaned up");
|
|
589
|
+
});
|
|
590
|
+
|
|
591
|
+
ChatInput({
|
|
592
|
+
name: "reload-safe",
|
|
593
|
+
description: "Safe command",
|
|
594
|
+
onExecute({ interaction }) {
|
|
595
|
+
interaction.reply("Hello!");
|
|
596
|
+
}
|
|
597
|
+
});
|
|
598
|
+
});
|
|
599
|
+
```
|
|
600
|
+
|
|
601
|
+
### Reload Flow
|
|
602
|
+
|
|
603
|
+
```javascript
|
|
604
|
+
// Unload current features
|
|
605
|
+
await dbi.unload();
|
|
606
|
+
|
|
607
|
+
// Clear require cache for updated files
|
|
608
|
+
Utils.recursiveUnload("./src");
|
|
609
|
+
|
|
610
|
+
// Re-import files
|
|
611
|
+
await Utils.recursiveImport("./src");
|
|
612
|
+
|
|
613
|
+
// Load again
|
|
614
|
+
await dbi.load();
|
|
615
|
+
|
|
616
|
+
console.log("Bot reloaded!");
|
|
617
|
+
```
|
|
618
|
+
|
|
619
|
+
### Utils for Hot Reloading
|
|
620
|
+
|
|
621
|
+
```javascript
|
|
622
|
+
const { Utils } = require("@mostfeatured/dbi");
|
|
623
|
+
|
|
624
|
+
// Import all files in a directory
|
|
625
|
+
await Utils.recursiveImport("./src");
|
|
626
|
+
|
|
627
|
+
// Unload modules from require cache
|
|
628
|
+
Utils.recursiveUnload("./src");
|
|
629
|
+
|
|
630
|
+
// Unload a single module
|
|
631
|
+
Utils.unloadModule("./src/commands/ping.js");
|
|
632
|
+
```
|
|
633
|
+
|
|
634
|
+
---
|
|
635
|
+
|
|
636
|
+
## Persistent Store
|
|
637
|
+
|
|
638
|
+
DBI includes a store interface for persistent data.
|
|
639
|
+
|
|
640
|
+
### Default MemoryStore
|
|
641
|
+
|
|
642
|
+
```javascript
|
|
643
|
+
const { MemoryStore } = require("@mostfeatured/dbi");
|
|
644
|
+
|
|
645
|
+
const dbi = createDBI("my-bot", {
|
|
646
|
+
store: new MemoryStore() // Default - not persistent
|
|
647
|
+
});
|
|
648
|
+
```
|
|
649
|
+
|
|
650
|
+
### Custom Store Implementation
|
|
651
|
+
|
|
652
|
+
```javascript
|
|
653
|
+
// Implement the DBIStore interface
|
|
654
|
+
class RedisStore {
|
|
655
|
+
constructor(redis) {
|
|
656
|
+
this.redis = redis;
|
|
657
|
+
}
|
|
658
|
+
|
|
659
|
+
async get(key, defaultValue) {
|
|
660
|
+
const value = await this.redis.get(key);
|
|
661
|
+
return value ? JSON.parse(value) : defaultValue;
|
|
662
|
+
}
|
|
663
|
+
|
|
664
|
+
async set(key, value) {
|
|
665
|
+
await this.redis.set(key, JSON.stringify(value));
|
|
666
|
+
}
|
|
667
|
+
|
|
668
|
+
async delete(key) {
|
|
669
|
+
await this.redis.del(key);
|
|
670
|
+
}
|
|
671
|
+
|
|
672
|
+
async has(key) {
|
|
673
|
+
return (await this.redis.exists(key)) === 1;
|
|
674
|
+
}
|
|
675
|
+
}
|
|
676
|
+
|
|
677
|
+
// Use custom store
|
|
678
|
+
const dbi = createDBI("my-bot", {
|
|
679
|
+
store: new RedisStore(redisClient)
|
|
680
|
+
});
|
|
681
|
+
|
|
682
|
+
// Use the store
|
|
683
|
+
await dbi.config.store.set("key", { data: "value" });
|
|
684
|
+
const data = await dbi.config.store.get("key");
|
|
685
|
+
```
|
|
686
|
+
|
|
687
|
+
---
|
|
688
|
+
|
|
689
|
+
## Flag-based Loading
|
|
690
|
+
|
|
691
|
+
Load different features based on flags.
|
|
692
|
+
|
|
693
|
+
### Defining Flags
|
|
694
|
+
|
|
695
|
+
```javascript
|
|
696
|
+
dbi.register(({ ChatInput, Event }) => {
|
|
697
|
+
// Always loaded
|
|
698
|
+
ChatInput({
|
|
699
|
+
name: "ping",
|
|
700
|
+
description: "Ping",
|
|
701
|
+
onExecute({ interaction }) {
|
|
702
|
+
interaction.reply("Pong!");
|
|
703
|
+
}
|
|
704
|
+
});
|
|
705
|
+
|
|
706
|
+
// Only loaded with 'debug' flag
|
|
707
|
+
ChatInput({
|
|
708
|
+
name: "debug-info",
|
|
709
|
+
description: "Debug information",
|
|
710
|
+
flag: "debug",
|
|
711
|
+
|
|
712
|
+
onExecute({ interaction }) {
|
|
713
|
+
interaction.reply("Debug info...");
|
|
714
|
+
}
|
|
715
|
+
});
|
|
716
|
+
|
|
717
|
+
// Only loaded with 'admin' flag
|
|
718
|
+
ChatInput({
|
|
719
|
+
name: "eval",
|
|
720
|
+
description: "Evaluate code",
|
|
721
|
+
flag: "admin",
|
|
722
|
+
|
|
723
|
+
onExecute({ interaction }) {
|
|
724
|
+
// Dangerous!
|
|
725
|
+
}
|
|
726
|
+
});
|
|
727
|
+
});
|
|
728
|
+
```
|
|
729
|
+
|
|
730
|
+
### Loading with Flags
|
|
731
|
+
|
|
732
|
+
```javascript
|
|
733
|
+
// Load only non-flagged features
|
|
734
|
+
await dbi.load();
|
|
735
|
+
|
|
736
|
+
// Load with specific flags
|
|
737
|
+
await dbi.load("debug");
|
|
738
|
+
await dbi.load("debug", "admin");
|
|
739
|
+
|
|
740
|
+
// Load everything
|
|
741
|
+
await dbi.load("all");
|
|
742
|
+
```
|
|
743
|
+
|
|
744
|
+
---
|
|
745
|
+
|
|
746
|
+
## Data Management
|
|
747
|
+
|
|
748
|
+
DBI provides utilities for managing shared data.
|
|
749
|
+
|
|
750
|
+
### Using dbi.data.other
|
|
751
|
+
|
|
752
|
+
```javascript
|
|
753
|
+
// Store data
|
|
754
|
+
dbi.set("config", { prefix: "!", language: "en" });
|
|
755
|
+
dbi.set("cache.users", new Map());
|
|
756
|
+
|
|
757
|
+
// Get data
|
|
758
|
+
const config = dbi.get("config");
|
|
759
|
+
const cache = dbi.get("cache.users");
|
|
760
|
+
|
|
761
|
+
// Get with default
|
|
762
|
+
const settings = dbi.get("settings", { theme: "dark" });
|
|
763
|
+
|
|
764
|
+
// Check existence
|
|
765
|
+
if (dbi.has("config")) {
|
|
766
|
+
// ...
|
|
767
|
+
}
|
|
768
|
+
|
|
769
|
+
// Delete data
|
|
770
|
+
dbi.delete("cache");
|
|
771
|
+
```
|
|
772
|
+
|
|
773
|
+
### Constructor Data
|
|
774
|
+
|
|
775
|
+
```javascript
|
|
776
|
+
const dbi = createDBI("my-bot", {
|
|
777
|
+
data: {
|
|
778
|
+
other: {
|
|
779
|
+
// Pre-populated data
|
|
780
|
+
startTime: Date.now(),
|
|
781
|
+
version: "1.0.0",
|
|
782
|
+
customData: {}
|
|
783
|
+
},
|
|
784
|
+
refs: new Map() // Pre-existing references
|
|
785
|
+
}
|
|
786
|
+
});
|
|
787
|
+
```
|
|
788
|
+
|
|
789
|
+
### Accessing Registered Features
|
|
790
|
+
|
|
791
|
+
```javascript
|
|
792
|
+
// Get an interaction by name
|
|
793
|
+
const ping = dbi.interaction("ping");
|
|
794
|
+
const button = dbi.interaction("my-button");
|
|
795
|
+
|
|
796
|
+
// Get an event by ID
|
|
797
|
+
const readyEvent = dbi.event("ready-handler");
|
|
798
|
+
|
|
799
|
+
// Get a locale by name
|
|
800
|
+
const enLocale = dbi.locale("en");
|
|
801
|
+
|
|
802
|
+
// Access collections directly
|
|
803
|
+
const allInteractions = dbi.data.interactions; // Discord.Collection
|
|
804
|
+
const allEvents = dbi.data.events;
|
|
805
|
+
const allLocales = dbi.data.locales;
|
|
806
|
+
```
|
|
807
|
+
|
|
808
|
+
---
|
|
809
|
+
|
|
810
|
+
## Strict Mode
|
|
811
|
+
|
|
812
|
+
Strict mode enforces best practices:
|
|
813
|
+
|
|
814
|
+
```javascript
|
|
815
|
+
const dbi = createDBI("my-bot", {
|
|
816
|
+
strict: true // Default is true
|
|
817
|
+
});
|
|
818
|
+
```
|
|
819
|
+
|
|
820
|
+
With strict mode:
|
|
821
|
+
- Duplicate interaction names throw errors
|
|
822
|
+
- Duplicate event IDs throw errors
|
|
823
|
+
- Duplicate locale names throw errors
|
|
824
|
+
- Custom IDs over 100 characters throw errors
|
|
825
|
+
- Missing event IDs throw errors
|
|
826
|
+
|
|
827
|
+
Without strict mode:
|
|
828
|
+
- Duplicates are silently ignored/overwritten
|
|
829
|
+
- Long custom IDs are truncated
|
|
830
|
+
|
|
831
|
+
---
|
|
832
|
+
|
|
833
|
+
## Next Steps
|
|
834
|
+
|
|
835
|
+
- [Svelte Components](./SVELTE_COMPONENTS.md) - Build reactive Discord UIs
|
|
836
|
+
- [API Reference](./API_REFERENCE.md) - Complete API documentation
|