119 lines
3.2 KiB
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!")
|
|
}
|