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 svgEnd = "" +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) }