OpenDiablo2/d2core/d2config/d2config.go

129 lines
2.5 KiB
Go

package d2config
import (
"encoding/json"
"log"
"os"
"path"
"github.com/OpenDiablo2/OpenDiablo2/d2common/d2util"
)
// Config holds the configuration from config.json
var Config *Configuration //nolint:gochecknoglobals // Currently global by design
// Configuration defines the configuration for the engine, loaded from config.json
type Configuration struct {
MpqLoadOrder []string
Language string
MpqPath string
TicksPerSecond int
FpsCap int
SfxVolume float64
BgmVolume float64
FullScreen bool
RunInBackground bool
VsyncEnabled bool
Backend string
LogLevel d2util.LogLevel
path string
}
// Load loads a configuration object from disk
func Load() error {
Config = new(Configuration)
if Config.Load() != nil {
return Config.Save()
}
return nil
}
// Load loads a configuration object from disk
func (c *Configuration) Load() error {
configPaths := []string{
defaultConfigPath(),
localConfigPath(),
}
for _, configPath := range configPaths {
log.Printf("loading configuration file from %s...", configPath)
if _, err := os.Stat(configPath); os.IsNotExist(err) {
continue
}
configFile, err := os.Open(path.Clean(configPath))
if err != nil {
return err
}
if err := json.NewDecoder(configFile).Decode(&Config); err != nil {
return err
}
if err := configFile.Close(); err != nil {
return err
}
c.path = configPath
return nil
}
log.Println("failed to load configuration file, saving default configuration...")
Config = defaultConfig()
return Config.Save()
}
// Save saves the configuration object to disk
func (c *Configuration) Save() error {
configPath := defaultConfigPath()
log.Printf("saving configuration file to %s...", configPath)
configDir := path.Dir(configPath)
if err := os.MkdirAll(configDir, 0750); err != nil {
return err
}
configFile, err := os.Create(configPath)
if err != nil {
return err
}
buf, err := json.MarshalIndent(Config, "", " ")
if err != nil {
return err
}
if _, err := configFile.Write(buf); err != nil {
return err
}
return configFile.Close()
}
// Path returns the path of the config file
func (c *Configuration) Path() string {
if c.path == "" {
c.path = defaultConfigPath()
}
return c.path
}
func defaultConfigPath() string {
if configDir, err := os.UserConfigDir(); err == nil {
return path.Join(configDir, "OpenDiablo2", "config.json")
}
return localConfigPath()
}
func localConfigPath() string {
return path.Join(path.Dir(os.Args[0]), "config.json")
}