85 lines
1.3 KiB
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
|
|
}
|