Files
GaCy-GO/internal/common/team_presets.go
T

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
}