88 lines
2.2 KiB
Go
88 lines
2.2 KiB
Go
package common
|
|
|
|
import (
|
|
"encoding/json"
|
|
"fmt"
|
|
"sync"
|
|
)
|
|
|
|
type TeamPresetRules struct {
|
|
Count uint32 `json:"preset_count"`
|
|
MaxMembers uint32 `json:"max_members"`
|
|
MaxNameLength int `json:"max_name_length"`
|
|
}
|
|
|
|
var teamPresetOnce sync.Once
|
|
var teamPresetRules TeamPresetRules
|
|
var teamPresetError error
|
|
|
|
func LoadTeamPresetRules() (*TeamPresetRules, error) {
|
|
teamPresetOnce.Do(func() {
|
|
raw, err := ReadResourceFile("resources/TeamPresetConfig.json")
|
|
if err != nil {
|
|
teamPresetError = err
|
|
return
|
|
}
|
|
if err := json.Unmarshal(raw, &teamPresetRules); err != nil {
|
|
teamPresetError = err
|
|
return
|
|
}
|
|
if teamPresetRules.Count == 0 || teamPresetRules.MaxMembers == 0 || teamPresetRules.MaxNameLength < 1 {
|
|
teamPresetError = fmt.Errorf("invalid TeamPresetConfig")
|
|
}
|
|
})
|
|
return &teamPresetRules, teamPresetError
|
|
}
|
|
func (f *FreesrData) TeamPreset(index uint32) *TeamPreset {
|
|
original := f.TeamPresets[index]
|
|
p := &TeamPreset{Name: fmt.Sprintf("Team %d", index+1), Avatars: map[uint32]uint32{}, Favourite: true}
|
|
if original != nil {
|
|
p.Name = original.Name
|
|
p.LeaderSlot = original.LeaderSlot
|
|
p.Favourite = original.Favourite
|
|
for slot, id := range original.Avatars {
|
|
p.Avatars[slot] = id
|
|
}
|
|
}
|
|
// Preserve edits made through the existing /api/persistent lineups field.
|
|
if index == f.ActiveTeamPreset {
|
|
p.Avatars = map[uint32]uint32{}
|
|
for slot, id := range f.Lineups {
|
|
p.Avatars[slot] = id
|
|
}
|
|
}
|
|
return p
|
|
}
|
|
func (f *FreesrData) SaveTeamPreset(index uint32, preset *TeamPreset) error {
|
|
if f.TeamPresets == nil {
|
|
f.TeamPresets = map[uint32]*TeamPreset{}
|
|
}
|
|
if preset.Avatars[preset.LeaderSlot] == 0 {
|
|
found := false
|
|
for slot, id := range preset.Avatars {
|
|
if id != 0 && (!found || slot < preset.LeaderSlot) {
|
|
preset.LeaderSlot = slot
|
|
found = true
|
|
}
|
|
}
|
|
}
|
|
old, oldLineup := f.TeamPresets[index], f.Lineups
|
|
f.TeamPresets[index] = preset
|
|
if index == f.ActiveTeamPreset {
|
|
f.Lineups = map[uint32]uint32{}
|
|
for slot, id := range preset.Avatars {
|
|
f.Lineups[slot] = id
|
|
}
|
|
}
|
|
if err := f.SavePersistentChecked(); err != nil {
|
|
if old == nil {
|
|
delete(f.TeamPresets, index)
|
|
} else {
|
|
f.TeamPresets[index] = old
|
|
}
|
|
f.Lineups = oldLineup
|
|
return err
|
|
}
|
|
return nil
|
|
}
|