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 }