discord-jukebox-bot/cmd/bot/main.go

119 lines
3.2 KiB
Go

package main
import (
"flag"
"os"
"os/exec"
"os/signal"
"syscall"
"discord-jukebox-bot/pkg/commands"
"discord-jukebox-bot/pkg/config"
"discord-jukebox-bot/pkg/logger"
"discord-jukebox-bot/pkg/web"
)
func main() {
// Parse command-line flags
debugMode := flag.Bool("debug", false, "Enable debug mode with verbose logging")
flag.Parse()
// Initialize logger
logger.Init(*debugMode)
logger.Info("Discord Jukebox Bot - Starting up...")
if *debugMode {
logger.Debug("Debug mode enabled - verbose logging will be shown")
}
// Load configuration from environment variables and .env file
logger.Info("Loading configuration...")
cfg, err := config.Load()
if err != nil {
logger.Error("Error loading configuration", "error", err)
config.PrintDebugInfo()
os.Exit(1)
}
logger.Info("Configuration loaded successfully")
// Print config summary in debug mode
if logger.IsDebug() {
logger.Debug("Configuration Summary",
"discord_guild_id", cfg.DiscordGuildID,
"subsonic_server", cfg.SubsonicServer,
"subsonic_username", cfg.SubsonicUsername,
"subsonic_api_version", cfg.SubsonicVersion)
}
// Check if ffmpeg is available - important for audio transcoding
ffmpegPath, err := exec.LookPath("ffmpeg")
if err != nil {
logger.Warn("ffmpeg not found in system PATH. Audio streaming may be less reliable.",
"error", err.Error())
} else {
logger.Info("ffmpeg found and available for audio transcoding",
"path", ffmpegPath)
}
// Set up commands and the Discord bot
logger.Info("Setting up bot and commands...")
bot, err := commands.Setup(cfg)
if err != nil {
logger.Error("Error setting up bot", "error", err)
os.Exit(1)
}
// Start the bot
logger.Info("Starting Discord bot...")
if err := bot.Start(); err != nil {
logger.Error("Error starting bot", "error", err)
os.Exit(1)
}
logger.Info("Discord Jukebox Bot is now running.")
logger.Info("Use /jukebox play, /jukebox stop, or /jukebox skip in your Discord server.")
// Get jukebox player reference
jukebox := commands.GetJukebox()
// HTTP server reference
var webServer *web.Server
// Initialize and start web server if enabled
if cfg.WebEnabled {
logger.Info("Starting HTTP server...", "address", cfg.WebAddr)
var err error
webServer, err = web.StartServer(jukebox, bot, cfg.WebAddr)
if err != nil {
logger.Error("Error starting HTTP server", "error", err)
os.Exit(1)
}
logger.Info("HTTP server is now running", "address", cfg.WebAddr)
} else {
logger.Info("HTTP server is disabled. Set JUKEBOX_WEB_ENABLED=true to enable")
}
logger.Info("Press Ctrl+C to exit.")
// Wait for a termination signal
sc := make(chan os.Signal, 1)
signal.Notify(sc, syscall.SIGINT, syscall.SIGTERM, os.Interrupt)
<-sc
// Clean up and exit
logger.Info("Shutting down Discord Jukebox Bot...")
// Stop the HTTP server if it was started
if cfg.WebEnabled && webServer != nil {
logger.Info("Stopping HTTP server...")
if err := webServer.Stop(); err != nil {
logger.Error("Error stopping HTTP server", "error", err)
}
logger.Info("HTTP server stopped")
}
// Stop the Discord bot
if err := bot.Stop(); err != nil {
logger.Error("Error stopping bot", "error", err)
}
logger.Info("Bot stopped. Goodbye!")
}