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!") }