package data import ( "encoding/json" "fmt" "net/url" "os" "sync" ) var sessionMu sync.RWMutex func ReadSessionData() (Session, error) { var session Session sessionMu.RLock() data, err := os.ReadFile("players.json") sessionMu.RUnlock() if err != nil { return session, err } err = json.Unmarshal(data, &session) if err == nil { for i, p := range session.Players { session.Players[i].ToggleUrl = "/sessioninfo?playerName=" + url.QueryEscape(p.Name) + "&playerAttending=toggle" } } return session, err } func PersistSession(session Session) error { jsonData, err := json.MarshalIndent(session, "", " ") if err != nil { return err } sessionMu.Lock() err = os.WriteFile("players.json", jsonData, 0644) sessionMu.Unlock() return err } func AddPlayer(session Session, p Player) error { session.Players = append(session.Players, p) return PersistSession(session) } func DeletePlayer(session Session, name string) error { players := make([]Player, 0, len(session.Players)) for _, p := range session.Players { if p.Name != name { players = append(players, p) } } session.Players = players return PersistSession(session) } func UpdatePlayer(session Session, originalName string, updated Player) error { for i, p := range session.Players { if p.Name == originalName { session.Players[i] = updated return PersistSession(session) } } return fmt.Errorf("player %q not found", originalName) }