workin on gm rpc

master
Bel LaPointe 2023-03-27 06:13:26 -06:00
parent 2d4cb394de
commit 26f052d981
1 changed files with 75 additions and 36 deletions

View File

@ -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("<<SOMEONE SAID %q>>", 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
}