package chat import ( "encoding/json" "log/slog" "os" "path/filepath" "sync" "github.com/ayn2op/discordo/internal/consts" "github.com/diamondburned/arikawa/v3/discord" ) type guildState struct { ExpandedGuilds map[discord.GuildID]bool `json:"expanded_guilds"` mu sync.Mutex } var stateFilePath = filepath.Join(consts.CacheDir(), "state.json") func loadGuildState() *guildState { gs := &guildState{ExpandedGuilds: make(map[discord.GuildID]bool)} data, err := os.ReadFile(stateFilePath) if err != nil { return gs } if err := json.Unmarshal(data, gs); err != nil { slog.Warn("failed to parse guild state", "err", err) return &guildState{ExpandedGuilds: make(map[discord.GuildID]bool)} } if gs.ExpandedGuilds == nil { gs.ExpandedGuilds = make(map[discord.GuildID]bool) } return gs } func (gs *guildState) save() { gs.mu.Lock() defer gs.mu.Unlock() data, err := json.Marshal(gs) if err != nil { slog.Error("failed to marshal guild state", "err", err) return } if err := os.WriteFile(stateFilePath, data, 0644); err != nil { slog.Error("failed to write guild state", "err", err) } } func (gs *guildState) setExpanded(id discord.GuildID, expanded bool) { gs.mu.Lock() if expanded { gs.ExpandedGuilds[id] = true } else { delete(gs.ExpandedGuilds, id) } gs.mu.Unlock() gs.save() } func (gs *guildState) isExpanded(id discord.GuildID) bool { gs.mu.Lock() defer gs.mu.Unlock() return gs.ExpandedGuilds[id] }