96 lines
2.1 KiB
Go
96 lines
2.1 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()
|
|
}
|
|
|
|
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")
|
|
}
|
|
}
|