diff --git a/.vscode/settings.json b/.vscode/settings.json index 7d8cf2d..b9d69bd 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -9,6 +9,7 @@ "ldflags", "LOCALAPPDATA", "pkill", + "runas", "setlocal", "taskkill", "trimpath" diff --git a/app.exe b/app.exe deleted file mode 100644 index d1b67a7..0000000 Binary files a/app.exe and /dev/null differ diff --git a/app.manifest b/app.manifest deleted file mode 100644 index 7af02b2..0000000 --- a/app.manifest +++ /dev/null @@ -1,11 +0,0 @@ - - - - - - - - - - - \ No newline at end of file diff --git a/cursor-id-modifier-linux b/cursor-id-modifier-linux deleted file mode 100644 index d1b67a7..0000000 Binary files a/cursor-id-modifier-linux and /dev/null differ diff --git a/cursor-id-modifier-macos b/cursor-id-modifier-macos deleted file mode 100644 index d1b67a7..0000000 Binary files a/cursor-id-modifier-macos and /dev/null differ diff --git a/go.mod b/go.mod index 2de8890..27ba945 100644 --- a/go.mod +++ b/go.mod @@ -1,11 +1,13 @@ -module github.com/yuaotian/go-cursor-help +module cursor-id-modifier -go 1.22.0 +go 1.21 -require github.com/fatih/color v1.18.0 +require ( + github.com/fatih/color v1.15.0 + golang.org/x/sys v0.13.0 +) require ( github.com/mattn/go-colorable v0.1.13 // indirect - github.com/mattn/go-isatty v0.0.20 // indirect - golang.org/x/sys v0.28.0 + github.com/mattn/go-isatty v0.0.17 // indirect ) diff --git a/go.sum b/go.sum index a266003..b4bb98d 100644 --- a/go.sum +++ b/go.sum @@ -1,13 +1,10 @@ -github.com/fatih/color v1.18.0 h1:S8gINlzdQ840/4pfAwic/ZE0djQEH3wM94VfqLTZcOM= -github.com/fatih/color v1.18.0/go.mod h1:4FelSpRwEGDpQ12mAdzqdOukCy4u8WUtOY6lkT/6HfU= +github.com/fatih/color v1.15.0 h1:kOqh6YHBtK8aywxGerMG2Eq3H6Qgoqeo13Bk2Mv/nBs= +github.com/fatih/color v1.15.0/go.mod h1:0h5ZqXfHYED7Bhv2ZJamyIOUej9KtShiJESRwBDUSsw= github.com/mattn/go-colorable v0.1.13 h1:fFA4WZxdEF4tXPZVKMLwD8oUnCTTo08duU7wxecdEvA= github.com/mattn/go-colorable v0.1.13/go.mod h1:7S9/ev0klgBDR4GtXTXX8a3vIGJpMovkB8vQcUbaXHg= github.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM= -github.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY= -github.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y= +github.com/mattn/go-isatty v0.0.17 h1:BTarxUcIeDqL27Mc+vyvdWYSL28zpIhv3RoTdsLMPng= +github.com/mattn/go-isatty v0.0.17/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM= golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.25.0 h1:r+8e+loiHxRqhXVl6ML1nO3l1+oFoWbnlu2Ehimmi34= -golang.org/x/sys v0.25.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= -golang.org/x/sys v0.28.0 h1:Fksou7UEQUWlKvIdsqzJmUmCX3cZuD2+P3XyyzwMhlA= -golang.org/x/sys v0.28.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.13.0 h1:Af8nKPmuFypiUBjVoU9V20FiaFXOcuZI21p0ycVYYGE= +golang.org/x/sys v0.13.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= diff --git a/install.sh b/install.sh index fdc3afe..e412e31 100644 --- a/install.sh +++ b/install.sh @@ -16,15 +16,14 @@ detect_platform() { case "$OS" in linux*) case "$ARCH" in - x86_64) BINARY_NAME="cursor-id-modifier" ;; - aarch64) BINARY_NAME="cursor-id-modifier-arm64" ;; + x86_64) BINARY_NAME="cursor_id_modifier_v2.0.0_linux_amd64" ;; *) error "Unsupported Linux architecture/不支持的Linux架构: $ARCH" ;; esac ;; darwin*) case "$ARCH" in - x86_64) BINARY_NAME="cursor-id-modifier-amd64" ;; - arm64) BINARY_NAME="cursor-id-modifier-arm64" ;; + x86_64) BINARY_NAME="cursor_id_modifier_v2.0.0_mac_intel" ;; + arm64) BINARY_NAME="cursor_id_modifier_v2.0.0_mac_m1" ;; *) error "Unsupported macOS architecture/不支持的macOS架构: $ARCH" ;; esac ;; @@ -47,7 +46,7 @@ INSTALL_DIR="/usr/local/bin" # Download binary / 下载二进制文件 echo "Downloading cursor-id-modifier for/正在下载 $OS ($ARCH)..." TEMP_DIR=$(mktemp -d) -DOWNLOAD_URL="https://github.com/yuaotian/go-cursor-help/releases/latest/download/$BINARY_NAME" +DOWNLOAD_URL="https://github.com/yuaotian/go-cursor-help/raw/main/bin/$BINARY_NAME" if ! curl -fsSL "$DOWNLOAD_URL" -o "$TEMP_DIR/$BINARY_NAME"; then error "Failed to download binary/下载二进制文件失败" diff --git a/main.go b/main.go index dfa7a7b..b0ce95d 100644 --- a/main.go +++ b/main.go @@ -15,7 +15,6 @@ import ( "path/filepath" "runtime" "strings" - "syscall" "time" "github.com/fatih/color" @@ -28,23 +27,23 @@ type Language string const ( CN Language = "cn" EN Language = "en" - + // Version constant Version = "1.0.1" ) // TextResource 存储多语言文本 / TextResource stores multilingual text type TextResource struct { - SuccessMessage string - RestartMessage string - ReadingConfig string - GeneratingIds string - PressEnterToExit string - ErrorPrefix string - PrivilegeError string - RunAsAdmin string - RunWithSudo string - SudoExample string + SuccessMessage string + RestartMessage string + ReadingConfig string + GeneratingIds string + PressEnterToExit string + ErrorPrefix string + PrivilegeError string + RunAsAdmin string + RunWithSudo string + SudoExample string } // StorageConfig 优化的存储配置结构 / StorageConfig optimized storage configuration struct @@ -76,28 +75,28 @@ var ( texts = map[Language]TextResource{ CN: { - SuccessMessage: "[√] 配置文件已成功更新!", - RestartMessage: "[!] 请手动重启 Cursor 以使更新生效", - ReadingConfig: "正在读取配置文件...", - GeneratingIds: "正在生成新的标识符...", - PressEnterToExit: "按回车键退出程序...", - ErrorPrefix: "程序发生严重错误: %v", - PrivilegeError: "\n[!] 错误:需要管理员权限", - RunAsAdmin: "请右键点击程序,选择「以管理员身份运行」", - RunWithSudo: "请使用 sudo 命令运行此程序", - SudoExample: "示例: sudo %s", + SuccessMessage: "[√] 配置文件已成功更新!", + RestartMessage: "[!] 请手动重启 Cursor 以使更新生效", + ReadingConfig: "正在读取配置文件...", + GeneratingIds: "正在生成新的标识符...", + PressEnterToExit: "按回车键退出程序...", + ErrorPrefix: "程序发生严重错误: %v", + PrivilegeError: "\n[!] 错误:需要管理员权限", + RunAsAdmin: "请右键点击程序,选择「以管理员身份运行」", + RunWithSudo: "请使用 sudo 命令运行此程序", + SudoExample: "示例: sudo %s", }, EN: { - SuccessMessage: "[√] Configuration file updated successfully!", - RestartMessage: "[!] Please restart Cursor manually for changes to take effect", - ReadingConfig: "Reading configuration file...", - GeneratingIds: "Generating new identifiers...", - PressEnterToExit: "Press Enter to exit...", - ErrorPrefix: "Program encountered a serious error: %v", - PrivilegeError: "\n[!] Error: Administrator privileges required", - RunAsAdmin: "Please right-click and select 'Run as Administrator'", - RunWithSudo: "Please run this program with sudo", - SudoExample: "Example: sudo %s", + SuccessMessage: "[√] Configuration file updated successfully!", + RestartMessage: "[!] Please restart Cursor manually for changes to take effect", + ReadingConfig: "Reading configuration file...", + GeneratingIds: "Generating new identifiers...", + PressEnterToExit: "Press Enter to exit...", + ErrorPrefix: "Program encountered a serious error: %v", + PrivilegeError: "\n[!] Error: Administrator privileges required", + RunAsAdmin: "Please right-click and select 'Run as Administrator'", + RunWithSudo: "Please run this program with sudo", + SudoExample: "Example: sudo %s", }, } ) @@ -224,9 +223,9 @@ func killCursorProcesses() error { // First try graceful shutdown exec.Command("taskkill", "/IM", "Cursor.exe").Run() exec.Command("taskkill", "/IM", "cursor.exe").Run() - + time.Sleep(time.Second) - + // Force kill any remaining instances exec.Command("taskkill", "/F", "/IM", "Cursor.exe").Run() exec.Command("taskkill", "/F", "/IM", "cursor.exe").Run() @@ -244,7 +243,7 @@ func checkCursorRunning() bool { } else { cmd = exec.Command("pgrep", "-f", "Cursor") } - + output, _ := cmd.Output() return strings.Contains(string(output), "Cursor") || strings.Contains(string(output), "cursor") } @@ -288,7 +287,7 @@ func printCyberpunkBanner() { cyan.Println(banner) yellow.Println("\t\t>> Cursor ID Modifier v1.0 <<") magenta.Println("\t\t [ By Pancake Fruit Rolled Shark Chili ]") - + langText := "当前语言/Language: " if currentLanguage == CN { langText += "简体中文" @@ -302,7 +301,7 @@ func showSuccess() { text := texts[currentLanguage] successColor := color.New(color.FgGreen, color.Bold) warningColor := color.New(color.FgYellow, color.Bold) - + successColor.Printf("\n%s\n", text.SuccessMessage) warningColor.Printf("%s\n", text.RestartMessage) } @@ -311,7 +310,7 @@ func showPrivilegeError() { text := texts[currentLanguage] red := color.New(color.FgRed, color.Bold) yellow := color.New(color.FgYellow) - + red.Println(text.PrivilegeError) if runtime.GOOS == "windows" { yellow.Println(text.RunAsAdmin) @@ -324,16 +323,16 @@ func showPrivilegeError() { func showIdComparison(oldConfig *StorageConfig, newConfig *StorageConfig) { cyan := color.New(color.FgCyan) yellow := color.New(color.FgYellow) - + fmt.Println("\n=== ID Modification Comparison / ID 修改对比 ===") - + if oldConfig != nil { cyan.Println("\n[Original IDs / 原始 ID]") yellow.Printf("Machine ID: %s\n", oldConfig.TelemetryMachineId) yellow.Printf("Mac Machine ID: %s\n", oldConfig.TelemetryMacMachineId) yellow.Printf("Dev Device ID: %s\n", oldConfig.TelemetryDevDeviceId) } - + cyan.Println("\n[Newly Generated IDs / 新生成 ID]") yellow.Printf("Machine ID: %s\n", newConfig.TelemetryMachineId) yellow.Printf("Mac Machine ID: %s\n", newConfig.TelemetryMacMachineId) @@ -395,7 +394,7 @@ func loadAndUpdateConfig() (*StorageConfig, error) { text := texts[currentLanguage] showProgress(text.ReadingConfig) - + _, err = os.ReadFile(configPath) if err != nil && !os.IsNotExist(err) { return nil, &AppError{"read config file", configPath, err} @@ -413,14 +412,14 @@ func checkAdminPrivileges() (bool, error) { cmd := exec.Command("net", "session") err := cmd.Run() return err == nil, nil - + case "darwin", "linux": currentUser, err := user.Current() if err != nil { return false, fmt.Errorf("failed to get current user: %v", err) } return currentUser.Uid == "0", nil - + default: return false, fmt.Errorf("unsupported operating system: %s", runtime.GOOS) } @@ -432,16 +431,16 @@ func selfElevate() error { if err != nil { return err } - + cwd, err := os.Getwd() if err != nil { return err } - - verbPtr, _ := syscall.UTF16PtrFromString(verb) - exePtr, _ := syscall.UTF16PtrFromString(exe) - cwdPtr, _ := syscall.UTF16PtrFromString(cwd) - argPtr, _ := syscall.UTF16PtrFromString("") + // 将字符串转换为UTF-16指针 + verbPtr, _ := windows.UTF16PtrFromString(verb) + exePtr, _ := windows.UTF16PtrFromString(exe) + cwdPtr, _ := windows.UTF16PtrFromString(cwd) + argPtr, _ := windows.UTF16PtrFromString("") var showCmd int32 = 1 //SW_NORMAL @@ -460,7 +459,7 @@ func detectLanguage() Language { if lang == "" { lang = os.Getenv("LANGUAGE") } - + if strings.Contains(strings.ToLower(lang), "zh") { return CN } @@ -494,7 +493,7 @@ func main() { os.Stdout.Sync() currentLanguage = detectLanguage() - + isAdmin, err := checkAdminPrivileges() if err != nil { handleError("permission check failed", err) @@ -524,7 +523,7 @@ func main() { waitExit() return } - + time.Sleep(2 * time.Second) if checkCursorRunning() { fmt.Println("\nWarning: Cursor is still running. Please close it manually. / 警告:Cursor 仍在运行,请手动关闭。") @@ -535,21 +534,21 @@ func main() { clearScreen() printCyberpunkBanner() - + oldConfig, err := readExistingConfig() if err != nil { oldConfig = nil } - + config, err := loadAndUpdateConfig() if err != nil { handleError("configuration update failed", err) waitExit() return } - + showIdComparison(oldConfig, config) - + if err := saveConfig(config); err != nil { handleError("failed to save configuration", err) waitExit()