Files
v2ray_simple/cmd/verysimple/perference.go
e1732a364fed 0b1d84dc09 fix #196,交互模式全变nil问题;修订utils.SortByOrder以防止该情况再次发生
添加 Test函数来测试utils.SortByOrder,保证该函数正确运行
2022-12-12 09:37:25 +08:00

130 lines
3.1 KiB
Go
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
//go:build !nocli
package main
import (
"flag"
"fmt"
"os"
"github.com/BurntSushi/toml"
"github.com/e1732a364fed/v2ray_simple/utils"
)
/*
用户偏好功能:
1. 自动将最近运行的交互命令提升到首位; 退出交互模式时将顺序记录到文件; 进入交互模式时加载文件并加载回顺序
2. todo记录用户所选择的语言
3. todo记录每个tag的listen 和 dial 所消耗的流量
*/
const (
preferencesFileName = ".verysimple_preferences"
openAutoRearrangeStr = "开启自动将最近运行的交互命令提升到首位"
)
var (
disablePreferenceFeature bool
currentUserPreference UserPreference
toggleAutoRearrangeCliCmd = &CliCmd{Name: openAutoRearrangeStr}
)
type UserPreference struct {
CliCmdOrder []int `toml:"cli_cmd_order"`
AutoArrange bool `toml:"auto_arrange"`
}
func init() {
flag.BoolVar(&disablePreferenceFeature, "dp", false, "if given, vs won't save your interactive mode preferences.")
cliCmdList = append(cliCmdList, toggleAutoRearrangeCliCmd)
toggleAutoRearrangeCliCmd.f = func() {
currentUserPreference.AutoArrange = !currentUserPreference.AutoArrange
doWhenUpdateAutoRearrange()
}
}
func doWhenUpdateAutoRearrange() {
if !currentUserPreference.AutoArrange {
toggleAutoRearrangeCliCmd.Name = openAutoRearrangeStr
} else {
if len(currentUserPreference.CliCmdOrder) == 0 {
initOrderList()
}
toggleAutoRearrangeCliCmd.Name = "关闭自动将最近运行的交互命令提升到首位"
}
}
func initOrderList() {
currentUserPreference.CliCmdOrder = nil
for i := range cliCmdList {
currentUserPreference.CliCmdOrder = append(currentUserPreference.CliCmdOrder, i)
}
}
func updateMostRecentCli(i int) {
utils.MoveItem(&cliCmdList, i, 0)
utils.MoveItem(&currentUserPreference.CliCmdOrder, i, 0)
}
func savePerferences() {
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
}
}
func loadPreferences() {
if disablePreferenceFeature {
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, &currentUserPreference)
if err != nil {
fmt.Println("err encountered during toml.Unmarshal preferences file,", err)
return
}
doWhenUpdateAutoRearrange()
if len(currentUserPreference.CliCmdOrder) == 0 {
return
}
if len(currentUserPreference.CliCmdOrder) <= len(cliCmdList) {
var neworder []int
var ei int
cliCmdList, neworder, ei = utils.SortByOrder(cliCmdList, currentUserPreference.CliCmdOrder)
if ei != 0 {
fmt.Println("utils.SortByOrder got ei", ei)
}
if neworder != nil {
currentUserPreference.CliCmdOrder = neworder
}
} else {
initOrderList()
}
}