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