package main import ( "fmt" "log" "net/http" "os" "os/signal" "syscall" "time" "git.rouggy.com/rouggy/ShackMaster/internal/api" "git.rouggy.com/rouggy/ShackMaster/internal/config" ) func main() { log.Println("Starting ShackMaster server...") // Load configuration cfg, err := config.Load("configs/config.yaml") if err != nil { log.Fatalf("Failed to load configuration: %v", err) } log.Printf("Configuration loaded: %s:%d", cfg.Server.Host, cfg.Server.Port) // Create WebSocket hub hub := api.NewHub() go hub.Run() // Initialize device manager with hub deviceManager := api.NewDeviceManager(cfg, hub) if err := deviceManager.Initialize(); err != nil { log.Fatalf("Failed to initialize device manager: %v", err) } // Start device monitoring (will broadcast automatically) if err := deviceManager.Start(); err != nil { log.Fatalf("Failed to start device manager: %v", err) } // Create HTTP server server := api.NewServer(deviceManager, hub, cfg) mux := server.SetupRoutes() // Setup HTTP server addr := fmt.Sprintf("%s:%d", cfg.Server.Host, cfg.Server.Port) httpServer := &http.Server{ Addr: addr, Handler: mux, ReadTimeout: 15 * time.Second, WriteTimeout: 15 * time.Second, IdleTimeout: 60 * time.Second, } // Start HTTP server in goroutine go func() { log.Printf("Server listening on %s", addr) log.Printf("WebSocket endpoint: ws://%s/ws", addr) log.Printf("Web interface: http://%s/", addr) if err := httpServer.ListenAndServe(); err != nil && err != http.ErrServerClosed { log.Fatalf("HTTP server error: %v", err) } }() // Wait for interrupt signal quit := make(chan os.Signal, 1) signal.Notify(quit, syscall.SIGINT, syscall.SIGTERM) <-quit log.Println("Shutting down server...") deviceManager.Stop() log.Println("Server stopped") }