diff --git a/goecs.go b/goecs.go index e6c55d8..55cc11e 100644 --- a/goecs.go +++ b/goecs.go @@ -2,6 +2,7 @@ package main import ( "bufio" + "context" "flag" "fmt" "github.com/oneclickvirt/CommonMediaTests/commediatests" @@ -38,7 +39,7 @@ import ( ) var ( - ecsVersion = "v0.0.74" + ecsVersion = "v0.0.75" menuMode bool onlyChinaTest bool input, choice string @@ -62,6 +63,68 @@ var ( goecsFlag = flag.NewFlagSet("goecs", flag.ContinueOnError) ) +func getMenuChoice(language string) string { + ctx, cancel := context.WithCancel(context.Background()) + defer cancel() + + sigChan := make(chan os.Signal, 1) + signal.Notify(sigChan, os.Interrupt, syscall.SIGINT, syscall.SIGTERM) + defer signal.Stop(sigChan) + + inputChan := make(chan string, 1) + + go func() { + select { + case <-sigChan: + fmt.Println("\n程序在选择过程中被用户中断") + os.Exit(1) + case <-ctx.Done(): + return + } + }() + + for { + go func() { + var input string + fmt.Print("请输入选项 / Please enter your choice: ") + fmt.Scanln(&input) + input = strings.TrimSpace(input) + input = strings.TrimRight(input, "\n") + select { + case inputChan <- input: + case <-ctx.Done(): + return + } + }() + + select { + case input := <-inputChan: + re := regexp.MustCompile(`^\d+$`) // 正则表达式匹配纯数字 + if re.MatchString(input) { + choice := input + switch choice { + case "1", "2", "3", "4", "5", "6", "7", "8", "9", "10": + return choice + default: + if language == "zh" { + fmt.Println("无效的选项") + } else { + fmt.Println("Invalid choice") + } + } + } else { + if language == "zh" { + fmt.Println("输入错误,请输入一个纯数字") + } else { + fmt.Println("Invalid input, please enter a number") + } + } + case <-ctx.Done(): + return "" + } + } +} + func main() { goecsFlag.BoolVar(&help, "h", false, "Show help information") goecsFlag.BoolVar(&showVersion, "v", false, "Display version information") @@ -95,8 +158,6 @@ func main() { goecsFlag.PrintDefaults() return } - sig := make(chan os.Signal, 1) - signal.Notify(sig, os.Interrupt, syscall.SIGINT, syscall.SIGTERM) if showVersion { fmt.Println(ecsVersion) return @@ -149,103 +210,90 @@ func main() { } Loop: for { - fmt.Print("请输入选项 / Please enter your choice: ") - fmt.Scanln(&input) - input = strings.TrimSpace(input) - input = strings.TrimRight(input, "\n") - re := regexp.MustCompile(`^\d+$`) // 正则表达式匹配纯数字 - if re.MatchString(input) { - choice = input - switch choice { - case "1": - basicStatus = true - cpuTestStatus = true - memoryTestStatus = true - diskTestStatus = true - commTestStatus = true - utTestStatus = true - securityTestStatus = true - emailTestStatus = true - backtraceStatus = true - nt3Status = true - speedTestStatus = true - onlyChinaTest = utils.CheckChina(enableLogger) - break Loop - case "2": - basicStatus = true - cpuTestStatus = true - memoryTestStatus = true - diskTestStatus = true - speedTestStatus = true - break Loop - case "3": - basicStatus = true - cpuTestStatus = true - memoryTestStatus = true - diskTestStatus = true - utTestStatus = true - nt3Status = true - speedTestStatus = true - break Loop - case "4": - basicStatus = true - cpuTestStatus = true - memoryTestStatus = true - diskTestStatus = true - backtraceStatus = true - nt3Status = true - speedTestStatus = true - break Loop - case "5": - basicStatus = true - cpuTestStatus = true - memoryTestStatus = true - diskTestStatus = true - commTestStatus = true - utTestStatus = true - speedTestStatus = true - break Loop - case "6": - securityTestStatus = true - speedTestStatus = true - backtraceStatus = true - nt3Status = true - break Loop - case "7": - commTestStatus = true - utTestStatus = true - enabelUpload = false - break Loop - case "8": - basicStatus = true - cpuTestStatus = true - memoryTestStatus = true - diskTestStatus = true - securityTestStatus = false - autoChangeDiskTestMethod = false - break Loop - case "9": - securityTestStatus = true - emailTestStatus = true - break Loop - case "10": - backtraceStatus = true - nt3Status = true - pingTestStatus = true - enabelUpload = false - break Loop - default: - if language == "zh" { - fmt.Println("无效的选项") - } else { - fmt.Println("Invalid choice") - } - } - } else { + choice := getMenuChoice(language) + switch choice { + case "1": + basicStatus = true + cpuTestStatus = true + memoryTestStatus = true + diskTestStatus = true + commTestStatus = true + utTestStatus = true + securityTestStatus = true + emailTestStatus = true + backtraceStatus = true + nt3Status = true + speedTestStatus = true + onlyChinaTest = utils.CheckChina(enableLogger) + break Loop + case "2": + basicStatus = true + cpuTestStatus = true + memoryTestStatus = true + diskTestStatus = true + speedTestStatus = true + break Loop + case "3": + basicStatus = true + cpuTestStatus = true + memoryTestStatus = true + diskTestStatus = true + utTestStatus = true + nt3Status = true + speedTestStatus = true + break Loop + case "4": + basicStatus = true + cpuTestStatus = true + memoryTestStatus = true + diskTestStatus = true + backtraceStatus = true + nt3Status = true + speedTestStatus = true + break Loop + case "5": + basicStatus = true + cpuTestStatus = true + memoryTestStatus = true + diskTestStatus = true + commTestStatus = true + utTestStatus = true + speedTestStatus = true + break Loop + case "6": + securityTestStatus = true + speedTestStatus = true + backtraceStatus = true + nt3Status = true + break Loop + case "7": + commTestStatus = true + utTestStatus = true + enabelUpload = false + break Loop + case "8": + basicStatus = true + cpuTestStatus = true + memoryTestStatus = true + diskTestStatus = true + securityTestStatus = false + autoChangeDiskTestMethod = false + break Loop + case "9": + securityTestStatus = true + emailTestStatus = true + break Loop + case "10": + backtraceStatus = true + nt3Status = true + pingTestStatus = true + enabelUpload = false + break Loop + default: if language == "zh" { - fmt.Println("输入错误,请输入一个纯数字") + fmt.Println("无效的选项") } else { - fmt.Println("Invalid input, please enter a number") + fmt.Println("Invalid choice") } } } @@ -263,6 +311,9 @@ func main() { basicInfo, securityInfo, emailInfo, mediaInfo, ptInfo string output, tempOutput string ) + // 设置主程序的信号处理 + sig := make(chan os.Signal, 1) + signal.Notify(sig, os.Interrupt, syscall.SIGINT, syscall.SIGTERM) // 启动一个goroutine来等待信号,内置计时器 go func() { startTime = time.Now() diff --git a/utils/utils.go b/utils/utils.go index c26ca85..e6f2089 100644 --- a/utils/utils.go +++ b/utils/utils.go @@ -238,7 +238,7 @@ func PrintAndCapture(f func(), tempOutput, output string) string { } // UploadText 上传文本内容到指定URL -func UploadText(absPath string) (string, error) { +func UploadText(absPath string) (string, string, error) { primaryURL := "http://hpaste.spiritlhl.net/api/upload" backupURL := "https://paste.spiritlhl.net/api/upload" token := network.SecurityUploadToken @@ -250,10 +250,10 @@ func UploadText(absPath string) (string, error) { SetRetryFixedInterval(2 * time.Second) file, err := os.Open(absPath) if err != nil { - return "", err + return "", "", err } defer file.Close() - upload := func(url string) (string, error) { + upload := func(url string) (string, string, error) { resp, err := client.R(). SetHeader("Authorization", token). SetHeader("Format", "RANDOM"). @@ -264,23 +264,24 @@ func UploadText(absPath string) (string, error) { SetFileReader("file", "goecs.txt", file). Post(url) if err != nil { - return "", err + return "", "", err } if resp.StatusCode >= 200 && resp.StatusCode <= 299 { - return strings.ReplaceAll(resp.String(), "https://paste.spiritlhl.net/", "http://hpaste.spiritlhl.net/"), nil + return strings.ReplaceAll(resp.String(), "https://paste.spiritlhl.net/", "http://hpaste.spiritlhl.net/"), + strings.ReplaceAll(resp.String(), "http://hpaste.spiritlhl.net/", "https://paste.spiritlhl.net/"), nil } else { - return "", fmt.Errorf("upload failed with status code: %d", resp.StatusCode) + return "", "", fmt.Errorf("upload failed with status code: %d", resp.StatusCode) } } - result, err := upload(primaryURL) + http_url, https_url, err := upload(primaryURL) if err == nil { - return result, nil + return http_url, https_url, nil } - result, err = upload(backupURL) + http_url, https_url, err = upload(backupURL) if err != nil { - return "", err + return "", "", err } - return result, nil + return http_url, https_url, nil } // ProcessAndUpload 创建结果文件并上传文件 @@ -321,12 +322,12 @@ func ProcessAndUpload(output string, filePath string, enableUplaod bool) { return } // 上传文件并生成短链接 - shorturl, err3 := UploadText(absPath) + http_url, https_url, err3 := UploadText(absPath) if err3 != nil { fmt.Println("Upload failed, cannot generate short URL.") fmt.Println(err3.Error()) return } - fmt.Println("Upload successful, short URL:", shorturl) + fmt.Println("Upload successful, short URL:", http_url, https_url) } }