Files
golias/handlers/handlers.go
2025-05-20 13:10:09 +03:00

124 lines
2.7 KiB
Go

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