package main import ( "context" "encoding/json" "fmt" "io" "log" "net/http" "strings" "time" "github.com/coder/websocket" ) func isWS(r *http.Request) bool { return r.URL.Path == "/ws" || strings.HasPrefix(r.URL.Path, "/ws/") } func (s *S) serveWS(w http.ResponseWriter, r *http.Request) error { ctx, can := context.WithCancel(r.Context()) defer can() r = r.WithContext(ctx) session := s.Session(ctx) games, err := s.games.GamesForUser(ctx, session.ID) if err != nil { return err } if len(games) == 0 { return fmt.Errorf("user %s is in zero games", session.ID) } game := games[0] c, err := websocket.Accept(w, r, nil) if err != nil { return err } defer c.CloseNow() go func() { defer can() for { _, b, err := c.Read(ctx) if err != nil { log.Println(err) return } log.Printf("READ %s", b) } }() for { select { case <-ctx.Done(): return ctx.Err() case <-time.After(time.Second * 1): } gameState, err := s.games.GameState(ctx, game) if err != nil { return err } msg := map[string]any{ "help": strings.Join([]string{ "CARD ASSASSINS (HOLIDAY PHONE EDITION)", "", "1. Get any target to say any of his or her kill words.", "2. Click on the kill word a target said.", "", "The game ends when everyone has been assassinated.", }, "
"), } if gameState.Started { msg["page"] = "B" if gameState.Completed.IsZero() { msg["event"] = "A" return io.EOF } else { msg["event"] = "B" items := []map[string]any{} for k, v := range gameState.Players { name, err := s.games.UserName(ctx, k) if err != nil { return err } points := 0 tags := []map[string]any{} for _, kill := range v.Kills { points += kill.KillWord.Points tags = append(tags, map[string]any{ "k": kill.KillWord.Word, "v": kill.Victim, }) } items = append(items, map[string]any{ "name": name, "title": fmt.Sprint(points), "tags": tags, }) } msg["items"] = items } } else { msg["page"] = "A" items := []map[string]any{} for k := range gameState.Players { name, err := s.games.UserName(ctx, k) if err != nil { return err } items = append(items, map[string]any{"name": name}) } msg["items"] = items } msgB, _ := json.Marshal(msg) if err := c.Write(ctx, 1, msgB); err != nil { return err } } }