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

85 lines
1.3 KiB
Go

package v01
import (
"encoding/json"
"sync"
patch "github.com/evanphx/json-patch/v5"
)
type (
config struct {
lock *sync.Mutex
Feedback configFeedback
Users map[string]configUser
Players []configPlayer
Quiet bool
Broadcast configBroadcast
GM configGM
}
configGM struct {
Hotwords map[string]configGMHotword
}
configGMHotword struct {
Call string
Args []string
}
configBroadcast struct {
Message string
}
configFeedback struct {
Addr string
TTSURL string
}
configUser struct {
Meta configUserMeta
State configUserState
}
configUserMeta struct {
LastTSMS int64
LastLag int64
}
configUserState struct {
Player int
Message string
GM configUserStateGM
}
configUserStateGM struct {
Alias string
LastAlias string
Vote string
}
configPlayer struct {
Transformation transformation
}
)
func (cfg config) WithPatch(v interface{}) config {
cfg.lock.Lock()
defer cfg.lock.Unlock()
originalData, _ := json.Marshal(cfg)
patchData, _ := json.Marshal(v)
patcher, err := patch.DecodePatch(patchData)
if err != nil {
return cfg
}
patchedData, err := patcher.Apply(originalData)
if err != nil {
return cfg
}
var patched config
if err := json.Unmarshal(patchedData, &patched); err != nil {
return cfg
}
return patched
}