package handlers import ( "golias/broker" "golias/config" "golias/models" "golias/pkg/cache" "html/template" "log/slog" "net/http" "os" ) var ( log *slog.Logger cfg *config.Config memcache cache.Cache Notifier *broker.Broker ) func init() { log = slog.New(slog.NewJSONHandler(os.Stderr, &slog.HandlerOptions{ Level: slog.LevelDebug, AddSource: true, })) memcache = cache.MemCache cfg = config.LoadConfigOrDefault("") Notifier = broker.Notifier // go Notifier.Listen() } func HandlePing(w http.ResponseWriter, r *http.Request) { w.Write([]byte("pong")) } func HandleHome(w http.ResponseWriter, r *http.Request) { tmpl, err := template.ParseGlob("components/*.html") if err != nil { abortWithError(w, err.Error()) return } fi, _ := getFullInfoByCtx(r.Context()) if fi != nil && fi.Room != nil && fi.State != nil { if fi.State.Role == "mime" { fi.Room.RevealAllCards() } else { fi.Room.UpdateCounter() } } if fi != nil && fi.Room == nil { fi.List = listPublicRooms() } if err := tmpl.ExecuteTemplate(w, "base", fi); err != nil { log.Error("failed to exec templ;", "error", err, "templ", "base") } } func HandleExit(w http.ResponseWriter, r *http.Request) { tmpl, err := template.ParseGlob("components/*.html") if err != nil { abortWithError(w, err.Error()) return } fi, err := getFullInfoByCtx(r.Context()) if err != nil { abortWithError(w, err.Error()) return } if fi.Room.IsRunning { abortWithError(w, "cannot leave when game is running") return } var creatorLeft bool if fi.Room.CreatorName == fi.State.Username { creatorLeft = true } exitedRoom := fi.ExitRoom() if err := saveRoom(exitedRoom); err != nil { abortWithError(w, err.Error()) return } if len(exitedRoom.PlayerList) == 0 || creatorLeft { removeRoom(exitedRoom.ID) // TODO: notify users if creator left notify(models.NotifyRoomListUpdate, "") } if err := saveState(fi.State.Username, fi.State); err != nil { abortWithError(w, err.Error()) return } fi.List = listPublicRooms() if err := tmpl.ExecuteTemplate(w, "base", fi); err != nil { log.Error("failed to exec templ;", "error", err, "templ", "base") } }