@mostfeatured/dbi 0.0.1

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.
Files changed (126) hide show
  1. package/.gitattributes +2 -0
  2. package/LICENSE +674 -0
  3. package/dist/src/DBI.d.ts +78 -0
  4. package/dist/src/DBI.d.ts.map +1 -0
  5. package/dist/src/DBI.js +202 -0
  6. package/dist/src/DBI.js.map +1 -0
  7. package/dist/src/Events.d.ts +29 -0
  8. package/dist/src/Events.d.ts.map +1 -0
  9. package/dist/src/Events.js +51 -0
  10. package/dist/src/Events.js.map +1 -0
  11. package/dist/src/data/eventMap.json +234 -0
  12. package/dist/src/index.d.ts +4 -0
  13. package/dist/src/index.d.ts.map +1 -0
  14. package/dist/src/index.js +11 -0
  15. package/dist/src/index.js.map +1 -0
  16. package/dist/src/methods/hookEventListeners.d.ts +3 -0
  17. package/dist/src/methods/hookEventListeners.d.ts.map +1 -0
  18. package/dist/src/methods/hookEventListeners.js +34 -0
  19. package/dist/src/methods/hookEventListeners.js.map +1 -0
  20. package/dist/src/methods/hookInteractionListeners.d.ts +3 -0
  21. package/dist/src/methods/hookInteractionListeners.d.ts.map +1 -0
  22. package/dist/src/methods/hookInteractionListeners.js +97 -0
  23. package/dist/src/methods/hookInteractionListeners.js.map +1 -0
  24. package/dist/src/methods/publishInteractions.d.ts +4 -0
  25. package/dist/src/methods/publishInteractions.d.ts.map +1 -0
  26. package/dist/src/methods/publishInteractions.js +150 -0
  27. package/dist/src/methods/publishInteractions.js.map +1 -0
  28. package/dist/src/types/Button.d.ts +19 -0
  29. package/dist/src/types/Button.d.ts.map +1 -0
  30. package/dist/src/types/Button.js +27 -0
  31. package/dist/src/types/Button.js.map +1 -0
  32. package/dist/src/types/ChatInput/ChatInput.d.ts +15 -0
  33. package/dist/src/types/ChatInput/ChatInput.d.ts.map +1 -0
  34. package/dist/src/types/ChatInput/ChatInput.js +19 -0
  35. package/dist/src/types/ChatInput/ChatInput.js.map +1 -0
  36. package/dist/src/types/ChatInput/ChatInputOptions.d.ts +153 -0
  37. package/dist/src/types/ChatInput/ChatInputOptions.d.ts.map +1 -0
  38. package/dist/src/types/ChatInput/ChatInputOptions.js +149 -0
  39. package/dist/src/types/ChatInput/ChatInputOptions.js.map +1 -0
  40. package/dist/src/types/Event.d.ts +257 -0
  41. package/dist/src/types/Event.d.ts.map +1 -0
  42. package/dist/src/types/Event.js +21 -0
  43. package/dist/src/types/Event.js.map +1 -0
  44. package/dist/src/types/Interaction.d.ts +34 -0
  45. package/dist/src/types/Interaction.d.ts.map +1 -0
  46. package/dist/src/types/Interaction.js +25 -0
  47. package/dist/src/types/Interaction.js.map +1 -0
  48. package/dist/src/types/Locale.d.ts +19 -0
  49. package/dist/src/types/Locale.d.ts.map +1 -0
  50. package/dist/src/types/Locale.js +31 -0
  51. package/dist/src/types/Locale.js.map +1 -0
  52. package/dist/src/types/MessageContextMenu.d.ts +14 -0
  53. package/dist/src/types/MessageContextMenu.d.ts.map +1 -0
  54. package/dist/src/types/MessageContextMenu.js +17 -0
  55. package/dist/src/types/MessageContextMenu.js.map +1 -0
  56. package/dist/src/types/Modal.d.ts +19 -0
  57. package/dist/src/types/Modal.d.ts.map +1 -0
  58. package/dist/src/types/Modal.js +24 -0
  59. package/dist/src/types/Modal.js.map +1 -0
  60. package/dist/src/types/SelectMenu.d.ts +19 -0
  61. package/dist/src/types/SelectMenu.d.ts.map +1 -0
  62. package/dist/src/types/SelectMenu.js +27 -0
  63. package/dist/src/types/SelectMenu.js.map +1 -0
  64. package/dist/src/types/UserContextMenu.d.ts +14 -0
  65. package/dist/src/types/UserContextMenu.d.ts.map +1 -0
  66. package/dist/src/types/UserContextMenu.js +17 -0
  67. package/dist/src/types/UserContextMenu.js.map +1 -0
  68. package/dist/src/utils/MemoryStore.d.ts +9 -0
  69. package/dist/src/utils/MemoryStore.d.ts.map +1 -0
  70. package/dist/src/utils/MemoryStore.js +30 -0
  71. package/dist/src/utils/MemoryStore.js.map +1 -0
  72. package/dist/src/utils/customId.d.ts +7 -0
  73. package/dist/src/utils/customId.d.ts.map +1 -0
  74. package/dist/src/utils/customId.js +44 -0
  75. package/dist/src/utils/customId.js.map +1 -0
  76. package/dist/src/utils/permissions.d.ts +3 -0
  77. package/dist/src/utils/permissions.d.ts.map +1 -0
  78. package/dist/src/utils/permissions.js +9 -0
  79. package/dist/src/utils/permissions.js.map +1 -0
  80. package/dist/src/utils/recursiveImport.d.ts +2 -0
  81. package/dist/src/utils/recursiveImport.d.ts.map +1 -0
  82. package/dist/src/utils/recursiveImport.js +20 -0
  83. package/dist/src/utils/recursiveImport.js.map +1 -0
  84. package/dist/test/commands/hello world.d.ts +2 -0
  85. package/dist/test/commands/hello world.d.ts.map +1 -0
  86. package/dist/test/commands/hello world.js +46 -0
  87. package/dist/test/commands/hello world.js.map +1 -0
  88. package/dist/test/commands/stuff.d.ts +2 -0
  89. package/dist/test/commands/stuff.d.ts.map +1 -0
  90. package/dist/test/commands/stuff.js +22 -0
  91. package/dist/test/commands/stuff.js.map +1 -0
  92. package/dist/test/index.d.ts +2 -0
  93. package/dist/test/index.d.ts.map +1 -0
  94. package/dist/test/index.js +33 -0
  95. package/dist/test/index.js.map +1 -0
  96. package/dist/test/publish.d.ts +2 -0
  97. package/dist/test/publish.d.ts.map +1 -0
  98. package/dist/test/publish.js +5 -0
  99. package/dist/test/publish.js.map +1 -0
  100. package/dist/test/things/test.d.ts +2 -0
  101. package/dist/test/things/test.d.ts.map +1 -0
  102. package/dist/test/things/test.js +84 -0
  103. package/dist/test/things/test.js.map +1 -0
  104. package/package.json +40 -0
  105. package/src/DBI.ts +262 -0
  106. package/src/Events.ts +72 -0
  107. package/src/data/eventMap.json +234 -0
  108. package/src/index.ts +7 -0
  109. package/src/methods/hookEventListeners.ts +38 -0
  110. package/src/methods/hookInteractionListeners.ts +118 -0
  111. package/src/methods/publishInteractions.ts +158 -0
  112. package/src/types/Button.ts +32 -0
  113. package/src/types/ChatInput/ChatInput.ts +24 -0
  114. package/src/types/ChatInput/ChatInputOptions.ts +168 -0
  115. package/src/types/Event.ts +115 -0
  116. package/src/types/Interaction.ts +69 -0
  117. package/src/types/Locale.ts +39 -0
  118. package/src/types/MessageContextMenu.ts +23 -0
  119. package/src/types/Modal.ts +32 -0
  120. package/src/types/SelectMenu.ts +32 -0
  121. package/src/types/UserContextMenu.ts +21 -0
  122. package/src/utils/MemoryStore.ts +28 -0
  123. package/src/utils/customId.ts +35 -0
  124. package/src/utils/permissions.ts +5 -0
  125. package/src/utils/recursiveImport.ts +15 -0
  126. package/tsconfig.json +39 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"test.js","sourceRoot":"","sources":["../../../test/things/test.ts"],"names":[],"mappings":";;AAAA,2CAAwE;AACxE,0BAAyB;AAEzB,OAAG,CAAC,QAAQ,CAAC,CAAC,EAAE,SAAS,EAAE,gBAAgB,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE,EAAE;IAErE,KAAK,CAAC;QACJ,IAAI,EAAE,aAAa;QACnB,SAAS,CAAC,GAAG;YACX,GAAG,CAAC,WAAW,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;QAChC,CAAC;QACD,OAAO,EAAE;YACP,KAAK,EAAE,QAAQ;YACf,UAAU,EAAE;gBACV;oBACE,IAAI,EAAE,0BAAa,CAAC,SAAS;oBAC7B,UAAU,EAAE;wBACV;4BACE,QAAQ,EAAE,QAAQ;4BAClB,KAAK,EAAE,OAAO;4BACd,KAAK,EAAE,2BAAc,CAAC,KAAK;4BAC3B,IAAI,EAAE,0BAAa,CAAC,SAAS;4BAC7B,WAAW,EAAE,YAAY;yBAC1B;qBACF;iBACF;aACF;SACF;KACF,CAAC,CAAA;IAEF,KAAK,CAAC;QACJ,IAAI,EAAE,OAAO;QACb,SAAS;YACP,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;QACvB,CAAC;KACF,CAAC,CAAC;IAEH,KAAK,CAAC;QACJ,IAAI,EAAE,eAAe;QACrB,SAAS,CAAC,GAAG;YACX,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;QACnC,CAAC;KACF,CAAC,CAAA;IAEF,MAAM,CAAC;QACL,IAAI,EAAE,SAAS;QACf,SAAS,CAAC,GAAG;YACX,GAAG,CAAC,WAAW,CAAC,KAAK,CAAC,eAAgB,GAAG,CAAC,IAAI,CAAC,CAAC,CAAS,EAAE,IAAI,IAAI,CAAC,CAAC;QACvE,CAAC;QACD,OAAO,EAAE;YACP,KAAK,EAAE,wBAAW,CAAC,OAAO;YAC1B,KAAK,EAAE,KAAK;SACb;KACF,CAAC,CAAC;IAEH,SAAS,CAAC;QACR,IAAI,EAAE,aAAa;QACnB,WAAW,EAAE,MAAM;QACnB,KAAK,CAAC,SAAS,CAAC,GAAG;YACjB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,CAAA;YAClB,OAAO,CAAC,GAAG,CAAE,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,aAAa,CAAS,CAAC,MAAM,EAAE,CAAC,CAAC;YAC5E,GAAG,CAAC,WAAW,CAAC,SAAS,CAAE,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,aAAa,CAAS,CAAC,MAAM,EAAE,CAAC,CAAA;YACzF,0BAA0B;YAC1B,qEAAqE;YACrE,kBAAkB;YAClB,QAAQ;YACR,uCAAuC;YACvC,sBAAsB;YACtB,wHAAwH;YACxH,UAAU;YACV,QAAQ;YACR,MAAM;YACN,MAAM;QACR,CAAC;QACD,OAAO,EAAE;YACP,gBAAgB,CAAC,kBAAkB,CAAC;gBAClC,IAAI,EAAE,MAAM;gBACZ,WAAW,EAAE,aAAa;gBAC1B,SAAS,EAAE,CAAC;gBACZ,SAAS,EAAE,EAAE;gBACb,QAAQ,EAAE,IAAI;gBACd,KAAK,CAAC,UAAU,CAAC,GAAG;oBAClB,OAAO,CAAC,EAAE,IAAI,EAAE,GAAG,GAAG,CAAC,KAAK,SAAS,EAAE,KAAK,EAAE,GAAG,GAAG,CAAC,KAAK,EAAE,EAAE,CAAC,CAAA;gBACjE,CAAC;aACF,CAAC;SACH;KACF,CAAC,CAAC;AAEL,CAAC,CAAC,CAAC","sourcesContent":["import { ButtonStyle, ComponentType, TextInputStyle } from \"discord.js\";\r\nimport { dbi } from \"..\";\r\n\r\ndbi.register(({ ChatInput, ChatInputOptions, Button, Event, Modal }) => {\r\n\r\n Modal({\r\n name: \"modalIsCool\",\r\n onExecute(ctx) {\r\n ctx.interaction.reply(\"xd 1\");\r\n },\r\n options: {\r\n title: \"XDaaaa\",\r\n components: [\r\n {\r\n type: ComponentType.ActionRow,\r\n components: [\r\n {\r\n customId: \"COOLID\",\r\n label: \"WOWXD\",\r\n style: TextInputStyle.Short,\r\n type: ComponentType.TextInput,\r\n placeholder: \"valla yani\"\r\n }\r\n ]\r\n }\r\n ]\r\n }\r\n })\r\n\r\n Event({\r\n name: \"ready\",\r\n onExecute() {\r\n console.log(\"READY\");\r\n }\r\n });\r\n\r\n Event({\r\n name: \"messageCreate\",\r\n onExecute(ctx) {\r\n console.log(ctx.message.content);\r\n }\r\n })\r\n\r\n Button({\r\n name: \"button1\",\r\n onExecute(ctx) {\r\n ctx.interaction.reply(`Text was: \\`${(ctx.data[0] as any)?.text}\\``);\r\n },\r\n options: {\r\n style: ButtonStyle.Primary,\r\n label: \"WOW\"\r\n }\r\n });\r\n\r\n ChatInput({\r\n name: \"hello world\",\r\n description: \"bruh\",\r\n async onExecute(ctx) {\r\n console.log(\"aa1\")\r\n console.log((ctx.dbi.data.interactions.get(\"modalIsCool\") as any).toJSON());\r\n ctx.interaction.showModal((ctx.dbi.data.interactions.get(\"modalIsCool\") as any).toJSON())\r\n // ctx.interaction.reply({\r\n // content: `Hi! \\`${ctx.interaction.options.getString(\"yazı\")}\\``,\r\n // components: [\r\n // {\r\n // type: ComponentType.ActionRow,\r\n // components: [\r\n // (ctx.dbi.data.interactions.get(\"button1\") as any).toJSON({ text: ctx.interaction.options.getString(\"yazı\") })\r\n // ]\r\n // }\r\n // ]\r\n // });\r\n },\r\n options: [\r\n ChatInputOptions.stringAutocomplete({\r\n name: \"yazı\",\r\n description: \"yazı yazıon\",\r\n minLength: 3,\r\n maxLength: 16,\r\n required: true,\r\n async onComplete(ctx) {\r\n return [{ name: `${ctx.value} yazdın`, value: `${ctx.value}` }]\r\n }\r\n })\r\n ],\r\n });\r\n\r\n});"]}
