78 lines
1.5 KiB
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)
|
|
}
|