workin on gm rpc
parent
2d4cb394de
commit
26f052d981
|
|
@ -2,9 +2,11 @@ package v01
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"encoding/json"
|
"encoding/json"
|
||||||
|
"errors"
|
||||||
"fmt"
|
"fmt"
|
||||||
"io"
|
"io"
|
||||||
"log"
|
"log"
|
||||||
|
"math/rand"
|
||||||
"mayhem-party/src/device/input/wrap"
|
"mayhem-party/src/device/input/wrap"
|
||||||
"net/http"
|
"net/http"
|
||||||
"os"
|
"os"
|
||||||
|
|
@ -23,13 +25,13 @@ func (v01 *V01) listen() {
|
||||||
}
|
}
|
||||||
|
|
||||||
func (v01 *V01) _listen() {
|
func (v01 *V01) _listen() {
|
||||||
mutex := &sync.RWMutex{}
|
mutex := &sync.Mutex{}
|
||||||
s := &http.Server{
|
s := &http.Server{
|
||||||
Addr: v01.cfg.Feedback.Addr,
|
Addr: v01.cfg.Feedback.Addr,
|
||||||
Handler: http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
|
Handler: http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
|
||||||
if r.Method == http.MethodGet {
|
if r.Method == http.MethodGet {
|
||||||
mutex.RLock()
|
mutex.Lock()
|
||||||
defer mutex.RUnlock()
|
defer mutex.Unlock()
|
||||||
} else {
|
} else {
|
||||||
mutex.Lock()
|
mutex.Lock()
|
||||||
defer mutex.Unlock()
|
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) {
|
func (v01 *V01) servePutBroadcast(w http.ResponseWriter, r *http.Request) {
|
||||||
b, _ := io.ReadAll(r.Body)
|
b, _ := io.ReadAll(r.Body)
|
||||||
v := v01.cfg.Users["broadcast"]
|
v01.servePutBroadcastValue(string(b))
|
||||||
v.Message = string(b)
|
}
|
||||||
v01.cfg.Users["broadcast"] = v
|
|
||||||
|
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) {
|
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 = ""
|
v.Message = ""
|
||||||
v01.cfg.Users[k] = v
|
v01.cfg.Users[k] = v
|
||||||
}
|
}
|
||||||
v01.cfg.Users["broadcast"].Message = fmt.Sprintf("SOMEONE SAID %q", strings.ToUpper(r.URL.Query().Get("message")))
|
v01.servePutBroadcastValue(fmt.Sprintf("<<SOMEONE SAID %q>>", strings.ToUpper(r.URL.Query().Get("message"))))
|
||||||
case "/gm/rpc/mustSwapElseShuffle":
|
case "/gm/rpc/shuffle":
|
||||||
getUserNameFor := func(like string) string {
|
v01.serveGMShuffle(w, r)
|
||||||
if _, ok := r.cfg.Users[like]; ok {
|
v01.cfg.Quiet = false
|
||||||
return like
|
case "/gm/rpc/swap":
|
||||||
}
|
if err := v01.serveGMSwap(r, r.URL.Query().Get("a"), r.URL.Query().Get("b")); err != nil {
|
||||||
for k, v := range r.cfg.Users {
|
http.Error(w, err.Error(), http.StatusBadRequest)
|
||||||
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)
|
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
if userA == userB {
|
v01.cfg.Quiet = false
|
||||||
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
|
|
||||||
default:
|
default:
|
||||||
http.NotFound(w, r)
|
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