package/package.json ADDED
@@ -0,0 +1,40 @@
1
+ {
2
+ "dependencies": {
3
+ "@discordjs/rest": "^1.0.1",
4
+ "discord-api-types": "^0.37.0",
5
+ "discord-hybrid-sharding": "^1.7.4",
6
+ "discord.js": "^14.1.2",
7
+ "eventemitter3": "^4.0.7",
8
+ "lodash": "^4.17.21",
9
+ "snakecase-keys": "^5.4.2",
10
+ "stuffs": "^0.1.17"
11
+ },
12
+ "name": "@mostfeatured/dbi",
13
+ "version": "0.0.1",
14
+ "main": "dist/index.js",
15
+ "type": "commonjs",
16
+ "private": false,
17
+ "scripts": {
18
+ "test": "npx tsc && node dist/test",
19
+ "build": "npx tsc"
20
+ },
21
+ "repository": {
22
+ "type": "git",
23
+ "url": "git+https://github.com/MostFeatured/DiscordBotInfrastructure.git"
24
+ },
25
+ "author": "Kıraç Armağan Önal",
26
+ "license": "GPL-3.0-or-later",
27
+ "bugs": {
28
+ "url": "https://github.com/MostFeatured/DiscordBotInfrastructure/issues"
29
+ },
30
+ "homepage": "https://github.com/MostFeatured/DiscordBotInfrastructure#readme",
31
+ "description": "",
32
+ "devDependencies": {
33
+ "@types/lodash": "^4.14.182",
34
+ "typescript": "^4.7.4"
35
+ },
36
+ "publishConfig": {
37
+ "access": "public",
38
+ "registry": "https://registry.npmjs.org/"
39
+ }
40
+ }
package/src/DBI.ts ADDED
@@ -0,0 +1,262 @@
1
+ import Discord from "discord.js";
2
+ import { DBIChatInput, TDBIChatInputOmitted } from "./types/ChatInput/ChatInput";
3
+ import { DBIChatInputOptions } from "./types/ChatInput/ChatInputOptions";
4
+ import { publishInteractions } from "./methods/publishInteractions";
5
+ import { DBIEvent, TDBIEventOmitted } from "./types/Event";
6
+ import { MemoryStore } from "./utils/MemoryStore";
7
+ import { hookInteractionListeners } from "./methods/hookInteractionListeners";
8
+ import { Events } from "./Events";
9
+ import { DBILocale, TDBILocaleConstructor, TDBILocaleString } from "./types/Locale";
10
+ import { DBIButton, TDBIButtonOmitted } from "./types/Button";
11
+ import { DBISelectMenu, TDBISelectMenuOmitted } from "./types/SelectMenu";
12
+ import { DBIMessageContextMenu, TDBIMessageContextMenuOmitted } from "./types/MessageContextMenu";
13
+ import { DBIUserContextMenu, TDBIUserContextMenuOmitted } from "./types/UserContextMenu";
14
+ import { hookEventListeners } from "./methods/hookEventListeners";
15
+ import eventMap from "./data/eventMap.json";
16
+ import { DBIModal, TDBIModalOmitted } from "./types/Modal";
17
+ import * as Sharding from "discord-hybrid-sharding";
18
+
19
+ export interface DBIConfig {
20
+ discord: {
21
+ token: string;
22
+ options?: Discord.ClientOptions
23
+ }
24
+ defaults?: {
25
+ locale?: TDBILocaleString,
26
+ directMessages?: boolean,
27
+ defaultMemberPermissions?: Discord.PermissionsString[]
28
+ };
29
+
30
+ sharding?: boolean;
31
+
32
+ store?: {
33
+ get(key: string, defaultValue?: any): Promise<any>;
34
+ set(key: string, value: any): Promise<void>;
35
+ del(key: string): Promise<void>;
36
+ has(key: string): Promise<boolean>;
37
+ }
38
+ }
39
+
40
+ export interface DBIRegisterAPI {
41
+ ChatInput(cfg: TDBIChatInputOmitted): DBIChatInput;
42
+ ChatInputOptions: typeof DBIChatInputOptions;
43
+ Event(cfg: TDBIEventOmitted): DBIEvent;
44
+ Locale(cfg: TDBILocaleConstructor): DBILocale;
45
+ Button(cfg: TDBIButtonOmitted): DBIButton;
46
+ SelectMenu(cfg: TDBISelectMenuOmitted): DBISelectMenu;
47
+ MessageContextMenu(cfg: TDBIMessageContextMenuOmitted): DBIMessageContextMenu;
48
+ UserContextMenu(cfg: TDBIUserContextMenuOmitted): DBIUserContextMenu;
49
+ Modal(cfg: TDBIModalOmitted): DBIModal;
50
+ onUnload(cb: ()=>Promise<any>);
51
+ }
52
+
53
+ export class DBI {
54
+ namespace: string;
55
+ config: DBIConfig;
56
+ client: Discord.Client<true>;
57
+ data: {
58
+ interactions: Discord.Collection<string, DBIChatInput | DBIButton | DBISelectMenu | DBIMessageContextMenu | DBIUserContextMenu | DBIModal>;
59
+ events: Discord.Collection<string, DBIEvent>;
60
+ plugins: Discord.Collection<string, any>;
61
+ locales: Discord.Collection<string, DBILocale>;
62
+ other: Record<string, any>;
63
+ eventMap: Record<string, string[]>;
64
+ unloaders: Set<() => void>;
65
+ registers: Set<(...args: any[]) => any>;
66
+ registerUnloaders: Set<(...args: any[]) => any>;
67
+ refs: Map<string, { at: number, value: any }>;
68
+ };
69
+ events: Events;
70
+ cluster?: Sharding.Client;
71
+ private _loaded: boolean;
72
+ constructor(namespace: string, config: DBIConfig) {
73
+ this.namespace = namespace;
74
+
75
+ config.store = config.store as any || new MemoryStore();
76
+ config.defaults = {
77
+ locale: "en",
78
+ defaultMemberPermissions: [],
79
+ directMessages: false,
80
+ ...(config.defaults || {})
81
+ };
82
+
83
+ this.config = config;
84
+
85
+ this.data = {
86
+ interactions: new Discord.Collection(),
87
+ events: new Discord.Collection(),
88
+ plugins: new Discord.Collection(),
89
+ locales: new Discord.Collection(),
90
+ other: {},
91
+ eventMap,
92
+ unloaders: new Set(),
93
+ registers: new Set(),
94
+ registerUnloaders: new Set(),
95
+ refs: new Map()
96
+ }
97
+
98
+ this.events = new Events(this);
99
+ this.client = new Discord.Client({
100
+ ...(config.discord?.options || {}) as any,
101
+ ...(config.sharding ? {
102
+ shards: (Sharding as any).data.SHARD_LIST,
103
+ shardCount: (Sharding as any).data.TOTAL_SHARDS
104
+ } : {})
105
+ });
106
+ this.cluster = config.sharding ? new Sharding.Client(this.client) : null;
107
+ this._hookListeners();
108
+ this._loaded = false;
109
+ }
110
+
111
+ private async _hookListeners() {
112
+ this.data.unloaders.add(hookInteractionListeners(this));
113
+ this.data.unloaders.add(hookEventListeners(this));
114
+ }
115
+
116
+ private async _unregisterAll() {
117
+ for await (const cb of this.data.registerUnloaders) {
118
+ await cb();
119
+ }
120
+ this.data.events.clear();
121
+ this.data.interactions.clear();
122
+ this.data.plugins.clear();
123
+ }
124
+
125
+ private async _registerAll() {
126
+ const self = this;
127
+
128
+ for await (const cb of this.data.registers) {
129
+ let ChatInput = function(cfg: DBIChatInput) {
130
+ let dbiChatInput = new DBIChatInput(self, cfg);
131
+ if (self.data.interactions.has(dbiChatInput.name)) throw new Error(`DBIChatInput "${dbiChatInput.name}" already loaded as "${self.data.interactions.get(dbiChatInput.name).type}"!`);
132
+ self.data.interactions.set(dbiChatInput.name, dbiChatInput);
133
+ return dbiChatInput;
134
+ };
135
+ ChatInput = Object.assign(ChatInput, class { constructor(...args) { return ChatInput.call(this, ...args); } });
136
+
137
+ let Event = function(cfg: TDBIEventOmitted) {
138
+ let dbiEvent = new DBIEvent(self, cfg);
139
+ if (self.data.events.has(dbiEvent.name)) throw new Error(`DBIEvent "${dbiEvent.name}" already loaded!`);
140
+ self.data.events.set(dbiEvent.name, dbiEvent);
141
+ return dbiEvent;
142
+ };
143
+ Event = Object.assign(Event, class { constructor(...args) { return Event.call(this, ...args); } });
144
+
145
+ let Button = function(cfg: TDBIButtonOmitted) {
146
+ let dbiButton = new DBIButton(self, cfg);
147
+ if (self.data.interactions.has(dbiButton.name)) throw new Error(`DBIButton "${dbiButton.name}" already loaded as "${self.data.interactions.get(dbiButton.name).type}"!`);
148
+ self.data.interactions.set(dbiButton.name, dbiButton);
149
+ return dbiButton;
150
+ };
151
+ Button = Object.assign(Button, class { constructor(...args) { return Button.call(this, ...args); } });
152
+
153
+ let SelectMenu = function(cfg: TDBISelectMenuOmitted) {
154
+ let dbiSelectMenu = new DBISelectMenu(self, cfg);
155
+ if (self.data.interactions.has(dbiSelectMenu.name)) throw new Error(`DBISelectMenu "${dbiSelectMenu.name}" already loaded as "${self.data.interactions.get(dbiSelectMenu.name).type}"!`);
156
+ self.data.interactions.set(dbiSelectMenu.name, dbiSelectMenu);
157
+ return dbiSelectMenu;
158
+ };
159
+ SelectMenu = Object.assign(SelectMenu, class { constructor(...args) { return SelectMenu.call(this, ...args); } });
160
+
161
+ let MessageContextMenu = function(cfg: TDBIMessageContextMenuOmitted) {
162
+ let dbiMessageContextMenu = new DBIMessageContextMenu(self, cfg);
163
+ if (self.data.interactions.has(dbiMessageContextMenu.name)) throw new Error(`DBIMessageContextMenu "${dbiMessageContextMenu.name}" already loaded as "${self.data.interactions.get(dbiMessageContextMenu.name).type}"!`);
164
+ self.data.interactions.set(dbiMessageContextMenu.name, dbiMessageContextMenu);
165
+ return dbiMessageContextMenu;
166
+ };
167
+ MessageContextMenu = Object.assign(MessageContextMenu, class { constructor(...args) { return MessageContextMenu.call(this, ...args); } });
168
+
169
+ let UserContextMenu = function(cfg: TDBIUserContextMenuOmitted) {
170
+ let dbiUserContextMenu = new DBIUserContextMenu(self, cfg);
171
+ if (self.data.interactions.has(dbiUserContextMenu.name)) throw new Error(`DBIUserContextMenu "${dbiUserContextMenu.name}" already loaded as "${self.data.interactions.get(dbiUserContextMenu.name).type}"!`);
172
+ self.data.interactions.set(dbiUserContextMenu.name, dbiUserContextMenu);
173
+ return dbiUserContextMenu;
174
+ };
175
+ UserContextMenu = Object.assign(UserContextMenu, class { constructor(...args) { return UserContextMenu.call(this, ...args); } });
176
+
177
+ let Modal = function(cfg: TDBIModalOmitted) {
178
+ let dbiModal = new DBIModal(self, cfg);
179
+ if (self.data.interactions.has(dbiModal.name)) throw new Error(`DBIModal "${dbiModal.name}" already loaded as "${self.data.interactions.get(dbiModal.name).type}"!`);
180
+ self.data.interactions.set(dbiModal.name, dbiModal);
181
+ return dbiModal;
182
+ };
183
+ Modal = Object.assign(Modal, class { constructor(...args) { return Modal.call(this, ...args); } });
184
+
185
+
186
+ let Locale = function(cfg: TDBILocaleConstructor) {
187
+ let dbiLocale = new DBILocale(self, cfg);
188
+ if (self.data.locales.has(dbiLocale.name)) throw new Error(`DBILocale "${dbiLocale.name}" already loaded!`);
189
+ self.data.locales.set(dbiLocale.name, dbiLocale);
190
+ return dbiLocale;
191
+ };
192
+ Locale = Object.assign(Locale, class { constructor(...args) { return Locale.call(this, ...args); } });
193
+
194
+ return await cb({
195
+ ChatInput,
196
+ Event,
197
+ ChatInputOptions: DBIChatInputOptions,
198
+ Locale,
199
+ Button,
200
+ SelectMenu,
201
+ MessageContextMenu,
202
+ UserContextMenu,
203
+ Modal,
204
+ onUnload(cb) {
205
+ self.data.registerUnloaders.add(cb);
206
+ },
207
+ });
208
+ }
209
+ }
210
+
211
+ async login(): Promise<any> {
212
+ await this.client.login(this.config.discord.token);
213
+ }
214
+
215
+ async register(cb: (api: DBIRegisterAPI) => void): Promise<any> {
216
+ this.data.registers.add(cb);
217
+ }
218
+
219
+ async load(): Promise<boolean> {
220
+ if (this._loaded) return false;
221
+ await this._registerAll();
222
+ this._loaded = true;
223
+ return true;
224
+ }
225
+
226
+ async unload(): Promise<boolean> {
227
+ if (!this._loaded) return false;
228
+ await this._unregisterAll();
229
+ this._loaded = false;
230
+ return true;
231
+ }
232
+
233
+ get loaded(): boolean {
234
+ return this._loaded;
235
+ }
236
+
237
+ async publish(type: "Global", clear?: boolean): Promise<any>;
238
+ async publish(type: "Guild", guildId: string, clear?: boolean): Promise<any>;
239
+
240
+ async publish(...args) {
241
+ let interactions = this.data.interactions.filter(i => i.type == "ChatInput" || i.type == "MessageContextMenu" || i.type == "UserContextMenu") as any;
242
+ switch (args[0]) {
243
+ case "Global": {
244
+ return await publishInteractions(
245
+ this.config.discord.token,
246
+ args[1] ? new Discord.Collection() : interactions,
247
+ args[0]
248
+ );
249
+ }
250
+ case "Guild": {
251
+ return await publishInteractions(
252
+ this.config.discord.token,
253
+ args[2] ? new Discord.Collection() : interactions,
254
+ args[0],
255
+ args[1]
256
+ );
257
+ }
258
+ }
259
+ }
260
+
261
+
262
+ }
package/src/Events.ts ADDED
@@ -0,0 +1,72 @@
1
+ import { DBI } from "./DBI";
2
+ import { IDBIBaseExecuteCtx, TDBIRateLimitTypes } from "./types/Interaction";
3
+
4
+ export type TDBIEventNames = "beforeInteraction" | "afterInteraction" | "interactionRateLimit" | "beforeEvent" | "afterEvent";
5
+
6
+ export class Events {
7
+ DBI: DBI;
8
+ handlers: Record<string, Array<(data: any) => boolean | Promise<boolean>>>;
9
+ constructor(DBI: DBI) {
10
+ this.DBI = DBI;
11
+
12
+ this.handlers = {
13
+ beforeInteraction: [],
14
+ afterInteraction: [],
15
+ interactionRateLimit: [],
16
+ beforeEvent: [],
17
+ afterEvent: []
18
+ }
19
+ }
20
+
21
+ async trigger(name: TDBIEventNames, data: any): Promise<boolean>{
22
+ let handlers = this.handlers[name];
23
+ for (let i = 0; i < handlers.length; i++) {
24
+ const handler = handlers[i];
25
+ let returned = await handler(data);
26
+ if (returned !== true) return false;
27
+ }
28
+ return true;
29
+ }
30
+
31
+
32
+ on(
33
+ eventName: "beforeInteraction" | "afterInteraction",
34
+ handler: (data: IDBIBaseExecuteCtx) => Promise<boolean> | boolean,
35
+ options?: { once: boolean }
36
+ ): (() => any);
37
+
38
+ on(
39
+ eventName: "beforeEvent" | "afterEvent",
40
+ handler: (data: { [key: string]: any, other: Record<string, any> }) => Promise<boolean> | boolean,
41
+ options?: { once: boolean }
42
+ ): (() => any);
43
+
44
+ on(
45
+ eventName: "interactionRateLimit",
46
+ handler: (data: Omit<IDBIBaseExecuteCtx, "other" | "setRateLimit"> & { rateLimit: { type: TDBIRateLimitTypes, duration: number, at: number } }) => Promise<boolean> | boolean,
47
+ options?: { once: boolean }
48
+ ): (() => any);
49
+
50
+ on(eventName: TDBIEventNames, handler: (data: any) => Promise<boolean> | boolean, options: { once: boolean } = { once: false }): (() => any) {
51
+ if (options.once) {
52
+ let h = (data) => {
53
+ this.off(eventName, h);
54
+ return handler(data);
55
+ };
56
+ this.on(eventName as any, h as any, { once: false });
57
+ return () => {
58
+ this.off(eventName, h);
59
+ }
60
+ } else {
61
+ this.handlers[eventName].push(handler);
62
+ return () => {
63
+ this.off(eventName, handler);
64
+ }
65
+ }
66
+ }
67
+
68
+ off(eventName: TDBIEventNames, handler: (data: any) => Promise<boolean> | boolean) {
69
+ let l = this.handlers[eventName];
70
+ l.splice(l.indexOf(handler), 1);
71
+ }
72
+ }
@@ -0,0 +1,234 @@
1
+ {
2
+ "applicationCommandPermissionsUpdate": [
3
+ "data"
4
+ ],
5
+ "cacheSweep": [
6
+ "message"
7
+ ],
8
+ "channelCreate": [
9
+ "channel"
10
+ ],
11
+ "channelDelete": [
12
+ "channel"
13
+ ],
14
+ "channelPinsUpdate": [
15
+ "channel",
16
+ "date"
17
+ ],
18
+ "channelUpdate": [
19
+ "oldChannel",
20
+ "newChannel"
21
+ ],
22
+ "debug": [
23
+ "message"
24
+ ],
25
+ "warn": [
26
+ "message"
27
+ ],
28
+ "emojiCreate": [
29
+ "emoji"
30
+ ],
31
+ "emojiDelete": [
32
+ "emoji"
33
+ ],
34
+ "emojiUpdate": [
35
+ "oldEmoji",
36
+ "newEmoji"
37
+ ],
38
+ "error": [
39
+ "error"
40
+ ],
41
+ "guildBanAdd": [
42
+ "ban"
43
+ ],
44
+ "guildBanRemove": [
45
+ "ban"
46
+ ],
47
+ "guildCreate": [
48
+ "guild"
49
+ ],
50
+ "guildDelete": [
51
+ "guild"
52
+ ],
53
+ "guildUnavailable": [
54
+ "guild"
55
+ ],
56
+ "guildIntegrationsUpdate": [
57
+ "guild"
58
+ ],
59
+ "guildMemberAdd": [
60
+ "member"
61
+ ],
62
+ "guildMemberAvailable": [
63
+ "member"
64
+ ],
65
+ "guildMemberRemove": [
66
+ "member"
67
+ ],
68
+ "guildMembersChunk": [
69
+ "members",
70
+ "guild",
71
+ "data"
72
+ ],
73
+ "guildMemberUpdate": [
74
+ "oldMember",
75
+ "newMember"
76
+ ],
77
+ "guildUpdate": [
78
+ "oldGuild",
79
+ "newGuild"
80
+ ],
81
+ "inviteCreate": [
82
+ "invite"
83
+ ],
84
+ "inviteDelete": [
85
+ "invite"
86
+ ],
87
+ "messageCreate": [
88
+ "message"
89
+ ],
90
+ "messageDelete": [
91
+ "message"
92
+ ],
93
+ "messageReactionRemoveAll": [
94
+ "message",
95
+ "reactions"
96
+ ],
97
+ "messageReactionRemoveEmoji": [
98
+ "reaction"
99
+ ],
100
+ "messageDeleteBulk": [
101
+ "messages",
102
+ "channel"
103
+ ],
104
+ "messageReactionAdd": [
105
+ "reaction",
106
+ "user"
107
+ ],
108
+ "messageReactionRemove": [
109
+ "reaction",
110
+ "user"
111
+ ],
112
+ "messageUpdate": [
113
+ "oldMessage",
114
+ "newMessage"
115
+ ],
116
+ "presenceUpdate": [
117
+ "oldPresence",
118
+ "newPresence"
119
+ ],
120
+ "ready": [
121
+ "client"
122
+ ],
123
+ "invalidated": [
124
+ "undefined"
125
+ ],
126
+ "roleCreate": [
127
+ "role"
128
+ ],
129
+ "roleDelete": [
130
+ "role"
131
+ ],
132
+ "roleUpdate": [
133
+ "oldRole",
134
+ "newRole"
135
+ ],
136
+ "threadCreate": [
137
+ "thread",
138
+ "newlyCreated"
139
+ ],
140
+ "threadDelete": [
141
+ "thread"
142
+ ],
143
+ "threadListSync": [
144
+ "threads",
145
+ "guild"
146
+ ],
147
+ "threadMemberUpdate": [
148
+ "oldMember",
149
+ "newMember"
150
+ ],
151
+ "threadMembersUpdate": [
152
+ "addedMembers",
153
+ "removedMembers",
154
+ "thread"
155
+ ],
156
+ "threadUpdate": [
157
+ "oldThread",
158
+ "newThread"
159
+ ],
160
+ "typingStart": [
161
+ "typing"
162
+ ],
163
+ "userUpdate": [
164
+ "oldUser",
165
+ "newUser"
166
+ ],
167
+ "voiceStateUpdate": [
168
+ "oldState",
169
+ "newState"
170
+ ],
171
+ "webhookUpdate": [
172
+ "channel"
173
+ ],
174
+ "interactionCreate": [
175
+ "interaction"
176
+ ],
177
+ "shardDisconnect": [
178
+ "closeEvent",
179
+ "shardId"
180
+ ],
181
+ "shardError": [
182
+ "error",
183
+ "shardId"
184
+ ],
185
+ "shardReady": [
186
+ "shardId",
187
+ "unavailableGuilds"
188
+ ],
189
+ "shardReconnecting": [
190
+ "shardId"
191
+ ],
192
+ "shardResume": [
193
+ "shardId",
194
+ "replayedEvents"
195
+ ],
196
+ "stageInstanceCreate": [
197
+ "stageInstance"
198
+ ],
199
+ "stageInstanceUpdate": [
200
+ "oldStageInstance",
201
+ "newStageInstance"
202
+ ],
203
+ "stageInstanceDelete": [
204
+ "stageInstance"
205
+ ],
206
+ "stickerCreate": [
207
+ "sticker"
208
+ ],
209
+ "stickerDelete": [
210
+ "sticker"
211
+ ],
212
+ "stickerUpdate": [
213
+ "oldSticker",
214
+ "newSticker"
215
+ ],
216
+ "guildScheduledEventCreate": [
217
+ "guildScheduledEvent"
218
+ ],
219
+ "guildScheduledEventUpdate": [
220
+ "oldGuildScheduledEvent",
221
+ "newGuildScheduledEvent"
222
+ ],
223
+ "guildScheduledEventDelete": [
224
+ "guildScheduledEvent"
225
+ ],
226
+ "guildScheduledEventUserAdd": [
227
+ "guildScheduledEvent",
228
+ "user"
229
+ ],
230
+ "guildScheduledEventUserRemove": [
231
+ "guildScheduledEvent",
232
+ "user"
233
+ ]
234
+ }
package/src/index.ts ADDED
@@ -0,0 +1,7 @@
1
+ import { DBI, DBIConfig } from "./DBI";
2
+ export { recursiveImport } from "./utils/recursiveImport";
3
+ export { MemoryStore } from "./utils/MemoryStore";
4
+
5
+ export function createDBI(namespace: string, cfg: DBIConfig): DBI {
6
+ return new DBI(namespace, cfg);
7
+ }
@@ -0,0 +1,38 @@
1
+ import { DBI } from "../DBI";
2
+
3
+ export function hookEventListeners(dbi: DBI): () => any {
4
+ async function handle(eventName: string, ...args: any[]) {
5
+ if (!dbi.data.eventMap[eventName]) return;
6
+
7
+ let ctxArgs =
8
+ dbi.data.eventMap[eventName]
9
+ .reduce((all, current, index) => {
10
+ all[current] = args[index];
11
+ return all;
12
+ }, {});
13
+
14
+ let other = {};
15
+
16
+ if (!await dbi.events.trigger("beforeEvent", { eventName, ...ctxArgs, other })) return;
17
+
18
+ for (let i = 0; i < dbi.data.events.size; i++) {
19
+ const value = dbi.data.events.at(i);
20
+ if (value.name == eventName) {
21
+ await value.onExecute({ eventName, ...ctxArgs, other });
22
+ }
23
+ }
24
+
25
+ dbi.events.trigger("afterEvent", { eventName, ...ctxArgs, other })
26
+ }
27
+
28
+ let originalEmit = dbi.client.emit;
29
+
30
+ dbi.client.emit = function(eventName, ...args) {
31
+ handle(eventName, ...args);
32
+ return originalEmit.call(this, eventName, ...args);
33
+ }
34
+
35
+ return () => {
36
+ dbi.client.emit = originalEmit;
37
+ }
38
+ }