aboutsummaryrefslogtreecommitdiff
path: root/internal/config/config.go
blob: af85c617b85cd7042f078a62ea1b84d58af73b09 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
package config

import (
	"os"

	"gopkg.in/yaml.v3"
)

type Config struct {
	Game      GameConfig      `yaml:"game"`
	Colors    ColorsConfig    `yaml:"colors"`
	Telnet    TelnetConfig    `yaml:"telnet"`
	TelnetTLS TelnetTLSConfig `yaml:"telnet_tls"`
	HTTP      HTTPConfig      `yaml:"http"`
	HTTPS     HTTPSConfig     `yaml:"https"`
}

type ColorsConfig map[string]string

func DefaultColors() ColorsConfig {
	return ColorsConfig{
		"room_name":       "81 bold",
		"room_number":     "240",
		"room_desc":       "252",
		"direction":       "75",
		"exit_direction":  "75",
		"exit_name":       "114",
		"mob_name":        "203",
		"friendly_npc":    "120",
		"hostile_npc":     "203",
		"damage":          "196",
		"enemy_hp":        "167",
		"character_hp":    "84",
		"xp":              "222",
		"level_up":        "226 bold",
		"item":            "223",
		"player_name":     "189",
		"death":           "196 bold",
		"victory":         "83",
		"miss":            "243",
		"error":           "209",
		"say":             "230",
		"dialog":          "117",
		"broadcast":       "215",
		"fire":            "208",
		"eat_food":        "156",
		"drop_message":    "186",
		"credits_pickup":  "220",
		"visual_tick":      "33 dim",
		"visual_first_tick": "196 bold",
	}
}

type GameConfig struct {
	TickLength int `yaml:"tick_length"`
}

type TelnetConfig struct {
	Enabled bool `yaml:"enabled"`
	Port    int  `yaml:"port"`
}

type TelnetTLSConfig struct {
	Enabled  bool   `yaml:"enabled"`
	Port     int    `yaml:"port"`
	CertFile string `yaml:"cert_file"`
	KeyFile  string `yaml:"key_file"`
}

type HTTPConfig struct {
	Enabled bool `yaml:"enabled"`
	Port    int  `yaml:"port"`
}

type HTTPSConfig struct {
	Enabled  bool   `yaml:"enabled"`
	Port     int    `yaml:"port"`
	CertFile string `yaml:"cert_file"`
	KeyFile  string `yaml:"key_file"`
}

func Default() *Config {
	return &Config{
		Game: GameConfig{
			TickLength: 600,
		},
		Colors: DefaultColors(),
		Telnet: TelnetConfig{
			Enabled: true,
			Port:    4000,
		},
		TelnetTLS: TelnetTLSConfig{
			Enabled: false,
			Port:    4001,
		},
		HTTP: HTTPConfig{
			Enabled: false,
			Port:    8080,
		},
		HTTPS: HTTPSConfig{
			Enabled: false,
			Port:    8443,
		},
	}
}

func Load(path string) (*Config, error) {
	data, err := os.ReadFile(path)
	if err != nil {
		return nil, err
	}
	cfg := Default()
	if err := yaml.Unmarshal(data, cfg); err != nil {
		return nil, err
	}
	return cfg, nil
}

func SaveDefault(path string) error {
	cfg := Default()
	data, err := yaml.Marshal(cfg)
	if err != nil {
		return err
	}
	return os.WriteFile(path, data, 0644)
}