From a0433b1dac34e94b3f3dcbf6c3789a80c130f207 Mon Sep 17 00:00:00 2001
From: landaiqing <3517283258@qq.com>
Date: Fri, 1 Nov 2024 17:11:28 +0800
Subject: [PATCH] :bug: fixed multiavatar api unavailable issue
---
.../captcha_controller/captcha_controller.go | 10 +-
.../client_controller/client_controller.go | 18 +-
controller/sms_controller/sms_controller.go | 6 +-
controller/user_controller/user_controller.go | 14 +-
global/global.go | 1 +
go.mod | 21 +-
go.sum | 79 +-
middleware/session_check.go | 1 +
...in_rule.go => sca_auth_permission_rule.go} | 0
utils/generate_avatar.go | 761 +++++++++++++++---
10 files changed, 729 insertions(+), 182 deletions(-)
rename model/{sca_auth_casbin_rule.go => sca_auth_permission_rule.go} (100%)
diff --git a/controller/captcha_controller/captcha_controller.go b/controller/captcha_controller/captcha_controller.go
index 239b50e..75fa043 100644
--- a/controller/captcha_controller/captcha_controller.go
+++ b/controller/captcha_controller/captcha_controller.go
@@ -3,20 +3,22 @@ package captcha_controller
import (
"encoding/json"
"fmt"
+ "log"
+ "strconv"
+ "strings"
+ "time"
+
ginI18n "github.com/gin-contrib/i18n"
"github.com/gin-gonic/gin"
"github.com/wenlng/go-captcha-assets/helper"
"github.com/wenlng/go-captcha/v2/click"
"github.com/wenlng/go-captcha/v2/rotate"
"github.com/wenlng/go-captcha/v2/slide"
- "log"
+
"schisandra-cloud-album/common/constant"
"schisandra-cloud-album/common/redis"
"schisandra-cloud-album/common/result"
"schisandra-cloud-album/global"
- "strconv"
- "strings"
- "time"
)
type CaptchaController struct{}
diff --git a/controller/client_controller/client_controller.go b/controller/client_controller/client_controller.go
index d118abe..8e16d48 100644
--- a/controller/client_controller/client_controller.go
+++ b/controller/client_controller/client_controller.go
@@ -1,15 +1,17 @@
package client_controller
import (
+ "sync"
+ "time"
+
+ "github.com/ccpwcn/kgo"
"github.com/gin-gonic/gin"
- "github.com/google/uuid"
+
"schisandra-cloud-album/common/constant"
"schisandra-cloud-album/common/redis"
"schisandra-cloud-album/common/result"
"schisandra-cloud-album/global"
"schisandra-cloud-album/utils"
- "sync"
- "time"
)
type ClientController struct{}
@@ -36,16 +38,12 @@ func (ClientController) GenerateClientId(c *gin.Context) {
return
}
// 生成新的客户端ID
- uid, err := uuid.NewUUID()
+ simpleUuid := kgo.SimpleUuid()
+ err := redis.Set(constant.UserLoginClientRedisKey+ip, simpleUuid, time.Hour*24*7).Err()
if err != nil {
global.LOG.Error(err)
return
}
- err = redis.Set(constant.UserLoginClientRedisKey+ip, uid.String(), time.Hour*24*7).Err()
- if err != nil {
- global.LOG.Error(err)
- return
- }
- result.OkWithData(uid.String(), c)
+ result.OkWithData(simpleUuid, c)
return
}
diff --git a/controller/sms_controller/sms_controller.go b/controller/sms_controller/sms_controller.go
index ff46ce7..bbc7191 100644
--- a/controller/sms_controller/sms_controller.go
+++ b/controller/sms_controller/sms_controller.go
@@ -1,18 +1,20 @@
package sms_controller
import (
+ "time"
+
ginI18n "github.com/gin-contrib/i18n"
"github.com/gin-gonic/gin"
gosms "github.com/pkg6/go-sms"
"github.com/pkg6/go-sms/gateways"
"github.com/pkg6/go-sms/gateways/aliyun"
"github.com/pkg6/go-sms/gateways/smsbao"
+
"schisandra-cloud-album/common/constant"
"schisandra-cloud-album/common/redis"
"schisandra-cloud-album/common/result"
"schisandra-cloud-album/global"
"schisandra-cloud-album/utils"
- "time"
)
type SmsController struct{}
@@ -62,7 +64,7 @@ func (SmsController) SendMessageByAli(c *gin.Context) {
_, err = sms.Send(smsRequest.Phone, gosms.MapStringAny{
"content": "您的验证码是:****。请不要把验证码泄露给其他人。",
"template": global.CONFIG.SMS.Ali.TemplateID,
- //"signName": global.CONFIG.SMS.Ali.Signature,
+ // "signName": global.CONFIG.SMS.Ali.Signature,
"data": gosms.MapStrings{
"code": code,
},
diff --git a/controller/user_controller/user_controller.go b/controller/user_controller/user_controller.go
index bf9b0c0..0c760ad 100644
--- a/controller/user_controller/user_controller.go
+++ b/controller/user_controller/user_controller.go
@@ -2,12 +2,16 @@ package user_controller
import (
"errors"
+ "reflect"
+ "strconv"
+ "sync"
+
ginI18n "github.com/gin-contrib/i18n"
"github.com/gin-gonic/gin"
"github.com/mssola/useragent"
"github.com/yitter/idgenerator-go/idgen"
"gorm.io/gorm"
- "reflect"
+
"schisandra-cloud-album/common/constant"
"schisandra-cloud-album/common/enum"
"schisandra-cloud-album/common/randomname"
@@ -17,8 +21,6 @@ import (
"schisandra-cloud-album/model"
"schisandra-cloud-album/service/impl"
"schisandra-cloud-album/utils"
- "strconv"
- "sync"
)
type UserController struct{}
@@ -111,7 +113,7 @@ func (UserController) AccountLogin(c *gin.Context) {
accountLoginRequest := AccountLoginRequest{}
err := c.ShouldBindJSON(&accountLoginRequest)
if err != nil {
- result.FailWithMessage(ginI18n.MustGetMessage(c, "ParamsError"), c)
+ global.LOG.Error(err)
return
}
rotateData := utils.CheckRotateData(accountLoginRequest.Angle, accountLoginRequest.Key)
@@ -161,7 +163,7 @@ func (UserController) PhoneLogin(c *gin.Context) {
request := PhoneLoginRequest{}
err := c.ShouldBind(&request)
if err != nil {
- result.FailWithMessage(ginI18n.MustGetMessage(c, "ParamsError"), c)
+ global.LOG.Error(err)
return
}
phone := request.Phone
@@ -244,7 +246,7 @@ func (UserController) PhoneLogin(c *gin.Context) {
func (UserController) RefreshHandler(c *gin.Context) {
request := RefreshTokenRequest{}
if err := c.ShouldBindJSON(&request); err != nil {
- result.FailWithMessage(ginI18n.MustGetMessage(c, "ParamsError"), c)
+ global.LOG.Error(err)
return
}
data, res := userService.RefreshTokenService(request.RefreshToken)
diff --git a/global/global.go b/global/global.go
index 0db86b0..545bbcb 100644
--- a/global/global.go
+++ b/global/global.go
@@ -14,6 +14,7 @@ import (
"github.com/zmexing/go-sensitive-word"
"go.mongodb.org/mongo-driver/mongo"
"gorm.io/gorm"
+
"schisandra-cloud-album/config"
)
diff --git a/go.mod b/go.mod
index a5f87b5..61b8403 100644
--- a/go.mod
+++ b/go.mod
@@ -6,17 +6,17 @@ toolchain go1.23.1
require (
github.com/ArtisanCloud/PowerLibs/v3 v3.2.6
- github.com/ArtisanCloud/PowerWeChat/v3 v3.2.50
+ github.com/ArtisanCloud/PowerWeChat/v3 v3.2.55
github.com/BurntSushi/toml v1.4.0
github.com/acmestack/gorm-plus v0.1.5
github.com/casbin/casbin/v2 v2.100.0
github.com/casbin/gorm-adapter/v3 v3.28.0
+ github.com/ccpwcn/kgo v1.2.3
github.com/gin-contrib/cors v1.7.2
github.com/gin-contrib/i18n v1.1.4
github.com/gin-gonic/gin v1.10.0
github.com/golang-jwt/jwt/v5 v5.2.1
github.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0
- github.com/google/uuid v1.6.0
github.com/gorilla/sessions v1.4.0
github.com/juju/ratelimit v1.0.2
github.com/lionsoul2014/ip2region/binding/golang v0.0.0-20240510055607-89e20ab7b6c6
@@ -26,11 +26,11 @@ require (
github.com/nsqio/go-nsq v1.1.0
github.com/pkg6/go-sms v0.1.2
github.com/rbcervilla/redisstore/v9 v9.0.0
- github.com/redis/go-redis/v9 v9.6.2
+ github.com/redis/go-redis/v9 v9.7.0
github.com/sirupsen/logrus v1.9.3
github.com/swaggo/files v1.0.1
github.com/swaggo/gin-swagger v1.6.0
- github.com/swaggo/swag v1.16.3
+ github.com/swaggo/swag v1.16.4
github.com/wenlng/go-captcha-assets v1.0.1
github.com/wenlng/go-captcha/v2 v2.0.1
github.com/wumansgy/goEncrypt v1.1.0
@@ -53,7 +53,7 @@ require (
github.com/aymerick/douceur v0.2.0 // indirect
github.com/bmatcuk/doublestar/v4 v4.7.1 // indirect
github.com/bytedance/sonic v1.12.3 // indirect
- github.com/bytedance/sonic/loader v0.2.0 // indirect
+ github.com/bytedance/sonic/loader v0.2.1 // indirect
github.com/casbin/govaluate v1.2.0 // indirect
github.com/cespare/xxhash/v2 v2.3.0 // indirect
github.com/clbanning/mxj/v2 v2.7.0 // indirect
@@ -81,10 +81,10 @@ require (
github.com/golang-sql/sqlexp v0.1.0 // indirect
github.com/golang/mock v1.6.0 // indirect
github.com/golang/snappy v0.0.4 // indirect
- github.com/google/pprof v0.0.0-20241009165004-a3522334989c // indirect
+ github.com/google/pprof v0.0.0-20241029153458-d1b30febd7db // indirect
+ github.com/google/uuid v1.6.0 // indirect
github.com/gorilla/css v1.0.1 // indirect
github.com/gorilla/securecookie v1.1.2 // indirect
- github.com/h2non/filetype v1.1.3 // indirect
github.com/hashicorp/errwrap v1.1.0 // indirect
github.com/hashicorp/go-multierror v1.1.1 // indirect
github.com/imroc/req/v3 v3.48.0 // indirect
@@ -109,17 +109,16 @@ require (
github.com/montanaflynn/stats v0.7.1 // indirect
github.com/ncruces/go-strftime v0.1.9 // indirect
github.com/nicksnyder/go-i18n/v2 v2.4.1 // indirect
- github.com/onsi/ginkgo/v2 v2.20.2 // indirect
+ github.com/onsi/ginkgo/v2 v2.21.0 // indirect
github.com/orcaman/concurrent-map/v2 v2.0.1 // indirect
github.com/patrickmn/go-cache v2.1.0+incompatible // indirect
github.com/pelletier/go-toml/v2 v2.2.3 // indirect
github.com/pkg/errors v0.9.1 // indirect
github.com/pkg6/go-requests v0.2.3 // indirect
github.com/quic-go/qpack v0.5.1 // indirect
- github.com/quic-go/quic-go v0.48.0 // indirect
+ github.com/quic-go/quic-go v0.48.1 // indirect
github.com/refraction-networking/utls v1.6.7 // indirect
github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec // indirect
- github.com/rock-rabbit/rain v0.4.5 // indirect
github.com/twitchyliquid64/golang-asm v0.15.1 // indirect
github.com/ugorji/go/codec v1.2.12 // indirect
github.com/xdg-go/pbkdf2 v1.0.0 // indirect
@@ -128,7 +127,7 @@ require (
github.com/youmark/pkcs8 v0.0.0-20240726163527-a2c0da244d78 // indirect
go.opentelemetry.io/otel v1.31.0 // indirect
go.opentelemetry.io/otel/trace v1.31.0 // indirect
- go.uber.org/mock v0.4.0 // indirect
+ go.uber.org/mock v0.5.0 // indirect
go.uber.org/multierr v1.11.0 // indirect
go.uber.org/zap v1.27.0 // indirect
golang.org/x/arch v0.11.0 // indirect
diff --git a/go.sum b/go.sum
index 2e20c2d..83f85b2 100644
--- a/go.sum
+++ b/go.sum
@@ -4,10 +4,10 @@ github.com/ArtisanCloud/PowerLibs/v3 v3.2.6 h1:xNDXBJ1VNYAEgs4UG/lSygzU66/XG3mTA
github.com/ArtisanCloud/PowerLibs/v3 v3.2.6/go.mod h1:xFGsskCnzAu+6rFEJbGVAlwhrwZPXAny6m7j71S/B5k=
github.com/ArtisanCloud/PowerSocialite/v3 v3.0.7 h1:P+erNlErr+X2v7Et+yTWaTfIRhw+HfpAPdvNIEwk9Gw=
github.com/ArtisanCloud/PowerSocialite/v3 v3.0.7/go.mod h1:VZQNCvcK/rldF3QaExiSl1gJEAkyc5/I8RLOd3WFZq4=
-github.com/ArtisanCloud/PowerWeChat/v3 v3.2.45 h1:Wi8+OTRowLI82kBZfTg9DMyiZKWuUalU7B2BkshsQHE=
-github.com/ArtisanCloud/PowerWeChat/v3 v3.2.45/go.mod h1:HgdxYE6yV9OAMKIvHNRHUShq6auhFK0T2sIpUd1dG5o=
github.com/ArtisanCloud/PowerWeChat/v3 v3.2.50 h1:fuAnuGF1nV1ziva7Hme6/TyFhYdU+dL8DBNNP2euzfg=
github.com/ArtisanCloud/PowerWeChat/v3 v3.2.50/go.mod h1:HgdxYE6yV9OAMKIvHNRHUShq6auhFK0T2sIpUd1dG5o=
+github.com/ArtisanCloud/PowerWeChat/v3 v3.2.55 h1:NKyw6PPEeomEieDMoEXvtL0RkFP6oFepJ1Jsn/6zE9w=
+github.com/ArtisanCloud/PowerWeChat/v3 v3.2.55/go.mod h1:D2cB1wtwC1YgzYT1Ni8NWS5wJCm5n1T18TybXkFlwvo=
github.com/Azure/azure-sdk-for-go/sdk/azcore v1.4.0/go.mod h1:ON4tFdPTwRcgWEaVDrN3584Ef+b7GgSJaXxe5fW9t4M=
github.com/Azure/azure-sdk-for-go/sdk/azcore v1.6.0/go.mod h1:bjGvMhVMb+EEm3VRNQawDMUyMMjo+S5ewNjflkep/0Q=
github.com/Azure/azure-sdk-for-go/sdk/azcore v1.6.1/go.mod h1:bjGvMhVMb+EEm3VRNQawDMUyMMjo+S5ewNjflkep/0Q=
@@ -38,13 +38,10 @@ github.com/KyleBanks/depth v1.2.1 h1:5h8fQADFrWtarTdtDudMmGsC7GPbOAu6RVB3ffsVFHc
github.com/KyleBanks/depth v1.2.1/go.mod h1:jzSb9d0L43HxTQfT+oSA1EEp2q+ne2uh6XgeJcm8brE=
github.com/acmestack/gorm-plus v0.1.5 h1:8FhGeZ1fQpebtT8vgL0Gkt2sJkGjDFitYWnU/Ym2Xwo=
github.com/acmestack/gorm-plus v0.1.5/go.mod h1:qGJTQQkQ7ttaov5lIKLshyGaPdtVvJab0Td8iI08XLA=
-github.com/andybalholm/brotli v1.1.0 h1:eLKJA0d02Lf0mVpIDgYnqXcUn0GqVmEFny3VuID1U3M=
-github.com/andybalholm/brotli v1.1.0/go.mod h1:sms7XGricyQI9K10gOSf56VKKWS4oLer58Q+mhRPtnY=
github.com/andybalholm/brotli v1.1.1 h1:PR2pgnyFznKEugtsUo0xLdDop5SKXd5Qf5ysW+7XdTA=
github.com/andybalholm/brotli v1.1.1/go.mod h1:05ib4cKhjx3OQYUY22hTVd34Bc8upXjOLL2rKwwZBoA=
github.com/aymerick/douceur v0.2.0 h1:Mv+mAeH1Q+n9Fr+oyamOlAkUNPWPlA8PPGR0QAaYuPk=
github.com/aymerick/douceur v0.2.0/go.mod h1:wlT5vV2O3h55X9m7iVYN0TBM0NH/MmbLnd30/FjWUq4=
-github.com/bmatcuk/doublestar/v4 v4.6.1 h1:FH9SifrbvJhnlQpztAx++wlkk70QBf0iBWDwNy7PA4I=
github.com/bmatcuk/doublestar/v4 v4.6.1/go.mod h1:xBQ8jztBU6kakFMg+8WGxn0c6z1fTSPVIjEY1Wr7jzc=
github.com/bmatcuk/doublestar/v4 v4.7.1 h1:fdDeAqgT47acgwd9bd9HxJRDmc9UAmPpc+2m0CXv75Q=
github.com/bmatcuk/doublestar/v4 v4.7.1/go.mod h1:xBQ8jztBU6kakFMg+8WGxn0c6z1fTSPVIjEY1Wr7jzc=
@@ -52,25 +49,25 @@ 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/bytedance/sonic v1.12.2 h1:oaMFuRTpMHYLpCntGca65YWt5ny+wAceDERTkT2L9lg=
-github.com/bytedance/sonic v1.12.2/go.mod h1:B8Gt/XvtZ3Fqj+iSKMypzymZxw/FVwgIGKzMzT9r/rk=
github.com/bytedance/sonic v1.12.3 h1:W2MGa7RCU1QTeYRTPE3+88mVC0yXmsRQRChiyVocVjU=
github.com/bytedance/sonic v1.12.3/go.mod h1:B8Gt/XvtZ3Fqj+iSKMypzymZxw/FVwgIGKzMzT9r/rk=
github.com/bytedance/sonic/loader v0.1.1/go.mod h1:ncP89zfokxS5LZrJxl5z0UJcsk4M4yY2JpfqGeCtNLU=
github.com/bytedance/sonic/loader v0.2.0 h1:zNprn+lsIP06C/IqCHs3gPQIvnvpKbbxyXQP1iU4kWM=
github.com/bytedance/sonic/loader v0.2.0/go.mod h1:ncP89zfokxS5LZrJxl5z0UJcsk4M4yY2JpfqGeCtNLU=
+github.com/bytedance/sonic/loader v0.2.1 h1:1GgorWTqf12TA8mma4DDSbaQigE2wOgQo7iCjjJv3+E=
+github.com/bytedance/sonic/loader v0.2.1/go.mod h1:ncP89zfokxS5LZrJxl5z0UJcsk4M4yY2JpfqGeCtNLU=
github.com/casbin/casbin/v2 v2.100.0 h1:aeugSNjjHfCrgA22nHkVvw2xsscboHv5r0a13ljQKGQ=
github.com/casbin/casbin/v2 v2.100.0/go.mod h1:LO7YPez4dX3LgoTCqSQAleQDo0S0BeZBDxYnPUl95Ng=
github.com/casbin/gorm-adapter/v3 v3.28.0 h1:ORF8prF6SfaipdgT1fud+r1Tp5J0uul8QaKJHqCPY/o=
github.com/casbin/gorm-adapter/v3 v3.28.0/go.mod h1:aftWi0cla0CC1bHQVrSFzBcX/98IFK28AvuPppCQgTs=
github.com/casbin/govaluate v1.2.0 h1:wXCXFmqyY+1RwiKfYo3jMKyrtZmOL3kHwaqDyCPOYak=
github.com/casbin/govaluate v1.2.0/go.mod h1:G/UnbIjZk/0uMNaLwZZmFQrR72tYRZWQkO70si/iR7A=
+github.com/ccpwcn/kgo v1.2.3 h1:lcCO26EH/FcAhjuVgEkkJ2YcEOQd5TiFYAak9qwYknI=
+github.com/ccpwcn/kgo v1.2.3/go.mod h1:y6G244zGfW95c6aCcw00TdZR6JUfBCmQ4acJcFdaktA=
github.com/cespare/xxhash/v2 v2.3.0 h1:UL815xU9SqsFlibzuggzjXhog7bL6oX9BbNZnL2UFvs=
github.com/cespare/xxhash/v2 v2.3.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=
github.com/clbanning/mxj/v2 v2.7.0 h1:WA/La7UGCanFe5NpHF0Q3DNtnCsVoxbPKuyBNHWRyME=
github.com/clbanning/mxj/v2 v2.7.0/go.mod h1:hNiWqW14h+kc+MdF9C6/YoRfjEJoR3ou6tn/Qo+ve2s=
-github.com/cloudflare/circl v1.4.0 h1:BV7h5MgrktNzytKmWjpOtdYrf0lkkbF8YMlBGPhJQrY=
-github.com/cloudflare/circl v1.4.0/go.mod h1:PDRU+oXvdD7KCtgKxW95M5Z8BpSCJXQORiZFnBQS5QU=
github.com/cloudflare/circl v1.5.0 h1:hxIWksrX6XN5a1L2TI/h53AGPhNHoUBo+TD1ms9+pys=
github.com/cloudflare/circl v1.5.0/go.mod h1:uddAzsPgqdMAYatqJ0lsjX1oECcQLIlRpzZh3pJrofs=
github.com/cloudwego/base64x v0.1.4 h1:jwCgWpFanWmN8xoIUHa2rtzmkd5J2plF/dnLS6Xd/0Y=
@@ -88,8 +85,6 @@ github.com/dolthub/maphash v0.1.0 h1:bsQ7JsF4FkkWyrP3oCnFJgrCUAFbFf3kOl4L/QxPDyQ
github.com/dolthub/maphash v0.1.0/go.mod h1:gkg4Ch4CdCDu5h6PMriVLawB7koZ+5ijb9puGMV50a4=
github.com/dustin/go-humanize v1.0.1 h1:GzkhY7T5VNhEkwH0PVJgjz+fX1rhBrR7pRT3mDkpeCY=
github.com/dustin/go-humanize v1.0.1/go.mod h1:Mu1zIs6XwVuF/gI1OepvI0qD18qycQx+mFykh5fBlto=
-github.com/gabriel-vasile/mimetype v1.4.5 h1:J7wGKdGu33ocBOhGy0z653k/lFKLFDPJMG8Gql0kxn4=
-github.com/gabriel-vasile/mimetype v1.4.5/go.mod h1:ibHel+/kbxn9x2407k1izTA1S81ku1z/DlgOW2QE0M4=
github.com/gabriel-vasile/mimetype v1.4.6 h1:3+PzJTKLkvgjeTbts6msPJt4DixhT4YtFNf1gtGe3zc=
github.com/gabriel-vasile/mimetype v1.4.6/go.mod h1:JX1qVKqZd40hUPpAfiNTe0Sne7hdfKSbOqqmkq8GCXc=
github.com/gin-contrib/cors v1.7.2 h1:oLDHxdg8W/XDoN/8zamqk/Drgt4oVZDvaV0YmvVICQw=
@@ -157,10 +152,10 @@ github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeN
github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=
github.com/google/gofuzz v1.2.0 h1:xRy4A+RhZaiKjJ1bPfwQ8sedCA+YS2YcCHW6ec7JMi0=
github.com/google/gofuzz v1.2.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=
-github.com/google/pprof v0.0.0-20241001023024-f4c0cfd0cf1d h1:Jaz2JzpQaQXyET0AjLBXShrthbpqMkhGiEfkcQAiAUs=
-github.com/google/pprof v0.0.0-20241001023024-f4c0cfd0cf1d/go.mod h1:vavhavw2zAxS5dIdcRluK6cSGGPlZynqzFM8NdvU144=
github.com/google/pprof v0.0.0-20241009165004-a3522334989c h1:NDovD0SMpBYXlE1zJmS1q55vWB/fUQBcPAqAboZSccA=
github.com/google/pprof v0.0.0-20241009165004-a3522334989c/go.mod h1:vavhavw2zAxS5dIdcRluK6cSGGPlZynqzFM8NdvU144=
+github.com/google/pprof v0.0.0-20241029153458-d1b30febd7db h1:097atOisP2aRj7vFgYQBbFN4U4JNXUNYpxael3UzMyo=
+github.com/google/pprof v0.0.0-20241029153458-d1b30febd7db/go.mod h1:vavhavw2zAxS5dIdcRluK6cSGGPlZynqzFM8NdvU144=
github.com/google/uuid v1.3.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0=
github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
@@ -170,12 +165,8 @@ github.com/gorilla/securecookie v1.1.1/go.mod h1:ra0sb63/xPlUeL+yeDciTfxMRAA+MP+
github.com/gorilla/securecookie v1.1.2 h1:YCIWL56dvtr73r6715mJs5ZvhtnY73hBvEF8kXD8ePA=
github.com/gorilla/securecookie v1.1.2/go.mod h1:NfCASbcHqRSY+3a8tlWJwsQap2VX5pwzwo4h3eOamfo=
github.com/gorilla/sessions v1.2.1/go.mod h1:dk2InVEVJ0sfLlnXv9EAgkf6ecYs/i80K/zI+bUmuGM=
-github.com/gorilla/sessions v1.2.2 h1:lqzMYz6bOfvn2WriPUjNByzeXIlVzURcPmgMczkmTjY=
-github.com/gorilla/sessions v1.2.2/go.mod h1:ePLdVu+jbEgHH+KWw8I1z2wqd0BAdAQh/8LRvBeoNcQ=
github.com/gorilla/sessions v1.4.0 h1:kpIYOp/oi6MG/p5PgxApU8srsSw9tuFbt46Lt7auzqQ=
github.com/gorilla/sessions v1.4.0/go.mod h1:FLWm50oby91+hl7p/wRxDth9bWSuk0qVL2emc7lT5ik=
-github.com/h2non/filetype v1.1.3 h1:FKkx9QbD7HR/zjK1Ia5XiBsq9zdLi5Kf3zGyFTAFkGg=
-github.com/h2non/filetype v1.1.3/go.mod h1:319b3zT68BvV+WRj7cwy856M2ehB3HqNOt6sy1HndBY=
github.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4=
github.com/hashicorp/errwrap v1.1.0 h1:OxrOeh75EUXMY8TBjag2fzXGZ40LB6IKw45YeGUDY2I=
github.com/hashicorp/errwrap v1.1.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4=
@@ -183,8 +174,6 @@ github.com/hashicorp/go-multierror v1.1.1 h1:H5DkEtf6CXdFp0N0Em5UCwQpXMWke8IA0+l
github.com/hashicorp/go-multierror v1.1.1/go.mod h1:iw975J/qwKPdAO1clOe2L8331t/9/fmwbPZ6JB6eMoM=
github.com/hashicorp/go-uuid v1.0.2/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro=
github.com/hashicorp/go-uuid v1.0.3/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro=
-github.com/imroc/req/v3 v3.46.1 h1:oahr2hBTb3AaFI4P6jkN0Elj2ZVKJcdQ/IjWqeIKjvc=
-github.com/imroc/req/v3 v3.46.1/go.mod h1:weam9gmyb00QnOtu6HXSnk44dNFkIUQb5QdMx13FeUU=
github.com/imroc/req/v3 v3.48.0 h1:IYuMGetuwLzOOTzDCquDqs912WNwpsPK0TBXWPIvoqg=
github.com/imroc/req/v3 v3.48.0/go.mod h1:weam9gmyb00QnOtu6HXSnk44dNFkIUQb5QdMx13FeUU=
github.com/jackc/pgpassfile v1.0.0 h1:/6Hmqy13Ss2zCq62VdNG8tM1wchn8zjSGOBJ6icpsIM=
@@ -211,8 +200,6 @@ github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnr
github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo=
github.com/juju/ratelimit v1.0.2 h1:sRxmtRiajbvrcLQT7S+JbqU0ntsb9W2yhSdNN8tWfaI=
github.com/juju/ratelimit v1.0.2/go.mod h1:qapgC/Gy+xNh9UxzV13HGGl/6UXNN+ct+vwSgWNm/qk=
-github.com/klauspost/compress v1.17.10 h1:oXAz+Vh0PMUvJczoi+flxpnBEPxoER1IaAnU/NMPtT0=
-github.com/klauspost/compress v1.17.10/go.mod h1:pMDklpSncoRMuLFrf1W9Ss9KT+0rH90U12bZKk7uwG0=
github.com/klauspost/compress v1.17.11 h1:In6xLpyWOi1+C7tXUUWv2ot1QvBjxevKAaI6IXrJmUc=
github.com/klauspost/compress v1.17.11/go.mod h1:pMDklpSncoRMuLFrf1W9Ss9KT+0rH90U12bZKk7uwG0=
github.com/klauspost/cpuid/v2 v2.0.9/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg=
@@ -259,16 +246,17 @@ github.com/mssola/useragent v1.0.0 h1:WRlDpXyxHDNfvZaPEut5Biveq86Ze4o4EMffyMxmH5
github.com/mssola/useragent v1.0.0/go.mod h1:hz9Cqz4RXusgg1EdI4Al0INR62kP7aPSRNHnpU+b85Y=
github.com/ncruces/go-strftime v0.1.9 h1:bY0MQC28UADQmHmaF5dgpLmImcShSi2kHU9XLdhx/f4=
github.com/ncruces/go-strftime v0.1.9/go.mod h1:Fwc5htZGVVkseilnfgOVb9mKy6w1naJmn9CehxcKcls=
-github.com/nicksnyder/go-i18n/v2 v2.4.0 h1:3IcvPOAvnCKwNm0TB0dLDTuawWEj+ax/RERNC+diLMM=
-github.com/nicksnyder/go-i18n/v2 v2.4.0/go.mod h1:nxYSZE9M0bf3Y70gPQjN9ha7XNHX7gMc814+6wVyEI4=
github.com/nicksnyder/go-i18n/v2 v2.4.1 h1:zwzjtX4uYyiaU02K5Ia3zSkpJZrByARkRB4V3YPrr0g=
github.com/nicksnyder/go-i18n/v2 v2.4.1/go.mod h1:++Pl70FR6Cki7hdzZRnEEqdc2dJt+SAGotyFg/SvZMk=
github.com/nsqio/go-nsq v1.1.0 h1:PQg+xxiUjA7V+TLdXw7nVrJ5Jbl3sN86EhGCQj4+FYE=
github.com/nsqio/go-nsq v1.1.0/go.mod h1:vKq36oyeVXgsS5Q8YEO7WghqidAVXQlcFxzQbQTuDEY=
github.com/onsi/ginkgo/v2 v2.20.2 h1:7NVCeyIWROIAheY21RLS+3j2bb52W0W82tkberYytp4=
github.com/onsi/ginkgo/v2 v2.20.2/go.mod h1:K9gyxPIlb+aIvnZ8bd9Ak+YP18w3APlR+5coaZoE2ag=
+github.com/onsi/ginkgo/v2 v2.21.0 h1:7rg/4f3rB88pb5obDgNZrNHrQ4e6WpjonchcpuBRnZM=
+github.com/onsi/ginkgo/v2 v2.21.0/go.mod h1:7Du3c42kxCUegi0IImZ1wUQzMBVecgIHjR1C+NkhLQo=
github.com/onsi/gomega v1.34.1 h1:EUMJIKUjM8sKjYbtxQI9A4z2o+rruxnzNvpknOXie6k=
github.com/onsi/gomega v1.34.1/go.mod h1:kU1QgUvBDLXBJq618Xvm2LUX6rSAfRaFRTcdOeDLwwY=
+github.com/onsi/gomega v1.34.2 h1:pNCwDkzrsv7MS9kpaQvVb1aVLahQXyJ/Tv5oAZMI3i8=
github.com/orcaman/concurrent-map/v2 v2.0.1 h1:jOJ5Pg2w1oeB6PeDurIYf6k9PQ+aTITr/6lP/L/zp6c=
github.com/orcaman/concurrent-map/v2 v2.0.1/go.mod h1:9Eq3TG2oBe5FirmYWQfYO5iH1q0Jv47PLaNK++uCdOM=
github.com/patrickmn/go-cache v2.1.0+incompatible h1:HRMgzkcYKYpi3C8ajMPV8OFXaaRUnok+kx1WdO15EQc=
@@ -288,22 +276,20 @@ github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZb
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
github.com/quic-go/qpack v0.5.1 h1:giqksBPnT/HDtZ6VhtFKgoLOWmlyo9Ei6u9PqzIMbhI=
github.com/quic-go/qpack v0.5.1/go.mod h1:+PC4XFrEskIVkcLzpEkbLqq1uCoxPhQuvK5rH1ZgaEg=
-github.com/quic-go/quic-go v0.47.0 h1:yXs3v7r2bm1wmPTYNLKAAJTHMYkPEsfYJmTazXrCZ7Y=
-github.com/quic-go/quic-go v0.47.0/go.mod h1:3bCapYsJvXGZcipOHuu7plYtaV6tnF+z7wIFsU0WK9E=
github.com/quic-go/quic-go v0.48.0 h1:2TCyvBrMu1Z25rvIAlnp2dPT4lgh/uTqLqiXVpp5AeU=
github.com/quic-go/quic-go v0.48.0/go.mod h1:yBgs3rWBOADpga7F+jJsb6Ybg1LSYiQvwWlLX+/6HMs=
+github.com/quic-go/quic-go v0.48.1 h1:y/8xmfWI9qmGTc+lBr4jKRUWLGSlSigv847ULJ4hYXA=
+github.com/quic-go/quic-go v0.48.1/go.mod h1:yBgs3rWBOADpga7F+jJsb6Ybg1LSYiQvwWlLX+/6HMs=
github.com/rbcervilla/redisstore/v9 v9.0.0 h1:wOPbBaydbdxzi1gTafDftCI/Z7vnsXw0QDPCuhiMG0g=
github.com/rbcervilla/redisstore/v9 v9.0.0/go.mod h1:q/acLpoKkTZzIsBYt0R4THDnf8W/BH6GjQYvxDSSfdI=
-github.com/redis/go-redis/v9 v9.6.1 h1:HHDteefn6ZkTtY5fGUE8tj8uy85AHk6zP7CpzIAM0y4=
-github.com/redis/go-redis/v9 v9.6.1/go.mod h1:0C0c6ycQsdpVNQpxb1njEQIqkx5UcsM8FJCQLgE9+RA=
github.com/redis/go-redis/v9 v9.6.2 h1:w0uvkRbc9KpgD98zcvo5IrVUsn0lXpRMuhNgiHDJzdk=
github.com/redis/go-redis/v9 v9.6.2/go.mod h1:0C0c6ycQsdpVNQpxb1njEQIqkx5UcsM8FJCQLgE9+RA=
+github.com/redis/go-redis/v9 v9.7.0 h1:HhLSs+B6O021gwzl+locl0zEDnyNkxMtf/Z3NNBMa9E=
+github.com/redis/go-redis/v9 v9.7.0/go.mod h1:f6zhXITC7JUJIlPEiBOTXxJgPLdZcA93GewI7inzyWw=
github.com/refraction-networking/utls v1.6.7 h1:zVJ7sP1dJx/WtVuITug3qYUq034cDq9B2MR1K67ULZM=
github.com/refraction-networking/utls v1.6.7/go.mod h1:BC3O4vQzye5hqpmDTWUqi4P5DDhzJfkV1tdqtawQIH0=
github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec h1:W09IVJc94icq4NjY3clb7Lk8O1qJ8BdBEF8z0ibU0rE=
github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec/go.mod h1:qqbHyh8v60DhA7CoWK5oRCqLrMHRGoxYCSS9EjAz6Eo=
-github.com/rock-rabbit/rain v0.4.5 h1:SNzv5oTN978STB477XQ/+3tctdqT+Cdf0pN+ru2mhM8=
-github.com/rock-rabbit/rain v0.4.5/go.mod h1:3weEuxzk4ZxQZF158l2Vb+0Y+s2jGcIdjwJJFUvRB5c=
github.com/rogpeppe/go-internal v1.12.0 h1:exVL4IDcn6na9z1rAb56Vxr+CgyK3nn3O+epU5NdKM8=
github.com/rogpeppe/go-internal v1.12.0/go.mod h1:E+RYuTGaKKdloAfM02xzb0FW3Paa99yedzYV+kq4uf4=
github.com/sirupsen/logrus v1.8.1/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0=
@@ -329,6 +315,8 @@ github.com/swaggo/gin-swagger v1.6.0 h1:y8sxvQ3E20/RCyrXeFfg60r6H0Z+SwpTjMYsMm+z
github.com/swaggo/gin-swagger v1.6.0/go.mod h1:BG00cCEy294xtVpyIAHG6+e2Qzj/xKlRdOqDkvq0uzo=
github.com/swaggo/swag v1.16.3 h1:PnCYjPCah8FK4I26l2F/KQ4yz3sILcVUN3cTlBFA9Pg=
github.com/swaggo/swag v1.16.3/go.mod h1:DImHIuOFXKpMFAQjcC7FG4m3Dg4+QuUgUzJmKjI/gRk=
+github.com/swaggo/swag v1.16.4 h1:clWJtd9LStiG3VeijiCfOVODP6VpHtKdQy9ELFG3s1A=
+github.com/swaggo/swag v1.16.4/go.mod h1:VBsHJRsDvfYvqoiMKnsdwhNV9LEMHgEDZcyVYX0sxPg=
github.com/twitchyliquid64/golang-asm v0.15.1 h1:SU5vSMR7hnwNxj24w34ZyCi/FmDZTkS4MhqMhdFk5YI=
github.com/twitchyliquid64/golang-asm v0.15.1/go.mod h1:a1lVb/DtPvCB8fslRZhAngC2+aY1QWCk3Cedj/Gdt08=
github.com/ugorji/go/codec v1.2.12 h1:9LC83zGrHhuUA9l16C9AHXAqEV/2wBQ4nkvumAE65EE=
@@ -345,6 +333,7 @@ github.com/xdg-go/scram v1.1.2 h1:FHX5I5B4i4hKRVRBCFRxq1iQRej7WO3hhBuJf+UUySY=
github.com/xdg-go/scram v1.1.2/go.mod h1:RT/sEzTbU5y00aCK8UOx6R7YryM0iF1N2MOmC3kKLN4=
github.com/xdg-go/stringprep v1.0.4 h1:XLI/Ng3O1Atzq0oBs3TWm+5ZVgkq2aqdlvP9JtoZ6c8=
github.com/xdg-go/stringprep v1.0.4/go.mod h1:mPGuuIYwz7CmR2bT9j4GbQqutWS1zV24gijq1dTyGkM=
+github.com/xyproto/randomstring v1.0.5 h1:YtlWPoRdgMu3NZtP45drfy1GKoojuR7hmRcnhZqKjWU=
github.com/xyproto/randomstring v1.0.5/go.mod h1:rgmS5DeNXLivK7YprL0pY+lTuhNQW3iGxZ18UQApw/E=
github.com/yitter/idgenerator-go v1.3.3 h1:i6rzmpbCL0vlmr/tuW5+lSQzNuDG9vYBjIYRvnRcHE8=
github.com/yitter/idgenerator-go v1.3.3/go.mod h1:VVjbqFjGUsIkaXVkXEdmx1LiXUL3K1NvyxWPJBPbBpE=
@@ -354,33 +343,26 @@ github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1
github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY=
github.com/zmexing/go-sensitive-word v1.3.0 h1:dB9S9kNklksOODGLLAov0RaVCwC2w9Kwxz6NZMdM6rk=
github.com/zmexing/go-sensitive-word v1.3.0/go.mod h1:wkNIpkq1iPOe3l7l83zvnnV5mm20jfj2x8V8kjOTsUM=
-go.mongodb.org/mongo-driver v1.17.0 h1:Hp4q2MCjvY19ViwimTs00wHi7G4yzxh4/2+nTx8r40k=
-go.mongodb.org/mongo-driver v1.17.0/go.mod h1:wwWm/+BuOddhcq3n68LKRmgk2wXzmF6s0SFOa0GINL4=
go.mongodb.org/mongo-driver v1.17.1 h1:Wic5cJIwJgSpBhe3lx3+/RybR5PiYRMpVFgO7cOHyIM=
go.mongodb.org/mongo-driver v1.17.1/go.mod h1:wwWm/+BuOddhcq3n68LKRmgk2wXzmF6s0SFOa0GINL4=
-go.opentelemetry.io/otel v1.30.0 h1:F2t8sK4qf1fAmY9ua4ohFS/K+FUuOPemHUIXHtktrts=
-go.opentelemetry.io/otel v1.30.0/go.mod h1:tFw4Br9b7fOS+uEao81PJjVMjW/5fvNCbpsDIXqP0pc=
go.opentelemetry.io/otel v1.31.0 h1:NsJcKPIW0D0H3NgzPDHmo0WW6SptzPdqg/L1zsIm2hY=
go.opentelemetry.io/otel v1.31.0/go.mod h1:O0C14Yl9FgkjqcCZAsE053C13OaddMYr/hz6clDkEJE=
-go.opentelemetry.io/otel/metric v1.30.0 h1:4xNulvn9gjzo4hjg+wzIKG7iNFEaBMX00Qd4QIZs7+w=
-go.opentelemetry.io/otel/metric v1.30.0/go.mod h1:aXTfST94tswhWEb+5QjlSqG+cZlmyXy/u8jFpor3WqQ=
go.opentelemetry.io/otel/metric v1.31.0 h1:FSErL0ATQAmYHUIzSezZibnyVlft1ybhy4ozRPcF2fE=
+go.opentelemetry.io/otel/metric v1.31.0/go.mod h1:C3dEloVbLuYoX41KpmAhOqNriGbA+qqH6PQ5E5mUfnY=
go.opentelemetry.io/otel/sdk v1.4.0 h1:LJE4SW3jd4lQTESnlpQZcBhQ3oci0U2MLR5uhicfTHQ=
go.opentelemetry.io/otel/sdk v1.4.0/go.mod h1:71GJPNJh4Qju6zJuYl1CrYtXbrgfau/M9UAggqiy1UE=
-go.opentelemetry.io/otel/trace v1.30.0 h1:7UBkkYzeg3C7kQX8VAidWh2biiQbtAKjyIML8dQ9wmc=
-go.opentelemetry.io/otel/trace v1.30.0/go.mod h1:5EyKqTzzmyqB9bwtCCq6pDLktPK6fmGf/Dph+8VI02o=
go.opentelemetry.io/otel/trace v1.31.0 h1:ffjsj1aRouKewfr85U2aGagJ46+MvodynlQ1HYdmJys=
go.opentelemetry.io/otel/trace v1.31.0/go.mod h1:TXZkRk7SM2ZQLtR6eoAWQFIHPvzQ06FJAsO1tJg480A=
go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto=
go.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE=
go.uber.org/mock v0.4.0 h1:VcM4ZOtdbR4f6VXfiOpwpVJDL6lCReaZ6mw31wqh7KU=
go.uber.org/mock v0.4.0/go.mod h1:a6FSlNadKUHUa9IP5Vyt1zh4fC7uAwxMutEAscFbkZc=
+go.uber.org/mock v0.5.0 h1:KAMbZvZPyBPWgD14IrIQ38QCyjwpvVVV6K/bHl1IwQU=
+go.uber.org/mock v0.5.0/go.mod h1:ge71pBPLYDk7QIi1LupWxdAykm7KIEFchiOqd6z7qMM=
go.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0=
go.uber.org/multierr v1.11.0/go.mod h1:20+QtiLqy0Nd6FdQB9TLXag12DsQkrbs3htMFfDN80Y=
go.uber.org/zap v1.27.0 h1:aJMhYGrd5QSmlpLMr2MftRKl7t8J8PTZPA732ud/XR8=
go.uber.org/zap v1.27.0/go.mod h1:GB2qFLM7cTU87MWRP2mPIjqfIDnGu+VIO4V/SdhGo2E=
-golang.org/x/arch v0.10.0 h1:S3huipmSclq3PJMNe76NGwkBR504WFkQ5dhzWzP8ZW8=
-golang.org/x/arch v0.10.0/go.mod h1:FEVrYAQjsQXMVJ1nsMoVVXPZg6p2JE2mx8psSWTDQys=
golang.org/x/arch v0.11.0 h1:KXV8WWKCXm6tRpLirl2szsO5j/oOODwZf4hATmGVNs4=
golang.org/x/arch v0.11.0/go.mod h1:FEVrYAQjsQXMVJ1nsMoVVXPZg6p2JE2mx8psSWTDQys=
golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
@@ -391,17 +373,11 @@ golang.org/x/crypto v0.6.0/go.mod h1:OFC/31mSvZgRz0V1QTNCzfAI1aIRzbiufJtkMIlEp58
golang.org/x/crypto v0.7.0/go.mod h1:pYwdfH91IfpZVANVyUOhSIPZaFoJGxTFbZhFTx+dXZU=
golang.org/x/crypto v0.9.0/go.mod h1:yrmDGqONDYtNj3tH8X9dzUun2m2lzPa9ngI6/RUPGR0=
golang.org/x/crypto v0.12.0/go.mod h1:NF0Gs7EO5K4qLn+Ylc+fih8BSTeIjAP05siRnAh98yw=
-golang.org/x/crypto v0.27.0 h1:GXm2NjJrPaiv/h1tb2UH8QfgC/hOf/+z0p6PT8o1w7A=
-golang.org/x/crypto v0.27.0/go.mod h1:1Xngt8kV6Dvbssa53Ziq6Eqn0HqbZi5Z6R0ZpwQzt70=
golang.org/x/crypto v0.28.0 h1:GBDwsMXVQi34v5CCYUm2jkJvu4cbtru2U4TN2PSyQnw=
golang.org/x/crypto v0.28.0/go.mod h1:rmgy+3RHxRZMyY0jjAJShp2zgEdOqj2AO7U0pYmeQ7U=
-golang.org/x/exp v0.0.0-20240909161429-701f63a606c0 h1:e66Fs6Z+fZTbFBAxKfP3PALWBtpfqks2bwGcexMxgtk=
-golang.org/x/exp v0.0.0-20240909161429-701f63a606c0/go.mod h1:2TbTHSBQa924w8M6Xs1QcRcFwyucIwBGpK1p2f1YFFY=
golang.org/x/exp v0.0.0-20241009180824-f66d83c29e7c h1:7dEasQXItcW1xKJ2+gg5VOiBnqWrJc+rq0DPKyvvdbY=
golang.org/x/exp v0.0.0-20241009180824-f66d83c29e7c/go.mod h1:NQtJDoLvd6faHhE7m4T/1IY708gDefGGjR/iUW8yQQ8=
golang.org/x/image v0.16.0/go.mod h1:ugSZItdV4nOxyqp56HmXwH0Ry0nBCpjnZdpDaIHdoPs=
-golang.org/x/image v0.20.0 h1:7cVCUjQwfL18gyBJOmYvptfSHS8Fb3YUDtfLIZ7Nbpw=
-golang.org/x/image v0.20.0/go.mod h1:0a88To4CYVBAHp5FXJm8o7QbUl37Vd85ply1vyD8auM=
golang.org/x/image v0.21.0 h1:c5qV36ajHpdj4Qi0GnE0jUc/yuo33OLFaa0d+crTD5s=
golang.org/x/image v0.21.0/go.mod h1:vUbsLavqK/W303ZroQQVKQ+Af3Yl6Uz1Ppu5J/cLz78=
golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
@@ -422,8 +398,6 @@ golang.org/x/net v0.7.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs=
golang.org/x/net v0.8.0/go.mod h1:QVkue5JL9kW//ek3r6jTKnTFis1tRmNAW2P1shuFdJc=
golang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg=
golang.org/x/net v0.14.0/go.mod h1:PpSgVXXLK0OxS0F31C1/tv6XNguvCrnXIDrFMspZIUI=
-golang.org/x/net v0.29.0 h1:5ORfpBpCs4HzDYoodCDBbwHzdR5UrLBZ3sOnUJmFoHo=
-golang.org/x/net v0.29.0/go.mod h1:gLkgy8jTGERgjzMic6DS9+SP0ajcu6Xu3Orq/SpETg0=
golang.org/x/net v0.30.0 h1:AcW1SDZMkb8IpzCdQUaIq2sP4sZ4zw+55h6ynffypl4=
golang.org/x/net v0.30.0/go.mod h1:2wGyMJ5iFasEhkwi13ChkO/t1ECNC4X4eBKkVFyYFlU=
golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
@@ -448,8 +422,6 @@ golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.11.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.26.0 h1:KHjCJyddX0LoSTb3J+vWpupP9p0oznkqVk/IfjymZbo=
golang.org/x/sys v0.26.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
@@ -468,12 +440,8 @@ golang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8=
golang.org/x/text v0.12.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE=
golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU=
golang.org/x/text v0.15.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU=
-golang.org/x/text v0.18.0 h1:XvMDiNzPAl0jr17s6W9lcaIhGUfUORdGCNsuLmPG224=
-golang.org/x/text v0.18.0/go.mod h1:BuEKDfySbSR4drPmRPG/7iBdf8hvFMuRexcpahXilzY=
golang.org/x/text v0.19.0 h1:kTxAhCbGbxhK0IwgSKiMO5awPoDQ0RpfiVYBfK860YM=
golang.org/x/text v0.19.0/go.mod h1:BuEKDfySbSR4drPmRPG/7iBdf8hvFMuRexcpahXilzY=
-golang.org/x/time v0.5.0 h1:o7cqy6amK/52YcAKIPlM3a+Fpj35zvRj2TP+e1xFSfk=
-golang.org/x/time v0.5.0/go.mod h1:3BpzKBy/shNhVucY/MWOyx10tF3SFh9QdLuxbVysPQM=
golang.org/x/time v0.7.0 h1:ntUhktv3OPE6TgYxXWv9vKvUSJyIFJlyohwbkEwPrKQ=
golang.org/x/time v0.7.0/go.mod h1:3BpzKBy/shNhVucY/MWOyx10tF3SFh9QdLuxbVysPQM=
golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
@@ -482,15 +450,11 @@ golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtn
golang.org/x/tools v0.1.1/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk=
golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc=
golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU=
-golang.org/x/tools v0.25.0 h1:oFU9pkj/iJgs+0DT+VMHrx+oBKs/LJMV+Uvg78sl+fE=
-golang.org/x/tools v0.25.0/go.mod h1:/vtpO8WL1N9cQC3FN5zPqb//fRXskFHbLKk4OW1Q7rg=
golang.org/x/tools v0.26.0 h1:v/60pFQmzmT9ExmjDv2gGIfi3OqfKoEP6I5+umXlbnQ=
golang.org/x/tools v0.26.0/go.mod h1:TPVVj70c7JJ3WCazhD8OdXcZg/og+b9+tH/KxylGwH0=
golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
-google.golang.org/protobuf v1.34.2 h1:6xV6lTsCfpGD21XK49h7MhtcApnLqkfYgPcdHftf6hg=
-google.golang.org/protobuf v1.34.2/go.mod h1:qYOHts0dSfpeUzUFpOMr/WGzszTmLH+DiWniOlNbLDw=
google.golang.org/protobuf v1.35.1 h1:m3LfL6/Ca+fqnjnlqQXNpFPABW1UD7mjh8KO2mKFytA=
google.golang.org/protobuf v1.35.1/go.mod h1:9fA7Ob0pmnwhb644+1+CVWFRbNajQ6iRojtC/QF5bRE=
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
@@ -499,7 +463,6 @@ gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EV
gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
-gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY=
gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ=
gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=
diff --git a/middleware/session_check.go b/middleware/session_check.go
index 38fc002..857811e 100644
--- a/middleware/session_check.go
+++ b/middleware/session_check.go
@@ -3,6 +3,7 @@ package middleware
import (
ginI18n "github.com/gin-contrib/i18n"
"github.com/gin-gonic/gin"
+
"schisandra-cloud-album/common/constant"
"schisandra-cloud-album/common/result"
"schisandra-cloud-album/utils"
diff --git a/model/sca_auth_casbin_rule.go b/model/sca_auth_permission_rule.go
similarity index 100%
rename from model/sca_auth_casbin_rule.go
rename to model/sca_auth_permission_rule.go
diff --git a/utils/generate_avatar.go b/utils/generate_avatar.go
index 09a9836..3161144 100644
--- a/utils/generate_avatar.go
+++ b/utils/generate_avatar.go
@@ -1,103 +1,682 @@
package utils
import (
+ "crypto/sha256"
"encoding/base64"
- "io"
- "net/http"
- "schisandra-cloud-album/global"
+ "encoding/hex"
+ "errors"
+ "math"
+ "regexp"
"strconv"
- "time"
+ "strings"
)
-const (
- numParts = 4 // 分成4块
-)
+type Options struct {
+ Theme int
+ Part int
+}
+
+var svgStart = ""
+var env = ""
+var head = ""
+
+// Themes
+var themes [16][3]map[string][]string
+
+// Shapes
+var sp [16]map[string]string
+
+func init() {
+ // Robo
+ themes[0][0] = map[string][]string{
+ "env": {"#ff2f2b"},
+ "clo": {"#fff", "#000"},
+ "head": {"#fff"},
+ "mouth": {"#fff", "#000", "#000"},
+ "eyes": {"#000", "none", "#0ff"},
+ "top": {"#fff", "#fff"},
+ }
+ themes[0][1] = map[string][]string{
+ "env": {"#ff1ec1"},
+ "clo": {"#000", "#fff"},
+ "head": {"#ffc1c1"},
+ "mouth": {"#fff", "#000", "#000"},
+ "eyes": {"#FF2D00", "#fff", "none"},
+ "top": {"#a21d00", "#fff"},
+ }
+ themes[0][2] = map[string][]string{
+ "env": {"#0079b1"},
+ "clo": {"#0e00b1", "#d1fffe"},
+ "head": {"#f5aa77"},
+ "mouth": {"#fff", "#000", "#000"},
+ "eyes": {"#0c00de", "#fff", "none"},
+ "top": {"#acfffd", "#acfffd"},
+ }
+
+ // Girl
+ themes[1][0] = map[string][]string{
+ "env": {"#a50000"},
+ "clo": {"#f06", "#8e0039"},
+ "head": {"#85492C"},
+ "mouth": {"#000"},
+ "eyes": {"#000", "#ff9809"},
+ "top": {"#ff9809", "#ff9809", "none", "none"},
+ }
+ themes[1][1] = map[string][]string{
+ "env": {"#40E83B"},
+ "clo": {"#00650b", "#62ce5a"},
+ "head": {"#f7c1a6"},
+ "mouth": {"#6e1c1c"},
+ "eyes": {"#000", "#ff833b"},
+ "top": {"#67FFCC", "none", "none", "#ecff3b"},
+ }
+ themes[1][2] = map[string][]string{
+ "env": {"#ff2c2c"},
+ "clo": {"#fff", "#000"},
+ "head": {"#ffce8b"},
+ "mouth": {"#000"},
+ "eyes": {"#000", "#0072ff"},
+ "top": {"#ff9809", "none", "#ffc809", "none"},
+ }
+
+ // Blonde
+ themes[2][0] = map[string][]string{
+ "env": {"#ff7520"},
+ "clo": {"#d12823"},
+ "head": {"#fee3c5"},
+ "mouth": {"#d12823"},
+ "eyes": {"#000", "none"},
+ "top": {"#000", "none", "none", "#FFCC00", "red"},
+ }
+ themes[2][1] = map[string][]string{
+ "env": {"#ff9700"},
+ "clo": {"#000"},
+ "head": {"#d2ad6d"},
+ "mouth": {"#000"},
+ "eyes": {"#000", "#00ffdc"},
+ "top": {"#fdff00", "#fdff00", "none", "none", "none"},
+ }
+ themes[2][2] = map[string][]string{
+ "env": {"#26a7ff"},
+ "clo": {"#d85cd7"},
+ "head": {"#542e02"},
+ "mouth": {"#f70014"},
+ "eyes": {"#000", "magenta"},
+ "top": {"#FFCC00", "#FFCC00", "#FFCC00", "#ff0000", "yellow"},
+ }
+
+ // Evilnormie
+ themes[3][0] = map[string][]string{
+ "env": {"#6FC30E"},
+ "clo": {"#b4e1fa", "#5b5d6e", "#515262", "#a0d2f0", "#a0d2f0"},
+ "head": {"#fae3b9"},
+ "mouth": {"#fff", "#000"},
+ "eyes": {"#000"},
+ "top": {"#8eff45", "#8eff45", "none", "none"},
+ }
+ themes[3][1] = map[string][]string{
+ "env": {"#00a58c"},
+ "clo": {"#000", "#5b00", "#5100", "#a000", "#a000"},
+ "head": {"#FAD2B9"},
+ "mouth": {"#fff", "#000"},
+ "eyes": {"#000"},
+ "top": {"#FFC600", "none", "#FFC600", "none"},
+ }
+ themes[3][2] = map[string][]string{
+ "env": {"#ff501f"},
+ "clo": {"#000", "#ff0000", "#ff0000", "#7d7d7d", "#7d7d7d"},
+ "head": {"#fff3dc"},
+ "mouth": {"#d2001b", "none"},
+ "eyes": {"#000"},
+ "top": {"#D2001B", "none", "none", "#D2001B"},
+ }
+
+ // Country
+ themes[4][0] = map[string][]string{
+ "env": {"#fc0"},
+ "clo": {"#901e0e", "#ffbe1e", "#ffbe1e", "#c55f54"},
+ "head": {"#f8d9ad"},
+ "mouth": {"#000", "none", "#000", "none"},
+ "eyes": {"#000"},
+ "top": {"#583D00", "#AF892E", "#462D00", "#a0a0a0"},
+ }
+ themes[4][1] = map[string][]string{
+ "env": {"#386465"},
+ "clo": {"#fff", "#333", "#333", "#333"},
+ "head": {"#FFD79D"},
+ "mouth": {"#000", "#000", "#000", "#000"},
+ "eyes": {"#000"},
+ "top": {"#27363C", "#5DCAD4", "#314652", "#333"},
+ }
+ themes[4][2] = map[string][]string{
+ "env": {"#DFFF00"},
+ "clo": {"#304267", "#aab0b1", "#aab0b1", "#aab0b1"},
+ "head": {"#e6b876"},
+ "mouth": {"#50230a", "#50230a", "#50230a", "#50230a"},
+ "eyes": {"#000"},
+ "top": {"#333", "#afafaf", "#222", "#6d3a1d"},
+ }
+
+ // Johnyold
+ themes[5][0] = map[string][]string{
+ "env": {"#a09300"},
+ "clo": {"#c7d4e2", "#435363", "#435363", "#141720", "#141720", "#e7ecf2", "#e7ecf2"},
+ "head": {"#f5d4a6"},
+ "mouth": {"#000", "#cf9f76"},
+ "eyes": {"#000", "#000", "#000", "#000", "#000", "#000", "#fff", "#fff", "#fff", "#fff", "#000", "#000"},
+ "top": {"none", "#fdff00"},
+ }
+ themes[5][1] = map[string][]string{
+ "env": {"#b3003e"},
+ "clo": {"#000", "#435363", "#435363", "#000", "none", "#e7ecf2", "#e7ecf2"},
+ "head": {"#f5d4a6"},
+ "mouth": {"#000", "#af9f94"},
+ "eyes": {"#9ff3ffdb", "#000", "#9ff3ffdb", "#000", "#2f508a", "#000", "#000", "#000", "none", "none", "none", "none"},
+ "top": {"#ff9a00", "#ff9a00"},
+ }
+ themes[5][2] = map[string][]string{
+ "env": {"#884f00"},
+ "clo": {"#ff0000", "#fff", "#fff", "#141720", "#141720", "#e7ecf2", "#e7ecf2"},
+ "head": {"#c57b14"},
+ "mouth": {"#000", "#cf9f76"},
+ "eyes": {"none", "#000", "none", "#000", "#5a0000", "#000", "#000", "#000", "none", "none", "none", "none"},
+ "top": {"#efefef", "none"},
+ }
+
+ // Asian
+ themes[6][0] = map[string][]string{
+ "env": {"#8acf00"},
+ "clo": {"#ee2829", "#ff0"},
+ "head": {"#ffce73"},
+ "mouth": {"#fff", "#000"},
+ "eyes": {"#000"},
+ "top": {"#000", "#000", "none", "#000", "#ff4e4e", "#000"},
+ }
+ themes[6][1] = map[string][]string{
+ "env": {"#00d2a3"},
+ "clo": {"#0D0046", "#ffce73"},
+ "head": {"#ffce73"},
+ "mouth": {"#000", "none"},
+ "eyes": {"#000"},
+ "top": {"#000", "#000", "#000", "none", "#ffb358", "#000", "none", "none"},
+ }
+ themes[6][2] = map[string][]string{
+ "env": {"#ff184e"},
+ "clo": {"#000", "none"},
+ "head": {"#ffce73"},
+ "mouth": {"#ff0000", "none"},
+ "eyes": {"#000"},
+ "top": {"none", "none", "none", "none", "none", "#ffc107", "none", "none"},
+ }
+
+ // Punk
+ themes[7][0] = map[string][]string{
+ "env": {"#00deae"},
+ "clo": {"#ff0000"},
+ "head": {"#ffce94"},
+ "mouth": {"#f73b6c", "#000"},
+ "eyes": {"#e91e63", "#000", "#e91e63", "#000", "#000", "#000"},
+ "top": {"#dd104f", "#dd104f", "#f73b6c", "#dd104f"},
+ }
+ themes[7][1] = map[string][]string{
+ "env": {"#181284"},
+ "clo": {"#491f49", "#ff9809", "#491f49"},
+ "head": {"#f6ba97"},
+ "mouth": {"#ff9809", "#000"},
+ "eyes": {"#c4ffe4", "#000", "#c4ffe4", "#000", "#000", "#000"},
+ "top": {"none", "none", "#d6f740", "#516303"},
+ }
+ themes[7][2] = map[string][]string{
+ "env": {"#bcf700"},
+ "clo": {"#ff14e4", "#000", "#14fffd"},
+ "head": {"#7b401e"},
+ "mouth": {"#666", "#000"},
+ "eyes": {"#00b5b4", "#000", "#00b5b4", "#000", "#000", "#000"},
+ "top": {"#14fffd", "#14fffd", "#14fffd", "#0d3a62"},
+ }
+
+ // Afrohair
+ themes[8][0] = map[string][]string{
+ "env": {"#0df"},
+ "clo": {"#571e57", "#ff0"},
+ "head": {"#f2c280"},
+ "mouth": {"#ff0000"},
+ "eyes": {"#795548", "#000"},
+ "top": {"#de3b00", "none"},
+ }
+ themes[8][1] = map[string][]string{
+ "env": {"#B400C2"},
+ "clo": {"#0D204A", "#00ffdf"},
+ "head": {"#ca8628"},
+ "mouth": {"#1a1a1a"},
+ "eyes": {"#cbbdaf", "#000"},
+ "top": {"#000", "#000"},
+ }
+ themes[8][2] = map[string][]string{
+ "env": {"#ffe926"},
+ "clo": {"#00d6af", "#000"},
+ "head": {"#8c5100"},
+ "mouth": {"#7d0000"},
+ "eyes": {"none", "#000"},
+ "top": {"#f7f7f7", "none"},
+ }
+
+ // Normie female
+ themes[9][0] = map[string][]string{
+ "env": {"#4aff0c"},
+ "clo": {"#101010", "#fff", "#fff"},
+ "head": {"#dbbc7f"},
+ "mouth": {"#000"},
+ "eyes": {"#000", "none", "none"},
+ "top": {"#531148", "#531148", "#531148", "none"},
+ }
+ themes[9][1] = map[string][]string{
+ "env": {"#FFC107"},
+ "clo": {"#033c58", "#fff", "#fff"},
+ "head": {"#dbc97f"},
+ "mouth": {"#000"},
+ "eyes": {"none", "#fff", "#000"},
+ "top": {"#FFEB3B", "#FFEB3B", "none", "#FFEB3B"},
+ }
+ themes[9][2] = map[string][]string{
+ "env": {"#FF9800"},
+ "clo": {"#b40000", "#fff", "#fff"},
+ "head": {"#E2AF6B"},
+ "mouth": {"#000"},
+ "eyes": {"none", "#fff", "#000"},
+ "top": {"#ec0000", "#ec0000", "none", "none"},
+ }
+
+ // Older
+ themes[10][0] = map[string][]string{
+ "env": {"#104c8c"},
+ "clo": {"#354B65", "#3D8EBB", "#89D0DA", "#00FFFD"},
+ "head": {"#cc9a5c"},
+ "mouth": {"#222", "#fff"},
+ "eyes": {"#000", "#000"},
+ "top": {"#fff", "#fff", "none"},
+ }
+ themes[10][1] = map[string][]string{
+ "env": {"#0DC15C"},
+ "clo": {"#212121", "#fff", "#212121", "#fff"},
+ "head": {"#dca45f"},
+ "mouth": {"#111", "#633b1d"},
+ "eyes": {"#000", "#000"},
+ "top": {"none", "#792B74", "#792B74"},
+ }
+ themes[10][2] = map[string][]string{
+ "env": {"#ffe500"},
+ "clo": {"#1e5e80", "#fff", "#1e5e80", "#fff"},
+ "head": {"#e8bc86"},
+ "mouth": {"#111", "none"},
+ "eyes": {"#000", "#000"},
+ "top": {"none", "none", "#633b1d"},
+ }
+
+ // Firehair
+ themes[11][0] = map[string][]string{
+ "env": {"#4a3f73"},
+ "clo": {"#e6e9ee", "#f1543f", "#ff7058", "#fff", "#fff"},
+ "head": {"#b27e5b"},
+ "mouth": {"#191919", "#191919"},
+ "eyes": {"#000", "#000", "#57FFFD"},
+ "top": {"#ffc", "#ffc", "#ffc"},
+ }
+ themes[11][1] = map[string][]string{
+ "env": {"#00a08d"},
+ "clo": {"#FFBA32", "#484848", "#4e4e4e", "#fff", "#fff"},
+ "head": {"#ab5f2c"},
+ "mouth": {"#191919", "#191919"},
+ "eyes": {"#000", "#ff23fa63", "#000"},
+ "top": {"#ff90f4", "#ff90f4", "#ff90f4"},
+ }
+ themes[11][2] = map[string][]string{
+ "env": {"#22535d"},
+ "clo": {"#000", "#ff2500", "#ff2500", "#fff", "#fff"},
+ "head": {"#a76c44"},
+ "mouth": {"#191919", "#191919"},
+ "eyes": {"#000", "none", "#000"},
+ "top": {"none", "#00efff", "none"},
+ }
+
+ // Blond
+ themes[12][0] = map[string][]string{
+ "env": {"#2668DC"},
+ "clo": {"#2385c6", "#b8d0e0", "#b8d0e0"},
+ "head": {"#ad8a60"},
+ "mouth": {"#000", "#4d4d4d"},
+ "eyes": {"#7fb5a2", "#d1eddf", "#301e19"},
+ "top": {"#fff510", "#fff510"},
+ }
+ themes[12][1] = map[string][]string{
+ "env": {"#643869"},
+ "clo": {"#D67D1B", "#b8d0e0", "#b8d0e0"},
+ "head": {"#CC985A", "none0000"},
+ "mouth": {"#000", "#ececec"},
+ "eyes": {"#1f2644", "#9b97ce", "#301e19"},
+ "top": {"#00eaff", "none"},
+ }
+ themes[12][2] = map[string][]string{
+ "env": {"#F599FF"},
+ "clo": {"#2823C6", "#b8d0e0", "#b8d0e0"},
+ "head": {"#C7873A"},
+ "mouth": {"#000", "#4d4d4d"},
+ "eyes": {"#581b1b", "#FF8B8B", "#000"},
+ "top": {"none", "#9c0092"},
+ }
+
+ // Ateam
+ themes[13][0] = map[string][]string{
+ "env": {"#d10084"},
+ "clo": {"#efedee", "#00a1e0", "#00a1e0", "#efedee", "#ffce1c"},
+ "head": {"#b35f49"},
+ "mouth": {"#3a484a", "#000"},
+ "eyes": {"#000"},
+ "top": {"#000", "none", "#000", "none"},
+ }
+ themes[13][1] = map[string][]string{
+ "env": {"#E6C117"},
+ "clo": {"#efedee", "#ec0033", "#ec0033", "#efedee", "#f2ff05"},
+ "head": {"#ffc016"},
+ "mouth": {"#4a3737", "#000"},
+ "eyes": {"#000"},
+ "top": {"#ffe900", "#ffe900", "none", "#ffe900"},
+ }
+ themes[13][2] = map[string][]string{
+ "env": {"#1d8c00"},
+ "clo": {"#e000cb", "#fff", "#fff", "#e000cb", "#ffce1c"},
+ "head": {"#b96438"},
+ "mouth": {"#000", "#000"},
+ "eyes": {"#000"},
+ "top": {"#53ffff", "#53ffff", "none", "none"},
+ }
+
+ // Rasta
+ themes[14][0] = map[string][]string{
+ "env": {"#fc0065"},
+ "clo": {"#708913", "#fdea14", "#708913", "#fdea14", "#708913"},
+ "head": {"#DEA561"},
+ "mouth": {"#444", "#000"},
+ "eyes": {"#000"},
+ "top": {"#32393f", "#32393f", "#32393f", "#32393f", "#32393f", "#32393f", "#32393f", "#32393f", "#32393f", "#32393f", "#32393f", "#32393f", "#32393f", "#32393f", "#32393f", "#32393f", "#32393f"},
+ }
+ themes[14][1] = map[string][]string{
+ "env": {"#81f72e"},
+ "clo": {"#ff0000", "#ffc107", "#ff0000", "#ffc107", "#ff0000"},
+ "head": {"#ef9831"},
+ "mouth": {"#6b0000", "#000"},
+ "eyes": {"#000"},
+ "top": {"#FFFAAD", "#FFFAAD", "#FFFAAD", "#FFFAAD", "#FFFAAD", "#FFFAAD", "#FFFAAD", "#FFFAAD", "#FFFAAD", "#FFFAAD", "#FFFAAD", "#FFFAAD", "#FFFAAD", "none", "none", "none", "none"},
+ }
+ themes[14][2] = map[string][]string{
+ "env": {"#00D872"},
+ "clo": {"#590D00", "#FD1336", "#590D00", "#FD1336", "#590D00"},
+ "head": {"#c36c00"},
+ "mouth": {"#56442b", "#000"},
+ "eyes": {"#000"},
+ "top": {"#004E4C", "#004E4C", "#004E4C", "#004E4C", "#004E4C", "#004E4C", "#004E4C", "#004E4C", "#004E4C", "none", "none", "none", "none", "none", "none", "none", "none"},
+ }
+
+ // Meta
+ themes[15][0] = map[string][]string{
+ "env": {"#111"},
+ "clo": {"#000", "#00FFFF"},
+ "head": {"#755227"},
+ "mouth": {"#fff", "#000"},
+ "eyes": {"black", "#008a", "aqua"},
+ "top": {"#fff", "#fff", "#fff", "#fff", "#fff"},
+ }
+ themes[15][1] = map[string][]string{
+ "env": {"#00D0D4"},
+ "clo": {"#000", "#fff"},
+ "head": {"#755227"},
+ "mouth": {"#fff", "#000"},
+ "eyes": {"black", "#1df7ffa3", "#fcff2c"},
+ "top": {"#fff539", "none", "#fff539", "none", "#fff539"},
+ }
+ themes[15][2] = map[string][]string{
+ "env": {"#DC75FF"},
+ "clo": {"#000", "#FFBDEC"},
+ "head": {"#997549"},
+ "mouth": {"#fff", "#000"},
+ "eyes": {"black", "black", "aqua"},
+ "top": {"#00fffd", "none", "none", "none", "none"},
+ }
+
+ // Robo
+ sp[0] = map[string]string{
+ "clo": "",
+ "mouth": "",
+ "eyes": "",
+ "top": "",
+ }
+
+ // Girl
+ sp[1] = map[string]string{
+ "clo": "",
+ "mouth": "",
+ "eyes": "",
+ "top": "",
+ }
+
+ // Blonde
+ sp[2] = map[string]string{
+ "clo": "",
+ "mouth": "",
+ "eyes": "",
+ "top": "",
+ }
+
+ // Guy
+ sp[3] = map[string]string{
+ "clo": "",
+ "mouth": "",
+ "eyes": "",
+ "top": "",
+ }
+
+ // Country
+ sp[4] = map[string]string{
+ "clo": "",
+ "mouth": "",
+ "eyes": "",
+ "top": "",
+ }
+
+ // Geeknot
+ sp[5] = map[string]string{
+ "clo": "",
+ "mouth": "",
+ "eyes": "",
+ "top": "",
+ }
+
+ // Asian
+ sp[6] = map[string]string{
+ "clo": "",
+ "mouth": "",
+ "eyes": "",
+ "top": "",
+ }
+
+ // Punk
+ sp[7] = map[string]string{
+ "clo": "",
+ "mouth": "",
+ "eyes": "",
+ "top": "",
+ }
+
+ // Afrohair
+ sp[8] = map[string]string{
+ "clo": "",
+ "mouth": "",
+ "eyes": "",
+ "top": "",
+ }
+
+ // Normie Female
+ sp[9] = map[string]string{
+ "clo": "",
+ "mouth": "",
+ "eyes": "",
+ "top": "",
+ }
+
+ // Older
+ sp[10] = map[string]string{
+ "clo": "",
+ "mouth": "",
+ "eyes": "",
+ "top": "",
+ }
+
+ // Firehair
+ sp[11] = map[string]string{
+ "clo": "",
+ "mouth": "",
+ "eyes": "",
+ "top": "",
+ }
+
+ // Blond
+ sp[12] = map[string]string{
+ "clo": "",
+ "mouth": "",
+ "eyes": "",
+ "top": "",
+ }
+
+ // Ateam
+ sp[13] = map[string]string{
+ "clo": "",
+ "mouth": "",
+ "eyes": "",
+ "top": "",
+ }
+
+ // Rasta
+ sp[14] = map[string]string{
+ "clo": "",
+ "mouth": "",
+ "eyes": "",
+ "top": "",
+ }
+
+ // Meta
+ sp[15] = map[string]string{
+ "clo": "",
+ "mouth": "",
+ "eyes": "",
+ "top": "",
+ }
+}
+
+func SvgCode(avatarId string, sansEnv bool, opts *Options) (svg string, err error) {
+ if avatarId == "" {
+ err = errors.New("avatar id is required")
+ return
+ }
+
+ h := sha256.New()
+ h.Write([]byte(avatarId))
+ sum := h.Sum(nil)
+ s := hex.EncodeToString(sum)
+ reg := regexp.MustCompile("[0-9]")
+ hash := reg.FindAllString(s, -1)[0:12]
+
+ var p = make(map[string][2]int, 6)
+ var num int
+ num, err = strconv.Atoi(strings.Join(hash[:2], ""))
+ if err != nil {
+ num = 0
+ }
+ p["env"] = getKey(int(math.Floor(.47*float64(num)+.5)), opts)
+
+ num, err = strconv.Atoi(strings.Join(hash[2:4], ""))
+ if err != nil {
+ num = 0
+ }
+ p["clo"] = getKey(int(math.Floor(.47*float64(num)+.5)), opts)
+
+ num, err = strconv.Atoi(strings.Join(hash[4:6], ""))
+ if err != nil {
+ num = 0
+ }
+ p["head"] = getKey(int(math.Floor(.47*float64(num)+.5)), opts)
+
+ num, err = strconv.Atoi(strings.Join(hash[6:8], ""))
+ if err != nil {
+ num = 0
+ }
+ p["mouth"] = getKey(int(math.Floor(.47*float64(num)+.5)), opts)
+
+ num, err = strconv.Atoi(strings.Join(hash[8:10], ""))
+ if err != nil {
+ num = 0
+ }
+ p["eyes"] = getKey(int(math.Floor(.47*float64(num)+.5)), opts)
+
+ num, err = strconv.Atoi(strings.Join(hash[10:], ""))
+ if err != nil {
+ num = 0
+ }
+ p["top"] = getKey(int(math.Floor(.47*float64(num)+.5)), opts)
+
+ var final = make(map[string]string, 6)
+ for k, v := range p {
+ colors := themes[v[0]][v[1]][k]
+ var svgPart string
+ if k == "env" {
+ svgPart = env
+ } else if k == "head" {
+ svgPart = head
+ } else {
+ svgPart = sp[v[0]][k]
+ }
+
+ reg := regexp.MustCompile("#(.*?)+(;)")
+ match := reg.FindAllString(svgPart, -1)
+ for i, rm := range match {
+ svgPart = strings.Replace(svgPart, rm, colors[i]+";", 1)
+ }
+ final[k] = svgPart
+ }
+
+ var builder strings.Builder
+ builder.WriteString(svgStart)
+ builder.WriteString(final["env"])
+ builder.WriteString(final["head"])
+ builder.WriteString(final["clo"])
+ builder.WriteString(final["top"])
+ builder.WriteString(final["eyes"])
+ builder.WriteString(final["mouth"])
+ builder.WriteString(svgEnd)
+ svg = builder.String()
+
+ return
+}
+
+func getKey(v int, opts *Options) [2]int {
+ if opts != nil {
+ return [2]int{opts.Part, opts.Theme}
+ }
+
+ if v > 31 {
+ return [2]int{v - 32, 2}
+ } else if v > 15 {
+ return [2]int{v - 16, 1}
+ } else {
+ return [2]int{v, 0}
+ }
+}
func GenerateAvatar(userId string) (baseImg string) {
- path := "https://api.multiavatar.com/" + userId + ".png"
-
- // 创建 HTTP 客户端并设置超时时间
- client := &http.Client{
- Timeout: 10 * time.Second,
- }
-
- // 发送 HEAD 请求获取图片大小
- headReq, err := http.NewRequest("HEAD", path, nil)
+ svg, err := SvgCode(userId, true, nil)
if err != nil {
- global.LOG.Error(err)
- return ""
+ return "data:image/svg+xml;charset=utf-8;base64,PHN2ZyB0PSIxNzMwNDUwODA4NDIwIiBjbGFzcz0iaWNvbiIgdmlld0JveD0iMCAwIDEwMjQgMTAyNCIgdmVyc2lvbj0iMS4xIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHAtaWQ9IjkyMDMiIHdpZHRoPSIyMDAiIGhlaWdodD0iMjAwIj48cGF0aCBkPSJNOTc0LjU5NjU0NiA1MDUuOTYwNTg0YzAgMjU1LjQ4NDg0My0yMDcuMTA3NTczIDQ2Ni40MjA0NzctNDYyLjU5NjU0NiA0NjYuNDIwNDc3LTI1NS40ODg5NzMgMC00NjIuNTk2NTQ2LTIxMC45MzU2MzQtNDYyLjU5NjU0Ni00NjYuNDIwNDc3QzQ5LjQwMzQ1NCAyNTAuNDcxNjEyIDI1Ni41MTEwMjcgNDMuMzU5OTA5IDUxMiA0My4zNTk5MDljMjU1LjQ4ODk3MyAwIDQ2Mi41OTY1NDYgMjA3LjExMTcwMyA0NjIuNTk2NTQ2IDQ2Mi42MDA2NzV6IiBmaWxsPSIjRkZFNTc4IiBwLWlkPSI5MjA0Ij48L3BhdGg+PHBhdGggZD0iTTUxMiAxMDAzLjM1MjQyNGMtMjcyLjE1NTY5NiAwLTQ5My41Njc5MDktMjIzLjEzMDA5Mi00OTMuNTY3OTA5LTQ5Ny4zOTE4NEMxOC40MzIwOTEgMjMzLjgwNDg4OCAyMzkuODQ0MzA0IDEyLjM4ODU0NSA1MTIgMTIuMzg4NTQ1czQ5My41Njc5MDkgMjIxLjQxNjM0MyA0OTMuNTY3OTA5IDQ5My41Njc5MWMwIDI3NC4yNjU4NzgtMjIxLjQxMjIxNCA0OTcuMzk1OTctNDkzLjU2NzkwOSA0OTcuMzk1OTY5ek01MTIgNzQuMzMxMjczQzI3My45OTk1MjQgNzQuMzMxMjczIDgwLjM3NDgxOCAyNjcuOTYwMTA4IDgwLjM3NDgxOCA1MDUuOTYwNTg0YzAgMjQwLjExMDY1OCAxOTMuNjI4ODM2IDQzNS40NDkxMTMgNDMxLjYyNTE4MiA0MzUuNDQ5MTEzczQzMS42MjUxODItMTk1LjM0MjU4NCA0MzEuNjI1MTgyLTQzNS40NDkxMTNDOTQzLjYyNTE4MiAyNjcuOTYwMTA4IDc1MC4wMDA0NzYgNzQuMzMxMjczIDUxMiA3NC4zMzEyNzN6IiBmaWxsPSIjNkU2RTk2IiBwLWlkPSI5MjA1Ij48L3BhdGg+PHBhdGggZD0iTTUxMS43OTc2NTQgNDMuMzU5OTA5Yy0yMzUuMDY4NTIgMC00MjkuMTc2Mzc5IDE3NS4zMzkyMTMtNDU4LjY5ODI4NCA0MDIuMzYzNDM4IDEuMDk0MzIyIDIuMTUxNDc3IDEuNzI2MTM3IDMuMjg3MDk0IDEuNzI2MTM4IDMuMjg3MDk0aDI1MC42MDM3NTZsNDIuMDUwODUzLTE4MC4wODgxNTYgMzguMjMxMDUxIDE4MC4wODgxNTZoNTg1LjE4OTQ2MkM5NDIuODMyMzE1IDIyMC4zOTYzNTMgNzQ3Ljk5NzY2MSA0My4zNTk5MDkgNTExLjc5NzY1NCA0My4zNTk5MDl6IiBmaWxsPSIjOUM5Q0JDIiBwLWlkPSI5MjA2Ij48L3BhdGg+PHBhdGggZD0iTTI1MC4wNTY1OTUgNjA5LjE4MTk0NWE4MC4yODYwMzMgNjguODE0MjQgOTAgMSAwIDEzNy42Mjg0ODEgMCA4MC4yODYwMzMgNjguODE0MjQgOTAgMSAwLTEzNy42Mjg0ODEgMFoiIGZpbGw9IiM2RTZFOTYiIHAtaWQ9IjkyMDciPjwvcGF0aD48cGF0aCBkPSJNNjMzLjMyOTI4NCA2MDkuMTgxOTQ1YTgwLjI4NjAzMyA2OC44MTAxMTEgOTAgMSAwIDEzNy42MjAyMjIgMCA4MC4yODYwMzMgNjguODEwMTExIDkwIDEgMC0xMzcuNjIwMjIyIDBaIiBmaWxsPSIjNkU2RTk2IiBwLWlkPSI5MjA4Ij48L3BhdGg+PHBhdGggZD0iTTEwMDUuOTA2NTI5IDQ3OS45ODE4MDRIMzYwLjYyNDM2M2wtMTQuNTg1NDQ3LTY4LjY5NDQ4NC0xNi4wMzkwMzcgNjguNjk0NDg0SDM2LjY2MzlsLTguOTE5NzUyLTE1LjkzOTkyOHMtMC44MjU5MDMtMS40NzAxMDctMi4yNDIzMjctNC4yNjE2NmwtNC4zNTI1MDktOC41NDM5NjcgMS4yMzQ3MjUtOS41MDYxNDNDNTQuMjE0MzQgMTk2Ljk2NTQ4NCAyNjQuNjEzMTM2IDEyLjM4ODU0NSA1MTEuNzk3NjU0IDEyLjM4ODU0NWMyNDguOTY0MzM5IDAgNDU5LjU0ODk2MyAxODYuMDg0MjExIDQ4OS44NDcyMTYgNDMyLjg0NzUxOWw0LjI2MTY1OSAzNC43NDU3NHogbS01OTUuMTEyNjg2LTYxLjk0MjcyN2g1MjMuNjU5Njg2Qzg5My41MjE3NzUgMjE5LjgwMTcwMyA3MTcuNjYyMjQzIDc0LjMzMTI3MyA1MTEuNzk3NjU0IDc0LjMzMTI3MyAzMDYuNDM2ODY2IDc0LjMzMTI3MyAxMzAuMTEwNjk4IDIxOS45ODc1MzEgODkuMTM3NjQ5IDQxOC4wMzkwNzdoMTkxLjcxMjc0MWwzNi40NjM2MTgtMTU2LjE1NzYxNSA2MC40NTYxMDIgMC42MTExNjggMzMuMDIzNzMzIDE1NS41NDY0NDd6IiBmaWxsPSIjNkU2RTk2IiBwLWlkPSI5MjA5Ij48L3BhdGg+PC9zdmc+"
}
-
- respHead, err := client.Do(headReq)
- if err != nil {
- global.LOG.Error(err)
- return ""
- }
- defer respHead.Body.Close()
-
- // 获取图片大小
- contentLength := respHead.ContentLength
- if contentLength <= 0 {
- return ""
- }
-
- imgChunks := make([][]byte, numParts) // 存储每个部分的图片数据
-
- // 启动多个 goroutine 下载分块
- for i := 0; i < numParts; i++ {
- wg.Add(1)
- go func(part int) {
- defer wg.Done()
- start := (contentLength / int64(numParts)) * int64(part)
- end := start + (contentLength / int64(numParts)) - 1
- if part == numParts-1 {
- end = contentLength - 1 // 最后一部分下载到文件末尾
- }
-
- // 创建 RANGE 请求
- rangeHeader := "bytes=" + strconv.FormatInt(start, 10) + "-" + strconv.FormatInt(end, 10)
- request, err := http.NewRequest("GET", path, nil)
- if err != nil {
- global.LOG.Error(err)
- return
- }
- request.Header.Set("Range", rangeHeader)
-
- respImg, err := client.Do(request)
- if err != nil {
- global.LOG.Error(err)
- return
- }
- defer respImg.Body.Close()
-
- // 读取图片数据
- imgByte, err := io.ReadAll(respImg.Body)
- if err != nil {
- global.LOG.Error(err)
- return
- }
-
- // 存储分块
- imgChunks[part] = imgByte
- }(i)
- }
-
- wg.Wait() // 等待所有 goroutine 完成
-
- // 合并所有部分
- var fullImg []byte
- for _, chunk := range imgChunks {
- fullImg = append(fullImg, chunk...)
- }
-
- // 判断文件类型,生成一个前缀
- mimeType := http.DetectContentType(fullImg)
- switch mimeType {
- case "image/png":
- baseImg = "data:image/png;base64," + base64.StdEncoding.EncodeToString(fullImg)
- default:
- return ""
- }
-
- return baseImg
+ svgBytes := []byte(svg)
+ return "data:image/svg+xml;base64," + base64.StdEncoding.EncodeToString(svgBytes)
}