mayhem-party/src/device/input/parse/v01/server.go

80 lines
1.6 KiB
Go

package v01
import (
"io"
"log"
"mayhem-party/src/device/input/wrap"
"net/http"
"sync"
"syscall"
)
func (v01 *V01) listen() {
if v01.cfg.Feedback.Addr == "" {
return
}
return v01._listen()
}
func (v01 *V01) _listen() {
mutex := &sync.RWMutex{}
s := &http.Server{
Addr: v01.cfg.Feedback.Addr,
Handler: http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
r = r.WithContext(v01.ctx)
if r.Method == http.MethodGet {
mutex.RLock()
defer mutex.RUnlock()
} else {
mutex.Lock()
defer mutex.Unlock()
}
v01.ServeHTTP(w, r)
}),
}
go func() {
<-v01.ctx.Done()
log.Println("closing v01 server")
s.Close()
}()
log.Println("starting v01 server")
if err := s.ListenAndServe(); err != nil && v01.ctx.Err() == nil {
log.Println("err with v01 server", err)
panic(err)
}
}
func (v01 *V01) ServeHTTP(w http.ResponseWriter, r *http.Request) {
v01.serveHTTP(w, r)
if _, ok := r.URL.Query()["refresh"]; ok {
select {
case wrap.ChSigUsr1 <- syscall.SIGUSR1:
default:
}
}
}
func (v01 *V01) serveHTTP(w http.ResponseWriter, r *http.Request) {
switch r.URL.Path {
case "/":
v01.getUserFeedback(w, r)
case "/broadcast":
v01.putBroadcast(w, r)
}
}
func (v01 *V01) getUserFeedback(w http.ResponseWriter, r *http.Request) {
user, ok := v01.cfg.Users[r.URL.Query().Get("user")]
if !ok {
user = v01.cfg.Users["broadcast"]
}
w.Write([]byte(user.Message))
}
func (v01 *V01) putBroadcast(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
}