Files
HomesteadToGo/relay/storage/storage.go
2025-12-08 13:31:47 +01:00

81 lines
1.4 KiB
Go

package storage
import (
"encoding/json"
"os"
"github.com/disgoorg/snowflake/v2"
)
func NewChannelStorage(filename string) (*ChannelStorage, error) {
storage := &ChannelStorage{
filename: filename,
Channels: make(map[snowflake.ID]bool),
}
if err := storage.Load(); err != nil && !os.IsNotExist(err) {
return nil, err
}
return storage, nil
}
func (s *ChannelStorage) Load() error {
s.mutex.Lock()
defer s.mutex.Unlock()
data, err := os.ReadFile(s.filename)
if err != nil {
return err
}
return json.Unmarshal(data, s)
}
func (s *ChannelStorage) Save() error {
s.mutex.Lock()
defer s.mutex.Unlock()
data, err := json.MarshalIndent(s, "", " ")
if err != nil {
return err
}
return os.WriteFile(s.filename, data, 0644)
}
func (s *ChannelStorage) AddChannel(channelID snowflake.ID) error {
s.mutex.Lock()
s.Channels[channelID] = true
s.mutex.Unlock()
return s.Save()
}
func (s *ChannelStorage) RemoveChannel(channelID snowflake.ID) error {
s.mutex.Lock()
delete(s.Channels, channelID)
s.mutex.Unlock()
return s.Save()
}
func (s *ChannelStorage) IsRegistered(channelID snowflake.ID) bool {
s.mutex.RLock()
defer s.mutex.RUnlock()
return s.Channels[channelID]
}
func (s *ChannelStorage) GetAll() []snowflake.ID {
s.mutex.RLock()
defer s.mutex.RUnlock()
channels := make([]snowflake.ID, 0, len(s.Channels))
for channelID := range s.Channels {
channels = append(channels, channelID)
}
return channels
}