|
|
|
|
@@ -92,7 +92,13 @@ func (v01 *V01) getUserFeedback(w http.ResponseWriter, r *http.Request) {
|
|
|
|
|
msg = fmt.Sprintf("%s (Your secret word is '%s'. Make **someone else** say it!)", msg, alias)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
w.Write([]byte(msg))
|
|
|
|
|
w.Write([]byte(msg + "\n\n"))
|
|
|
|
|
v01.serveGMStatus(w)
|
|
|
|
|
|
|
|
|
|
if v01.cfg.Quiet {
|
|
|
|
|
w.Write([]byte("\n\n"))
|
|
|
|
|
v01.serveGMVoteRead(w)
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func (v01 *V01) servePutBroadcast(w http.ResponseWriter, r *http.Request) {
|
|
|
|
|
@@ -170,7 +176,7 @@ func (v01 *V01) serveGlobalQueryRefresh(r *http.Request) {
|
|
|
|
|
func (v01 *V01) serveGM(w http.ResponseWriter, r *http.Request) {
|
|
|
|
|
switch r.URL.Path {
|
|
|
|
|
case "/gm/rpc/status":
|
|
|
|
|
v01.serveGMStatus(w, r)
|
|
|
|
|
v01.serveGMStatus(w)
|
|
|
|
|
case "/gm/rpc/broadcastSomeoneSaidAlias":
|
|
|
|
|
v01.serveGMSomeoneSaidAlias(w, r)
|
|
|
|
|
case "/gm/rpc/fillNonPlayerAliases":
|
|
|
|
|
@@ -192,25 +198,29 @@ func (v01 *V01) serveGM(w http.ResponseWriter, r *http.Request) {
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func (v01 *V01) serveGMStatus(w http.ResponseWriter, r *http.Request) {
|
|
|
|
|
users := map[string]struct {
|
|
|
|
|
Lag time.Duration `yaml:"lag,omitempty"`
|
|
|
|
|
Player int `yaml:"player,omitempty"`
|
|
|
|
|
IdleFor time.Duration `yaml:"idle_for,omitempty"`
|
|
|
|
|
}{}
|
|
|
|
|
func (v01 *V01) serveGMStatus(w io.Writer) {
|
|
|
|
|
users := map[string]string{}
|
|
|
|
|
for k, v := range v01.cfg.Users {
|
|
|
|
|
v2 := users[k]
|
|
|
|
|
v2.Lag = time.Duration(v.Meta.LastLag) * time.Millisecond
|
|
|
|
|
v2.Player = v.State.Player
|
|
|
|
|
if v.Meta.LastTSMS > 0 {
|
|
|
|
|
v2.IdleFor = time.Since(time.Unix(0, v.Meta.LastTSMS*int64(time.Millisecond)))
|
|
|
|
|
result := ""
|
|
|
|
|
|
|
|
|
|
if v.State.Player > 0 {
|
|
|
|
|
result += fmt.Sprintf("Player %v ", v.State.Player)
|
|
|
|
|
}
|
|
|
|
|
users[k] = v2
|
|
|
|
|
|
|
|
|
|
if ms := time.Duration(v.Meta.LastLag) * time.Millisecond; v.Meta.LastLag > 0 && ms < time.Minute {
|
|
|
|
|
result += fmt.Sprintf("%s ", ms.String())
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if result == "" {
|
|
|
|
|
result = "..."
|
|
|
|
|
}
|
|
|
|
|
users[k] = result
|
|
|
|
|
}
|
|
|
|
|
yaml.NewEncoder(w).Encode(map[string]interface{}{
|
|
|
|
|
b, _ := yaml.Marshal(map[string]interface{}{
|
|
|
|
|
"Players": len(v01.cfg.Players),
|
|
|
|
|
"Users": users,
|
|
|
|
|
})
|
|
|
|
|
w.Write(b)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func (v01 *V01) serveGMSomeoneSaidAlias(w http.ResponseWriter, r *http.Request) {
|
|
|
|
|
@@ -291,28 +301,36 @@ func (v01 *V01) serveGMElect(w http.ResponseWriter, r *http.Request) {
|
|
|
|
|
func (v01 *V01) serveGMVote(w http.ResponseWriter, r *http.Request) {
|
|
|
|
|
switch r.URL.Query().Get("payload") {
|
|
|
|
|
case "":
|
|
|
|
|
counts := map[string]string{}
|
|
|
|
|
for k, v := range v01.cfg.Users {
|
|
|
|
|
if v.State.GM.Vote != "" {
|
|
|
|
|
counts[k] = "voted"
|
|
|
|
|
} else {
|
|
|
|
|
counts[k] = "voting"
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
yaml.NewEncoder(w).Encode(counts)
|
|
|
|
|
v01.serveGMVoteRead(w)
|
|
|
|
|
default:
|
|
|
|
|
voter := r.URL.Query().Get("user")
|
|
|
|
|
candidate := r.URL.Query().Get("payload")
|
|
|
|
|
v, ok := v01.cfg.Users[voter]
|
|
|
|
|
if _, ok2 := v01.cfg.Users[candidate]; !ok || !ok2 {
|
|
|
|
|
http.Error(w, "bad voter/candidate", http.StatusBadRequest)
|
|
|
|
|
return
|
|
|
|
|
}
|
|
|
|
|
v.State.GM.Vote = candidate
|
|
|
|
|
v01.cfg.Users[voter] = v
|
|
|
|
|
v01.serveGMVoteWrite(w, r)
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func (v01 *V01) serveGMVoteRead(w io.Writer) {
|
|
|
|
|
counts := map[string]string{}
|
|
|
|
|
for k, v := range v01.cfg.Users {
|
|
|
|
|
if v.State.GM.Vote != "" {
|
|
|
|
|
counts[k] = "voted"
|
|
|
|
|
} else {
|
|
|
|
|
counts[k] = "voting"
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
yaml.NewEncoder(w).Encode(counts)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func (v01 *V01) serveGMVoteWrite(w http.ResponseWriter, r *http.Request) {
|
|
|
|
|
voter := r.URL.Query().Get("user")
|
|
|
|
|
candidate := r.URL.Query().Get("payload")
|
|
|
|
|
v, ok := v01.cfg.Users[voter]
|
|
|
|
|
if _, ok2 := v01.cfg.Users[candidate]; !ok || !ok2 {
|
|
|
|
|
http.Error(w, "bad voter/candidate", http.StatusBadRequest)
|
|
|
|
|
return
|
|
|
|
|
}
|
|
|
|
|
v.State.GM.Vote = candidate
|
|
|
|
|
v01.cfg.Users[voter] = v
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func (v01 *V01) serveGMShuffle(r *http.Request) {
|
|
|
|
|
poolSize := len(v01.cfg.Users)
|
|
|
|
|
if altSize := len(v01.cfg.Players); altSize > poolSize {
|
|
|
|
|
|