package v01 import ( "encoding/json" "io" "log" "mayhem-party/src/device/input/wrap" "net/http" "os" "sync" "syscall" "gopkg.in/yaml.v2" ) func (v01 *V01) listen() { if v01.cfg.Feedback.Addr == "" { 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) { 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) { r = r.WithContext(v01.ctx) v01.serveHTTP(w, r) v01.globalQueries(r) } 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) case "/config": v01.patchConfig(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 } func (v01 *V01) patchConfig(w http.ResponseWriter, r *http.Request) { b, _ := io.ReadAll(r.Body) var v []interface{} if err := json.Unmarshal(b, &v); err != nil { http.Error(w, err.Error(), http.StatusBadRequest) return } v01.cfg = v01.cfg.WithPatch(v) if b, err := yaml.Marshal(v01.cfg); err == nil && FlagParseV01Config != "" { if err := os.WriteFile(FlagParseV01Config, b, os.ModePerm); err != nil { http.Error(w, err.Error(), http.StatusInternalServerError) } } } func (v01 *V01) globalQueries(r *http.Request) { v01.globalQuerySay(r) v01.globalQueryRefresh(r) } func (v01 *V01) globalQuerySay(r *http.Request) { text := r.URL.Query().Get("say") if text == "" { text = r.Header.Get("say") } if text == "" { return } go v01.tts(text) } func (v01 *V01) globalQueryRefresh(r *http.Request) { if _, ok := r.URL.Query()["refresh"]; !ok { return } select { case wrap.ChSigUsr1 <- syscall.SIGUSR1: default: } }