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.NewBroker() go Notifier.Listen() } var roundWords = map[string]string{ "hamster": "blue", "child": "red", "wheel": "white", "condition": "black", "test": "white", "ball": "blue", "violin": "red", "rat": "white", "perplexity": "blue", "notion": "red", "guitar": "blue", "ocean": "blue", "moon": "blue", "coffee": "blue", "mountain": "blue", "book": "blue", "camera": "blue", "apple": "red", "fire": "red", "rose": "red", "sun": "red", "cherry": "red", "heart": "red", "tomato": "red", "cloud": "white", } 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") } }