From 2dbc9166529252377a1301e0d37650b780b7de50 Mon Sep 17 00:00:00 2001 From: imbytecat Date: Sun, 1 Mar 2026 04:45:27 +0800 Subject: [PATCH] =?UTF-8?q?refactor:=20=E7=A7=BB=E9=99=A4=E4=BA=8C?= =?UTF-8?q?=E7=BB=B4=E7=A0=81=E5=92=8C=E4=BA=A4=E5=8F=89=E7=BC=96=E8=AF=91?= =?UTF-8?q?=EF=BC=8C=E6=94=B9=E4=B8=BA=E5=88=97=E5=87=BA=E6=89=80=E6=9C=89?= =?UTF-8?q?=20LAN=20IP=20=E5=9C=B0=E5=9D=80=EF=BC=9B=E6=B8=85=E7=90=86?= =?UTF-8?q?=E4=BE=9D=E8=B5=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Taskfile.yml | 39 +-------------------------------------- go.mod | 3 --- go.sum | 6 ------ internal/server/net.go | 14 +++++++++----- main.go | 37 ++++++++++++++++++++++++------------- qrcode.go | 18 ------------------ 6 files changed, 34 insertions(+), 83 deletions(-) delete mode 100644 qrcode.go diff --git a/Taskfile.yml b/Taskfile.yml index 7d7b21d..c2a353b 100644 --- a/Taskfile.yml +++ b/Taskfile.yml @@ -22,48 +22,11 @@ tasks: cmds: - go run . - build:darwin-arm64: - desc: Build for macOS ARM64 - env: - GOOS: darwin - GOARCH: arm64 - CGO_ENABLED: "1" - cmds: - - go build -ldflags "-s -w -X main.version={{.VERSION}}" -o dist/{{.APP_NAME}}-darwin-arm64 . - - build:darwin-amd64: - desc: Build for macOS AMD64 - env: - GOOS: darwin - GOARCH: amd64 - CGO_ENABLED: "1" - cmds: - - go build -ldflags "-s -w -X main.version={{.VERSION}}" -o dist/{{.APP_NAME}}-darwin-amd64 . - - build:linux-amd64: - desc: Build for Linux AMD64 - env: - GOOS: linux - GOARCH: amd64 - CGO_ENABLED: "1" - cmds: - - go build -ldflags "-s -w -X main.version={{.VERSION}}" -o dist/{{.APP_NAME}}-linux-amd64 . - - build:windows-amd64: - desc: Build for Windows AMD64 - env: - GOOS: windows - GOARCH: amd64 - CGO_ENABLED: "1" - cmds: - - go build -ldflags "-s -w -X main.version={{.VERSION}}" -o dist/{{.APP_NAME}}-windows-amd64.exe . - build:all: desc: Build for all platforms cmds: - mkdir -p dist - - task: build:linux-amd64 - + - task: default clean: desc: Clean build artifacts cmds: diff --git a/go.mod b/go.mod index 8690c39..8e88afa 100644 --- a/go.mod +++ b/go.mod @@ -9,7 +9,6 @@ require ( github.com/gofiber/contrib/v3/websocket v1.0.0 github.com/gofiber/fiber/v3 v3.1.0 github.com/google/uuid v1.6.0 - github.com/mdp/qrterminal/v3 v3.2.1 golang.design/x/clipboard v0.7.1 gopkg.in/yaml.v3 v3.0.1 ) @@ -55,7 +54,5 @@ require ( golang.org/x/mobile v0.0.0-20250606033058-a2a15c67f36f // indirect golang.org/x/net v0.50.0 // indirect golang.org/x/sys v0.41.0 // indirect - golang.org/x/term v0.40.0 // indirect golang.org/x/text v0.34.0 // indirect - rsc.io/qr v0.2.0 // indirect ) diff --git a/go.sum b/go.sum index d2e475f..1b6de10 100644 --- a/go.sum +++ b/go.sum @@ -50,8 +50,6 @@ github.com/mattn/go-colorable v0.1.14 h1:9A9LHSqF/7dyVVX6g0U9cwm9pG3kP9gSzcuIPHP github.com/mattn/go-colorable v0.1.14/go.mod h1:6LmQG8QLFO4G5z1gPvYEzlUgJ2wF+stgPZH1UqBm1s8= 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/mdp/qrterminal/v3 v3.2.1 h1:6+yQjiiOsSuXT5n9/m60E54vdgFsw0zhADHhHLrFet4= -github.com/mdp/qrterminal/v3 v3.2.1/go.mod h1:jOTmXvnBsMy5xqLniO0R++Jmjs2sTm9dFSuQ5kpz/SU= github.com/nfnt/resize v0.0.0-20180221191011-83c6a9932646 h1:zYyBkD/k9seD2A7fsi6Oo2LfFZAehjjQMERAvZLEDnQ= github.com/nfnt/resize v0.0.0-20180221191011-83c6a9932646/go.mod h1:jpp1/29i3P1S/RLdc7JQKbRpFeM1dOBd8T9ki5s+AY8= github.com/otiai10/gosseract/v2 v2.4.1 h1:G8AyBpXEeSlcq8TI85LH/pM5SXk8Djy2GEXisgyblRw= @@ -129,8 +127,6 @@ golang.org/x/sys v0.1.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.41.0 h1:Ivj+2Cp/ylzLiEU89QhWblYnOE9zerudt9Ftecq2C6k= golang.org/x/sys v0.41.0/go.mod h1:OgkHotnGiDImocRcuBABYBEXf8A9a87e/uXjp9XT3ks= -golang.org/x/term v0.40.0 h1:36e4zGLqU4yhjlmxEaagx2KuYbJq3EwY8K943ZsHcvg= -golang.org/x/term v0.40.0/go.mod h1:w2P8uVp06p2iyKKuvXIm7N/y0UCRt3UfJTfZ7oOpglM= golang.org/x/text v0.34.0 h1:oL/Qq0Kdaqxa1KbNeMKwQq0reLCCaFtqu2eNuSeNHbk= golang.org/x/text v0.34.0/go.mod h1:homfLqTYRFyVYemLBFl5GgL/DWEiH5wcsQ5gSh1yziA= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= @@ -138,5 +134,3 @@ gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntN gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= -rsc.io/qr v0.2.0 h1:6vBLea5/NRMVTz8V66gipeLycZMl/+UlFmk8DvqQ6WY= -rsc.io/qr v0.2.0/go.mod h1:IF+uZjkb9fqyeF/4tlBoynqmQxUoPfWEKh921coOuXs= diff --git a/internal/server/net.go b/internal/server/net.go index f67ec07..ff2984b 100644 --- a/internal/server/net.go +++ b/internal/server/net.go @@ -5,17 +5,21 @@ import ( "net" ) -// GetLANIP returns the first non-loopback IPv4 address. -func GetLANIP() (string, error) { +// GetLANIPs returns all non-loopback IPv4 addresses. +func GetLANIPs() ([]string, error) { addrs, err := net.InterfaceAddrs() if err != nil { - return "", err + return nil, err } + var ips []string for _, addr := range addrs { if ipNet, ok := addr.(*net.IPNet); ok && !ipNet.IP.IsLoopback() && ipNet.IP.To4() != nil { - return ipNet.IP.String(), nil + ips = append(ips, ipNet.IP.String()) } } - return "", fmt.Errorf("no LAN IP found") + if len(ips) == 0 { + return nil, fmt.Errorf("no LAN IP found") + } + return ips, nil } diff --git a/main.go b/main.go index 71ff015..aaeed85 100644 --- a/main.go +++ b/main.go @@ -42,12 +42,13 @@ func main() { if err := paste.Init(); err != nil { slog.Warn("clipboard init failed, paste will be unavailable", "err", err) } - // Detect LAN IP - lanIP, err := server.GetLANIP() + // Detect LAN IPs + lanIPs, err := server.GetLANIPs() if err != nil { slog.Error("failed to detect LAN IP", "error", err) os.Exit(1) } + lanIP := lanIPs[0] // Use first IP for TLS and server binding // Read token from config (empty = no auth required) token := cfg.Security.Token @@ -66,20 +67,26 @@ func main() { scheme = "https" host = tlsResult.Host } - // Build URL - var url string - if token != "" { - url = fmt.Sprintf("%s://%s:%d/?token=%s", scheme, host, cfg.Server.Port, token) - } else { - url = fmt.Sprintf("%s://%s:%d/", scheme, host, cfg.Server.Port) - } + // Print connection info fmt.Println() fmt.Println("╔══════════════════════════════════════╗") fmt.Println("║ VoicePaste 就绪 ║") fmt.Println("╚══════════════════════════════════════╝") fmt.Println() - fmt.Printf(" 地址: %s\n", url) + // Print all accessible addresses + if len(lanIPs) == 1 { + fmt.Printf(" 地址: %s\n", buildURL(scheme, host, cfg.Server.Port, token)) + } else { + fmt.Println(" 地址:") + for _, ip := range lanIPs { + h := ip + if tlsResult != nil { + h = tlsResult.Host + } + fmt.Printf(" - %s\n", buildURL(scheme, h, cfg.Server.Port, token)) + } + } if tlsResult != nil && tlsResult.AnyIP { fmt.Println(" 证书: AnyIP(浏览器信任)") } else if cfg.Server.TLSAuto { @@ -91,9 +98,7 @@ func main() { fmt.Println(" 认证: 未启用(无需 token)") } fmt.Println() - printQRCode(url) - fmt.Println() - fmt.Println(" 用手机扫描二维码连接") + fmt.Println(" 在手机浏览器中打开上方地址") fmt.Println(" 按 Ctrl+C 停止服务") fmt.Println() // Create and start server @@ -142,4 +147,10 @@ func main() { slog.Error("server error", "error", err) os.Exit(1) } +} +func buildURL(scheme, host string, port int, token string) string { + if token != "" { + return fmt.Sprintf("%s://%s:%d/?token=%s", scheme, host, port, token) + } + return fmt.Sprintf("%s://%s:%d/", scheme, host, port) } \ No newline at end of file diff --git a/qrcode.go b/qrcode.go deleted file mode 100644 index c4ed0b6..0000000 --- a/qrcode.go +++ /dev/null @@ -1,18 +0,0 @@ -package main - -import ( - "os" - - "github.com/mdp/qrterminal/v3" -) - -// printQRCode prints a QR code to the terminal. -func printQRCode(url string) { - qrterminal.GenerateWithConfig(url, qrterminal.Config{ - Level: qrterminal.L, - Writer: os.Stdout, - BlackChar: qrterminal.BLACK, - WhiteChar: qrterminal.WHITE, - QuietZone: 2, - }) -}