out/cmd/server/v1.go

78 lines
1.5 KiB
Go

package main
import (
"bytes"
"encoding/json"
"io"
"net/http"
"path"
"slices"
"strings"
)
func isV1(r *http.Request) bool {
return strings.HasPrefix(r.URL.Path, "/v1/")
}
func (s *S) serveV1(w http.ResponseWriter, r *http.Request) error {
uid := s.Session(r.Context()).ID
switch path.Join(r.Method, r.URL.Path) {
case "GET/v1/state/" + uid:
name, err := s.games.UserName(r.Context(), uid)
if err != nil {
return err
}
gids, err := s.games.GamesForUser(r.Context(), uid)
if err != nil {
return err
}
msg := map[string]any{
"name": name,
}
if len(gids) > 0 {
party, err := s.games.GameName(r.Context(), gids[0])
if err != nil {
return err
}
msg["party"] = party
}
return json.NewEncoder(w).Encode(msg)
case "PUT/v1/state/" + uid + "/party":
return s.serveV1PutParty(w, r)
default:
http.NotFound(w, r)
}
return nil
}
func (s *S) serveV1PutParty(w http.ResponseWriter, r *http.Request) error {
userName, err := s.games.UserName(r.Context(), s.Session(r.Context()).ID)
if err != nil {
return err
}
party, err := io.ReadAll(r.Body)
if err != nil {
return err
}
party = bytes.TrimSpace(party)
if len(party) == 0 {
return nil
}
gid, err := s.games.GameByName(r.Context(), string(party))
if err != nil {
return err
}
games, err := s.games.GamesForUser(r.Context(), gid)
if err != nil {
return err
}
if slices.Contains(games, gid) {
return nil
}
return s.games.CreateEventPlayerJoin(r.Context(), gid, s.Session(r.Context()).ID, userName)
}