1 package main 2 3 import ( 4 "encoding/json" 5 "os" 6 "sort" 7 "sync" 8 9 "vimagination.zapto.org/minewebgen/internal/data" 10 ) 11 12 type Config struct { 13 mu sync.RWMutex 14 ServerSettings data.ServerSettings 15 16 Servers Servers 17 Maps Maps 18 19 Generators Generators 20 21 filename string 22 } 23 24 func LoadConfig(filename string) (*Config, error) { 25 c := new(Config) 26 c.ServerSettings.ServerName = "MineWebGen" 27 c.ServerSettings.ListenAddr = ":8080" 28 c.ServerSettings.DirServers = "servers" 29 c.ServerSettings.DirMaps = "maps" 30 c.ServerSettings.DirGenerators = "generators" 31 c.ServerSettings.GeneratorExecutable = "generator" 32 c.ServerSettings.GeneratorMaxMem = 512 * 1024 * 1024 33 c.filename = filename 34 f, err := os.Open(filename) 35 if err == nil { 36 defer f.Close() 37 err = json.NewDecoder(f).Decode(c) 38 } 39 if err != nil { 40 if !os.IsNotExist(err) { 41 return nil, err 42 } 43 } 44 sort.Sort(&c.Servers) 45 sort.Sort(&c.Maps) 46 sort.Sort(&c.Generators) 47 return c, nil 48 } 49 50 func (c *Config) Save() error { 51 c.mu.RLock() 52 defer c.mu.RUnlock() 53 c.Servers.mu.RLock() 54 defer c.Servers.mu.RUnlock() 55 c.Maps.mu.RLock() 56 defer c.Maps.mu.RUnlock() 57 f, err := os.Create(c.filename) 58 if err != nil { 59 return err 60 } 61 defer f.Close() 62 return json.NewEncoder(f).Encode(c) 63 } 64 65 func (c *Config) Server(id int) *data.Server { 66 if id < 0 { 67 return nil 68 } 69 return c.Servers.Get(id) 70 } 71 72 func (c *Config) Map(id int) *data.Map { 73 if id < 0 { 74 return nil 75 } 76 return c.Maps.Get(id) 77 } 78 79 func (c *Config) NewServer() *data.Server { 80 p := c.Settings().DirServers 81 return c.Servers.New(p) 82 } 83 84 func (c *Config) NewMap() *data.Map { 85 p := c.Settings().DirMaps 86 return c.Maps.New(p) 87 } 88 89 func (c *Config) RemoveServer(id int) { 90 c.Servers.Remove(id) 91 } 92 93 func (c *Config) RemoveMap(id int) { 94 c.Maps.Remove(id) 95 } 96 97 func (c *Config) Settings() data.ServerSettings { 98 c.mu.RLock() 99 defer c.mu.RUnlock() 100 return c.ServerSettings 101 } 102 103 func (c *Config) SetSettings(s data.ServerSettings) { 104 c.mu.Lock() 105 defer c.mu.Unlock() 106 c.ServerSettings = s 107 } 108 109 func (c *Config) Generator(id int) *data.Generator { 110 if id < 0 { 111 return nil 112 } 113 return c.Generators.Get(id) 114 } 115 116 func (c *Config) NewGenerator() *data.Generator { 117 p := c.Settings().DirGenerators 118 return c.Generators.New(p) 119 } 120 121 func (c *Config) RemoveGenerator(id int) { 122 c.Generators.Remove(id) 123 }