package button import ( "encoding/json" "io/ioutil" "log" "mayhem-party/src/device/input/raw" "os" "time" "gopkg.in/yaml.v2" ) var debugging = os.Getenv("DEBUG") == "true" type ( V01 struct { src raw.Raw cfg v01Cfg } v01Msg struct { T int64 U string Y string N string } v01Cfg struct { Users map[string]struct { Player int Message string } Players []struct { Transformation v01Transformation } } v01Transformation map[string]string ) func NewV01(src raw.Raw) V01 { var cfg v01Cfg b, _ := ioutil.ReadFile(os.Getenv("BUTTON_PARSER_V01_CONFIG")) yaml.Unmarshal(b, &cfg) return V01{ src: src, cfg: cfg, } } func (v01 V01) Close() { v01.src.Close() } func (v01 V01) Read() []Button { line := v01.src.Read() var msg v01Msg if err := json.Unmarshal(line, &msg); err != nil { log.Printf("%v: %s", err, line) } v01.telemetry(msg) return v01.cfg.transform(msg).buttons() } func (cfg v01Cfg) transform(msg v01Msg) v01Msg { if len(cfg.Players) == 0 { return msg } user := cfg.Users[msg.U] if user.Player < 1 { msg.Y = "" msg.N = "" return msg } player := cfg.Players[user.Player-1] msg.Y = player.Transformation.pipe(msg.Y) msg.N = player.Transformation.pipe(msg.N) return msg } func (t v01Transformation) pipe(s string) string { for i := range s { if v := t[s[i:i+1]]; v != "" { s = s[:i] + v[:1] + s[i+1:] } } return s } func (v01 V01) telemetry(msg v01Msg) { if debugging { log.Printf("%s|%dms", msg.U, time.Now().UnixNano()/int64(time.Millisecond)-msg.T) } } func (msg v01Msg) buttons() []Button { buttons := make([]Button, len(msg.Y)+len(msg.N)) for i := range msg.Y { buttons[i] = Button{Char: msg.Y[i], Down: true} } for i := range msg.N { buttons[len(msg.Y)+i] = Button{Char: msg.N[i], Down: false} } if debugging { log.Printf("%+v", msg) } return buttons }