From 8d6978a60dea2a90caf4578bbd5273f47cf47599 Mon Sep 17 00:00:00 2001 From: Ink33 Date: Sun, 22 Aug 2021 15:05:14 +0800 Subject: [PATCH] feat: alert windows user when double click --- coolq/api.go | 2 +- coolq/cqcode_test.go | 6 ++-- global/all_test.go | 2 +- global/signal_windows.go | 8 ++--- global/terminal/double_click.go | 5 +++ global/terminal/double_click_windows.go | 43 +++++++++++++++++++++++++ go.mod | 2 ++ go.sum | 10 ++++-- main.go | 9 ++++++ server/scf.go | 4 +-- 10 files changed, 77 insertions(+), 14 deletions(-) diff --git a/coolq/api.go b/coolq/api.go index 4307888..b9dcf85 100644 --- a/coolq/api.go +++ b/coolq/api.go @@ -414,7 +414,7 @@ func (bot *CQBot) CQSendGroupForwardMessage(groupID int64, m gjson.Result) MSG { return true }) - var resolveElement = func(elems []message.IMessageElement) []message.IMessageElement { + resolveElement := func(elems []message.IMessageElement) []message.IMessageElement { for i, elem := range elems { switch elem.(type) { case *LocalImageElement, *LocalVideoElement: diff --git a/coolq/cqcode_test.go b/coolq/cqcode_test.go index 3edf7bb..5bde41a 100644 --- a/coolq/cqcode_test.go +++ b/coolq/cqcode_test.go @@ -18,8 +18,10 @@ func TestCQBot_ConvertStringMessage(t *testing.T) { } } -var bench = `asdfqwerqwerqwer[CQ:face,id=115,text=111]asdfasdfasdfasdfasdfasdfasd[CQ:face,id=217]] 123 [` -var benchArray = gjson.Parse(`[{"type":"text","data":{"text":"asdfqwerqwerqwer"}},{"type":"face","data":{"id":"115","text":"111"}},{"type":"text","data":{"text":"asdfasdfasdfasdfasdfasdfasd"}},{"type":"face","data":{"id":"217"}},{"type":"text","data":{"text":"] "}},{"type":"text","data":{"text":"123"}},{"type":"text","data":{"text":" ["}}]`) +var ( + bench = `asdfqwerqwerqwer[CQ:face,id=115,text=111]asdfasdfasdfasdfasdfasdfasd[CQ:face,id=217]] 123 [` + benchArray = gjson.Parse(`[{"type":"text","data":{"text":"asdfqwerqwerqwer"}},{"type":"face","data":{"id":"115","text":"111"}},{"type":"text","data":{"text":"asdfasdfasdfasdfasdfasdfasd"}},{"type":"face","data":{"id":"217"}},{"type":"text","data":{"text":"] "}},{"type":"text","data":{"text":"123"}},{"type":"text","data":{"text":" ["}}]`) +) func BenchmarkCQBot_ConvertStringMessage(b *testing.B) { for i := 0; i < b.N; i++ { diff --git a/global/all_test.go b/global/all_test.go index 06860a6..d8b9076 100644 --- a/global/all_test.go +++ b/global/all_test.go @@ -8,7 +8,7 @@ import ( ) func TestVersionNameCompare(t *testing.T) { - var tests = [...]struct { + tests := [...]struct { current string remote string expected bool diff --git a/global/signal_windows.go b/global/signal_windows.go index 6b13631..cd1875a 100644 --- a/global/signal_windows.go +++ b/global/signal_windows.go @@ -18,11 +18,9 @@ import ( log "github.com/sirupsen/logrus" ) -var ( - validTasks = map[string]func(){ - "dumpstack": dumpStack, - } -) +var validTasks = map[string]func(){ + "dumpstack": dumpStack, +} // SetupMainSignalHandler is for main to use at last func SetupMainSignalHandler() <-chan struct{} { diff --git a/global/terminal/double_click.go b/global/terminal/double_click.go index 6b696a2..ff56452 100644 --- a/global/terminal/double_click.go +++ b/global/terminal/double_click.go @@ -7,3 +7,8 @@ package terminal func RunningByDoubleClick() bool { return false } + +// NoMoreDoubleClick 提示用户不要双击运行,非Windows系统永远返回nil +func NoMoreDoubleClick() error { + return nil +} diff --git a/global/terminal/double_click_windows.go b/global/terminal/double_click_windows.go index a428060..2ac3186 100644 --- a/global/terminal/double_click_windows.go +++ b/global/terminal/double_click_windows.go @@ -4,8 +4,11 @@ package terminal import ( + "os" "syscall" "unsafe" + + "github.com/pkg/errors" ) // RunningByDoubleClick 检查是否通过双击直接运行 @@ -22,3 +25,43 @@ func RunningByDoubleClick() bool { } return true } + +// NoMoreDoubleClick 提示用户不要双击运行,并生成安全启动脚本 +func NoMoreDoubleClick() error { + r := boxW(0, "请勿通过双击直接运行本程序, 这将导致一些非预料的后果.\n请在shell中运行./go-cqhttp.exe\n点击确认将释出安全启动脚本,点击取消则关闭程序", "警告", 0x00000030|0x00000001) + if r == 2 { + return nil + } + r = boxW(0, "点击确认将覆盖go-cqhttp.bat,点击取消则关闭程序", "警告", 0x00000030|0x00000001) + if r == 2 { + return nil + } + f, err := os.OpenFile("go-cqhttp.bat", os.O_CREATE|os.O_RDWR, 0o666) + if err != nil { + return err + } + if err != nil { + return errors.Errorf("打开go-cqhttp.bat失败: %v", err) + } + _ = f.Truncate(0) + _, err = f.WriteString("%Created by go-cqhttp. DO NOT EDIT ME!%\nstart cmd /K go-cqhttp.exe") + if err != nil { + return errors.Errorf("写入go-cqhttp.bat失败: %v", err) + } + f.Close() + boxW(0, "安全启动脚本已生成,请双击go-cqhttp.bat启动", "提示", 0x00000040|0x00000000) + return nil +} + +// BoxW of Win32 API. Check https://docs.microsoft.com/en-us/windows/win32/api/winuser/nf-winuser-messageboxw for more detail. +func boxW(hwnd uintptr, caption, title string, flags uint) int { + captionPtr, _ := syscall.UTF16PtrFromString(caption) + titlePtr, _ := syscall.UTF16PtrFromString(title) + ret, _, _ := syscall.NewLazyDLL("user32.dll").NewProc("MessageBoxW").Call( + hwnd, + uintptr(unsafe.Pointer(captionPtr)), + uintptr(unsafe.Pointer(titlePtr)), + uintptr(flags)) + + return int(ret) +} diff --git a/go.mod b/go.mod index a5365ba..bc01480 100644 --- a/go.mod +++ b/go.mod @@ -33,6 +33,7 @@ require ( github.com/golang/snappy v0.0.4 // indirect github.com/google/uuid v1.3.0 // indirect github.com/jonboulle/clockwork v0.2.2 // indirect + github.com/kr/pretty v0.1.0 // indirect github.com/lestrrat-go/strftime v1.0.5 // indirect github.com/maruel/rs v1.0.0 // indirect github.com/mattn/go-colorable v0.1.8 // indirect @@ -49,6 +50,7 @@ require ( golang.org/x/sync v0.0.0-20210220032951-036812b2e83c // indirect golang.org/x/sys v0.0.0-20210820121016-41cdb8703e55 // indirect google.golang.org/protobuf v1.27.1 // indirect + gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15 // indirect gopkg.in/yaml.v2 v2.4.0 // indirect modernc.org/libc v1.10.0 // indirect modernc.org/mathutil v1.4.1 // indirect diff --git a/go.sum b/go.sum index aeaaee8..96895c6 100644 --- a/go.sum +++ b/go.sum @@ -69,13 +69,17 @@ github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpO github.com/jonboulle/clockwork v0.2.2 h1:UOGuzwb1PwsrDAObMuhUnj0p5ULPj8V/xJ7Kx9qUBdQ= github.com/jonboulle/clockwork v0.2.2/go.mod h1:Pkfl5aHPm1nk2H9h0bjmnJD/BcgbGXUBGnn1kMkgxc8= github.com/json-iterator/go v1.1.9/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= -github.com/json-iterator/go v1.1.10 h1:Kz6Cvnvv2wGdaG/V8yMvfkmNiXq9Ya2KUv4rouJJr68= github.com/json-iterator/go v1.1.10/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= github.com/json-iterator/go v1.1.11 h1:uVUAXhF2To8cbw/3xN3pxj6kk7TYKs98NIrTqPlMWAQ= github.com/json-iterator/go v1.1.11/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= github.com/kardianos/osext v0.0.0-20190222173326-2bc1f35cddc0 h1:iQTw/8FWTuc7uiaSepXwyf3o52HaUYcV+Tu66S3F5GA= github.com/kardianos/osext v0.0.0-20190222173326-2bc1f35cddc0/go.mod h1:1NbS8ALrpOvjt0rHPNLyCIeMtbizbir8U//inJ+zuB8= github.com/kballard/go-shellquote v0.0.0-20180428030007-95032a82bc51/go.mod h1:CzGEWj7cYgsdH8dAjBGEr58BoE7ScuLd+fwFZ44+/x8= +github.com/kr/pretty v0.1.0 h1:L/CwN0zerZDmRFUapSPitk6f+Q3+0za1rQkzVuMiMFI= +github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= +github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= +github.com/kr/text v0.1.0 h1:45sCR5RtlFHMR4UwH9sdQ5TC8v0qDQCHnXt+kaKSTVE= +github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= github.com/leodido/go-urn v1.2.0 h1:hpXL4XnriNwQ/ABnpepYM/1vCLWNDfUNts8dX3xTG6Y= github.com/leodido/go-urn v1.2.0/go.mod h1:+8+nEpDfqqsY+g338gtMEUOtuK+4dEMhiQEgxpxOKII= github.com/lestrrat-go/envload v0.0.0-20180220234015-a3eb8ddeffcc h1:RKf14vYWi2ttpEmkA4aQ3j4u9dStX2t4M8UM6qqNsG8= @@ -128,7 +132,6 @@ github.com/tidwall/gjson v1.8.1 h1:8j5EE9Hrh3l9Od1OIEDAb7IpezNA20UdRngNAj5N0WU= github.com/tidwall/gjson v1.8.1/go.mod h1:5/xDoumyyDNerp2U36lyolv46b3uF/9Bu6OfyQ9GImk= github.com/tidwall/match v1.0.3 h1:FQUVvBImDutD8wJLN6c5eMzWtjgONK9MwIBCOrUJKeE= github.com/tidwall/match v1.0.3/go.mod h1:eRSPERbgtNPcGhD8UCthc6PmLEQXEWd3PRB5JTxsfmM= -github.com/tidwall/pretty v1.1.0 h1:K3hMW5epkdAVwibsQEfR/7Zj0Qgt4DxtNumTq/VloO8= github.com/tidwall/pretty v1.1.0/go.mod h1:XNkn88O1ChpSDQmQeStsy+sBenx6DDtFZJxhVysOjyk= github.com/tidwall/pretty v1.2.0 h1:RWIZEg2iJ8/g6fDDYzMpobmaoGh5OLl4AXtGUGPcqCs= github.com/tidwall/pretty v1.2.0/go.mod h1:ITEVvHYasfjBbM0u2Pg8T2nJnzm8xPwvNhhsoaGGjNU= @@ -229,8 +232,9 @@ google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp0 google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= google.golang.org/protobuf v1.27.1 h1:SnqbnDw1V7RiZcXPx5MEeqPv2s79L9i7BJUlG/+RurQ= google.golang.org/protobuf v1.27.1/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= -gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405 h1:yhCVgyC4o1eVCa2tZl7eS0r+SDo693bJlVdllGtEeKM= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15 h1:YR8cESwS4TdDjEe65xsg0ogRM/Nc3DYOhEAlW+xobZo= +gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/fsnotify.v1 v1.4.7 h1:xOHLXZwVvI9hhs+cLKq5+I5onOuwQLhQwiu63xxlHs4= gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys= gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 h1:uRGJdciOHaEIrze2W8Q3AKkepLTh2hOroT7a+7czfdQ= diff --git a/main.go b/main.go index b29e1fc..a6ec923 100644 --- a/main.go +++ b/main.go @@ -134,6 +134,15 @@ func main() { } } if terminal.RunningByDoubleClick() && !isFastStart { + err := terminal.NoMoreDoubleClick() + if err != nil { + log.Errorf("遇到错误: %v", err) + time.Sleep(time.Second * 5) + return + } + if runtime.GOOS == "windows" { + return + } log.Warning("警告: 强烈不推荐通过双击直接运行本程序, 这将导致一些非预料的后果.") log.Warning("将等待10s后启动") time.Sleep(time.Second * 10) diff --git a/server/scf.go b/server/scf.go index 5169967..b504e0e 100644 --- a/server/scf.go +++ b/server/scf.go @@ -157,8 +157,8 @@ func (c *lambdaClient) next() *http.Request { if resp.StatusCode != http.StatusOK { return nil } - var req = new(http.Request) - var invoke = new(lambdaInvoke) + req := new(http.Request) + invoke := new(lambdaInvoke) _ = json.NewDecoder(resp.Body).Decode(invoke) if invoke.HTTPMethod == "" { // 不是 api 网关 return nil