Modernize Discord bot to v14 and Node.js 22

Major upgrades and architectural improvements:
- Upgrade Discord.js from v12 to v14.21.0
- Upgrade Node.js from 14 to 22 LTS
- Switch to pnpm package manager
- Complete rewrite with modern Discord API patterns

New Features:
- Hybrid command system: prefix commands + slash commands
- /sfx slash command with autocomplete for sound discovery
- Modern @discordjs/voice integration for audio
- Improved voice connection management
- Enhanced logging for SFX commands
- Multi-stage Docker build for optimized images

Technical Improvements:
- Modular architecture with services and command handlers
- Proper intent management for Discord gateway
- Better error handling and logging
- Hot-reload capability maintained
- Environment variable support
- Optimized Docker container with Alpine Linux

Breaking Changes:
- Moved main entry from index.js to src/index.js
- Updated configuration structure for v14 compatibility
- Replaced deprecated voice APIs with @discordjs/voice
- Updated audio dependencies (opus, ffmpeg)

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
Chris Ham
2025-08-16 11:37:37 -07:00
parent 19c8f4fa85
commit 0ad4265bed
31 changed files with 2931 additions and 381 deletions

26
src/config/config.js Normal file
View File

@@ -0,0 +1,26 @@
const fs = require("fs");
const path = require("path");
// Load config from root directory
const configPath = path.join(__dirname, "..", "..", "config.json");
const config = JSON.parse(fs.readFileSync(configPath, "utf-8"));
// Validate required config fields
function validateConfig(config) {
if (!config.discord?.token) {
throw new Error("Discord token is required in config.json");
}
if (!config.discord?.guilds || !Array.isArray(config.discord.guilds)) {
throw new Error("Discord guilds configuration is required");
}
// Ensure guilds is an array (supporting both old object format and new array format)
if (!Array.isArray(config.discord.guilds)) {
config.discord.guilds = Object.values(config.discord.guilds);
}
return config;
}
module.exports = validateConfig(config);