Clean project layout and fix release workflow
Some checks failed
build-windows-exe / build (push) Failing after 1m13s
Some checks failed
build-windows-exe / build (push) Failing after 1m13s
This commit is contained in:
@@ -33,20 +33,33 @@ type VrcLogConfig struct {
|
||||
}
|
||||
|
||||
type GUIConfig struct {
|
||||
TopMost bool
|
||||
FontSize int
|
||||
AutoUnmuteOnSelfLeave bool
|
||||
RefreshIntervalValue int
|
||||
RefreshIntervalUnit string
|
||||
HistoryRegex string
|
||||
HistoryFromDate string
|
||||
HistoryToDate string
|
||||
TopMost bool
|
||||
FontSize int
|
||||
AutoUnmuteOnSelfLeave bool
|
||||
RefreshIntervalValue int
|
||||
RefreshIntervalUnit string
|
||||
HistoryRegex string
|
||||
HistoryFromDate string
|
||||
HistoryToDate string
|
||||
HistoryExportDir string
|
||||
HistoryExportIncludeTime bool
|
||||
HistoryExportIncludeWorld bool
|
||||
HistoryExportIncludeJoinLeave bool
|
||||
HistoryExportCustomEnabled bool
|
||||
HistoryExportCustom string
|
||||
}
|
||||
|
||||
func Load(path string) (*Config, error) {
|
||||
cfg := &Config{
|
||||
OSC: OSCConfig{Host: "127.0.0.1", Port: 9001},
|
||||
GUI: GUIConfig{FontSize: 18, RefreshIntervalValue: 2, RefreshIntervalUnit: "sec"},
|
||||
GUI: GUIConfig{
|
||||
FontSize: 18,
|
||||
RefreshIntervalValue: 2,
|
||||
RefreshIntervalUnit: "sec",
|
||||
HistoryExportIncludeTime: true,
|
||||
HistoryExportIncludeWorld: true,
|
||||
HistoryExportIncludeJoinLeave: true,
|
||||
},
|
||||
}
|
||||
if path == "" {
|
||||
path = filepath.Join(common.RootDir(), "config", "config.toml")
|
||||
@@ -76,8 +89,7 @@ func Load(path string) (*Config, error) {
|
||||
continue
|
||||
}
|
||||
key := strings.TrimSpace(parts[0])
|
||||
val := strings.TrimSpace(parts[1])
|
||||
val = strings.Trim(val, "\"'")
|
||||
val := parseConfigValue(parts[1])
|
||||
switch section {
|
||||
case "osc":
|
||||
switch key {
|
||||
@@ -135,6 +147,18 @@ func Load(path string) (*Config, error) {
|
||||
cfg.GUI.HistoryFromDate = normalizeHistoryDate(val)
|
||||
case "history_to":
|
||||
cfg.GUI.HistoryToDate = normalizeHistoryDate(val)
|
||||
case "history_export_dir":
|
||||
cfg.GUI.HistoryExportDir = strings.TrimSpace(val)
|
||||
case "history_export_include_time":
|
||||
cfg.GUI.HistoryExportIncludeTime = parseBool(val, true)
|
||||
case "history_export_include_world":
|
||||
cfg.GUI.HistoryExportIncludeWorld = parseBool(val, true)
|
||||
case "history_export_include_join_leave":
|
||||
cfg.GUI.HistoryExportIncludeJoinLeave = parseBool(val, true)
|
||||
case "history_export_custom_enabled":
|
||||
cfg.GUI.HistoryExportCustomEnabled = parseBool(val, false)
|
||||
case "history_export_custom":
|
||||
cfg.GUI.HistoryExportCustom = strings.TrimSpace(val)
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -144,6 +168,8 @@ func Load(path string) (*Config, error) {
|
||||
cfg.GUI.RefreshIntervalUnit = normalizeRefreshIntervalUnit(cfg.GUI.RefreshIntervalUnit)
|
||||
cfg.GUI.HistoryFromDate = normalizeHistoryDate(cfg.GUI.HistoryFromDate)
|
||||
cfg.GUI.HistoryToDate = normalizeHistoryDate(cfg.GUI.HistoryToDate)
|
||||
cfg.GUI.HistoryExportDir = strings.TrimSpace(cfg.GUI.HistoryExportDir)
|
||||
cfg.GUI.HistoryExportCustom = strings.TrimSpace(cfg.GUI.HistoryExportCustom)
|
||||
if cfg.VrcLog.GuestFile != "" {
|
||||
if !filepath.IsAbs(cfg.VrcLog.GuestFile) {
|
||||
cfg.VrcLog.GuestFile = filepath.Join(common.RootDir(), cfg.VrcLog.GuestFile)
|
||||
@@ -155,6 +181,17 @@ func Load(path string) (*Config, error) {
|
||||
return cfg, scanner.Err()
|
||||
}
|
||||
|
||||
func parseConfigValue(raw string) string {
|
||||
raw = strings.TrimSpace(raw)
|
||||
if raw == "" {
|
||||
return ""
|
||||
}
|
||||
if unquoted, err := strconv.Unquote(raw); err == nil {
|
||||
return strings.TrimSpace(unquoted)
|
||||
}
|
||||
return strings.TrimSpace(strings.Trim(raw, "\"'"))
|
||||
}
|
||||
|
||||
func SaveGUI(path string, gui GUIConfig) error {
|
||||
path = resolvePath(path)
|
||||
if err := os.MkdirAll(filepath.Dir(path), 0o755); err != nil {
|
||||
@@ -263,6 +300,12 @@ func appendGUISection(out *[]string, gui GUIConfig) {
|
||||
fmt.Sprintf("history_regex = %q", gui.HistoryRegex),
|
||||
fmt.Sprintf("history_from = %q", gui.HistoryFromDate),
|
||||
fmt.Sprintf("history_to = %q", gui.HistoryToDate),
|
||||
fmt.Sprintf("history_export_dir = %q", strings.TrimSpace(gui.HistoryExportDir)),
|
||||
fmt.Sprintf("history_export_include_time = %t", gui.HistoryExportIncludeTime),
|
||||
fmt.Sprintf("history_export_include_world = %t", gui.HistoryExportIncludeWorld),
|
||||
fmt.Sprintf("history_export_include_join_leave = %t", gui.HistoryExportIncludeJoinLeave),
|
||||
fmt.Sprintf("history_export_custom_enabled = %t", gui.HistoryExportCustomEnabled),
|
||||
fmt.Sprintf("history_export_custom = %q", strings.TrimSpace(gui.HistoryExportCustom)),
|
||||
)
|
||||
}
|
||||
|
||||
|
||||
@@ -35,14 +35,14 @@ func TestLoadOSCValues(t *testing.T) {
|
||||
func TestLoadGUIValues(t *testing.T) {
|
||||
dir := t.TempDir()
|
||||
path := filepath.Join(dir, "config.toml")
|
||||
if err := os.WriteFile(path, []byte("[gui]\ntop_most = true\nfont_size = 24\nauto_unmute_on_self_leave = true\nrefresh_interval_value = 5\nrefresh_interval_unit = \"min\"\nhistory_regex = \"[wip]\"\nhistory_from = \"2026-01-01\"\nhistory_to = \"2026-01-31\"\n"), 0o600); err != nil {
|
||||
if err := os.WriteFile(path, []byte("[gui]\ntop_most = true\nfont_size = 24\nauto_unmute_on_self_leave = true\nrefresh_interval_value = 5\nrefresh_interval_unit = \"min\"\nhistory_regex = \"[wip]\"\nhistory_from = \"2026-01-01\"\nhistory_to = \"2026-01-31\"\nhistory_export_dir = \"C:/tmp/visit\"\nhistory_export_include_time = false\nhistory_export_include_world = true\nhistory_export_include_join_leave = true\nhistory_export_custom_enabled = true\nhistory_export_custom = \"[wip]\"\n"), 0o600); err != nil {
|
||||
t.Fatalf("WriteFile: %v", err)
|
||||
}
|
||||
cfg, err := Load(path)
|
||||
if err != nil {
|
||||
t.Fatalf("Load returned error: %v", err)
|
||||
}
|
||||
if cfg.GUI.TopMost != true || cfg.GUI.FontSize != 24 || cfg.GUI.AutoUnmuteOnSelfLeave != true || cfg.GUI.RefreshIntervalValue != 5 || cfg.GUI.RefreshIntervalUnit != "min" || cfg.GUI.HistoryRegex != "[wip]" || cfg.GUI.HistoryFromDate != "2026-01-01" || cfg.GUI.HistoryToDate != "2026-01-31" {
|
||||
if cfg.GUI.TopMost != true || cfg.GUI.FontSize != 24 || cfg.GUI.AutoUnmuteOnSelfLeave != true || cfg.GUI.RefreshIntervalValue != 5 || cfg.GUI.RefreshIntervalUnit != "min" || cfg.GUI.HistoryRegex != "[wip]" || cfg.GUI.HistoryFromDate != "2026-01-01" || cfg.GUI.HistoryToDate != "2026-01-31" || cfg.GUI.HistoryExportDir != "C:/tmp/visit" || cfg.GUI.HistoryExportIncludeTime != false || cfg.GUI.HistoryExportIncludeWorld != true || cfg.GUI.HistoryExportIncludeJoinLeave != true || cfg.GUI.HistoryExportCustomEnabled != true || cfg.GUI.HistoryExportCustom != "[wip]" {
|
||||
t.Fatalf("unexpected gui values: %+v", cfg.GUI)
|
||||
}
|
||||
}
|
||||
@@ -54,14 +54,14 @@ func TestSaveGUIUpdatesSection(t *testing.T) {
|
||||
if err := os.WriteFile(path, initial, 0o600); err != nil {
|
||||
t.Fatalf("WriteFile: %v", err)
|
||||
}
|
||||
if err := SaveGUI(path, GUIConfig{TopMost: true, FontSize: 26, AutoUnmuteOnSelfLeave: true, RefreshIntervalValue: 3, RefreshIntervalUnit: "sec", HistoryRegex: "[wip]", HistoryFromDate: "2026-01-01", HistoryToDate: "2026-01-31"}); err != nil {
|
||||
if err := SaveGUI(path, GUIConfig{TopMost: true, FontSize: 26, AutoUnmuteOnSelfLeave: true, RefreshIntervalValue: 3, RefreshIntervalUnit: "sec", HistoryRegex: "[wip]", HistoryFromDate: "2026-01-01", HistoryToDate: "2026-01-31", HistoryExportDir: "C:/tmp/visit", HistoryExportIncludeTime: false, HistoryExportIncludeWorld: true, HistoryExportIncludeJoinLeave: true, HistoryExportCustomEnabled: true, HistoryExportCustom: "[wip]"}); err != nil {
|
||||
t.Fatalf("SaveGUI returned error: %v", err)
|
||||
}
|
||||
cfg, err := Load(path)
|
||||
if err != nil {
|
||||
t.Fatalf("Load returned error: %v", err)
|
||||
}
|
||||
if cfg.GUI.TopMost != true || cfg.GUI.FontSize != 26 || cfg.GUI.AutoUnmuteOnSelfLeave != true || cfg.GUI.RefreshIntervalValue != 3 || cfg.GUI.RefreshIntervalUnit != "sec" || cfg.GUI.HistoryRegex != "[wip]" || cfg.GUI.HistoryFromDate != "2026-01-01" || cfg.GUI.HistoryToDate != "2026-01-31" {
|
||||
if cfg.GUI.TopMost != true || cfg.GUI.FontSize != 26 || cfg.GUI.AutoUnmuteOnSelfLeave != true || cfg.GUI.RefreshIntervalValue != 3 || cfg.GUI.RefreshIntervalUnit != "sec" || cfg.GUI.HistoryRegex != "[wip]" || cfg.GUI.HistoryFromDate != "2026-01-01" || cfg.GUI.HistoryToDate != "2026-01-31" || cfg.GUI.HistoryExportDir != "C:/tmp/visit" || cfg.GUI.HistoryExportIncludeTime != false || cfg.GUI.HistoryExportIncludeWorld != true || cfg.GUI.HistoryExportIncludeJoinLeave != true || cfg.GUI.HistoryExportCustomEnabled != true || cfg.GUI.HistoryExportCustom != "[wip]" {
|
||||
t.Fatalf("unexpected saved gui values: %+v", cfg.GUI)
|
||||
}
|
||||
data, err := os.ReadFile(path)
|
||||
|
||||
Reference in New Issue
Block a user