From 26f052d981724b712501f6faa11f3533a2af5dd3 Mon Sep 17 00:00:00 2001 From: Bel LaPointe Date: Mon, 27 Mar 2023 06:13:26 -0600 Subject: [PATCH] workin on gm rpc --- src/device/input/parse/v01/server.go | 111 ++++++++++++++++++--------- 1 file changed, 75 insertions(+), 36 deletions(-) diff --git a/src/device/input/parse/v01/server.go b/src/device/input/parse/v01/server.go index 1361e0a..0c3fffd 100644 --- a/src/device/input/parse/v01/server.go +++ b/src/device/input/parse/v01/server.go @@ -2,9 +2,11 @@ package v01 import ( "encoding/json" + "errors" "fmt" "io" "log" + "math/rand" "mayhem-party/src/device/input/wrap" "net/http" "os" @@ -23,13 +25,13 @@ func (v01 *V01) listen() { } func (v01 *V01) _listen() { - mutex := &sync.RWMutex{} + mutex := &sync.Mutex{} s := &http.Server{ Addr: v01.cfg.Feedback.Addr, Handler: http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { if r.Method == http.MethodGet { - mutex.RLock() - defer mutex.RUnlock() + mutex.Lock() + defer mutex.Unlock() } else { mutex.Lock() defer mutex.Unlock() @@ -78,9 +80,13 @@ func (v01 *V01) getUserFeedback(w http.ResponseWriter, r *http.Request) { func (v01 *V01) servePutBroadcast(w http.ResponseWriter, r *http.Request) { b, _ := io.ReadAll(r.Body) - v := v01.cfg.Users["broadcast"] - v.Message = string(b) - v01.cfg.Users["broadcast"] = v + v01.servePutBroadcastValue(string(b)) +} + +func (v01 *V01) servePutBroadcastValue(v string) { + u := v01.cfg.Users["broadcast"] + u.Message = v + v01.cfg.Users["broadcast"] = u } func (v01 *V01) serveConfig(w http.ResponseWriter, r *http.Request) { @@ -148,38 +154,16 @@ func (v01 *V01) serveGM(w http.ResponseWriter, r *http.Request) { v.Message = "" v01.cfg.Users[k] = v } - v01.cfg.Users["broadcast"].Message = fmt.Sprintf("SOMEONE SAID %q", strings.ToUpper(r.URL.Query().Get("message"))) - case "/gm/rpc/mustSwapElseShuffle": - getUserNameFor := func(like string) string { - if _, ok := r.cfg.Users[like]; ok { - return like - } - for k, v := range r.cfg.Users { - if v.Alias == like { - return k - } - } - return "" - } - userA := getUserNameFor(r.URL.Query("a")) - userB := getUserNameFor(r.URL.Query("b")) - if userA == "" || userB == "" { - http.Error(w, "who?", http.StatusBadRequest) + v01.servePutBroadcastValue(fmt.Sprintf("<>", strings.ToUpper(r.URL.Query().Get("message")))) + case "/gm/rpc/shuffle": + v01.serveGMShuffle(w, r) + v01.cfg.Quiet = false + case "/gm/rpc/swap": + if err := v01.serveGMSwap(r, r.URL.Query().Get("a"), r.URL.Query().Get("b")); err != nil { + http.Error(w, err.Error(), http.StatusBadRequest) return } - if userA == userB { - r.URL.Path = "/gm/rpc/shuffle" - v01.serveGM(w, r) - } - a := r.cfg.Users[userA] - b := r.cfg.Users[userB] - a.Player, b.Player = b.Player, a.Player - r.cfg.Users[userA] = a - r.cfg.Users[userB] = b - r.cfg.Quiet = false - bc := r.cfg.Users["broadcast"] - bc.Message = "" - r.cfg.Users["broadcast"] = bc + v01.cfg.Quiet = false default: http.NotFound(w, r) } @@ -202,3 +186,58 @@ func (v01 *V01) serveGM(w http.ResponseWriter, r *http.Request) { */ } + +var errServeGMSwapWhoDat = errors.New("who?") +var errServeGMSwapSelf = errors.New("/spiderman pointing") + +func (v01 *V01) serveGMShuffle(w http.ResponseWriter, r *http.Request) { + poolSize := len(v01.cfg.Users) + if altSize := len(v01.cfg.Players); altSize > poolSize { + poolSize = altSize + } + pool := make([]int, poolSize) + for i := range v01.cfg.Players { + pool[i] = i + 1 + } + for i := 0; i < 30; i++ { + l := rand.Int() % poolSize + r := rand.Int() % poolSize + pool[l], pool[r] = pool[r], pool[l] + } + i := 0 + msg := []string{} + for k, v := range v01.cfg.Users { + v.Player = pool[i] + v01.cfg.Users[k] = v + if pool[i] > 0 { + msg = append(msg, fmt.Sprintf("%s is now player %v", k, v.Player)) + } + i += 1 + } + v01.servePutBroadcastValue(strings.Join(msg, ", ")) +} + +func (v01 *V01) serveGMSwap(r *http.Request, nameA, nameB string) error { + getUserNameFor := func(like string) string { + for k, v := range v01.cfg.Users { + if k == like || v.Alias == like { + return k + } + } + return "" + } + userA := getUserNameFor(nameA) + userB := getUserNameFor(nameB) + if userA == "" || userB == "" { + return errServeGMSwapWhoDat + } + if userA == userB { + return errServeGMSwapSelf + } + a := v01.cfg.Users[userA] + b := v01.cfg.Users[userB] + a.Player, b.Player = b.Player, a.Player + v01.cfg.Users[userA] = a + v01.cfg.Users[userB] = b + return nil +}