A powerful and extendable Discord bot, with it's own module system :3 thevoid.cafe/projects/voidy

♻️ Refactor naming scheme from voidy-* to @voidy/*

Jo c119f9cc 41b92c93

+51 -62
.github/assets/cyn-hi-chat-cyn-murder-drones.gif

This is a binary file and will not be displayed.

+9 -12
bun.lock
··· 1 1 { 2 2 "lockfileVersion": 1, 3 + "configVersion": 0, 3 4 "workspaces": { 4 5 "": { 5 6 "name": "voidydiscord", 6 7 }, 7 8 "packages/bot": { 8 - "name": "voidy-bot", 9 + "name": "@voidy/bot", 9 10 "version": "0.1.0", 10 11 "dependencies": { 12 + "@voidy/framework": "workspace:*", 11 13 "discord.js": "^14.21.0", 12 - "voidy-framework": "workspace:*", 13 14 }, 14 15 "devDependencies": { 15 16 "@types/bun": "latest", ··· 19 20 }, 20 21 }, 21 22 "packages/framework": { 22 - "name": "voidy-framework", 23 + "name": "@voidy/framework", 23 24 "version": "0.1.0", 24 25 "dependencies": { 25 26 "discord.js": "^14.21.0", ··· 51 52 52 53 "@sapphire/snowflake": ["@sapphire/snowflake@3.5.3", "", {}, "sha512-jjmJywLAFoWeBi1W7994zZyiNWPIiqRRNAmSERxyg93xRGzNYvGjlZ0gR6x0F4gPRi2+0O6S71kOZYyr3cxaIQ=="], 53 54 54 - "@types/bun": ["@types/bun@1.2.22", "", { "dependencies": { "bun-types": "1.2.22" } }, "sha512-5A/KrKos2ZcN0c6ljRSOa1fYIyCKhZfIVYeuyb4snnvomnpFqC0tTsEkdqNxbAgExV384OETQ//WAjl3XbYqQA=="], 55 + "@types/bun": ["@types/bun@1.3.3", "", { "dependencies": { "bun-types": "1.3.3" } }, "sha512-ogrKbJ2X5N0kWLLFKeytG0eHDleBYtngtlbu9cyBKFtNL3cnpDZkNdQj8flVf6WTZUX5ulI9AY1oa7ljhSrp+g=="], 55 56 56 57 "@types/node": ["@types/node@24.1.0", "", { "dependencies": { "undici-types": "~7.8.0" } }, "sha512-ut5FthK5moxFKH2T1CUOC6ctR67rQRvvHdFLCD2Ql6KXmMuCrjsSsRI9UsLCm9M18BMwClv4pn327UvB7eeO1w=="], 57 - 58 - "@types/react": ["@types/react@19.1.9", "", { "dependencies": { "csstype": "^3.0.2" } }, "sha512-WmdoynAX8Stew/36uTSVMcLJJ1KRh6L3IZRx1PZ7qJtBqT3dYTgyDTx8H1qoRghErydW7xw9mSJ3wS//tCRpFA=="], 59 58 60 59 "@types/ws": ["@types/ws@8.18.1", "", { "dependencies": { "@types/node": "*" } }, "sha512-ThVF6DCVhA8kUGy+aazFQ4kXQ7E1Ty7A3ypFOe0IcJV8O/M511G99AW24irKrW56Wt44yG9+ij8FaqoBGkuBXg=="], 61 60 62 61 "@vladfrangu/async_event_emitter": ["@vladfrangu/async_event_emitter@2.4.6", "", {}, "sha512-RaI5qZo6D2CVS6sTHFKg1v5Ohq/+Bo2LZ5gzUEwZ/WkHhwtGTCB/sVLw8ijOkAUxasZ+WshN/Rzj4ywsABJ5ZA=="], 63 62 64 - "bun-types": ["bun-types@1.2.22", "", { "dependencies": { "@types/node": "*" }, "peerDependencies": { "@types/react": "^19" } }, "sha512-hwaAu8tct/Zn6Zft4U9BsZcXkYomzpHJX28ofvx7k0Zz2HNz54n1n+tDgxoWFGB4PcFvJXJQloPhaV2eP3Q6EA=="], 63 + "@voidy/bot": ["@voidy/bot@workspace:packages/bot"], 65 64 66 - "csstype": ["csstype@3.1.3", "", {}, "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw=="], 65 + "@voidy/framework": ["@voidy/framework@workspace:packages/framework"], 66 + 67 + "bun-types": ["bun-types@1.3.3", "", { "dependencies": { "@types/node": "*" } }, "sha512-z3Xwlg7j2l9JY27x5Qn3Wlyos8YAp0kKRlrePAOjgjMGS5IG6E7Jnlx736vH9UVI4wUICwwhC9anYL++XeOgTQ=="], 67 68 68 69 "discord-api-types": ["discord-api-types@0.38.18", "", {}, "sha512-ygenySjZKUaBf5JT8BNhZSxLzwpwdp41O0wVroOTu/N2DxFH7dxYTZUSnFJ6v+/2F3BMcnD47PC47u4aLOLxrQ=="], 69 70 ··· 86 87 "undici": ["undici@6.21.3", "", {}, "sha512-gBLkYIlEnSp8pFbT64yFgGE6UIB9tAkhukC23PmMDCe5Nd+cRqKxSjw5y54MK2AZMgZfJWMaNE4nYUHgi1XEOw=="], 87 88 88 89 "undici-types": ["undici-types@7.8.0", "", {}, "sha512-9UJ2xGDvQ43tYyVMpuHlsgApydB8ZKfVYTsLDhXkFL/6gfkp+U8xTGdh8pMJv1SpZna0zxG1DwsKZsreLbXBxw=="], 89 - 90 - "voidy-bot": ["voidy-bot@workspace:packages/bot"], 91 - 92 - "voidy-framework": ["voidy-framework@workspace:packages/framework"], 93 90 94 91 "ws": ["ws@8.18.3", "", { "peerDependencies": { "bufferutil": "^4.0.1", "utf-8-validate": ">=5.0.2" }, "optionalPeers": ["bufferutil", "utf-8-validate"] }, "sha512-PEIGCY5tSlUt50cqyMXfCzX+oOPqN0vuGqWzbcJ2xvnkzkq46oOpz7dQaTDBdfICb4N14+GARUDw2XV2N4tvzg=="], 95 92
+7 -7
package.json
··· 1 1 { 2 - "name": "voidy", 3 - "workspaces": [ 4 - "packages/*" 5 - ], 6 - "scripts": { 7 - "dev": "cd packages/bot && bun dev" 8 - } 2 + "name": "voidy", 3 + "workspaces": [ 4 + "packages/*" 5 + ], 6 + "scripts": { 7 + "dev": "cd packages/bot && bun dev" 8 + } 9 9 }
+2 -2
packages/bot/package.json
··· 1 1 { 2 - "name": "voidy-bot", 2 + "name": "@voidy/bot", 3 3 "version": "0.1.0", 4 4 "module": "src/index.ts", 5 5 "type": "module", ··· 14 14 "typescript": "^5" 15 15 }, 16 16 "dependencies": { 17 - "voidy-framework": "workspace:*", 17 + "@voidy/framework": "workspace:*", 18 18 "discord.js": "^14.21.0" 19 19 } 20 20 }
+1 -1
packages/bot/src/index.ts
··· 1 1 import { GatewayIntentBits } from "discord.js" 2 - import { VoidyClient } from "voidy-framework"; 2 + import { VoidyClient } from "@voidy/framework"; 3 3 4 4 // Client initialization with intents and stuff... 5 5 const client = new VoidyClient({
+1 -1
packages/bot/src/modules/core/commands/api/httpcat.ts
··· 1 1 import { MessageFlags, SlashCommandSubcommandBuilder } from "discord.js"; 2 - import type { Command } from "voidy-framework"; 2 + import type { Command } from "@voidy/framework"; 3 3 4 4 export default { 5 5 id: "api.httpcat",
+1 -1
packages/bot/src/modules/core/commands/ping.ts
··· 1 1 import { MessageFlags, SlashCommandBuilder } from "discord.js"; 2 - import type { Command } from "voidy-framework"; 2 + import type { Command } from "@voidy/framework"; 3 3 4 4 export default { 5 5 id: "ping",
+1 -1
packages/bot/src/modules/core/events/interactionCreate.ts
··· 4 4 ButtonHandler, 5 5 type VoidyClient, 6 6 type Event 7 - } from "voidy-framework"; 7 + } from "@voidy/framework"; 8 8 9 9 export default { 10 10 id: "interactionCreate",
+1 -1
packages/bot/src/modules/core/events/ready.ts
··· 1 - import type { Event, VoidyClient } from "voidy-framework"; 1 + import type { Event, VoidyClient } from "@voidy/framework"; 2 2 import { ActivityType, Events } from "discord.js"; 3 3 4 4 export default {
+1 -5
packages/bot/src/modules/core/module.ts
··· 3 3 CommandLoader, 4 4 EventLoader, 5 5 type Module 6 - } from "voidy-framework"; 6 + } from "@voidy/framework"; 7 7 8 8 export default { 9 9 id: "core", ··· 19 19 { 20 20 source: `${import.meta.dir}/commands`, 21 21 loader: CommandLoader, 22 - }, 23 - { 24 - source: `${import.meta.dir}/buttons`, 25 - loader: ButtonLoader, 26 22 } 27 23 ] 28 24 } as Module;
+1 -9
packages/bot/tsconfig.json
··· 2 2 "extends": "../../tsconfig.json", 3 3 "include": [ 4 4 "src" 5 - ], 6 - "compilerOptions": { 7 - "baseUrl": ".", 8 - "paths": { 9 - "voidy-framework": [ 10 - "../framework/src" 11 - ] 12 - } 13 - } 5 + ] 14 6 }
+7 -1
packages/framework/package.json
··· 1 1 { 2 - "name": "voidy-framework", 2 + "name": "@voidy/framework", 3 3 "version": "0.1.0", 4 4 "module": "src/index.ts", 5 5 "type": "module", 6 6 "private": true, 7 + "exports": { 8 + ".": { 9 + "import": "./src/index.ts", 10 + "require": "./src/index.cjs" 11 + } 12 + }, 7 13 "devDependencies": { 8 14 "@types/bun": "latest" 9 15 },
+19 -21
tsconfig.json
··· 1 1 { 2 - "compilerOptions": { 3 - "lib": [ 4 - "ESNext" 5 - ], 6 - "target": "ESNext", 7 - "module": "Preserve", 8 - "moduleDetection": "force", 9 - "allowJs": true, 10 - "moduleResolution": "bundler", 11 - "allowImportingTsExtensions": true, 12 - "verbatimModuleSyntax": true, 13 - "noEmit": true, 14 - "strict": true, 15 - "skipLibCheck": true, 16 - "noFallthroughCasesInSwitch": true, 17 - "noUncheckedIndexedAccess": true, 18 - "noImplicitOverride": true, 19 - "noUnusedLocals": false, 20 - "noUnusedParameters": false, 21 - "noPropertyAccessFromIndexSignature": false 22 - } 2 + "compilerOptions": { 3 + "lib": ["ESNext"], 4 + "target": "ESNext", 5 + "module": "Preserve", 6 + "moduleDetection": "force", 7 + "allowJs": true, 8 + "moduleResolution": "bundler", 9 + "allowImportingTsExtensions": true, 10 + "verbatimModuleSyntax": true, 11 + "noEmit": true, 12 + "strict": true, 13 + "skipLibCheck": true, 14 + "noFallthroughCasesInSwitch": true, 15 + "noUncheckedIndexedAccess": true, 16 + "noImplicitOverride": true, 17 + "noUnusedLocals": false, 18 + "noUnusedParameters": false, 19 + "noPropertyAccessFromIndexSignature": false 20 + } 23 21 }