Ztorrent/internal/config/config.go

79 lines
1.4 KiB
Go

package config
import (
"encoding/json"
"os"
"path/filepath"
"sync"
)
type Config struct {
TelegramToken string `json:"telegram_token"`
TelegramOwnerID int64 `json:"telegram_owner_id"`
DefaultDir string `json:"default_dir"`
DownloadLimit int `json:"download_limit_kbs"` // 0 = no limit
UploadLimit int `json:"upload_limit_kbs"` // 0 = no limit
DisableAnimations bool `json:"disable_animations"`
}
var (
mu sync.Mutex
)
func getConfigPath() (string, error) {
home, err := os.UserHomeDir()
if err != nil {
return "", err
}
return filepath.Join(home, ".ztrr", "config.json"), nil
}
func Load() (*Config, error) {
mu.Lock()
defer mu.Unlock()
path, err := getConfigPath()
if err != nil {
return nil, err
}
data, err := os.ReadFile(path)
if err != nil {
if os.IsNotExist(err) {
return &Config{}, nil
}
return nil, err
}
var cfg Config
if err := json.Unmarshal(data, &cfg); err != nil {
return nil, err
}
return &cfg, nil
}
func Save(cfg *Config) error {
mu.Lock()
defer mu.Unlock()
path, err := getConfigPath()
if err != nil {
return err
}
if err := os.MkdirAll(filepath.Dir(path), 0755); err != nil {
return err
}
data, err := json.MarshalIndent(cfg, "", " ")
if err != nil {
return err
}
tmpPath := path + ".tmp"
if err := os.WriteFile(tmpPath, data, 0644); err != nil {
return err
}
return os.Rename(tmpPath, path)
}