mirror of
https://github.com/OpenDiablo2/OpenDiablo2
synced 2025-02-05 08:07:51 -05:00
parent
810b168ebf
commit
2953d2171b
@ -17,7 +17,7 @@ type archiveEntry struct {
|
||||
|
||||
type archiveManager struct {
|
||||
cache *d2common.Cache
|
||||
config *d2config.Configuration
|
||||
config d2config.Configuration
|
||||
entries []archiveEntry
|
||||
mutex sync.Mutex
|
||||
}
|
||||
@ -26,7 +26,7 @@ const (
|
||||
archiveBudget = 1024 * 1024 * 512
|
||||
)
|
||||
|
||||
func createArchiveManager(config *d2config.Configuration) *archiveManager {
|
||||
func createArchiveManager(config d2config.Configuration) *archiveManager {
|
||||
return &archiveManager{cache: d2common.CreateCache(archiveBudget), config: config}
|
||||
}
|
||||
|
||||
|
@ -16,10 +16,10 @@ const (
|
||||
type fileManager struct {
|
||||
cache *d2common.Cache
|
||||
archiveManager *archiveManager
|
||||
config *d2config.Configuration
|
||||
config d2config.Configuration
|
||||
}
|
||||
|
||||
func createFileManager(config *d2config.Configuration, archiveManager *archiveManager) *fileManager {
|
||||
func createFileManager(config d2config.Configuration, archiveManager *archiveManager) *fileManager {
|
||||
return &fileManager{d2common.CreateCache(fileBudget), archiveManager, config}
|
||||
}
|
||||
|
||||
|
@ -1,12 +1,15 @@
|
||||
package d2config
|
||||
|
||||
import (
|
||||
"encoding/json"
|
||||
"io/ioutil"
|
||||
"os"
|
||||
"os/user"
|
||||
"path"
|
||||
"runtime"
|
||||
)
|
||||
|
||||
func getDefaultConfiguration() *Configuration {
|
||||
func getDefaultConfig() *Configuration {
|
||||
config := &Configuration{
|
||||
Language: "ENG",
|
||||
FullScreen: false,
|
||||
@ -61,3 +64,59 @@ func getDefaultConfiguration() *Configuration {
|
||||
|
||||
return config
|
||||
}
|
||||
|
||||
func getDefaultConfigPath() string {
|
||||
if configDir, err := os.UserConfigDir(); err == nil {
|
||||
return path.Join(configDir, "OpenDiablo2", "config.json")
|
||||
}
|
||||
|
||||
return getLocalConfigPath()
|
||||
}
|
||||
|
||||
func getLocalConfigPath() string {
|
||||
return path.Join(path.Dir(os.Args[0]), "config.json")
|
||||
}
|
||||
|
||||
func load(configPath string) error {
|
||||
configFile, err := os.Open(configPath)
|
||||
defer configFile.Close()
|
||||
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
data, err := ioutil.ReadAll(configFile)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
if err := json.Unmarshal(data, &singleton); err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
func save(configPath string) error {
|
||||
configDir := path.Dir(configPath)
|
||||
if err := os.MkdirAll(configDir, 0755); err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
configFile, err := os.Create(configPath)
|
||||
defer configFile.Close()
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
data, err := json.MarshalIndent(singleton, "", " ")
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
if _, err := configFile.Write(data); err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
|
@ -1,17 +1,7 @@
|
||||
package d2config
|
||||
|
||||
import (
|
||||
"encoding/json"
|
||||
"errors"
|
||||
"log"
|
||||
"os"
|
||||
"path"
|
||||
"path/filepath"
|
||||
)
|
||||
|
||||
var (
|
||||
ErrNotInit = errors.New("configuration is not initialized")
|
||||
ErrWasInit = errors.New("configuration has already been initialized")
|
||||
)
|
||||
|
||||
// Configuration defines the configuration for the engine, loaded from config.json
|
||||
@ -29,89 +19,54 @@ type Configuration struct {
|
||||
BgmVolume float64
|
||||
}
|
||||
|
||||
var singleton *Configuration
|
||||
var singleton *Configuration = getDefaultConfig()
|
||||
|
||||
func Initialize() error {
|
||||
verifyNotInit()
|
||||
|
||||
configDir, err := os.UserConfigDir()
|
||||
if err != nil {
|
||||
singleton = getDefaultConfiguration()
|
||||
return nil
|
||||
func Load() error {
|
||||
configPaths := []string{
|
||||
getLocalConfigPath(),
|
||||
getDefaultConfigPath(),
|
||||
}
|
||||
|
||||
configDir = path.Join(configDir, "OpenDiablo2")
|
||||
configPath := path.Join(configDir, "config.json")
|
||||
log.Printf("loading configuration file from %s...", configPath)
|
||||
configFile, err := os.Open(configPath)
|
||||
|
||||
if err == nil {
|
||||
var config Configuration
|
||||
decoder := json.NewDecoder(configFile)
|
||||
defer configFile.Close()
|
||||
if err := decoder.Decode(&config); err == nil {
|
||||
singleton = &config
|
||||
return nil
|
||||
}
|
||||
} else {
|
||||
log.Printf("configuration file not found, writing default")
|
||||
os.MkdirAll(filepath.Dir(configPath), os.ModePerm)
|
||||
configFile, err := os.Create(configPath)
|
||||
if err == nil {
|
||||
encoder := json.NewEncoder(configFile)
|
||||
defer configFile.Close()
|
||||
encoder.Encode(getDefaultConfiguration())
|
||||
} else {
|
||||
log.Printf("failed to write default configuration (%s)", err)
|
||||
var loaded bool
|
||||
for _, configPath := range configPaths {
|
||||
log.Printf("loading configuration file from %s...", configPath)
|
||||
if err := load(configPath); err == nil {
|
||||
loaded = true
|
||||
break
|
||||
}
|
||||
}
|
||||
|
||||
if !loaded {
|
||||
log.Println("failed to load configuration file, saving default configuration...")
|
||||
if err := Save(); err != nil {
|
||||
return err
|
||||
}
|
||||
}
|
||||
|
||||
singleton = getDefaultConfiguration()
|
||||
return nil
|
||||
}
|
||||
|
||||
func Save() error {
|
||||
verifyWasInit()
|
||||
|
||||
configDir, err := os.UserConfigDir()
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
configDir = path.Join(configDir, "OpenDiablo2")
|
||||
if err := os.MkdirAll(configDir, 0755); err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
configPath := path.Join(configDir, "config.json")
|
||||
configPath := getDefaultConfigPath()
|
||||
log.Printf("saving configuration file to %s...", configPath)
|
||||
configFile, err := os.Create(configPath)
|
||||
if err != nil {
|
||||
return err
|
||||
|
||||
var err error
|
||||
if err = save(configPath); err != nil {
|
||||
log.Printf("failed to write configuration file (%s)", err)
|
||||
}
|
||||
|
||||
encoder := json.NewEncoder(configFile)
|
||||
encoder.SetIndent("", " ")
|
||||
if err := encoder.Encode(singleton); err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
return nil
|
||||
return err
|
||||
}
|
||||
|
||||
func Get() *Configuration {
|
||||
verifyWasInit()
|
||||
return singleton
|
||||
func Set(config Configuration) {
|
||||
temp := config
|
||||
singleton = &temp
|
||||
}
|
||||
|
||||
func verifyWasInit() {
|
||||
func Get() Configuration {
|
||||
if singleton == nil {
|
||||
panic(ErrNotInit)
|
||||
panic("configuration is not initialized")
|
||||
}
|
||||
}
|
||||
|
||||
func verifyNotInit() {
|
||||
if singleton != nil {
|
||||
panic(ErrWasInit)
|
||||
}
|
||||
return *singleton
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user