diff --git a/cmd/verysimple/cli.go b/cmd/verysimple/cli.go index a60e6d0..a4cde97 100644 --- a/cmd/verysimple/cli.go +++ b/cmd/verysimple/cli.go @@ -146,8 +146,10 @@ func runCli_func() { f() } - if currentUserPreference.AutoArrange { - updateMostRecentCli(i) + if cp := currentUserPreference.Cli; cp != nil { + if cp.AutoArrange { + updateMostRecentCli(i) + } } } diff --git a/cmd/verysimple/cli_non.go b/cmd/verysimple/cli_non.go new file mode 100644 index 0000000..35549d5 --- /dev/null +++ b/cmd/verysimple/cli_non.go @@ -0,0 +1,6 @@ +//go:build nocli + +package main + +// placeholder +type CliPreference struct{} diff --git a/cmd/verysimple/cli_preferences.go b/cmd/verysimple/cli_preferences.go index 98e0b49..1f4acba 100644 --- a/cmd/verysimple/cli_preferences.go +++ b/cmd/verysimple/cli_preferences.go @@ -4,9 +4,7 @@ package main import ( "fmt" - "os" - "github.com/BurntSushi/toml" "github.com/e1732a364fed/v2ray_simple/utils" ) @@ -18,92 +16,94 @@ var ( toggleAutoRearrangeCliCmd = &CliCmd{Name: openAutoRearrangeStr} ) +type CliPreference struct { + CliCmdOrder []int `toml:"cli_cmd_order"` + AutoArrange bool `toml:"auto_arrange"` +} + func init() { cliCmdList = append(cliCmdList, toggleAutoRearrangeCliCmd) toggleAutoRearrangeCliCmd.f = func() { - currentUserPreference.AutoArrange = !currentUserPreference.AutoArrange + cp := currentUserPreference.Cli + if cp == nil { + cp = new(CliPreference) + currentUserPreference.Cli = cp + } + + cp.AutoArrange = !cp.AutoArrange doWhenUpdateAutoRearrangeCli() + } preference_loadFunclist = append(preference_loadFunclist, loadPreferences_cli) - preference_saveFunclist = append(preference_saveFunclist, savePerferences_cli) } func doWhenUpdateAutoRearrangeCli() { - if !currentUserPreference.AutoArrange { + + cp := currentUserPreference.Cli + if cp == nil { + cp = new(CliPreference) + currentUserPreference.Cli = cp + } + + if !cp.AutoArrange { toggleAutoRearrangeCliCmd.Name = openAutoRearrangeStr } else { - if len(currentUserPreference.CliCmdOrder) == 0 { + if len(cp.CliCmdOrder) == 0 { initOrderList() } toggleAutoRearrangeCliCmd.Name = "关闭自动将最近运行的交互命令提升到首位" } + } func initOrderList() { - currentUserPreference.CliCmdOrder = nil - for i := range cliCmdList { - currentUserPreference.CliCmdOrder = append(currentUserPreference.CliCmdOrder, i) + cp := currentUserPreference.Cli + if cp == nil { + cp = new(CliPreference) + currentUserPreference.Cli = cp } + cp.CliCmdOrder = nil + for i := range cliCmdList { + cp.CliCmdOrder = append(cp.CliCmdOrder, i) + } + } func updateMostRecentCli(i int) { + + cp := currentUserPreference.Cli + if cp == nil { + cp = new(CliPreference) + currentUserPreference.Cli = cp + } + utils.MoveItem(&cliCmdList, i, 0) - utils.MoveItem(¤tUserPreference.CliCmdOrder, i, 0) -} - -func savePerferences_cli() { - if disablePreferenceFeature { - return - } - - buf := utils.GetBuf() - defer utils.PutBuf(buf) - if err := toml.NewEncoder(buf).Encode(currentUserPreference); err != nil { - fmt.Println("err encountered during saving preferences,", err) - return - } - err := os.WriteFile(preferencesFileName, buf.Bytes(), os.ModePerm) - if err != nil { - fmt.Println("err encountered during saving preferences,", err) - return - } + utils.MoveItem(&cp.CliCmdOrder, i, 0) } func loadPreferences_cli() { - if disablePreferenceFeature { + cp := currentUserPreference.Cli + if cp == nil { return } - if !utils.FileExist(preferencesFileName) { - return - } - bs, err := os.ReadFile(preferencesFileName) - if err != nil { - fmt.Println("err encountered during loading preferences file,", err) - return - } - err = toml.Unmarshal(bs, ¤tUserPreference) - if err != nil { - fmt.Println("err encountered during toml.Unmarshal preferences file,", err) - return - } doWhenUpdateAutoRearrangeCli() - if len(currentUserPreference.CliCmdOrder) == 0 { + if len(cp.CliCmdOrder) == 0 { return } - if len(currentUserPreference.CliCmdOrder) <= len(cliCmdList) { + if len(cp.CliCmdOrder) <= len(cliCmdList) { var neworder []int var ei int - cliCmdList, neworder, ei = utils.SortByOrder(cliCmdList, currentUserPreference.CliCmdOrder) + cliCmdList, neworder, ei = utils.SortByOrder(cliCmdList, cp.CliCmdOrder) if ei != 0 { fmt.Println("utils.SortByOrder got ei", ei) } if neworder != nil { - currentUserPreference.CliCmdOrder = neworder + cp.CliCmdOrder = neworder } } else { diff --git a/cmd/verysimple/gui.go b/cmd/verysimple/gui.go index 23fa787..e41b85d 100644 --- a/cmd/verysimple/gui.go +++ b/cmd/verysimple/gui.go @@ -26,6 +26,9 @@ var theTunStartCmds []string var multilineEntry *ui.MultilineEntry //用于向用户提供一些随机的有用的需要复制的字符串 var entriesGroup *ui.Group //父 of multilineEntry +type GuiPreference struct { +} + func init() { flag.BoolVar(&gui_mode, "g", true, "gui mode") diff --git a/cmd/verysimple/gui_non.go b/cmd/verysimple/gui_non.go new file mode 100644 index 0000000..b138a8f --- /dev/null +++ b/cmd/verysimple/gui_non.go @@ -0,0 +1,6 @@ +//go:build !gui + +package main + +// placeholder +type GuiPreference struct{} diff --git a/cmd/verysimple/perference.go b/cmd/verysimple/perference.go index 39f2a5b..0ccb5fb 100644 --- a/cmd/verysimple/perference.go +++ b/cmd/verysimple/perference.go @@ -4,6 +4,11 @@ package main import ( "flag" + "fmt" + "os" + + "github.com/BurntSushi/toml" + "github.com/e1732a364fed/v2ray_simple/utils" ) /* @@ -21,13 +26,12 @@ var ( disablePreferenceFeature bool currentUserPreference UserPreference - preference_saveFunclist []func() preference_loadFunclist []func() ) type UserPreference struct { - CliCmdOrder []int `toml:"cli_cmd_order"` - AutoArrange bool `toml:"auto_arrange"` + Cli *CliPreference `toml:"cli"` + Gui *GuiPreference `toml:"gui"` } func init() { @@ -36,12 +40,45 @@ func init() { } func savePerferences() { - for _, f := range preference_saveFunclist { - f() + if disablePreferenceFeature { + return + } + fmt.Println("Saving preferences") + + buf := utils.GetBuf() + defer utils.PutBuf(buf) + if err := toml.NewEncoder(buf).Encode(currentUserPreference); err != nil { + fmt.Println("err encountered during saving preferences,", err) + return + } + err := os.WriteFile(preferencesFileName, buf.Bytes(), os.ModePerm) + if err != nil { + fmt.Println("err encountered during saving preferences,", err) + return } } func loadPreferences() { + if disablePreferenceFeature { + return + } + if !utils.FileExist(preferencesFileName) { + return + } + + fmt.Println("Loading preferences") + + bs, err := os.ReadFile(preferencesFileName) + if err != nil { + fmt.Println("Failed loading preferences file,", err) + return + } + err = toml.Unmarshal(bs, ¤tUserPreference) + if err != nil { + fmt.Println("Failed Unmarshal preferences toml,", err) + return + } + for _, f := range preference_loadFunclist { f() } diff --git a/cmd/verysimple/version.go b/cmd/verysimple/version.go index 09c99f2..0825928 100644 --- a/cmd/verysimple/version.go +++ b/cmd/verysimple/version.go @@ -1,5 +1,5 @@ /* -Package main 读取配置文件,然后进行代理转发, 并选择性运行 交互模式和 apiServer. +Package main 读取配置文件,然后进行代理转发, 并选择性运行 cli/gui/apiServer. 命令行参数请使用 --help / -h 查看详情,配置文件示例请参考 ../../examples/ .