From 2d557676832eef964fc73168c69df65bd6536e77 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 8 Dec 2023 19:50:52 +0000 Subject: [PATCH 01/14] build(deps): bump github.com/spf13/viper from 1.18.0 to 1.18.1 Bumps [github.com/spf13/viper](https://github.com/spf13/viper) from 1.18.0 to 1.18.1. - [Release notes](https://github.com/spf13/viper/releases) - [Commits](https://github.com/spf13/viper/compare/v1.18.0...v1.18.1) --- updated-dependencies: - dependency-name: github.com/spf13/viper dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- go.mod | 2 +- go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index a891f93a..8f47995d 100644 --- a/go.mod +++ b/go.mod @@ -12,7 +12,7 @@ require ( github.com/quic-go/quic-go v0.40.0 github.com/redis/go-redis/v9 v9.3.0 github.com/sashabaranov/go-openai v1.17.9 - github.com/spf13/viper v1.18.0 + github.com/spf13/viper v1.18.1 github.com/stretchr/testify v1.8.4 go.uber.org/zap v1.26.0 golang.org/x/exp v0.0.0-20231006140011-7918f672742d diff --git a/go.sum b/go.sum index 865b7763..3725a920 100644 --- a/go.sum +++ b/go.sum @@ -447,8 +447,8 @@ github.com/spf13/jwalterweatherman v1.1.0/go.mod h1:aNWZUN0dPAAO/Ljvb5BEdw96iTZ0 github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA= github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= github.com/spf13/viper v1.13.0/go.mod h1:Icm2xNL3/8uyh/wFuB1jI7TiTNKp8632Nwegu+zgdYw= -github.com/spf13/viper v1.18.0 h1:pN6W1ub/G4OfnM+NR9p7xP9R6TltLUzp5JG9yZD3Qg0= -github.com/spf13/viper v1.18.0/go.mod h1:EKmWIqdnk5lOcmR72yw6hS+8OPYcwD0jteitLMVB+yk= +github.com/spf13/viper v1.18.1 h1:rmuU42rScKWlhhJDyXZRKJQHXFX02chSVW1IvkPGiVM= +github.com/spf13/viper v1.18.1/go.mod h1:EKmWIqdnk5lOcmR72yw6hS+8OPYcwD0jteitLMVB+yk= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= From 81cd7b37a434ca61678ff69c057ba216cdefe4d8 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 13 Dec 2023 19:38:59 +0000 Subject: [PATCH 02/14] build(deps): bump github.com/quic-go/quic-go from 0.40.0 to 0.40.1 Bumps [github.com/quic-go/quic-go](https://github.com/quic-go/quic-go) from 0.40.0 to 0.40.1. - [Release notes](https://github.com/quic-go/quic-go/releases) - [Changelog](https://github.com/quic-go/quic-go/blob/master/Changelog.md) - [Commits](https://github.com/quic-go/quic-go/compare/v0.40.0...v0.40.1) --- updated-dependencies: - dependency-name: github.com/quic-go/quic-go dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- go.mod | 2 +- go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index 8f47995d..6798c87f 100644 --- a/go.mod +++ b/go.mod @@ -9,7 +9,7 @@ require ( github.com/meilisearch/meilisearch-go v0.26.0 github.com/prometheus/client_golang v1.17.0 github.com/prometheus/common v0.45.0 - github.com/quic-go/quic-go v0.40.0 + github.com/quic-go/quic-go v0.40.1 github.com/redis/go-redis/v9 v9.3.0 github.com/sashabaranov/go-openai v1.17.9 github.com/spf13/viper v1.18.1 diff --git a/go.sum b/go.sum index 3725a920..8c028d50 100644 --- a/go.sum +++ b/go.sum @@ -413,8 +413,8 @@ github.com/quic-go/qpack v0.4.0 h1:Cr9BXA1sQS2SmDUWjSofMPNKmvF6IiIfDRmgU0w1ZCo= github.com/quic-go/qpack v0.4.0/go.mod h1:UZVnYIfi5GRk+zI9UMaCPsmZ2xKJP7XBUvVyT1Knj9A= github.com/quic-go/qtls-go1-20 v0.4.1 h1:D33340mCNDAIKBqXuAvexTNMUByrYmFYVfKfDN5nfFs= github.com/quic-go/qtls-go1-20 v0.4.1/go.mod h1:X9Nh97ZL80Z+bX/gUXMbipO6OxdiDi58b/fMC9mAL+k= -github.com/quic-go/quic-go v0.40.0 h1:GYd1iznlKm7dpHD7pOVpUvItgMPo/jrMgDWZhMCecqw= -github.com/quic-go/quic-go v0.40.0/go.mod h1:PeN7kuVJ4xZbxSv/4OX6S1USOX8MJvydwpTx31vx60c= +github.com/quic-go/quic-go v0.40.1 h1:X3AGzUNFs0jVuO3esAGnTfvdgvL4fq655WaOi1snv1Q= +github.com/quic-go/quic-go v0.40.1/go.mod h1:PeN7kuVJ4xZbxSv/4OX6S1USOX8MJvydwpTx31vx60c= github.com/redis/go-redis/v9 v9.3.0 h1:RiVDjmig62jIWp7Kk4XVLs0hzV6pI3PyTnnL0cnn0u0= github.com/redis/go-redis/v9 v9.3.0/go.mod h1:hdY0cQFCN4fnSYT6TkisLufl/4W5UIXyv0b/CLO2V2M= github.com/rogpeppe/fastuuid v1.2.0/go.mod h1:jVj6XXZzXRy/MSR5jhDC/2q6DgLz+nrA6LYCDYWNEvQ= From bf075ae8e1ea4b7b8c4b5e34cc068a489cea71c4 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 18 Dec 2023 19:27:40 +0000 Subject: [PATCH 03/14] build(deps): bump github.com/spf13/viper from 1.18.1 to 1.18.2 Bumps [github.com/spf13/viper](https://github.com/spf13/viper) from 1.18.1 to 1.18.2. - [Release notes](https://github.com/spf13/viper/releases) - [Commits](https://github.com/spf13/viper/compare/v1.18.1...v1.18.2) --- updated-dependencies: - dependency-name: github.com/spf13/viper dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- go.mod | 2 +- go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index 6798c87f..d2d41518 100644 --- a/go.mod +++ b/go.mod @@ -12,7 +12,7 @@ require ( github.com/quic-go/quic-go v0.40.1 github.com/redis/go-redis/v9 v9.3.0 github.com/sashabaranov/go-openai v1.17.9 - github.com/spf13/viper v1.18.1 + github.com/spf13/viper v1.18.2 github.com/stretchr/testify v1.8.4 go.uber.org/zap v1.26.0 golang.org/x/exp v0.0.0-20231006140011-7918f672742d diff --git a/go.sum b/go.sum index 8c028d50..140ccad5 100644 --- a/go.sum +++ b/go.sum @@ -447,8 +447,8 @@ github.com/spf13/jwalterweatherman v1.1.0/go.mod h1:aNWZUN0dPAAO/Ljvb5BEdw96iTZ0 github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA= github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= github.com/spf13/viper v1.13.0/go.mod h1:Icm2xNL3/8uyh/wFuB1jI7TiTNKp8632Nwegu+zgdYw= -github.com/spf13/viper v1.18.1 h1:rmuU42rScKWlhhJDyXZRKJQHXFX02chSVW1IvkPGiVM= -github.com/spf13/viper v1.18.1/go.mod h1:EKmWIqdnk5lOcmR72yw6hS+8OPYcwD0jteitLMVB+yk= +github.com/spf13/viper v1.18.2 h1:LUXCnvUvSM6FXAsj6nnfc8Q2tp1dIgUfY9Kc8GsSOiQ= +github.com/spf13/viper v1.18.2/go.mod h1:EKmWIqdnk5lOcmR72yw6hS+8OPYcwD0jteitLMVB+yk= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= From 3c004967909ec3ce73a69872e032c508cfb226af Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 19 Dec 2023 00:06:51 +0000 Subject: [PATCH 04/14] build(deps): bump golang.org/x/crypto from 0.16.0 to 0.17.0 Bumps [golang.org/x/crypto](https://github.com/golang/crypto) from 0.16.0 to 0.17.0. - [Commits](https://github.com/golang/crypto/compare/v0.16.0...v0.17.0) --- updated-dependencies: - dependency-name: golang.org/x/crypto dependency-type: indirect ... Signed-off-by: dependabot[bot] --- go.mod | 2 +- go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index 6798c87f..40ac5f4a 100644 --- a/go.mod +++ b/go.mod @@ -69,7 +69,7 @@ require ( github.com/valyala/fasthttp v1.50.0 // indirect go.uber.org/mock v0.3.0 // indirect go.uber.org/multierr v1.11.0 // indirect - golang.org/x/crypto v0.16.0 // indirect + golang.org/x/crypto v0.17.0 // indirect golang.org/x/mod v0.13.0 // indirect golang.org/x/sys v0.15.0 // indirect golang.org/x/tools v0.14.0 // indirect diff --git a/go.sum b/go.sum index 8c028d50..d412f706 100644 --- a/go.sum +++ b/go.sum @@ -526,8 +526,8 @@ golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5y golang.org/x/crypto v0.0.0-20211108221036-ceb1ce70b4fa/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/crypto v0.0.0-20220214200702-86341886e292/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= golang.org/x/crypto v0.0.0-20220411220226-7b82a4e95df4/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= -golang.org/x/crypto v0.16.0 h1:mMMrFzRSCF0GvB7Ne27XVtVAaXLrPmgPC7/v0tkwHaY= -golang.org/x/crypto v0.16.0/go.mod h1:gCAAfMLgwOJRpTjQ2zCCt2OcSfYMTeZVSRtQlPC7Nq4= +golang.org/x/crypto v0.17.0 h1:r8bRNjWL3GshPW3gkd+RpvzWrZAwPS49OmTGZ/uhM4k= +golang.org/x/crypto v0.17.0/go.mod h1:gCAAfMLgwOJRpTjQ2zCCt2OcSfYMTeZVSRtQlPC7Nq4= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8= From 571cc32d8ae63100c29117740e282b65cf81a620 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 20 Dec 2023 05:05:57 +0000 Subject: [PATCH 05/14] build(deps): bump github.com/redis/go-redis/v9 from 9.3.0 to 9.3.1 Bumps [github.com/redis/go-redis/v9](https://github.com/redis/go-redis) from 9.3.0 to 9.3.1. - [Release notes](https://github.com/redis/go-redis/releases) - [Changelog](https://github.com/redis/go-redis/blob/master/CHANGELOG.md) - [Commits](https://github.com/redis/go-redis/compare/v9.3.0...v9.3.1) --- updated-dependencies: - dependency-name: github.com/redis/go-redis/v9 dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- go.mod | 2 +- go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index 239b2b0e..0e5ad52e 100644 --- a/go.mod +++ b/go.mod @@ -10,7 +10,7 @@ require ( github.com/prometheus/client_golang v1.17.0 github.com/prometheus/common v0.45.0 github.com/quic-go/quic-go v0.40.1 - github.com/redis/go-redis/v9 v9.3.0 + github.com/redis/go-redis/v9 v9.3.1 github.com/sashabaranov/go-openai v1.17.9 github.com/spf13/viper v1.18.2 github.com/stretchr/testify v1.8.4 diff --git a/go.sum b/go.sum index 062d5197..4003f213 100644 --- a/go.sum +++ b/go.sum @@ -415,8 +415,8 @@ github.com/quic-go/qtls-go1-20 v0.4.1 h1:D33340mCNDAIKBqXuAvexTNMUByrYmFYVfKfDN5 github.com/quic-go/qtls-go1-20 v0.4.1/go.mod h1:X9Nh97ZL80Z+bX/gUXMbipO6OxdiDi58b/fMC9mAL+k= github.com/quic-go/quic-go v0.40.1 h1:X3AGzUNFs0jVuO3esAGnTfvdgvL4fq655WaOi1snv1Q= github.com/quic-go/quic-go v0.40.1/go.mod h1:PeN7kuVJ4xZbxSv/4OX6S1USOX8MJvydwpTx31vx60c= -github.com/redis/go-redis/v9 v9.3.0 h1:RiVDjmig62jIWp7Kk4XVLs0hzV6pI3PyTnnL0cnn0u0= -github.com/redis/go-redis/v9 v9.3.0/go.mod h1:hdY0cQFCN4fnSYT6TkisLufl/4W5UIXyv0b/CLO2V2M= +github.com/redis/go-redis/v9 v9.3.1 h1:KqdY8U+3X6z+iACvumCNxnoluToB+9Me+TvyFa21Mds= +github.com/redis/go-redis/v9 v9.3.1/go.mod h1:hdY0cQFCN4fnSYT6TkisLufl/4W5UIXyv0b/CLO2V2M= github.com/rogpeppe/fastuuid v1.2.0/go.mod h1:jVj6XXZzXRy/MSR5jhDC/2q6DgLz+nrA6LYCDYWNEvQ= github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= github.com/rogpeppe/go-internal v1.6.1/go.mod h1:xXDCJY+GAPziupqXw64V24skbSoqbTEfhy4qGm1nDQc= From 6ef139aa19c875542b3be977e4617fa6ac1202b5 Mon Sep 17 00:00:00 2001 From: Hugefiver Date: Tue, 19 Dec 2023 17:45:21 +0800 Subject: [PATCH 06/14] stage --- base/color_cie.go | 125 ++++++++++++++++++++++++++++++++++++++++++++++ go.mod | 3 ++ go.sum | 6 +++ util/utils.go | 7 +++ 4 files changed, 141 insertions(+) create mode 100644 base/color_cie.go diff --git a/base/color_cie.go b/base/color_cie.go new file mode 100644 index 00000000..95b36152 --- /dev/null +++ b/base/color_cie.go @@ -0,0 +1,125 @@ +package base + +import ( + "bytes" + "context" + "errors" + "fmt" + "image" + "image/jpeg" + "image/png" + "io" + "slices" + + "github.com/gabriel-vasile/mimetype" + "go.uber.org/zap" + "golang.org/x/image/webp" + . "gopkg.in/telebot.v3" + + "csust-got/log" + "csust-got/util" +) + +var availableImageMimeTypes = []string{ + "image/jpeg", + "image/png", + "image/webp", +} + +func getImgFileFromMsg(msg *Message) (*File, error) { + if msg.Photo != nil { + return &msg.Photo.File, nil + } else if msg.Sticker != nil { + return &msg.Sticker.File, nil + } else if msg.Document != nil { + return &msg.Document.File, nil + } else { + return nil, errors.New("no img/file in message") + } +} + +func checkMIMEType(mime *mimetype.MIME) bool { + if slices.Contains(availableImageMimeTypes, mime.String()) { + return true + } + return false +} + +func GenColorCIE(ctx Context) error { + msg := ctx.Message() + if msg.ReplyTo != nil { + msg = msg.ReplyTo + } + + if msg.Photo == nil && msg.Sticker == nil && msg.Document == nil { + return ctx.Reply("请发送一张图片或回复一张图片") + } + + replyMsg := util.SendReply(ctx.Recipient(), "正在处理中,请稍后……", ctx.Message()) + go func() { + cancelCtx, cancel := context.WithCancel(context.Background()) + errMsg := "" + defer func() { + if errMsg != "" { + errMsg = "处理失败: " + errMsg + util.EditMessage(replyMsg, errMsg) + } else if context.Canceled == cancelCtx.Err() { + util.EditMessage(replyMsg, "已取消") + } + cancel() + }() + + img, err := getImgFileFromMsg(msg) + if err != nil { + log.Error("get image file error", zap.Error(err)) + errMsg = "get image file error" + return + } + + // File size limit up to 5MB + if img.FileSize > 5*(2<<20) { + log.Error("file size too large", zap.Int64("file_size", img.FileSize)) + errMsg = "file size too large" + return + } + + wtr, err := util.GetFile(img) + if err != nil { + log.Error("get image file error", zap.Error(err)) + errMsg = "get image file error" + return + } + defer wtr.Close() + bs, err := io.ReadAll(wtr) + if err != nil { + log.Error("read image file error", zap.Error(err)) + errMsg = "read image file error" + return + } + mime := mimetype.Detect(bs) + if !checkMIMEType(mime) { + log.Error("invalid file type", zap.String("mime_type", mime.String())) + errMsg = "invalid file type" + return + } + + var decodeImg image.Image + switch mime.String() { + case "image/jpeg": + decodeImg, err = jpeg.Decode(bytes.NewReader(bs)) + case "image/png": + decodeImg, err = png.Decode(bytes.NewReader(bs)) + case "image/webp": + decodeImg, err = webp.Decode(bytes.NewReader(bs)) + default: + err = fmt.Errorf("unsupported mime type: %s", mime.String()) + } + if err != nil { + log.Error("decode image error", zap.Error(err)) + errMsg = "decode image error" + return + } + + // TODO + }() +} diff --git a/go.mod b/go.mod index 239b2b0e..7361fb8b 100644 --- a/go.mod +++ b/go.mod @@ -32,6 +32,7 @@ require ( github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f // indirect github.com/fsnotify/fsnotify v1.7.0 // indirect + github.com/gabriel-vasile/mimetype v1.4.3 // indirect github.com/go-task/slim-sprig v0.0.0-20230315185526-52ccab3ef572 // indirect github.com/golang-jwt/jwt/v4 v4.5.0 // indirect github.com/golang/protobuf v1.5.3 // indirect @@ -41,6 +42,7 @@ require ( github.com/josharian/intern v1.0.0 // indirect github.com/json-iterator/go v1.1.12 // indirect github.com/klauspost/compress v1.17.2 // indirect + github.com/lucasb-eyer/go-colorful v1.2.0 // indirect github.com/magiconair/properties v1.8.7 // indirect github.com/mailru/easyjson v0.7.7 // indirect github.com/matttproud/golang_protobuf_extensions/v2 v2.0.0 // indirect @@ -70,6 +72,7 @@ require ( go.uber.org/mock v0.3.0 // indirect go.uber.org/multierr v1.11.0 // indirect golang.org/x/crypto v0.17.0 // indirect + golang.org/x/image v0.14.0 // indirect golang.org/x/mod v0.13.0 // indirect golang.org/x/sys v0.15.0 // indirect golang.org/x/tools v0.14.0 // indirect diff --git a/go.sum b/go.sum index 062d5197..9d2261c9 100644 --- a/go.sum +++ b/go.sum @@ -134,6 +134,8 @@ github.com/frankban/quicktest v1.14.6/go.mod h1:4ptaffx2x8+WTWXmUCuVU6aPUX1/Mz7z github.com/fsnotify/fsnotify v1.5.4/go.mod h1:OVB6XrOHzAwXMpEM7uPOzcehqUV2UqJxmVXmkdnm1bU= github.com/fsnotify/fsnotify v1.7.0 h1:8JEhPFa5W2WU7YfeZzPNqzMP6Lwt7L2715Ggo0nosvA= github.com/fsnotify/fsnotify v1.7.0/go.mod h1:40Bi/Hjc2AVfZrqy+aj+yEI+/bRxZnMJyTJwOpGvigM= +github.com/gabriel-vasile/mimetype v1.4.3 h1:in2uUcidCuFcDKtdcBxlR0rJ1+fsokWf+uqxgUFjbI0= +github.com/gabriel-vasile/mimetype v1.4.3/go.mod h1:d8uq/6HKRL6CGdk+aubisF/M5GcPfT7nKyLpA0lbSSk= github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU= github.com/go-gl/glfw/v3.3/glfw v0.0.0-20191125211704-12ad95a8df72/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= @@ -321,6 +323,8 @@ github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= github.com/leodido/go-urn v1.2.0/go.mod h1:+8+nEpDfqqsY+g338gtMEUOtuK+4dEMhiQEgxpxOKII= +github.com/lucasb-eyer/go-colorful v1.2.0 h1:1nnpGOrhyZZuNyfu1QjKiUICQ74+3FNCN69Aj6K7nkY= +github.com/lucasb-eyer/go-colorful v1.2.0/go.mod h1:R4dSotOR9KMtayYi1e77YzuveK+i7ruzyGqttikkLy0= github.com/magiconair/properties v1.8.6/go.mod h1:y3VJvCyxH9uVvJTWEGAELF3aiYNyPKd5NZ3oSwXrF60= github.com/magiconair/properties v1.8.7 h1:IeQXZAiQcpL9mgcAe1Nu6cX9LLw6ExEHKjN0VQdvPDY= github.com/magiconair/properties v1.8.7/go.mod h1:Dhd985XPs7jluiymwWYZ0G4Z61jb3vdS329zhj2hYo0= @@ -542,6 +546,8 @@ golang.org/x/exp v0.0.0-20231006140011-7918f672742d h1:jtJma62tbqLibJ5sFQz8bKtEM golang.org/x/exp v0.0.0-20231006140011-7918f672742d/go.mod h1:ldy0pHrwJyGW56pPQzzkH36rKxoZW1tw7ZJpeKx+hdo= golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js= golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= +golang.org/x/image v0.14.0 h1:tNgSxAFe3jC4uYqvZdTr84SZoM1KfwdC9SKIFrLjFn4= +golang.org/x/image v0.14.0/go.mod h1:HUYqC05R2ZcZ3ejNQsIHQDQiwWM4JBqmm6MKANTp4LE= golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU= golang.org/x/lint v0.0.0-20190301231843-5614ed5bae6f/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= diff --git a/util/utils.go b/util/utils.go index 4bd0efb3..ef3e240d 100644 --- a/util/utils.go +++ b/util/utils.go @@ -2,6 +2,8 @@ package util import ( "encoding/json" + "fmt" + "io" "math/rand" "net/http" "regexp" @@ -99,6 +101,11 @@ func DeleteMessage(m *tb.Message) { } } +// GetFile get file from telegram. +func GetFile(file *tb.File) (io.ReadCloser, error) { + return config.BotConfig.Bot.File(file) +} + // GetName can get user's name. func GetName(user *tb.User) string { name := user.FirstName From e82cc84c6cc73b2dfe177b8a917a0d278467e50a Mon Sep 17 00:00:00 2001 From: Hugefiver Date: Thu, 21 Dec 2023 11:25:35 +0800 Subject: [PATCH 07/14] add color CIE plot --- base/color_cie.go | 83 ++++++++++++++++++++++++++++++++++++++++++++++- go.mod | 13 ++++++-- go.sum | 31 ++++++++++++++++-- main.go | 3 ++ util/utils.go | 1 - 5 files changed, 124 insertions(+), 7 deletions(-) diff --git a/base/color_cie.go b/base/color_cie.go index 95b36152..11bc8fd6 100644 --- a/base/color_cie.go +++ b/base/color_cie.go @@ -6,14 +6,22 @@ import ( "errors" "fmt" "image" + "image/color" "image/jpeg" "image/png" "io" "slices" + "time" "github.com/gabriel-vasile/mimetype" "go.uber.org/zap" "golang.org/x/image/webp" + "gonum.org/v1/plot" + "gonum.org/v1/plot/plotter" + "gonum.org/v1/plot/vg" + "gonum.org/v1/plot/vg/draw" + "gonum.org/v1/plot/vg/vgimg" + "gopkg.in/telebot.v3" . "gopkg.in/telebot.v3" "csust-got/log" @@ -120,6 +128,79 @@ func GenColorCIE(ctx Context) error { return } - // TODO + out, err := plotCIEDiagram(decodeImg) + if err != nil { + log.Error("plot CIE diagram error", zap.Error(err)) + errMsg = "plot CIE diagram error" + return + } + + _, err = util.EditMessageWithError(replyMsg, telebot.Photo{File: telebot.FromReader(bytes.NewReader(out))}) + if err != nil { + log.Error("send image error", zap.Error(err)) + errMsg = "send image error" + return + } }() + + return nil +} + +func plotCIEDiagram(img image.Image) ([]byte, error) { + startTime := time.Now() + + bound := img.Bounds() + width := bound.Dx() + height := bound.Dy() + pixels := make([]color.Color, width*height) + for i := 0; i < width; i++ { + for j := 0; j < height; j++ { + pix := img.At(i, j) + pixels[i*width+j] = pix + } + } + + diag := plot.New() + diag.Title.Text = "CIE 1931 Chromaticity Diagram" + diag.X.Label.Text = "CIE x" + diag.Y.Label.Text = "CIE y" + diag.X.Min = 0 + diag.X.Max = 1 + diag.Y.Min = 0 + diag.Y.Max = 1 + + const imgW = 500 + const imgH = 500 + cv := image.NewRGBA(image.Rect(0, 0, imgW, imgH)) + for _, pix := range pixels { + rr, gg, bb, aa := pix.RGBA() + if aa == 0 { + continue + } + r := float32(rr * 0xffff / aa) + g := float32(gg * 0xffff / aa) + b := float32(bb * 0xffff / aa) + + x := r / (r + g + b) + y := g / (r + g + b) + + cv.Set(int(x*imgW), int(y*imgH), pix) + } + + diag.Add(plotter.NewImage(cv, 0, 0, 1, 1)) + + cvImg := vgimg.New(vg.Points(float64(imgW)), vg.Points(float64(imgH))) + dc := draw.New(cvImg) + dc = draw.Crop(dc, 0, -vg.Centimeter, 0, 0) + diag.Draw(dc) + + output := bytes.NewBuffer([]byte{}) + if _, err := (vgimg.PngCanvas{Canvas: cvImg}).WriteTo(output); err != nil { + log.Error("write image error", zap.Error(err)) + return nil, err + } + + processTime := time.Now().Sub(startTime) + log.Info("CIE process time", zap.Duration("process-time", processTime), zap.Int("width", width), zap.Int("height", height)) + return output.Bytes(), nil } diff --git a/go.mod b/go.mod index 7361fb8b..595512ec 100644 --- a/go.mod +++ b/go.mod @@ -3,6 +3,7 @@ module csust-got go 1.21 require ( + github.com/gabriel-vasile/mimetype v1.4.3 github.com/google/go-github/v35 v35.3.0 github.com/huichen/sego v0.0.0-20210824061530-c87651ea5c76 github.com/iyear/biligo v0.1.7 @@ -16,25 +17,33 @@ require ( github.com/stretchr/testify v1.8.4 go.uber.org/zap v1.26.0 golang.org/x/exp v0.0.0-20231006140011-7918f672742d + golang.org/x/image v0.14.0 golang.org/x/net v0.19.0 golang.org/x/oauth2 v0.15.0 golang.org/x/text v0.14.0 golang.org/x/time v0.5.0 + gonum.org/v1/plot v0.14.0 gopkg.in/telebot.v3 v3.2.1 mvdan.cc/xurls/v2 v2.5.0 ) require ( + git.sr.ht/~sbinet/gg v0.5.0 // indirect github.com/adamzy/cedar-go v0.0.0-20170805034717-80a9c64b256d // indirect + github.com/ajstarks/svgo v0.0.0-20211024235047-1546f124cd8b // indirect github.com/andybalholm/brotli v1.0.6 // indirect github.com/beorn7/perks v1.0.1 // indirect + github.com/campoy/embedmd v1.0.0 // indirect github.com/cespare/xxhash/v2 v2.2.0 // indirect github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f // indirect github.com/fsnotify/fsnotify v1.7.0 // indirect - github.com/gabriel-vasile/mimetype v1.4.3 // indirect + github.com/go-fonts/liberation v0.3.1 // indirect + github.com/go-latex/latex v0.0.0-20230307184459-12ec69307ad9 // indirect + github.com/go-pdf/fpdf v0.8.0 // indirect github.com/go-task/slim-sprig v0.0.0-20230315185526-52ccab3ef572 // indirect github.com/golang-jwt/jwt/v4 v4.5.0 // indirect + github.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0 // indirect github.com/golang/protobuf v1.5.3 // indirect github.com/google/go-querystring v1.1.0 // indirect github.com/google/pprof v0.0.0-20231101202521-4ca4178f5c7a // indirect @@ -42,7 +51,6 @@ require ( github.com/josharian/intern v1.0.0 // indirect github.com/json-iterator/go v1.1.12 // indirect github.com/klauspost/compress v1.17.2 // indirect - github.com/lucasb-eyer/go-colorful v1.2.0 // indirect github.com/magiconair/properties v1.8.7 // indirect github.com/mailru/easyjson v0.7.7 // indirect github.com/matttproud/golang_protobuf_extensions/v2 v2.0.0 // indirect @@ -72,7 +80,6 @@ require ( go.uber.org/mock v0.3.0 // indirect go.uber.org/multierr v1.11.0 // indirect golang.org/x/crypto v0.17.0 // indirect - golang.org/x/image v0.14.0 // indirect golang.org/x/mod v0.13.0 // indirect golang.org/x/sys v0.15.0 // indirect golang.org/x/tools v0.14.0 // indirect diff --git a/go.sum b/go.sum index 9d2261c9..b6cc8262 100644 --- a/go.sum +++ b/go.sum @@ -54,6 +54,10 @@ cloud.google.com/go/storage v1.8.0/go.mod h1:Wv1Oy7z6Yz3DshWRJFhqM/UCfaWIRTdp0RX cloud.google.com/go/storage v1.10.0/go.mod h1:FLPqc6j+Ki4BU591ie1oL6qBQGu2Bl/tZ9ullr3+Kg0= cloud.google.com/go/storage v1.14.0/go.mod h1:GrKmX003DSIwi9o29oFT7YDnHYwZoctc3fOKtUw0Xmo= dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU= +git.sr.ht/~sbinet/cmpimg v0.1.0 h1:E0zPRk2muWuCqSKSVZIWsgtU9pjsw3eKHi8VmQeScxo= +git.sr.ht/~sbinet/cmpimg v0.1.0/go.mod h1:FU12psLbF4TfNXkKH2ZZQ29crIqoiqTZmeQ7dkp/pxE= +git.sr.ht/~sbinet/gg v0.5.0 h1:6V43j30HM623V329xA9Ntq+WJrMjDxRjuAB1LFWF5m8= +git.sr.ht/~sbinet/gg v0.5.0/go.mod h1:G2C0eRESqlKhS7ErsNey6HHrqU1PwsnCQlekFi9Q2Oo= github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= github.com/DataDog/datadog-go v3.2.0+incompatible/go.mod h1:LButxg5PwREeZtORoXG3tL4fMGNddJ+vMq1mwgfaqoQ= @@ -61,6 +65,10 @@ github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAE github.com/adamzy/cedar-go v0.0.0-20170805034717-80a9c64b256d h1:ir/IFJU5xbja5UaBEQLjcvn7aAU01nqU/NUyOBEU+ew= github.com/adamzy/cedar-go v0.0.0-20170805034717-80a9c64b256d/go.mod h1:PRWNwWq0yifz6XDPZu48aSld8BWwBfr2JKB2bGWiEd4= github.com/adamzy/sego v0.0.0-20151004184924-5eab9a44f8e8/go.mod h1:KQxo+Xesl2wLJ3yJcX443KaoWzXpbPzU1GNRyE8kNEY= +github.com/ajstarks/deck v0.0.0-20200831202436-30c9fc6549a9/go.mod h1:JynElWSGnm/4RlzPXRlREEwqTHAN3T56Bv2ITsFT3gY= +github.com/ajstarks/deck/generate v0.0.0-20210309230005-c3f852c02e19/go.mod h1:T13YZdzov6OU0A1+RfKZiZN9ca6VeKdBdyDV+BY97Tk= +github.com/ajstarks/svgo v0.0.0-20211024235047-1546f124cd8b h1:slYM766cy2nI3BwyRiyQj/Ud48djTMtMebDqepE95rw= +github.com/ajstarks/svgo v0.0.0-20211024235047-1546f124cd8b/go.mod h1:1KcenG0jGWcpt8ov532z81sp/kMMUG485J2InIOyADM= github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= @@ -84,6 +92,8 @@ github.com/bsm/ginkgo/v2 v2.12.0 h1:Ny8MWAHyOepLGlLKYmXG4IEkioBysk6GpaRTLC8zwWs= github.com/bsm/ginkgo/v2 v2.12.0/go.mod h1:SwYbGRRDovPVboqFv0tPTcG1sN61LM1Z4ARdbAV9g4c= github.com/bsm/gomega v1.27.10 h1:yeMWxP2pV2fG3FgAODIY8EiRE3dy0aeFYt4l7wh6yKA= github.com/bsm/gomega v1.27.10/go.mod h1:JyEr/xRbxbtgWNi8tIEVPUYZ5Dzef52k01W3YH0H+O0= +github.com/campoy/embedmd v1.0.0 h1:V4kI2qTJJLf4J29RzI/MAt2c3Bl4dQSYPuflzwFH2hY= +github.com/campoy/embedmd v1.0.0/go.mod h1:oxyr9RCiSXg0M3VJ3ks0UGfp98BpSSGr0kpiX3MzVl8= github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc= github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= @@ -137,17 +147,27 @@ github.com/fsnotify/fsnotify v1.7.0/go.mod h1:40Bi/Hjc2AVfZrqy+aj+yEI+/bRxZnMJyT github.com/gabriel-vasile/mimetype v1.4.3 h1:in2uUcidCuFcDKtdcBxlR0rJ1+fsokWf+uqxgUFjbI0= github.com/gabriel-vasile/mimetype v1.4.3/go.mod h1:d8uq/6HKRL6CGdk+aubisF/M5GcPfT7nKyLpA0lbSSk= github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= +github.com/go-fonts/dejavu v0.1.0 h1:JSajPXURYqpr+Cu8U9bt8K+XcACIHWqWrvWCKyeFmVQ= +github.com/go-fonts/dejavu v0.1.0/go.mod h1:4Wt4I4OU2Nq9asgDCteaAaWZOV24E+0/Pwo0gppep4g= +github.com/go-fonts/latin-modern v0.3.1 h1:/cT8A7uavYKvglYXvrdDw4oS5ZLkcOU22fa2HJ1/JVM= +github.com/go-fonts/latin-modern v0.3.1/go.mod h1:ysEQXnuT/sCDOAONxC7ImeEDVINbltClhasMAqEtRK0= +github.com/go-fonts/liberation v0.3.1 h1:9RPT2NhUpxQ7ukUvz3jeUckmN42T9D9TpjtQcqK/ceM= +github.com/go-fonts/liberation v0.3.1/go.mod h1:jdJ+cqF+F4SUL2V+qxBth8fvBpBDS7yloUL5Fi8GTGY= github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU= github.com/go-gl/glfw/v3.3/glfw v0.0.0-20191125211704-12ad95a8df72/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= github.com/go-gl/glfw/v3.3/glfw v0.0.0-20200222043503-6f7a984d4dc4/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= github.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= github.com/go-kit/kit v0.9.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= github.com/go-kit/log v0.1.0/go.mod h1:zbhenjAZHb184qTLMA9ZjW7ThYL0H2mk7Q6pNt4vbaY= +github.com/go-latex/latex v0.0.0-20230307184459-12ec69307ad9 h1:NxXI5pTAtpEaU49bpLpQoDsu1zrteW/vxzTz8Cd2UAs= +github.com/go-latex/latex v0.0.0-20230307184459-12ec69307ad9/go.mod h1:gWuR/CrFDDeVRFQwHPvsv9soJVB/iqymhuZQuJ3a9OM= github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE= github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk= github.com/go-logfmt/logfmt v0.5.0/go.mod h1:wCYkCAKZfumFQihp8CzCvQ3paCTfi41vtzG1KdI/P7A= github.com/go-logr/logr v1.2.4 h1:g01GSCwiDw2xSZfjJ2/T9M+S6pFdcNtFYsp+Y43HYDQ= github.com/go-logr/logr v1.2.4/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= +github.com/go-pdf/fpdf v0.8.0 h1:IJKpdaagnWUeSkUFUjTcSzTppFxmv8ucGQyNPQWxYOQ= +github.com/go-pdf/fpdf v0.8.0/go.mod h1:gfqhcNwXrsd3XYKte9a7vM3smvU/jB4ZRDrmWSxpfdc= github.com/go-playground/assert/v2 v2.0.1/go.mod h1:VDjEfimB/XKnb+ZQfWdccd7VUvScMdVu0Titje2rxJ4= github.com/go-playground/locales v0.13.0/go.mod h1:taPMhCMXrRLJO55olJkUXHZBHCxTMfnGwq/HNwmWNS8= github.com/go-playground/universal-translator v0.17.0/go.mod h1:UkSxE5sNxxRwHyU+Scu5vgOQjsIJAF8j9muTVoKLVtA= @@ -161,6 +181,8 @@ github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7a github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= github.com/golang-jwt/jwt/v4 v4.5.0 h1:7cYmW1XlMY7h7ii7UhUyChSgS5wUJEnm9uZVTGqOWzg= github.com/golang-jwt/jwt/v4 v4.5.0/go.mod h1:m21LjoU+eqJr34lmDMbreY2eSTRJ1cv77w39/MY0Ch0= +github.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0 h1:DACJavvAHhabrF08vX0COfcOBJRhZ8lUbR+ZWIs0Y5g= +github.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0/go.mod h1:E/TSTwGwJL78qG/PmXZO1EjYhfJinVAhrmmHX6Z8B9k= github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/groupcache v0.0.0-20191227052852-215e87163ea7/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= @@ -323,8 +345,6 @@ github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= github.com/leodido/go-urn v1.2.0/go.mod h1:+8+nEpDfqqsY+g338gtMEUOtuK+4dEMhiQEgxpxOKII= -github.com/lucasb-eyer/go-colorful v1.2.0 h1:1nnpGOrhyZZuNyfu1QjKiUICQ74+3FNCN69Aj6K7nkY= -github.com/lucasb-eyer/go-colorful v1.2.0/go.mod h1:R4dSotOR9KMtayYi1e77YzuveK+i7ruzyGqttikkLy0= github.com/magiconair/properties v1.8.6/go.mod h1:y3VJvCyxH9uVvJTWEGAELF3aiYNyPKd5NZ3oSwXrF60= github.com/magiconair/properties v1.8.7 h1:IeQXZAiQcpL9mgcAe1Nu6cX9LLw6ExEHKjN0VQdvPDY= github.com/magiconair/properties v1.8.7/go.mod h1:Dhd985XPs7jluiymwWYZ0G4Z61jb3vdS329zhj2hYo0= @@ -823,6 +843,10 @@ golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8T golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20220411194840-2f41105eb62f/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20220517211312-f3a8303e98df/go.mod h1:K8+ghG5WaK9qNqU5K3HdILfMLy1f3aNYFI/wnl100a8= +gonum.org/v1/gonum v0.14.0 h1:2NiG67LD1tEH0D7kM+ps2V+fXmsAnpUeec7n8tcr4S0= +gonum.org/v1/gonum v0.14.0/go.mod h1:AoWeoz0becf9QMWtE8iWXNXc27fK4fNeHNf/oMejGfU= +gonum.org/v1/plot v0.14.0 h1:+LBDVFYwFe4LHhdP8coW6296MBEY4nQ+Y4vuUpJopcE= +gonum.org/v1/plot v0.14.0/go.mod h1:MLdR9424SJed+5VqC6MsouEpig9pZX2VZ57H9ko2bXU= google.golang.org/api v0.4.0/go.mod h1:8k5glujaEP+g9n7WNsDg8QP6cUVNI86fCNMcbazEtwE= google.golang.org/api v0.7.0/go.mod h1:WtwebWUNSVBH/HAw79HIFXZNqEvBhG+Ra+ax0hx3E3M= google.golang.org/api v0.8.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg= @@ -1027,9 +1051,12 @@ honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWh honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg= honnef.co/go/tools v0.0.1-2020.1.3/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= honnef.co/go/tools v0.0.1-2020.1.4/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= +honnef.co/go/tools v0.1.3/go.mod h1:NgwopIslSNH47DimFoV78dnkksY2EFtX0ajyb3K/las= mvdan.cc/xurls/v2 v2.5.0 h1:lyBNOm8Wo71UknhUs4QTFUNNMyxy2JEIaKKo0RWOh+8= mvdan.cc/xurls/v2 v2.5.0/go.mod h1:yQgaGQ1rFtJUzkmKiHYSSfuQxqfYmd//X6PxvholpeE= rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8= +rsc.io/pdf v0.1.1 h1:k1MczvYDUvJBe93bYd7wrZLLUEcLZAuF824/I4e5Xr4= +rsc.io/pdf v0.1.1/go.mod h1:n8OzWcQ6Sp37PL01nO98y4iUCRdTGarVfzxY20ICaU4= rsc.io/quote/v3 v3.1.0/go.mod h1:yEA65RcK8LyAZtP9Kv3t0HmxON59tX3rD+tICJqUlj0= rsc.io/sampler v1.3.0/go.mod h1:T1hPZKmBbMNahiBKFy5HrXp6adAjACjK9JXDnKaTXpA= sigs.k8s.io/yaml v1.2.0/go.mod h1:yfXDCHCao9+ENCvLSE62v9VSji2MKu5jeNfTrofGhJc= diff --git a/main.go b/main.go index ff537da7..95b1a116 100644 --- a/main.go +++ b/main.go @@ -175,6 +175,9 @@ func registerBaseHandler(bot *Bot) { bot.Handle("/gacha_setting", gacha.SetGachaHandle) bot.Handle("/gacha", gacha.WithMsgRpl) + // CIE handler + bot.Handle("/cie", base.GenColorCIE) + // custom regexp handler bot.Handle(OnText, customHandler) } diff --git a/util/utils.go b/util/utils.go index ef3e240d..3d9d754c 100644 --- a/util/utils.go +++ b/util/utils.go @@ -2,7 +2,6 @@ package util import ( "encoding/json" - "fmt" "io" "math/rand" "net/http" From 5b8e074982205ad2d0e4c8a478c588b022aab388 Mon Sep 17 00:00:00 2001 From: Hugefiver Date: Thu, 21 Dec 2023 12:31:02 +0800 Subject: [PATCH 08/14] fix lint issue --- .golangci.yaml | 1 + base/color_cie.go | 31 ++++++++++++++++--------------- base/genshin_voice.go | 28 ++++++++++++++++------------ config/config_test.go | 1 + 4 files changed, 34 insertions(+), 27 deletions(-) diff --git a/.golangci.yaml b/.golangci.yaml index 98161156..b07c59d1 100644 --- a/.golangci.yaml +++ b/.golangci.yaml @@ -498,6 +498,7 @@ linters-settings: - github.com/google/go-github - github.com/prometheus/common - github.com/prometheus/client_golang + - github.com/gabriel-vasile/mimetype # Packages that are not allowed where the value is a suggestion. deny: # - pkg: "github.com/sirupsen/logrus" diff --git a/base/color_cie.go b/base/color_cie.go index 11bc8fd6..d7946970 100644 --- a/base/color_cie.go +++ b/base/color_cie.go @@ -21,7 +21,6 @@ import ( "gonum.org/v1/plot/vg" "gonum.org/v1/plot/vg/draw" "gonum.org/v1/plot/vg/vgimg" - "gopkg.in/telebot.v3" . "gopkg.in/telebot.v3" "csust-got/log" @@ -34,25 +33,27 @@ var availableImageMimeTypes = []string{ "image/webp", } +var errNoImgFile = errors.New("no img/file in message") +var errUnsupportedImgType = errors.New("unsupported image type") + func getImgFileFromMsg(msg *Message) (*File, error) { - if msg.Photo != nil { + switch { + case msg.Photo != nil: return &msg.Photo.File, nil - } else if msg.Sticker != nil { + case msg.Sticker != nil: return &msg.Sticker.File, nil - } else if msg.Document != nil { + case msg.Document != nil: return &msg.Document.File, nil - } else { - return nil, errors.New("no img/file in message") + default: + return nil, errNoImgFile } } func checkMIMEType(mime *mimetype.MIME) bool { - if slices.Contains(availableImageMimeTypes, mime.String()) { - return true - } - return false + return slices.Contains(availableImageMimeTypes, mime.String()) } +// GenColorCIE generate CIE diagram from image reply by message func GenColorCIE(ctx Context) error { msg := ctx.Message() if msg.ReplyTo != nil { @@ -71,7 +72,7 @@ func GenColorCIE(ctx Context) error { if errMsg != "" { errMsg = "处理失败: " + errMsg util.EditMessage(replyMsg, errMsg) - } else if context.Canceled == cancelCtx.Err() { + } else if errors.Is(cancelCtx.Err(), context.Canceled) { util.EditMessage(replyMsg, "已取消") } cancel() @@ -97,7 +98,7 @@ func GenColorCIE(ctx Context) error { errMsg = "get image file error" return } - defer wtr.Close() + defer func() { _ = wtr.Close() }() bs, err := io.ReadAll(wtr) if err != nil { log.Error("read image file error", zap.Error(err)) @@ -120,7 +121,7 @@ func GenColorCIE(ctx Context) error { case "image/webp": decodeImg, err = webp.Decode(bytes.NewReader(bs)) default: - err = fmt.Errorf("unsupported mime type: %s", mime.String()) + err = fmt.Errorf("%w: %s", errUnsupportedImgType, mime.String()) } if err != nil { log.Error("decode image error", zap.Error(err)) @@ -135,7 +136,7 @@ func GenColorCIE(ctx Context) error { return } - _, err = util.EditMessageWithError(replyMsg, telebot.Photo{File: telebot.FromReader(bytes.NewReader(out))}) + _, err = util.EditMessageWithError(replyMsg, Photo{File: FromReader(bytes.NewReader(out))}) if err != nil { log.Error("send image error", zap.Error(err)) errMsg = "send image error" @@ -200,7 +201,7 @@ func plotCIEDiagram(img image.Image) ([]byte, error) { return nil, err } - processTime := time.Now().Sub(startTime) + processTime := time.Since(startTime) log.Info("CIE process time", zap.Duration("process-time", processTime), zap.Int("width", width), zap.Int("height", height)) return output.Bytes(), nil } diff --git a/base/genshin_voice.go b/base/genshin_voice.go index 0ababb89..e4039bac 100644 --- a/base/genshin_voice.go +++ b/base/genshin_voice.go @@ -44,6 +44,10 @@ type genShinVoiceV3 struct { Text string `json:"text"` } +const msgVoiceNotFoundAndArgs = "没有找到对应的语音,参数:\n" +const msgVoiceApiServerResponError = "语音api服务器返回异常" +const msgFailedToConnectApiServer = "连接语音api服务器失败" + // GetVoice (v1版本)从api服务器拿到语音的url以及其他信息,并发送为tg的voice信息 func GetVoice(ctx Context) error { m := ctx.Message() @@ -89,8 +93,8 @@ func GetVoiceV2(ctx Context) error { resp, err := http.Get(serverAddress + "/GetVoice/v2" + arg) if err != nil { - log.Error("连接语音api服务器失败", zap.Error(err)) - err := SendErrVoice(m.Chat, "连接语音api服务器失败") + log.Error(msgFailedToConnectApiServer, zap.Error(err)) + err := SendErrVoice(m.Chat, msgFailedToConnectApiServer) return err } @@ -111,8 +115,8 @@ func GetVoiceV2(ctx Context) error { body, _ := io.ReadAll(resp.Body) if resp.StatusCode != 200 { - log.Error("语音api服务器返回异常", zap.Int("status", resp.StatusCode), zap.String("body", string(body))) - err := SendErrVoice(m.Chat, "没有找到对应的语音,参数:\n"+strings.Join(debugMsg, "\n")) + log.Error(msgVoiceApiServerResponError, zap.Int("status", resp.StatusCode), zap.String("body", string(body))) + err := SendErrVoice(m.Chat, msgVoiceNotFoundAndArgs+strings.Join(debugMsg, "\n")) return err } err = json.Unmarshal(body, &data) @@ -142,8 +146,8 @@ func GetVoiceV3(ctx Context) error { resp, err := http.Get(serverAddress) if err != nil { - log.Error("连接语音api服务器失败", zap.Error(err)) - err := SendErrVoice(m.Chat, "连接语音api服务器失败") + log.Error(msgFailedToConnectApiServer, zap.Error(err)) + err := SendErrVoice(m.Chat, msgFailedToConnectApiServer) return err } @@ -164,8 +168,8 @@ func GetVoiceV3(ctx Context) error { body, _ := io.ReadAll(resp.Body) if resp.StatusCode != 200 { - log.Error("语音api服务器返回异常", zap.Int("status", resp.StatusCode), zap.String("body", string(body))) - err := SendErrVoice(m.Chat, "没有找到对应的语音,参数:\n"+strings.Join(debugMsg, "\n")) + log.Error(msgVoiceApiServerResponError, zap.Int("status", resp.StatusCode), zap.String("body", string(body))) + err := SendErrVoice(m.Chat, msgVoiceNotFoundAndArgs+strings.Join(debugMsg, "\n")) return err } err = json.Unmarshal(body, &data) @@ -198,8 +202,8 @@ func GetVoiceV3Pro(ctx Context) error { resp, err := http.PostForm(serverAddress, values) if err != nil { - log.Error("连接语音api服务器失败", zap.Error(err)) - err := SendErrVoice(m.Chat, "连接语音api服务器失败") + log.Error(msgFailedToConnectApiServer, zap.Error(err)) + err := SendErrVoice(m.Chat, msgFailedToConnectApiServer) return err } @@ -220,8 +224,8 @@ func GetVoiceV3Pro(ctx Context) error { body, _ := io.ReadAll(resp.Body) if resp.StatusCode != 200 { - log.Error("语音api服务器返回异常", zap.Int("status", resp.StatusCode), zap.String("body", string(body))) - err := SendErrVoice(m.Chat, "没有找到对应的语音,参数:\n"+strings.Join(debugMsg, "\n")) + log.Error(msgVoiceApiServerResponError, zap.Int("status", resp.StatusCode), zap.String("body", string(body))) + err := SendErrVoice(m.Chat, msgVoiceNotFoundAndArgs+strings.Join(debugMsg, "\n")) return err } err = json.Unmarshal(body, &data) diff --git a/config/config_test.go b/config/config_test.go index 1ba505bb..ccc80d50 100644 --- a/config/config_test.go +++ b/config/config_test.go @@ -48,6 +48,7 @@ func TestReadConfigFile(t *testing.T) { req.Empty(BotConfig.RedisConfig.RedisPass) } +// nolint:goconst func TestReadEnv(t *testing.T) { req := testInit(t) From 8cebeb0e614e0169545ceef8f970f55b9d026119 Mon Sep 17 00:00:00 2001 From: Hugefiver Date: Thu, 21 Dec 2023 12:34:37 +0800 Subject: [PATCH 09/14] update go version to 1.21 --- .github/workflows/go-build.yml | 2 +- .github/workflows/lint.yml | 2 +- .github/workflows/test.yml | 2 +- Dockerfile | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/.github/workflows/go-build.yml b/.github/workflows/go-build.yml index 10238cf4..651810a8 100644 --- a/.github/workflows/go-build.yml +++ b/.github/workflows/go-build.yml @@ -28,7 +28,7 @@ jobs: - name: Setup Go uses: actions/setup-go@v3 with: - go-version: ^1.20 + go-version: ^1.21 - name: Get source uses: actions/checkout@v3 diff --git a/.github/workflows/lint.yml b/.github/workflows/lint.yml index 32c5a172..e6d9a054 100644 --- a/.github/workflows/lint.yml +++ b/.github/workflows/lint.yml @@ -14,7 +14,7 @@ jobs: - name: Setup Go uses: actions/setup-go@v3 with: - go-version: ^1.20 + go-version: ^1.21 - name: golangci-lint uses: golangci/golangci-lint-action@v3 diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 4c5f33c4..7af53f1a 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -16,7 +16,7 @@ jobs: - name: Setup Go uses: actions/setup-go@v3 with: - go-version: ^1.20 + go-version: ^1.21 - name: Get source uses: actions/checkout@v3 diff --git a/Dockerfile b/Dockerfile index 255c26fc..01208ae3 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,5 +1,5 @@ # build -FROM --platform=$BUILDPLATFORM golang:1.20-alpine AS buildenv +FROM --platform=$BUILDPLATFORM golang:1.21-alpine AS buildenv ARG TARGETARCH RUN apk add make git tzdata From 2571011295da9b35072061a8212867d0bbe5fc90 Mon Sep 17 00:00:00 2001 From: Hugefiver Date: Thu, 21 Dec 2023 12:56:37 +0800 Subject: [PATCH 10/14] fix --- base/color_cie.go | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/base/color_cie.go b/base/color_cie.go index d7946970..b5056a5d 100644 --- a/base/color_cie.go +++ b/base/color_cie.go @@ -182,8 +182,13 @@ func plotCIEDiagram(img image.Image) ([]byte, error) { g := float32(gg * 0xffff / aa) b := float32(bb * 0xffff / aa) - x := r / (r + g + b) - y := g / (r + g + b) + sumrgb := r + g + b + if sumrgb == 0 { + continue + } + + x := r / sumrgb + y := g / sumrgb cv.Set(int(x*imgW), int(y*imgH), pix) } From 6a9cb78f84a7c033a47f02da51025f0b895969a2 Mon Sep 17 00:00:00 2001 From: Hugefiver Date: Thu, 21 Dec 2023 15:04:27 +0800 Subject: [PATCH 11/14] drop --- base/color_cie.go | 212 ---------------------------------------------- go.mod | 10 --- go.sum | 33 -------- main.go | 3 - 4 files changed, 258 deletions(-) delete mode 100644 base/color_cie.go diff --git a/base/color_cie.go b/base/color_cie.go deleted file mode 100644 index b5056a5d..00000000 --- a/base/color_cie.go +++ /dev/null @@ -1,212 +0,0 @@ -package base - -import ( - "bytes" - "context" - "errors" - "fmt" - "image" - "image/color" - "image/jpeg" - "image/png" - "io" - "slices" - "time" - - "github.com/gabriel-vasile/mimetype" - "go.uber.org/zap" - "golang.org/x/image/webp" - "gonum.org/v1/plot" - "gonum.org/v1/plot/plotter" - "gonum.org/v1/plot/vg" - "gonum.org/v1/plot/vg/draw" - "gonum.org/v1/plot/vg/vgimg" - . "gopkg.in/telebot.v3" - - "csust-got/log" - "csust-got/util" -) - -var availableImageMimeTypes = []string{ - "image/jpeg", - "image/png", - "image/webp", -} - -var errNoImgFile = errors.New("no img/file in message") -var errUnsupportedImgType = errors.New("unsupported image type") - -func getImgFileFromMsg(msg *Message) (*File, error) { - switch { - case msg.Photo != nil: - return &msg.Photo.File, nil - case msg.Sticker != nil: - return &msg.Sticker.File, nil - case msg.Document != nil: - return &msg.Document.File, nil - default: - return nil, errNoImgFile - } -} - -func checkMIMEType(mime *mimetype.MIME) bool { - return slices.Contains(availableImageMimeTypes, mime.String()) -} - -// GenColorCIE generate CIE diagram from image reply by message -func GenColorCIE(ctx Context) error { - msg := ctx.Message() - if msg.ReplyTo != nil { - msg = msg.ReplyTo - } - - if msg.Photo == nil && msg.Sticker == nil && msg.Document == nil { - return ctx.Reply("请发送一张图片或回复一张图片") - } - - replyMsg := util.SendReply(ctx.Recipient(), "正在处理中,请稍后……", ctx.Message()) - go func() { - cancelCtx, cancel := context.WithCancel(context.Background()) - errMsg := "" - defer func() { - if errMsg != "" { - errMsg = "处理失败: " + errMsg - util.EditMessage(replyMsg, errMsg) - } else if errors.Is(cancelCtx.Err(), context.Canceled) { - util.EditMessage(replyMsg, "已取消") - } - cancel() - }() - - img, err := getImgFileFromMsg(msg) - if err != nil { - log.Error("get image file error", zap.Error(err)) - errMsg = "get image file error" - return - } - - // File size limit up to 5MB - if img.FileSize > 5*(2<<20) { - log.Error("file size too large", zap.Int64("file_size", img.FileSize)) - errMsg = "file size too large" - return - } - - wtr, err := util.GetFile(img) - if err != nil { - log.Error("get image file error", zap.Error(err)) - errMsg = "get image file error" - return - } - defer func() { _ = wtr.Close() }() - bs, err := io.ReadAll(wtr) - if err != nil { - log.Error("read image file error", zap.Error(err)) - errMsg = "read image file error" - return - } - mime := mimetype.Detect(bs) - if !checkMIMEType(mime) { - log.Error("invalid file type", zap.String("mime_type", mime.String())) - errMsg = "invalid file type" - return - } - - var decodeImg image.Image - switch mime.String() { - case "image/jpeg": - decodeImg, err = jpeg.Decode(bytes.NewReader(bs)) - case "image/png": - decodeImg, err = png.Decode(bytes.NewReader(bs)) - case "image/webp": - decodeImg, err = webp.Decode(bytes.NewReader(bs)) - default: - err = fmt.Errorf("%w: %s", errUnsupportedImgType, mime.String()) - } - if err != nil { - log.Error("decode image error", zap.Error(err)) - errMsg = "decode image error" - return - } - - out, err := plotCIEDiagram(decodeImg) - if err != nil { - log.Error("plot CIE diagram error", zap.Error(err)) - errMsg = "plot CIE diagram error" - return - } - - _, err = util.EditMessageWithError(replyMsg, Photo{File: FromReader(bytes.NewReader(out))}) - if err != nil { - log.Error("send image error", zap.Error(err)) - errMsg = "send image error" - return - } - }() - - return nil -} - -func plotCIEDiagram(img image.Image) ([]byte, error) { - startTime := time.Now() - - bound := img.Bounds() - width := bound.Dx() - height := bound.Dy() - pixels := make([]color.Color, width*height) - for i := 0; i < width; i++ { - for j := 0; j < height; j++ { - pix := img.At(i, j) - pixels[i*width+j] = pix - } - } - - diag := plot.New() - diag.Title.Text = "CIE 1931 Chromaticity Diagram" - diag.X.Label.Text = "CIE x" - diag.Y.Label.Text = "CIE y" - diag.X.Min = 0 - diag.X.Max = 1 - diag.Y.Min = 0 - diag.Y.Max = 1 - - const imgW = 500 - const imgH = 500 - cv := image.NewRGBA(image.Rect(0, 0, imgW, imgH)) - for _, pix := range pixels { - rr, gg, bb, aa := pix.RGBA() - if aa == 0 { - continue - } - r := float32(rr * 0xffff / aa) - g := float32(gg * 0xffff / aa) - b := float32(bb * 0xffff / aa) - - sumrgb := r + g + b - if sumrgb == 0 { - continue - } - - x := r / sumrgb - y := g / sumrgb - - cv.Set(int(x*imgW), int(y*imgH), pix) - } - - diag.Add(plotter.NewImage(cv, 0, 0, 1, 1)) - - cvImg := vgimg.New(vg.Points(float64(imgW)), vg.Points(float64(imgH))) - dc := draw.New(cvImg) - dc = draw.Crop(dc, 0, -vg.Centimeter, 0, 0) - diag.Draw(dc) - - output := bytes.NewBuffer([]byte{}) - if _, err := (vgimg.PngCanvas{Canvas: cvImg}).WriteTo(output); err != nil { - log.Error("write image error", zap.Error(err)) - return nil, err - } - - processTime := time.Since(startTime) - log.Info("CIE process time", zap.Duration("process-time", processTime), zap.Int("width", width), zap.Int("height", height)) - return output.Bytes(), nil -} diff --git a/go.mod b/go.mod index 595512ec..239b2b0e 100644 --- a/go.mod +++ b/go.mod @@ -3,7 +3,6 @@ module csust-got go 1.21 require ( - github.com/gabriel-vasile/mimetype v1.4.3 github.com/google/go-github/v35 v35.3.0 github.com/huichen/sego v0.0.0-20210824061530-c87651ea5c76 github.com/iyear/biligo v0.1.7 @@ -17,33 +16,24 @@ require ( github.com/stretchr/testify v1.8.4 go.uber.org/zap v1.26.0 golang.org/x/exp v0.0.0-20231006140011-7918f672742d - golang.org/x/image v0.14.0 golang.org/x/net v0.19.0 golang.org/x/oauth2 v0.15.0 golang.org/x/text v0.14.0 golang.org/x/time v0.5.0 - gonum.org/v1/plot v0.14.0 gopkg.in/telebot.v3 v3.2.1 mvdan.cc/xurls/v2 v2.5.0 ) require ( - git.sr.ht/~sbinet/gg v0.5.0 // indirect github.com/adamzy/cedar-go v0.0.0-20170805034717-80a9c64b256d // indirect - github.com/ajstarks/svgo v0.0.0-20211024235047-1546f124cd8b // indirect github.com/andybalholm/brotli v1.0.6 // indirect github.com/beorn7/perks v1.0.1 // indirect - github.com/campoy/embedmd v1.0.0 // indirect github.com/cespare/xxhash/v2 v2.2.0 // indirect github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f // indirect github.com/fsnotify/fsnotify v1.7.0 // indirect - github.com/go-fonts/liberation v0.3.1 // indirect - github.com/go-latex/latex v0.0.0-20230307184459-12ec69307ad9 // indirect - github.com/go-pdf/fpdf v0.8.0 // indirect github.com/go-task/slim-sprig v0.0.0-20230315185526-52ccab3ef572 // indirect github.com/golang-jwt/jwt/v4 v4.5.0 // indirect - github.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0 // indirect github.com/golang/protobuf v1.5.3 // indirect github.com/google/go-querystring v1.1.0 // indirect github.com/google/pprof v0.0.0-20231101202521-4ca4178f5c7a // indirect diff --git a/go.sum b/go.sum index b6cc8262..062d5197 100644 --- a/go.sum +++ b/go.sum @@ -54,10 +54,6 @@ cloud.google.com/go/storage v1.8.0/go.mod h1:Wv1Oy7z6Yz3DshWRJFhqM/UCfaWIRTdp0RX cloud.google.com/go/storage v1.10.0/go.mod h1:FLPqc6j+Ki4BU591ie1oL6qBQGu2Bl/tZ9ullr3+Kg0= cloud.google.com/go/storage v1.14.0/go.mod h1:GrKmX003DSIwi9o29oFT7YDnHYwZoctc3fOKtUw0Xmo= dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU= -git.sr.ht/~sbinet/cmpimg v0.1.0 h1:E0zPRk2muWuCqSKSVZIWsgtU9pjsw3eKHi8VmQeScxo= -git.sr.ht/~sbinet/cmpimg v0.1.0/go.mod h1:FU12psLbF4TfNXkKH2ZZQ29crIqoiqTZmeQ7dkp/pxE= -git.sr.ht/~sbinet/gg v0.5.0 h1:6V43j30HM623V329xA9Ntq+WJrMjDxRjuAB1LFWF5m8= -git.sr.ht/~sbinet/gg v0.5.0/go.mod h1:G2C0eRESqlKhS7ErsNey6HHrqU1PwsnCQlekFi9Q2Oo= github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= github.com/DataDog/datadog-go v3.2.0+incompatible/go.mod h1:LButxg5PwREeZtORoXG3tL4fMGNddJ+vMq1mwgfaqoQ= @@ -65,10 +61,6 @@ github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAE github.com/adamzy/cedar-go v0.0.0-20170805034717-80a9c64b256d h1:ir/IFJU5xbja5UaBEQLjcvn7aAU01nqU/NUyOBEU+ew= github.com/adamzy/cedar-go v0.0.0-20170805034717-80a9c64b256d/go.mod h1:PRWNwWq0yifz6XDPZu48aSld8BWwBfr2JKB2bGWiEd4= github.com/adamzy/sego v0.0.0-20151004184924-5eab9a44f8e8/go.mod h1:KQxo+Xesl2wLJ3yJcX443KaoWzXpbPzU1GNRyE8kNEY= -github.com/ajstarks/deck v0.0.0-20200831202436-30c9fc6549a9/go.mod h1:JynElWSGnm/4RlzPXRlREEwqTHAN3T56Bv2ITsFT3gY= -github.com/ajstarks/deck/generate v0.0.0-20210309230005-c3f852c02e19/go.mod h1:T13YZdzov6OU0A1+RfKZiZN9ca6VeKdBdyDV+BY97Tk= -github.com/ajstarks/svgo v0.0.0-20211024235047-1546f124cd8b h1:slYM766cy2nI3BwyRiyQj/Ud48djTMtMebDqepE95rw= -github.com/ajstarks/svgo v0.0.0-20211024235047-1546f124cd8b/go.mod h1:1KcenG0jGWcpt8ov532z81sp/kMMUG485J2InIOyADM= github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= @@ -92,8 +84,6 @@ github.com/bsm/ginkgo/v2 v2.12.0 h1:Ny8MWAHyOepLGlLKYmXG4IEkioBysk6GpaRTLC8zwWs= github.com/bsm/ginkgo/v2 v2.12.0/go.mod h1:SwYbGRRDovPVboqFv0tPTcG1sN61LM1Z4ARdbAV9g4c= github.com/bsm/gomega v1.27.10 h1:yeMWxP2pV2fG3FgAODIY8EiRE3dy0aeFYt4l7wh6yKA= github.com/bsm/gomega v1.27.10/go.mod h1:JyEr/xRbxbtgWNi8tIEVPUYZ5Dzef52k01W3YH0H+O0= -github.com/campoy/embedmd v1.0.0 h1:V4kI2qTJJLf4J29RzI/MAt2c3Bl4dQSYPuflzwFH2hY= -github.com/campoy/embedmd v1.0.0/go.mod h1:oxyr9RCiSXg0M3VJ3ks0UGfp98BpSSGr0kpiX3MzVl8= github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc= github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= @@ -144,30 +134,18 @@ github.com/frankban/quicktest v1.14.6/go.mod h1:4ptaffx2x8+WTWXmUCuVU6aPUX1/Mz7z github.com/fsnotify/fsnotify v1.5.4/go.mod h1:OVB6XrOHzAwXMpEM7uPOzcehqUV2UqJxmVXmkdnm1bU= github.com/fsnotify/fsnotify v1.7.0 h1:8JEhPFa5W2WU7YfeZzPNqzMP6Lwt7L2715Ggo0nosvA= github.com/fsnotify/fsnotify v1.7.0/go.mod h1:40Bi/Hjc2AVfZrqy+aj+yEI+/bRxZnMJyTJwOpGvigM= -github.com/gabriel-vasile/mimetype v1.4.3 h1:in2uUcidCuFcDKtdcBxlR0rJ1+fsokWf+uqxgUFjbI0= -github.com/gabriel-vasile/mimetype v1.4.3/go.mod h1:d8uq/6HKRL6CGdk+aubisF/M5GcPfT7nKyLpA0lbSSk= github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= -github.com/go-fonts/dejavu v0.1.0 h1:JSajPXURYqpr+Cu8U9bt8K+XcACIHWqWrvWCKyeFmVQ= -github.com/go-fonts/dejavu v0.1.0/go.mod h1:4Wt4I4OU2Nq9asgDCteaAaWZOV24E+0/Pwo0gppep4g= -github.com/go-fonts/latin-modern v0.3.1 h1:/cT8A7uavYKvglYXvrdDw4oS5ZLkcOU22fa2HJ1/JVM= -github.com/go-fonts/latin-modern v0.3.1/go.mod h1:ysEQXnuT/sCDOAONxC7ImeEDVINbltClhasMAqEtRK0= -github.com/go-fonts/liberation v0.3.1 h1:9RPT2NhUpxQ7ukUvz3jeUckmN42T9D9TpjtQcqK/ceM= -github.com/go-fonts/liberation v0.3.1/go.mod h1:jdJ+cqF+F4SUL2V+qxBth8fvBpBDS7yloUL5Fi8GTGY= github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU= github.com/go-gl/glfw/v3.3/glfw v0.0.0-20191125211704-12ad95a8df72/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= github.com/go-gl/glfw/v3.3/glfw v0.0.0-20200222043503-6f7a984d4dc4/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= github.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= github.com/go-kit/kit v0.9.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= github.com/go-kit/log v0.1.0/go.mod h1:zbhenjAZHb184qTLMA9ZjW7ThYL0H2mk7Q6pNt4vbaY= -github.com/go-latex/latex v0.0.0-20230307184459-12ec69307ad9 h1:NxXI5pTAtpEaU49bpLpQoDsu1zrteW/vxzTz8Cd2UAs= -github.com/go-latex/latex v0.0.0-20230307184459-12ec69307ad9/go.mod h1:gWuR/CrFDDeVRFQwHPvsv9soJVB/iqymhuZQuJ3a9OM= github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE= github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk= github.com/go-logfmt/logfmt v0.5.0/go.mod h1:wCYkCAKZfumFQihp8CzCvQ3paCTfi41vtzG1KdI/P7A= github.com/go-logr/logr v1.2.4 h1:g01GSCwiDw2xSZfjJ2/T9M+S6pFdcNtFYsp+Y43HYDQ= github.com/go-logr/logr v1.2.4/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= -github.com/go-pdf/fpdf v0.8.0 h1:IJKpdaagnWUeSkUFUjTcSzTppFxmv8ucGQyNPQWxYOQ= -github.com/go-pdf/fpdf v0.8.0/go.mod h1:gfqhcNwXrsd3XYKte9a7vM3smvU/jB4ZRDrmWSxpfdc= github.com/go-playground/assert/v2 v2.0.1/go.mod h1:VDjEfimB/XKnb+ZQfWdccd7VUvScMdVu0Titje2rxJ4= github.com/go-playground/locales v0.13.0/go.mod h1:taPMhCMXrRLJO55olJkUXHZBHCxTMfnGwq/HNwmWNS8= github.com/go-playground/universal-translator v0.17.0/go.mod h1:UkSxE5sNxxRwHyU+Scu5vgOQjsIJAF8j9muTVoKLVtA= @@ -181,8 +159,6 @@ github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7a github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= github.com/golang-jwt/jwt/v4 v4.5.0 h1:7cYmW1XlMY7h7ii7UhUyChSgS5wUJEnm9uZVTGqOWzg= github.com/golang-jwt/jwt/v4 v4.5.0/go.mod h1:m21LjoU+eqJr34lmDMbreY2eSTRJ1cv77w39/MY0Ch0= -github.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0 h1:DACJavvAHhabrF08vX0COfcOBJRhZ8lUbR+ZWIs0Y5g= -github.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0/go.mod h1:E/TSTwGwJL78qG/PmXZO1EjYhfJinVAhrmmHX6Z8B9k= github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/groupcache v0.0.0-20191227052852-215e87163ea7/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= @@ -566,8 +542,6 @@ golang.org/x/exp v0.0.0-20231006140011-7918f672742d h1:jtJma62tbqLibJ5sFQz8bKtEM golang.org/x/exp v0.0.0-20231006140011-7918f672742d/go.mod h1:ldy0pHrwJyGW56pPQzzkH36rKxoZW1tw7ZJpeKx+hdo= golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js= golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= -golang.org/x/image v0.14.0 h1:tNgSxAFe3jC4uYqvZdTr84SZoM1KfwdC9SKIFrLjFn4= -golang.org/x/image v0.14.0/go.mod h1:HUYqC05R2ZcZ3ejNQsIHQDQiwWM4JBqmm6MKANTp4LE= golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU= golang.org/x/lint v0.0.0-20190301231843-5614ed5bae6f/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= @@ -843,10 +817,6 @@ golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8T golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20220411194840-2f41105eb62f/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20220517211312-f3a8303e98df/go.mod h1:K8+ghG5WaK9qNqU5K3HdILfMLy1f3aNYFI/wnl100a8= -gonum.org/v1/gonum v0.14.0 h1:2NiG67LD1tEH0D7kM+ps2V+fXmsAnpUeec7n8tcr4S0= -gonum.org/v1/gonum v0.14.0/go.mod h1:AoWeoz0becf9QMWtE8iWXNXc27fK4fNeHNf/oMejGfU= -gonum.org/v1/plot v0.14.0 h1:+LBDVFYwFe4LHhdP8coW6296MBEY4nQ+Y4vuUpJopcE= -gonum.org/v1/plot v0.14.0/go.mod h1:MLdR9424SJed+5VqC6MsouEpig9pZX2VZ57H9ko2bXU= google.golang.org/api v0.4.0/go.mod h1:8k5glujaEP+g9n7WNsDg8QP6cUVNI86fCNMcbazEtwE= google.golang.org/api v0.7.0/go.mod h1:WtwebWUNSVBH/HAw79HIFXZNqEvBhG+Ra+ax0hx3E3M= google.golang.org/api v0.8.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg= @@ -1051,12 +1021,9 @@ honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWh honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg= honnef.co/go/tools v0.0.1-2020.1.3/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= honnef.co/go/tools v0.0.1-2020.1.4/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= -honnef.co/go/tools v0.1.3/go.mod h1:NgwopIslSNH47DimFoV78dnkksY2EFtX0ajyb3K/las= mvdan.cc/xurls/v2 v2.5.0 h1:lyBNOm8Wo71UknhUs4QTFUNNMyxy2JEIaKKo0RWOh+8= mvdan.cc/xurls/v2 v2.5.0/go.mod h1:yQgaGQ1rFtJUzkmKiHYSSfuQxqfYmd//X6PxvholpeE= rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8= -rsc.io/pdf v0.1.1 h1:k1MczvYDUvJBe93bYd7wrZLLUEcLZAuF824/I4e5Xr4= -rsc.io/pdf v0.1.1/go.mod h1:n8OzWcQ6Sp37PL01nO98y4iUCRdTGarVfzxY20ICaU4= rsc.io/quote/v3 v3.1.0/go.mod h1:yEA65RcK8LyAZtP9Kv3t0HmxON59tX3rD+tICJqUlj0= rsc.io/sampler v1.3.0/go.mod h1:T1hPZKmBbMNahiBKFy5HrXp6adAjACjK9JXDnKaTXpA= sigs.k8s.io/yaml v1.2.0/go.mod h1:yfXDCHCao9+ENCvLSE62v9VSji2MKu5jeNfTrofGhJc= diff --git a/main.go b/main.go index 95b1a116..ff537da7 100644 --- a/main.go +++ b/main.go @@ -175,9 +175,6 @@ func registerBaseHandler(bot *Bot) { bot.Handle("/gacha_setting", gacha.SetGachaHandle) bot.Handle("/gacha", gacha.WithMsgRpl) - // CIE handler - bot.Handle("/cie", base.GenColorCIE) - // custom regexp handler bot.Handle(OnText, customHandler) } From 7b2789e69115062e6362c17046de6ac026a6906d Mon Sep 17 00:00:00 2001 From: Hugefiver Date: Thu, 21 Dec 2023 16:49:26 +0800 Subject: [PATCH 12/14] fix redis/go-redis#2817 --- orm/time_task.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/orm/time_task.go b/orm/time_task.go index e205e3bd..dd5d7310 100644 --- a/orm/time_task.go +++ b/orm/time_task.go @@ -77,7 +77,7 @@ func AddTasks(tasks ...*TaskNonced) error { } zs = append(zs, redis.Z{ Score: float64(t.ExecTime), - Member: value, + Member: string(value), }) } From 964064c63bbcfc7f3e97e79c5af3be069ea15e2a Mon Sep 17 00:00:00 2001 From: Hugefiver Date: Fri, 22 Dec 2023 14:56:10 +0800 Subject: [PATCH 13/14] gacha only apply to text message --- chat/gacha_reply.go | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/chat/gacha_reply.go b/chat/gacha_reply.go index b790c64d..c06cb94e 100644 --- a/chat/gacha_reply.go +++ b/chat/gacha_reply.go @@ -9,12 +9,25 @@ import ( // GachaReplyHandler reply a gpt msg determined by the gacha result func GachaReplyHandler(ctx telebot.Context) { + msg := ctx.Message() + + // only apply to text message + var text string + if len(msg.Text) > 0 { + text = msg.Text + } else if len(msg.Caption) > 0 { + text = msg.Caption + } + if len(text) == 0 { + return + } + result, err := gacha.PerformGaCha(ctx.Chat().ID) if err != nil { log.Error("[GaCha]: perform gacha failed", zap.Error(err)) return } - ctx.Message().Text = "/chat " + ctx.Message().Text + ctx.Message().Text = "/chat " + text switch result { case 3: return From 38c2bdc6f873150f09ac3c52a8b39d1e23f81544 Mon Sep 17 00:00:00 2001 From: Hugefiver Date: Fri, 22 Dec 2023 15:26:41 +0800 Subject: [PATCH 14/14] update ua list --- util/ua.go | 74 +++++++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 73 insertions(+), 1 deletion(-) diff --git a/util/ua.go b/util/ua.go index 468c55da..c6868aef 100644 --- a/util/ua.go +++ b/util/ua.go @@ -2,8 +2,10 @@ package util import "math/rand" +// **this UAs are too old** // nolint: revive // ua is long -var uaList = []string{ +/* +var uaListArchive = []string{ "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/94.0.4606.71 Safari/537.36", "Mozilla/5.0 (iPhone; CPU iPhone OS 12_0 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/12.0 Mobile/15E148 Safari/604.1", "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_2) AppleWebKit/601.3.9 (KHTML, like Gecko) Version/9.0.2 Safari/601.3.9", @@ -138,6 +140,76 @@ var uaList = []string{ "Mozilla/5.0 (Linux; Android 9; SM-A102U) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.136 Mobile Safari/537.36", "Mozilla/5.0 (Linux; Android 7.0; SM-G570M Build/NRD90M) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Mobile Safari/537.36", } +*/ + +// nolint: revive // ua is long +// Generated by `Microsoft Copilot` +var uaList = []string{ + // Chrome + "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/99.0.4844.51 Safari/537.36", + "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/99.0.4844.51 Safari/537.36", + "Mozilla/5.0 (Linux; Android 11; SM-G998B) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/99.0.4844.51 Mobile Safari/537.36", + "Mozilla/5.0 (iPhone; CPU iPhone OS 15_0_1 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) CriOS/99.0.4844.51 Mobile/15E148 Safari/604.1", + "Mozilla/5.0 (iPad; CPU OS 15_0_1 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) CriOS/99.0.4844.51 Mobile/15E148 Safari/604.1", + "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/99.0.4844.51 Safari/537.36", + "Mozilla/5.0 (X11; CrOS x86_64 14150.74.0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/99.0.4844.51 Safari/537.36", + "Mozilla/5.0 (Linux; Android 11; Pixel 5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/99.0.4844.51 Mobile Safari/537.36", + "Mozilla/5.0 (Linux; Android 11; SM-A515F) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/99.0.4844.51 Mobile Safari/537.36", + "Mozilla/5.0 (Linux; Android 11; SM-N986B) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/99.0.4844.51 Mobile Safari/537.36", + + // Firefox + "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:95.0) Gecko/20100101 Firefox/95.0", + "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:95.0) Gecko/20100101 Firefox/95.0", + "Mozilla/5.0 (Android 11; Mobile; rv:95.0) Gecko/95.0 Firefox/95.0", + "Mozilla/5.0 (iPhone; CPU iPhone OS 15_0_1 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) FxiOS/40.0 Mobile/15E148 Safari/605.1.15", + "Mozilla/5.0 (iPad; CPU OS 15_0_1 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) FxiOS/40.0 Mobile/15E148 Safari/605.1.15", + "Mozilla/5.0 (X11; Linux x86_64; rv:95.0) Gecko/20100101 Firefox/95.0", + "Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:95.0) Gecko/20100101 Firefox/95.0", + "Mozilla/5.0 (Android 11; Tablet; rv:95.0) Gecko/95.0 Firefox/95.0", + "Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:95.0) Gecko/20100101 Firefox/95.0", + "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.14; rv:95.0) Gecko/20100101 Firefox/95.0", + "", + + // Safari + "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/15.0 Safari/605.1.15", + "Mozilla/5.0 (iPhone; CPU iPhone OS 15_0_1 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/15.0 Mobile/15E148 Safari/604.1", + "Mozilla/5.0 (iPad; CPU OS 15_0_1 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/15.0 Mobile/15E148 Safari/604.1", + "Mozilla/5.0 (iPod touch; CPU iPhone OS 15_0_1 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/15.0 Mobile/15E148 Safari/604.1", + "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/15.0 Safari/605.1.15", + "Mozilla/5.0 (iPhone; CPU iPhone OS 14_8 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/14.0 Mobile/15E148 Safari/604.1", + "Mozilla/5.0 (iPad; CPU OS 14_8 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/14.0 Mobile/15E148 Safari/604.1", + "Mozilla/5.0 (iPod touch; CPU iPhone OS 14_8 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/14.0 Mobile/15E148 Safari/604.1", + "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/15.0 Safari/605.1.15", + "Mozilla/5.0 (iPhone; CPU iPhone OS 13_7 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/13.0 Mobile/15E148 Safari/604.1", + + // Edge + "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/99.0.4844.51 Safari/537.36 Edg/99.0.774.45", + "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/99.0.4844.51 Safari/537.36 Edg/99.0.774.45", + "Mozilla/5.0 (Linux; Android 11; SM-G998B) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/99.0.4844.51 Mobile Safari/537.36 EdgA/99.0.774.45", + "Mozilla/5.0 (iPhone; CPU iPhone OS 15_0_1 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/15.0 EdgiOS/99.0.774.45 Mobile/15E148 Safari/604.1", + "Mozilla/5.0 (iPad; CPU OS 15_0_1 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/15.0 EdgiOS/99.0.774.45 Mobile/15E148 Safari/604.1", + "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/99.0.4844.51 Safari/537.36 Edg/99.0.774.45", + "Mozilla/5.0 (X11; CrOS x86_64 14150.74.0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/99.0.4844.51 Safari/537.36 Edg/99.0.774.45", + "Mozilla/5.0 (Linux; Android 11; Pixel 5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/99.0.4844.51 Mobile Safari/537.36 EdgA/99.0.774.45", + "Mozilla/5.0 (Linux; Android 11; SM-A515F) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/99.0.4844.51 Mobile Safari/537.36 EdgA/99.0.774.45", + "Mozilla/5.0 (Linux; Android 11; SM-N986B) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/99.0.4844.51 Mobile Safari/537.36 EdgA/99.0.774.45", + + // Opera + "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/99.0.4844.51 Safari/537.36 OPR/99.0.4664.45", + "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/99.0.4844.51 Safari/537.36 OPR/99.0.4664.45", + "Mozilla/5.0 (Linux; Android 11; SM-G998B) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/99.0.4844.51 Mobile Safari/537.36 OPR/99.0.4664.45", + "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36 OPR/82.0.4227.23", + "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36 OPR/82.0.4227.23", + "Mozilla/5.0 (Linux; Android 11; SM-G998B) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36 OPR/82.0.4227.23", + "Mozilla/5.0 (iPhone; CPU iPhone OS 15_2 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) OPiOS/16.0.8.121059 Mobile/15E148 Safari/9537.53", + "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36 OPR/82.0.4227.23", + "Mozilla/5.0 (iPad; CPU OS 15_2 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) OPiOS/16.0.8.121059 Mobile/15E148 Safari/9537.53", + "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36 OPR/82.0.4227.23", + "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36 OPR/82.0.4227.23", + "Mozilla/5.0 (Linux; Android 9; SM-G960F) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36 OPR/82.0.4227.23", + "Mozilla/5.0 (Linux; Android 10; SM-A205U) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36 OPR/82.0.4227.23", + "Mozilla/5.0 (Linux; Android 11; SM-A102U) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36 OPR/82.0.4227.23", +} var uaLen = len(uaList)