122 lines
2.5 KiB
Go
122 lines
2.5 KiB
Go
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:
|
|
}
|
|
}
|