workin on gm rpc
parent
2d4cb394de
commit
26f052d981
|
|
@ -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
|
||||
}
|
||||
|
|
|
|||
Loading…
Reference in New Issue