From cc08e830d3fbca88ab2e972989bc37c8bd277e63 Mon Sep 17 00:00:00 2001 From: ayflying Date: Fri, 21 Mar 2025 16:33:44 +0800 Subject: [PATCH] =?UTF-8?q?=E5=88=86=E7=A6=BBwebsocket?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- go.mod | 13 +- go.sum | 37 ++- package/aycache/cache.go | 38 --- package/aycache/drive/elasticsearch.go | 119 -------- package/aycache/file.go | 134 --------- package/aycache/memory.go | 15 - package/aycache/mencached.go | 120 -------- package/aycache/redis.go | 18 -- package/pay/wechat.go | 2 + package/rank/rank.go | 395 ------------------------- pkg/aycache/cache.go | 2 +- pkg/pkg.go | 5 + pkg/websocket/registerer.go | 14 + pkg/websocket/socket_new.go | 177 +++++++++++ 14 files changed, 223 insertions(+), 866 deletions(-) delete mode 100644 package/aycache/cache.go delete mode 100644 package/aycache/drive/elasticsearch.go delete mode 100644 package/aycache/file.go delete mode 100644 package/aycache/memory.go delete mode 100644 package/aycache/mencached.go delete mode 100644 package/aycache/redis.go delete mode 100644 package/rank/rank.go create mode 100644 pkg/websocket/registerer.go create mode 100644 pkg/websocket/socket_new.go diff --git a/go.mod b/go.mod index a8a4201..f15c011 100644 --- a/go.mod +++ b/go.mod @@ -10,8 +10,8 @@ require ( github.com/go-pay/gopay v1.5.109 github.com/go-pay/util v0.0.4 github.com/goccy/go-json v0.10.4 - github.com/gogf/gf/contrib/config/apollo/v2 v2.8.3 - github.com/gogf/gf/v2 v2.8.3 + github.com/gogf/gf/contrib/config/apollo/v2 v2.9.0 + github.com/gogf/gf/v2 v2.9.0 github.com/lionsoul2014/ip2region/binding/golang v0.0.0-20241220152942-06eb5c6e8230 github.com/minio/minio-go/v7 v7.0.85 github.com/xuri/excelize/v2 v2.9.0 @@ -28,7 +28,6 @@ require ( github.com/clbanning/mxj/v2 v2.7.0 // indirect github.com/dustin/go-humanize v1.0.1 // indirect github.com/elastic/elastic-transport-go/v8 v8.6.1 // indirect - github.com/emersion/go-imap/v2 v2.0.0-beta.5 // indirect github.com/emirpasic/gods v1.18.1 // indirect github.com/fatih/color v1.18.0 // indirect github.com/fsnotify/fsnotify v1.7.0 // indirect @@ -70,10 +69,10 @@ require ( github.com/xuri/efp v0.0.0-20240408161823-9ad904a10d6d // indirect github.com/xuri/nfp v0.0.0-20240318013403-ab9948c2c4a7 // indirect go.opencensus.io v0.23.0 // indirect - go.opentelemetry.io/otel v1.28.0 // indirect - go.opentelemetry.io/otel/metric v1.28.0 // indirect - go.opentelemetry.io/otel/sdk v1.24.0 // indirect - go.opentelemetry.io/otel/trace v1.28.0 // indirect + go.opentelemetry.io/otel v1.32.0 // indirect + go.opentelemetry.io/otel/metric v1.32.0 // indirect + go.opentelemetry.io/otel/sdk v1.32.0 // indirect + go.opentelemetry.io/otel/trace v1.32.0 // indirect golang.org/x/crypto v0.33.0 // indirect golang.org/x/net v0.33.0 // indirect golang.org/x/sys v0.30.0 // indirect diff --git a/go.sum b/go.sum index 1ff2d75..48d4e88 100644 --- a/go.sum +++ b/go.sum @@ -77,8 +77,6 @@ github.com/elastic/elastic-transport-go/v8 v8.6.1 h1:h2jQRqH6eLGiBSN4eZbQnJLtL4b github.com/elastic/elastic-transport-go/v8 v8.6.1/go.mod h1:YLHer5cj0csTzNFXoNQ8qhtGY1GTvSqPnKWKaqQE3Hk= github.com/elastic/go-elasticsearch/v8 v8.17.1 h1:bOXChDoCMB4TIwwGqKd031U8OXssmWLT3UrAr9EGs3Q= github.com/elastic/go-elasticsearch/v8 v8.17.1/go.mod h1:MVJCtL+gJJ7x5jFeUmA20O7rvipX8GcQmo5iBcmaJn4= -github.com/emersion/go-imap/v2 v2.0.0-beta.5 h1:H3858DNmBuXyMK1++YrQIRdpKE1MwBc+ywBtg3n+0wA= -github.com/emersion/go-imap/v2 v2.0.0-beta.5/go.mod h1:BZTFHsS1hmgBkFlHqbxGLXk2hnRqTItUgwjSSCsYNAk= github.com/emirpasic/gods v1.18.1 h1:FXtiHYKDGKCW2KzwZKx0iC0PQmdlorYgdFG9jPXJ1Bc= github.com/emirpasic/gods v1.18.1/go.mod h1:8tpGGwCnJ5H4r6BWwaV6OrWmMoPhUl5jm/FMNAnJvWQ= github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= @@ -124,10 +122,10 @@ github.com/go-pay/xtime v0.0.2/go.mod h1:W1yRbJaSt4CSBcdAtLBQ8xajiN/Pl5hquGczUcU github.com/goccy/go-json v0.10.4 h1:JSwxQzIqKfmFX1swYPpUThQZp/Ka4wzJdK0LWVytLPM= github.com/goccy/go-json v0.10.4/go.mod h1:oq7eo15ShAhp70Anwd5lgX2pLfOS3QCiwU/PULtXL6M= github.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= -github.com/gogf/gf/contrib/config/apollo/v2 v2.8.3 h1:KU51l3uaU7Mxq+FSoLjROyDERUGKCMo4qExxPEgA7KQ= -github.com/gogf/gf/contrib/config/apollo/v2 v2.8.3/go.mod h1:Uo6f/Pr6zVHSbdP2Lj9iToEMuh/TzU/bE2E5SJlquEk= -github.com/gogf/gf/v2 v2.8.3 h1:h9Px3lqJnnH6It0AqHRz4/1hx0JmvaSf1IvUir5x1rA= -github.com/gogf/gf/v2 v2.8.3/go.mod h1:n++xPYGUUMadw6IygLEgGZqc6y6DRLrJKg5kqCrPLWY= +github.com/gogf/gf/contrib/config/apollo/v2 v2.9.0 h1:BewnDc3gq2iqYzPH56FtOelmT9F9WcAm6nnlOVgw3J8= +github.com/gogf/gf/contrib/config/apollo/v2 v2.9.0/go.mod h1:uNjaJcnMvMl7bkcoL0amxwcrOM+Q5XGADKKwKTY+8MY= +github.com/gogf/gf/v2 v2.9.0 h1:semN5Q5qGjDQEv4620VzxcJzJlSD07gmyJ9Sy9zfbHk= +github.com/gogf/gf/v2 v2.9.0/go.mod h1:sWGQw+pLILtuHmbOxoe0D+0DdaXxbleT57axOLH2vKI= github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= @@ -302,8 +300,8 @@ github.com/rivo/uniseg v0.4.7 h1:WUdvkW8uEhrYfLC4ZzdpI2ztxP1I582+49Oc5Mq64VQ= github.com/rivo/uniseg v0.4.7/go.mod h1:FN3SvrM+Zdj16jyLfmOkMNblXMcoc8DfTHruCPUcx88= github.com/rogpeppe/fastuuid v1.2.0/go.mod h1:jVj6XXZzXRy/MSR5jhDC/2q6DgLz+nrA6LYCDYWNEvQ= github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= -github.com/rogpeppe/go-internal v1.9.0 h1:73kH8U+JUqXU8lRuOHeVHaa/SZPifC7BkcraZVejAe8= -github.com/rogpeppe/go-internal v1.9.0/go.mod h1:WtVeX8xhTBvf0smdhujwtBcq4Qrzq/fJaraNFVN+nFs= +github.com/rogpeppe/go-internal v1.13.1 h1:KvO1DLK/DRN07sQ1LQKScxyZJuNnedQ5/wKSR38lUII= +github.com/rogpeppe/go-internal v1.13.1/go.mod h1:uMEvuHeurkdAXX61udpOXGD/AzZDWNMNyH2VO9fmH0o= github.com/rs/xid v1.6.0 h1:fV591PaemRlL6JfRxGDEPl69wICngIQ3shQtzfy2gxU= github.com/rs/xid v1.6.0/go.mod h1:7XoLgs4eV+QndskICGsho+ADou8ySMSjJKDIan90Nz0= github.com/ryanuber/columnize v0.0.0-20160712163229-9b3edd62028f/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts= @@ -331,8 +329,8 @@ github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81P github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA= github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= -github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg= -github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= +github.com/stretchr/testify v1.10.0 h1:Xv5erBjTwe/5IxqUQTdXv5kgmIvbHo3QQyRwhJsOfJA= +github.com/stretchr/testify v1.10.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= github.com/subosito/gotenv v1.2.0 h1:Slr1R9HxAlEKefgq5jn9U+DnETlIUa6HfgEzj0g5d7s= github.com/subosito/gotenv v1.2.0/go.mod h1:N0PQaV/YGNqwC0u51sEeR/aUtSLEXKX9iv69rRypqCw= github.com/tevid/gohamcrest v1.1.1 h1:ou+xSqlIw1xfGTg1uq1nif/htZ2S3EzRqLm2BP+tYU0= @@ -359,14 +357,14 @@ go.opencensus.io v0.22.4/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= go.opencensus.io v0.22.5/go.mod h1:5pWMHQbX5EPX2/62yrJeAkowc+lfs/XD7Uxpq3pI6kk= go.opencensus.io v0.23.0 h1:gqCw0LfLxScz8irSi8exQc7fyQ0fKQU/qnC/X8+V/1M= go.opencensus.io v0.23.0/go.mod h1:XItmlyltB5F7CS4xOC1DcqMoFqwtC6OG2xF7mCv7P7E= -go.opentelemetry.io/otel v1.28.0 h1:/SqNcYk+idO0CxKEUOtKQClMK/MimZihKYMruSMViUo= -go.opentelemetry.io/otel v1.28.0/go.mod h1:q68ijF8Fc8CnMHKyzqL6akLO46ePnjkgfIMIjUIX9z4= -go.opentelemetry.io/otel/metric v1.28.0 h1:f0HGvSl1KRAU1DLgLGFjrwVyismPlnuU6JD6bOeuA5Q= -go.opentelemetry.io/otel/metric v1.28.0/go.mod h1:Fb1eVBFZmLVTMb6PPohq3TO9IIhUisDsbJoL/+uQW4s= -go.opentelemetry.io/otel/sdk v1.24.0 h1:YMPPDNymmQN3ZgczicBY3B6sf9n62Dlj9pWD3ucgoDw= -go.opentelemetry.io/otel/sdk v1.24.0/go.mod h1:KVrIYw6tEubO9E96HQpcmpTKDVn9gdv35HoYiQWGDFg= -go.opentelemetry.io/otel/trace v1.28.0 h1:GhQ9cUuQGmNDd5BTCP2dAvv75RdMxEfTmYejp+lkx9g= -go.opentelemetry.io/otel/trace v1.28.0/go.mod h1:jPyXzNPg6da9+38HEwElrQiHlVMTnVfM3/yv2OlIHaI= +go.opentelemetry.io/otel v1.32.0 h1:WnBN+Xjcteh0zdk01SVqV55d/m62NJLJdIyb4y/WO5U= +go.opentelemetry.io/otel v1.32.0/go.mod h1:00DCVSB0RQcnzlwyTfqtxSm+DRr9hpYrHjNGiBHVQIg= +go.opentelemetry.io/otel/metric v1.32.0 h1:xV2umtmNcThh2/a/aCP+h64Xx5wsj8qqnkYZktzNa0M= +go.opentelemetry.io/otel/metric v1.32.0/go.mod h1:jH7CIbbK6SH2V2wE16W05BHCtIDzauciCRLoc/SyMv8= +go.opentelemetry.io/otel/sdk v1.32.0 h1:RNxepc9vK59A8XsgZQouW8ue8Gkb4jpWtJm9ge5lEG4= +go.opentelemetry.io/otel/sdk v1.32.0/go.mod h1:LqgegDBjKMmb2GC6/PrTnteJG39I8/vJCAP9LlJXEjU= +go.opentelemetry.io/otel/trace v1.32.0 h1:WIC9mYrXf8TmY/EXuULKc8hR17vE+Hjv2cssQDe03fM= +go.opentelemetry.io/otel/trace v1.32.0/go.mod h1:+i4rkvCraA+tG6AzwloGaCtkx53Fa+L+V8e9a7YvhT8= go.uber.org/atomic v1.7.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= go.uber.org/multierr v1.6.0/go.mod h1:cdWPpRnG4AhwMwsgIHip0KRBQjJy5kYEpYjJxpXp9iU= go.uber.org/zap v1.17.0/go.mod h1:MXVU+bhUf/A7Xi2HNOnopQOrmycQ5Ih87HtOu4q5SSo= @@ -701,8 +699,9 @@ google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQ gopkg.in/alexcesaro/quotedprintable.v3 v3.0.0-20150716171945-2caba252f4dc h1:2gGKlE2+asNV9m7xrywl36YYNnBG5ZQ0r/BOOxqPpmk= gopkg.in/alexcesaro/quotedprintable.v3 v3.0.0-20150716171945-2caba252f4dc/go.mod h1:m7x9LTH6d71AHyAX77c9yqWCCa3UKHcVEj9y7hAtKDk= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127 h1:qIbj1fsPNlZgppZ+VLlY7N33q108Sa+fhmuc+sWQYwY= gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= +gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= gopkg.in/gomail.v2 v2.0.0-20160411212932-81ebce5c23df h1:n7WqCuqOuCbNr617RXOY0AWRXxgwEyPp2z+p0+hgMuE= gopkg.in/gomail.v2 v2.0.0-20160411212932-81ebce5c23df/go.mod h1:LRQQ+SO6ZHR7tOkpBDuZnXENFzX8qRjMDMyPD6BRkCw= diff --git a/package/aycache/cache.go b/package/aycache/cache.go deleted file mode 100644 index f2e650f..0000000 --- a/package/aycache/cache.go +++ /dev/null @@ -1,38 +0,0 @@ -package aycache - -import ( - "github.com/ayflying/utility_go/package/aycache/drive" - "github.com/gogf/gf/v2/os/gcache" -) - -type Mod struct { - client *gcache.Cache -} - -//func NewV1(_name ...string) *cache.Mod { -// return pgk.Cache -//} - -// Deprecated: Use pgk.Cache() -func New(_name ...string) gcache.Adapter { - - var cacheAdapterObj gcache.Adapter - var name = "cache" - if len(_name) > 0 { - name = _name[0] - } - switch name { - case "cache": - cacheAdapterObj = NewAdapterMemory() - case "redis": - cacheAdapterObj = NewAdapterRedis() - case "file": - cacheAdapterObj = NewAdapterFile("runtime/cache") - case "es": - cacheAdapterObj = drive.NewAdapterElasticsearch([]string{"http://127.0.0.1:9200"}) - } - - //var client = gcache.New() - //client.SetAdapter(cacheAdapterObj) - return cacheAdapterObj -} diff --git a/package/aycache/drive/elasticsearch.go b/package/aycache/drive/elasticsearch.go deleted file mode 100644 index 0c4f92f..0000000 --- a/package/aycache/drive/elasticsearch.go +++ /dev/null @@ -1,119 +0,0 @@ -package drive - -import ( - "context" - "github.com/gogf/gf/v2/container/gvar" - "github.com/gogf/gf/v2/os/gcache" - "time" -) - -type AdapterElasticsearch struct { - //FilePath string - Addresses []string -} - -func (a AdapterElasticsearch) Set(ctx context.Context, key interface{}, value interface{}, duration time.Duration) error { - //TODO implement me - panic("implement me") -} - -func (a AdapterElasticsearch) SetMap(ctx context.Context, data map[interface{}]interface{}, duration time.Duration) error { - //TODO implement me - panic("implement me") -} - -func (a AdapterElasticsearch) SetIfNotExist(ctx context.Context, key interface{}, value interface{}, duration time.Duration) (ok bool, err error) { - //TODO implement me - panic("implement me") -} - -func (a AdapterElasticsearch) SetIfNotExistFunc(ctx context.Context, key interface{}, f gcache.Func, duration time.Duration) (ok bool, err error) { - //TODO implement me - panic("implement me") -} - -func (a AdapterElasticsearch) SetIfNotExistFuncLock(ctx context.Context, key interface{}, f gcache.Func, duration time.Duration) (ok bool, err error) { - //TODO implement me - panic("implement me") -} - -func (a AdapterElasticsearch) Get(ctx context.Context, key interface{}) (*gvar.Var, error) { - //TODO implement me - panic("implement me") -} - -func (a AdapterElasticsearch) GetOrSet(ctx context.Context, key interface{}, value interface{}, duration time.Duration) (result *gvar.Var, err error) { - //TODO implement me - panic("implement me") -} - -func (a AdapterElasticsearch) GetOrSetFunc(ctx context.Context, key interface{}, f gcache.Func, duration time.Duration) (result *gvar.Var, err error) { - //TODO implement me - panic("implement me") -} - -func (a AdapterElasticsearch) GetOrSetFuncLock(ctx context.Context, key interface{}, f gcache.Func, duration time.Duration) (result *gvar.Var, err error) { - //TODO implement me - panic("implement me") -} - -func (a AdapterElasticsearch) Contains(ctx context.Context, key interface{}) (bool, error) { - //TODO implement me - panic("implement me") -} - -func (a AdapterElasticsearch) Size(ctx context.Context) (size int, err error) { - //TODO implement me - panic("implement me") -} - -func (a AdapterElasticsearch) Data(ctx context.Context) (data map[interface{}]interface{}, err error) { - //TODO implement me - panic("implement me") -} - -func (a AdapterElasticsearch) Keys(ctx context.Context) (keys []interface{}, err error) { - //TODO implement me - panic("implement me") -} - -func (a AdapterElasticsearch) Values(ctx context.Context) (values []interface{}, err error) { - //TODO implement me - panic("implement me") -} - -func (a AdapterElasticsearch) Update(ctx context.Context, key interface{}, value interface{}) (oldValue *gvar.Var, exist bool, err error) { - //TODO implement me - panic("implement me") -} - -func (a AdapterElasticsearch) UpdateExpire(ctx context.Context, key interface{}, duration time.Duration) (oldDuration time.Duration, err error) { - //TODO implement me - panic("implement me") -} - -func (a AdapterElasticsearch) GetExpire(ctx context.Context, key interface{}) (time.Duration, error) { - //TODO implement me - panic("implement me") -} - -func (a AdapterElasticsearch) Remove(ctx context.Context, keys ...interface{}) (lastValue *gvar.Var, err error) { - //TODO implement me - panic("implement me") -} - -func (a AdapterElasticsearch) Clear(ctx context.Context) error { - //TODO implement me - panic("implement me") -} - -func (a AdapterElasticsearch) Close(ctx context.Context) error { - //TODO implement me - panic("implement me") -} - -func NewAdapterElasticsearch(addresses []string) gcache.Adapter { - return &AdapterElasticsearch{ - Addresses: addresses, - } -} diff --git a/package/aycache/file.go b/package/aycache/file.go deleted file mode 100644 index fe20309..0000000 --- a/package/aycache/file.go +++ /dev/null @@ -1,134 +0,0 @@ -package aycache - -import ( - "context" - "github.com/gogf/gf/v2/container/gvar" - "github.com/gogf/gf/v2/os/gcache" - "github.com/gogf/gf/v2/os/gfile" - "github.com/gogf/gf/v2/util/gconv" - "path" - "strings" - "time" -) - -type AdapterFile struct { - FilePath string -} - -func (a AdapterFile) Set(ctx context.Context, key interface{}, value interface{}, duration time.Duration) error { - //defer a.handleLruKey(ctx, key) - //expireTime := a.getInternalExpire(duration) - //a.data.Set(key, memoryDataItem{ - // a: value, - // a: expireTime, - //}) - //c.eventList.PushBack(&adapterMemoryEvent{ - // k: key, - // e: expireTime, - //}) - - arr := strings.Split(":", gconv.String(key)) - fileName := path.Join(arr...) - return gfile.PutBytes(fileName, gconv.Bytes(value)) -} - -func (a AdapterFile) SetMap(ctx context.Context, data map[interface{}]interface{}, duration time.Duration) error { - //TODO implement me - panic("implement me") -} - -func (a AdapterFile) SetIfNotExist(ctx context.Context, key interface{}, value interface{}, duration time.Duration) (ok bool, err error) { - //TODO implement me - panic("implement me") -} - -func (a AdapterFile) SetIfNotExistFunc(ctx context.Context, key interface{}, f gcache.Func, duration time.Duration) (ok bool, err error) { - //TODO implement me - panic("implement me") -} - -func (a AdapterFile) SetIfNotExistFuncLock(ctx context.Context, key interface{}, f gcache.Func, duration time.Duration) (ok bool, err error) { - //TODO implement me - panic("implement me") -} - -func (a AdapterFile) Get(ctx context.Context, key interface{}) (*gvar.Var, error) { - //TODO implement me - panic("implement me") -} - -func (a AdapterFile) GetOrSet(ctx context.Context, key interface{}, value interface{}, duration time.Duration) (result *gvar.Var, err error) { - //TODO implement me - panic("implement me") -} - -func (a AdapterFile) GetOrSetFunc(ctx context.Context, key interface{}, f gcache.Func, duration time.Duration) (result *gvar.Var, err error) { - //TODO implement me - panic("implement me") -} - -func (a AdapterFile) GetOrSetFuncLock(ctx context.Context, key interface{}, f gcache.Func, duration time.Duration) (result *gvar.Var, err error) { - //TODO implement me - panic("implement me") -} - -func (a AdapterFile) Contains(ctx context.Context, key interface{}) (bool, error) { - //TODO implement me - panic("implement me") -} - -func (a AdapterFile) Size(ctx context.Context) (size int, err error) { - //TODO implement me - panic("implement me") -} - -func (a AdapterFile) Data(ctx context.Context) (data map[interface{}]interface{}, err error) { - //TODO implement me - panic("implement me") -} - -func (a AdapterFile) Keys(ctx context.Context) (keys []interface{}, err error) { - //TODO implement me - panic("implement me") -} - -func (a AdapterFile) Values(ctx context.Context) (values []interface{}, err error) { - //TODO implement me - panic("implement me") -} - -func (a AdapterFile) Update(ctx context.Context, key interface{}, value interface{}) (oldValue *gvar.Var, exist bool, err error) { - //TODO implement me - panic("implement me") -} - -func (a AdapterFile) UpdateExpire(ctx context.Context, key interface{}, duration time.Duration) (oldDuration time.Duration, err error) { - //TODO implement me - panic("implement me") -} - -func (a AdapterFile) GetExpire(ctx context.Context, key interface{}) (time.Duration, error) { - //TODO implement me - panic("implement me") -} - -func (a AdapterFile) Remove(ctx context.Context, keys ...interface{}) (lastValue *gvar.Var, err error) { - //TODO implement me - panic("implement me") -} - -func (a AdapterFile) Clear(ctx context.Context) error { - //TODO implement me - panic("implement me") -} - -func (a AdapterFile) Close(ctx context.Context) error { - //TODO implement me - panic("implement me") -} - -func NewAdapterFile(filePath string) gcache.Adapter { - return &AdapterFile{ - FilePath: filePath, - } -} diff --git a/package/aycache/memory.go b/package/aycache/memory.go deleted file mode 100644 index 1cec4a0..0000000 --- a/package/aycache/memory.go +++ /dev/null @@ -1,15 +0,0 @@ -package aycache - -import ( - "github.com/gogf/gf/v2/os/gcache" -) - -var adapterMemoryClient = gcache.New() - -// NewAdapterMemory 创建并返回一个新的内存缓存对象。 -func NewAdapterMemory() gcache.Adapter { - //if adapterMemoryClient == nil { - // adapterMemoryClient = gcache.New() - //} - return adapterMemoryClient -} diff --git a/package/aycache/mencached.go b/package/aycache/mencached.go deleted file mode 100644 index 6e257d1..0000000 --- a/package/aycache/mencached.go +++ /dev/null @@ -1,120 +0,0 @@ -package aycache - -import ( - "context" - "github.com/gogf/gf/v2/container/gvar" - "github.com/gogf/gf/v2/database/gredis" - "github.com/gogf/gf/v2/os/gcache" - "time" -) - -// AdapterRedis is the gcache adapter implements using Redis server. -type AdapterMemcached struct { - //redis *gredis.Redis - //client -} - -func (a AdapterMemcached) Set(ctx context.Context, key interface{}, value interface{}, duration time.Duration) error { - //TODO implement me - panic("implement me") -} - -func (a AdapterMemcached) SetMap(ctx context.Context, data map[interface{}]interface{}, duration time.Duration) error { - //TODO implement me - panic("implement me") -} - -func (a AdapterMemcached) SetIfNotExist(ctx context.Context, key interface{}, value interface{}, duration time.Duration) (ok bool, err error) { - //TODO implement me - panic("implement me") -} - -func (a AdapterMemcached) SetIfNotExistFunc(ctx context.Context, key interface{}, f gcache.Func, duration time.Duration) (ok bool, err error) { - //TODO implement me - panic("implement me") -} - -func (a AdapterMemcached) SetIfNotExistFuncLock(ctx context.Context, key interface{}, f gcache.Func, duration time.Duration) (ok bool, err error) { - //TODO implement me - panic("implement me") -} - -func (a AdapterMemcached) Get(ctx context.Context, key interface{}) (*gvar.Var, error) { - //TODO implement me - panic("implement me") -} - -func (a AdapterMemcached) GetOrSet(ctx context.Context, key interface{}, value interface{}, duration time.Duration) (result *gvar.Var, err error) { - //TODO implement me - panic("implement me") -} - -func (a AdapterMemcached) GetOrSetFunc(ctx context.Context, key interface{}, f gcache.Func, duration time.Duration) (result *gvar.Var, err error) { - //TODO implement me - panic("implement me") -} - -func (a AdapterMemcached) GetOrSetFuncLock(ctx context.Context, key interface{}, f gcache.Func, duration time.Duration) (result *gvar.Var, err error) { - //TODO implement me - panic("implement me") -} - -func (a AdapterMemcached) Contains(ctx context.Context, key interface{}) (bool, error) { - //TODO implement me - panic("implement me") -} - -func (a AdapterMemcached) Size(ctx context.Context) (size int, err error) { - //TODO implement me - panic("implement me") -} - -func (a AdapterMemcached) Data(ctx context.Context) (data map[interface{}]interface{}, err error) { - //TODO implement me - panic("implement me") -} - -func (a AdapterMemcached) Keys(ctx context.Context) (keys []interface{}, err error) { - //TODO implement me - panic("implement me") -} - -func (a AdapterMemcached) Values(ctx context.Context) (values []interface{}, err error) { - //TODO implement me - panic("implement me") -} - -func (a AdapterMemcached) Update(ctx context.Context, key interface{}, value interface{}) (oldValue *gvar.Var, exist bool, err error) { - //TODO implement me - panic("implement me") -} - -func (a AdapterMemcached) UpdateExpire(ctx context.Context, key interface{}, duration time.Duration) (oldDuration time.Duration, err error) { - //TODO implement me - panic("implement me") -} - -func (a AdapterMemcached) GetExpire(ctx context.Context, key interface{}) (time.Duration, error) { - //TODO implement me - panic("implement me") -} - -func (a AdapterMemcached) Remove(ctx context.Context, keys ...interface{}) (lastValue *gvar.Var, err error) { - //TODO implement me - panic("implement me") -} - -func (a AdapterMemcached) Clear(ctx context.Context) error { - //TODO implement me - panic("implement me") -} - -func (a AdapterMemcached) Close(ctx context.Context) error { - //TODO implement me - panic("implement me") -} - -// NewAdapterRedis creates and returns a new memory cache object. -func NewAdapterMemcached(redis *gredis.Redis) gcache.Adapter { - return &AdapterMemcached{} -} diff --git a/package/aycache/redis.go b/package/aycache/redis.go deleted file mode 100644 index efc72a3..0000000 --- a/package/aycache/redis.go +++ /dev/null @@ -1,18 +0,0 @@ -package aycache - -import ( - "github.com/gogf/gf/v2/frame/g" - "github.com/gogf/gf/v2/os/gcache" -) - -var adapterRedisClient gcache.Adapter -var adapterRedisCache = gcache.New() - -func NewAdapterRedis() gcache.Adapter { - - if adapterRedisClient == nil { - adapterRedisClient = gcache.NewAdapterRedis(g.Redis("default")) - adapterRedisCache.SetAdapter(adapterRedisClient) - } - return adapterRedisCache -} diff --git a/package/pay/wechat.go b/package/pay/wechat.go index bea901f..520f670 100644 --- a/package/pay/wechat.go +++ b/package/pay/wechat.go @@ -1,3 +1,4 @@ +//Deprecated: 使用新的 pkg.Pay() package pay import ( @@ -27,6 +28,7 @@ type WechatPay struct { PrivateKey string } +// Deprecated: pkg.Pay().Wechat() func Wechat() *WechatPay { var pay = &WechatPay{} var err error diff --git a/package/rank/rank.go b/package/rank/rank.go deleted file mode 100644 index 1816dc2..0000000 --- a/package/rank/rank.go +++ /dev/null @@ -1,395 +0,0 @@ -package rank - -import ( - "fmt" - "time" - - "github.com/gogf/gf/v2/database/gredis" - "github.com/gogf/gf/v2/frame/g" - "github.com/gogf/gf/v2/os/gctx" -) - -var ( - ctx = gctx.New() -) - -type Mod struct { -} - -type F64CountRank struct { - name string // 排行榜名 - updateTs string // 更新时间key -} - -type RankData struct { - Id int64 - Score int64 - Rank int32 - UpdateTs int64 -} - -// Deprecated:Use pgk.Rank() -func New() *Mod { - return &Mod{} -} - -func (s *Mod) Load() { - -} - -// CreateF64CountRank 创建一个排行榜实例 -// 参数: -// -// name: 排行榜的名称,通常代表一个赛季 -// -// 返回值: -// -// *F64CountRank: 返回一个指向新创建的F64CountRank实例的指针 -// -// Deprecated:Use pgk.Rank().CreateF64CountRank(fmt.Sprintf("rank:%v", 1)) -func (s *Mod) CreateF64CountRank(name string) *F64CountRank { - // 初始化F64CountRank实例的name和updateTs字段 - // name字段用于标识排行榜的名称,格式为"rank::score" - // updateTs字段用于标识排行榜的更新时间,格式为"rank::updateTs" - return &F64CountRank{ - name: fmt.Sprintf("rank:%s:score", name), - updateTs: fmt.Sprintf("rank:%s:updateTs", name), - } -} - -// IncrScore 对指定ID的分数进行增加,并返回增加后的当前分数。 -// 该方法首先更新成员的更新时间戳,然后增加成员的分数。 -// -// 参数: -// -// id - 要操作的成员ID。 -// score - 要增加的分数。 -// -// 返回值: -// -// curScore - 增加分数后的当前分数。 -// err - 操作过程中可能发生的错误。 -// -// IncrScore 先改redis再改cache -// -// @Description: -// @receiver r -// @param id -// @param score -// @return curScore -// @return err -func (r *F64CountRank) IncrScore(id int64, score int64) (curScore float64, err error) { - // 记录当前时间戳,用于更新成员的最新活动时间。 - now := time.Now().UnixMilli() - - // 将成员的更新时间戳加入到Redis的有序集合中,确保成员的排序依据是最新的活动时间。 - _, err = g.Redis().ZAdd(ctx, r.updateTs, &gredis.ZAddOption{}, gredis.ZAddMember{ - Score: float64(now), - Member: id, - }) - - // 增加成员的分数,并返回增加后的当前分数。 - curScore, err = g.Redis().ZIncrBy(ctx, r.name, float64(score), id) - - //如果分数小于0,则删除 - if curScore <= 0 { - err = r.DelScore(id) - } - - return -} - -// todo暂时未使用 -func (r *F64CountRank) GetCount() { - count, _ := g.Redis().ZCard(ctx, r.name) - if count > 9999 { - //删除超过9999的数据 - g.Redis().ZRemRangeByRank(ctx, r.name, 0, -9999) - } -} - -// Delete 删除当前排行榜 -// 该方法通过删除Redis中与排行榜相关的键来清除排行榜信息 -func (r *F64CountRank) Delete() { - // 删除排行榜数据键 - _, err := g.Redis().Del(ctx, r.name) - if err != nil { - // 如果删除失败,记录错误日志 - g.Log().Error(ctx, "排行榜删除失败:%v", err) - } - // 删除排行榜更新时间键 - _, err = g.Redis().Del(ctx, r.updateTs) - if err != nil { - // 如果删除失败,记录错误日志 - g.Log().Error(ctx, "排行榜删除失败:%v", err) - } -} - -// DelScore 删除当前分数 -// -// 该方法从更新时间有序集合和排名有序集合中移除指定的id。 -// 这通常用于从排行榜中删除一个条目,同时确保其在更新时间集合中的对应记录也被清除。 -// -// @Description: 从更新时间和排名集合中移除指定id -// @receiver r 接收者为F64CountRank类型的实例 -// @param id 要从集合中移除的条目的ID -// @return err 可能发生的错误,如果操作成功,err为nil -func (r *F64CountRank) DelScore(id int64) (err error) { - // 从更新时间集合中移除id - _, err = g.Redis().ZRem(ctx, r.updateTs, id) - // 从排名集合中移除id - _, err = g.Redis().ZRem(ctx, r.name, id) - return -} - -// DelByRank 根据排名范围删除元素。 -// 该方法使用了Redis的有序集合数据结构,通过ZRange和ZRemRangeByRank命令来实现。 -// 参数start和stop定义了要删除的排名范围,从start到stop(包括start和stop)。 -// 返回可能的错误。 -func (r *F64CountRank) DelByRank(start int64, stop int64) (err error) { - // 初始化一个空的int64切片,用于存储指定排名范围内的元素。 - var members []int64 - - // 使用Redis的ZRange命令获取指定排名范围内的元素。 - // 选项Rev设置为true,表示按照分数从高到低的顺序返回元素。 - get, err := g.Redis().ZRange(ctx, r.name, start, stop, - gredis.ZRangeOption{ - Rev: true, - }) - - // 使用Scan方法将获取到的元素扫描到members切片中。 - err = get.Scan(&members) - // 如果扫描过程中出现错误,直接返回错误。 - if err != nil { - return - } - - // 遍历members切片,对于每个元素,使用ZRem命令从更新时间集合中删除对应的成员。 - for _, member := range members { - _, err = g.Redis().ZRem(ctx, r.updateTs, member) - // 忽略ZRem操作的错误,因为即使元素不存在,ZRem也不会返回错误。 - } - - // 使用ZRemRangeByRank命令从有序集合中删除指定排名范围内的元素。 - _, err = g.Redis().ZRemRangeByRank(ctx, r.name, start, stop) - // 返回可能的错误。 - return -} - -// updateScore 更新给定ID的分数值。 -// -// 参数: -// -// id - 需要更新分数的实体ID。 -// score - 新的分数值。 -// -// 返回值: -// -// error - 更新过程中可能出现的错误。 -// -// 该方法首先记录当前时间作为更新时间戳,然后将新的分数值添加到排名系统中。 -// 使用Redis的ZAdd方法来确保操作的原子性和一致性。 -// UpdateScore 更新分数 -// -// @Description: -// @receiver r -// @param id -// @param score -// @return err -func (r *F64CountRank) UpdateScore(id int64, score int64) (err error) { - // 获取当前时间戳,以毫秒为单位。 - now := time.Now().UnixMilli() - - // 向更新时间戳的有序集合中添加新的成员和分数,成员为id,分数为当前时间戳。 - _, err = g.Redis().ZAdd(ctx, r.updateTs, &gredis.ZAddOption{}, gredis.ZAddMember{ - Score: float64(now), - Member: id, - }) - - // 向排名的有序集合中添加新的成员和分数,成员为id,分数为传入的score。 - _, err = g.Redis().ZAdd(ctx, r.name, &gredis.ZAddOption{}, gredis.ZAddMember{ - Score: float64(score), - Member: id, - }) - return -} - -//// GetRankInfosV1 获取0~count跳记录 -//func (r *F64CountRank) getRankInfosV1(offset, count int) (list []*RankInfo, err error) { -// /* -// 找到maxRank的玩家的分数 -// 根据分数拿到所有分数大于等于minScore玩家 -// 将这些玩家进行排序 -// 返回maxRank条目 -// */ -// var ( -// minScore int64 // 最低分 -// maxScore int64 -// //zl []redis2.Z -// zl []gredis.ZAddMember -// length int -// ) -// // 拉取所有玩家的更新时间戳 -// zl, err = g.Redis().ZRemRangeByScore(ctx,r.updateTs, strconv.Itoa(0), strconv.Itoa(-1))//ZRemRangeByScore(ctx, r.updateTs, strconv.Itoa(0), strconv.Itoa(-1)) -// //zl, err = rdbV1.ZRangeWithScores(ctx, r.updateTs, 0, -1).Result() -// if err != nil { -// g.Log().Errorf(ctx, "redis err:%v", err) -// return -// } -// if len(zl) == 0 { -// //logs.Infof("empty list") -// return -// } -// tsl := make(map[int64]int64, len(zl)) -// for _, z := range zl { -// id := gconv.Int64(z.Member) //pgk.InterfaceToNumber[uint64](z.Member) -// tsl[id] = int64(z.Score) -// } -// -// // 找到maxRank的玩家的分数 -// zl, err = rdbV1.ZRevRangeByScoreWithScores(ctx, r.name, &redis2.ZRangeBy{ -// Min: "0", -// Max: strconv.Itoa(math.MaxInt), -// Offset: 0, -// Count: int64(count), -// }).Result() -// if err != nil { -// g.Log().Errorf(ctx, "redis err:%v", err) -// return -// } -// if len(zl) == 0 { -// g.Log().Info(ctx, "empty list") -// return -// } -// minScore = int64(zl[len(zl)-1].Score) -// maxScore = int64(zl[0].Score) -// // 根据分数拿到所有分数大于等于minScore玩家 -// zl, err = rdbV1.ZRevRangeByScoreWithScores(ctx, r.name, &redis2.ZRangeBy{ -// Min: fmt.Sprintf("%v", minScore), -// Max: fmt.Sprintf("%v", maxScore), -// }).Result() -// if err != nil { -// g.Log().Errorf(ctx, "redis err:%v", err) -// return -// } -// if len(zl) == 0 { -// g.Log().Info(ctx, "empty list") -// return -// } -// //如果开始已经大于等于总长度,就返回空 -// if offset >= len(zl) { -// return -// } -// list = make([]*RankInfo, len(zl)) -// for i, z := range zl { -// id := gconv.Int64(z.Member) -// list[i] = &RankInfo{ -// Id: id, -// Score: int64(z.Score), -// UpdateTs: tsl[id], -// } -// } -// // 将这些玩家进行排序 -// sort.Slice(list, func(i, j int) bool { -// if list[i].Score != list[j].Score { -// return list[i].Score > list[j].Score -// } else { -// return list[i].UpdateTs < list[j].UpdateTs -// } -// }) -// length = len(list) -// if length > count { -// length = count -// } -// for i := range list { -// info := list[i] -// info.Rank = i + 1 -// } -// -// list = list[offset:length] -// return -//} - -// GetRankInfosNotTs 获取0~count跳记录 不根据更新时间来 -// 该方法使用ZRange命令从Redis中获取指定范围的排名信息,不考虑更新时间 -// 参数: -// -// offset - 获取记录的起始偏移量 -// count - 获取记录的数量 -// -// 返回值: -// -// list - 排名信息列表 -// err - 错误信息,如果执行过程中遇到错误 -func (r *F64CountRank) GetRankInfosNotTs(offset, count int) (list []*RankData, err error) { - // 初始化存储成员ID的切片 - var members []int64 - - // 使用Redis的ZRange命令获取指定范围的成员ID - // 参数Rev设为true以从高分到低分获取成员 - get, err := g.Redis().ZRange(ctx, r.name, int64(offset), int64(count), - gredis.ZRangeOption{ - Rev: true, - }) //.ScanSlice(&members) - - // 将获取的结果扫描到members切片中 - err = get.Scan(&members) - // 如果发生错误,记录日志并返回 - if err != nil { - //logs.Withf("redis err:%v", err) - return - } - - // 根据获取的成员ID数量初始化排名信息列表 - list = make([]*RankData, len(members)) - for i := range members { - // 获取当前成员ID - id := members[i] - // 使用成员ID获取排名信息,不考虑更新时间 - list[i] = r.GetIdRankNotTs(id) - } - // 返回排名信息列表和可能的错误 - return -} - -// GetIdRankNotTs 获取指定id的当前排名 -// 该方法从Redis的有序集合中查询指定id的分数和排名信息,不考虑时间戳 -// 参数: -// -// id - 需要查询排名的id -// -// 返回值: -// -// rankInfo - 包含id的分数和排名信息的指针,如果没有找到,则返回nil -func (r *F64CountRank) GetIdRankNotTs(id int64) (rankInfo *RankData) { - // 初始化rankInfo结构体,设置id,其他字段将通过查询填充 - rankInfo = &RankData{Id: id} - - // 查询有序集合中指定id的分数 - score, err := g.Redis().ZScore(ctx, r.name, id) - if err != nil { - // 如果发生错误,直接返回,rankInfo为初始化状态,Id已设置,其他字段为零值 - return - } - - // 将分数转换为int64类型并更新rankInfo - rankInfo.Score = int64(score) - - // 如果分数为0,直接返回,表示该id的分数为0,没有进一步查询排名的必要 - if score == 0 { - return - } - - // 查询有序集合中指定id的排名 - rank, err := g.Redis().ZRevRank(ctx, r.name, id) - if err != nil { - // 如果发生错误,直接返回,rankInfo中仅分数有效,排名信息未更新 - return - } - - // 更新rankInfo中的排名信息,排名从0开始,所以需要加1以符合人类的计数习惯 - rankInfo.Rank = int32(rank) + 1 - - // 返回包含完整排名信息的rankInfo指针 - return rankInfo -} diff --git a/pkg/aycache/cache.go b/pkg/aycache/cache.go index 51b2267..fd6e40b 100644 --- a/pkg/aycache/cache.go +++ b/pkg/aycache/cache.go @@ -1,7 +1,7 @@ package aycache import ( - "github.com/ayflying/utility_go/package/aycache/drive" + "github.com/ayflying/utility_go/pkg/aycache/drive" drive2 "github.com/ayflying/utility_go/pkg/aycache/drive" "github.com/gogf/gf/v2/os/gcache" ) diff --git a/pkg/pkg.go b/pkg/pkg.go index 184e580..f707885 100644 --- a/pkg/pkg.go +++ b/pkg/pkg.go @@ -6,6 +6,7 @@ import ( "github.com/ayflying/utility_go/pkg/notice" "github.com/ayflying/utility_go/pkg/rank" "github.com/ayflying/utility_go/pkg/s3" + "github.com/ayflying/utility_go/pkg/websocket" "github.com/gogf/gf/v2/os/gcache" ) @@ -28,3 +29,7 @@ func S3(_name ...string) *s3.Mod { func Rank() *rank.Mod { return rank.New() } + +func Websocket() *websocket.SocketV1 { + return websocket.NewV1() +} diff --git a/pkg/websocket/registerer.go b/pkg/websocket/registerer.go new file mode 100644 index 0000000..595a9e7 --- /dev/null +++ b/pkg/websocket/registerer.go @@ -0,0 +1,14 @@ +package websocket + +// 定义一个处理方法的类型 +type Handler func(uid int64, data []byte) + +// 路由器的处理映射 +var ( + handlers = make(map[int]Handler) +) + +// 注册方法,将某个消息路由器ID和对应的处理方法关联起来 +func (s *SocketV1) RegisterRouter(cmd int, handler Handler) { + handlers[cmd] = handler +} diff --git a/pkg/websocket/socket_new.go b/pkg/websocket/socket_new.go new file mode 100644 index 0000000..066db5a --- /dev/null +++ b/pkg/websocket/socket_new.go @@ -0,0 +1,177 @@ +package websocket + +import ( + "github.com/gogf/gf/v2/container/gmap" + "github.com/gogf/gf/v2/frame/g" + "github.com/gogf/gf/v2/os/gctx" + "github.com/gogf/gf/v2/os/glog" + "github.com/gogf/gf/v2/util/gconv" + "github.com/google/uuid" + "github.com/gorilla/websocket" + "sync" + "github.com/gogf/gf/v2/net/ghttp" +) + +type SocketV1 struct{} + +var ( + ctx = gctx.New() + //Conn map[uuid.UUID]*WebsocketData + lock sync.Mutex + + m = gmap.New(true) +) + +type WebsocketData struct { + Ws *websocket.Conn + Uuid uuid.UUID + Uid int64 + Data g.Var +} + +func NewV1() *SocketV1 { + return &SocketV1{} +} + +type SocketInterface interface { + OnConnect(*websocket.Conn) + OnMessage(*WebsocketData, []byte, int) + Send(uuid.UUID, []byte) (err error) + SendAll(data []byte) + OnClose(conn *websocket.Conn) +} + +func (s *SocketV1) Load(serv *ghttp.Server, prefix string) { + //websocket服务启动 + serv.Group(prefix, func(group *ghttp.RouterGroup) { + + var websocketCfg = websocket.Upgrader{ + ReadBufferSize: 1024, + WriteBufferSize: 1024, + } + group.Bind( + func(r *ghttp.Request) { + ws, err := websocketCfg.Upgrade(r.Response.Writer, r.Request, nil) + if err != nil { + glog.Error(ctx, err) + r.Exit() + } + + //ws联机触发器 + NewV1().OnConnect(ws) + }, + ) + + }) +} + +// OnConnect +// +// @Description: +// @receiver s +// @param conn +func (s *SocketV1) OnConnect(conn *websocket.Conn) { + //lock.Lock() + //defer lock.Unlock() + + defer conn.Close() + id, _ := uuid.NewUUID() + ip := conn.RemoteAddr().String() + + data := &WebsocketData{ + Uuid: id, + Ws: conn, + Data: g.Var{}, + } + m.Set(id, data) + + //defer delete(Conn, id) + + //to := fmt.Sprintf("创建连接:%v,ip=%v", id, ip) + //s.Send(id, []byte(to)) + + for { + //进入当前连接线程拥堵 + msgType, msg, err := conn.ReadMessage() + if err != nil { + //客户端断开返回错误,断开当前连接 + break + } + s.OnMessage(m.Get(id).(*WebsocketData), msg, msgType) + } + //关闭连接触发 + s.OnClose(id, conn) + g.Log().Debugf(ctx, "断开连接:uuid=%v,ip=%v", id, ip) +} + +// OnMessage +// +// @Description: +// @receiver s +// @param msg +// @param msgType +func (s *SocketV1) OnMessage(conn *WebsocketData, req []byte, msgType int) { + //g.Log().Debugf(ctx, "收到消息:%v,type=%v,conn=%v", string(req), msgType, conn) + //s.Send(conn.Uuid, msg) + //s.SendAll(msg) + msgStr := string(req) + msg := msgStr[8:] + cmd := gconv.Int(msgStr[:8]) + //GetRouter(cmd, conn.Uid, msg) + handler, exist := handlers[cmd] + if exist { + //匹配上路由器 + handler(conn.Uid, []byte(msg)) + } else { + //fmt.Println("未注册的路由器ID:", cmd) + s.Send(conn.Uuid, []byte("未注册的协议号:"+msgStr[:8])) + s.OnClose(conn.Uuid, conn.Ws) + return + } + +} + +// Send +// +// @Description: +// @receiver s +// @param uid +// @param data +// @return err +func (s *SocketV1) Send(id uuid.UUID, data []byte) (err error) { + if !m.Contains(id) { + return + } + + conn := m.Get(id).(*WebsocketData) + conn.Ws.WriteMessage(1, data) + + return +} + +// 批量发送 +func (s *SocketV1) SendAll(data []byte) { + m.Iterator(func(k interface{}, v interface{}) bool { + //fmt.Printf("%v:%v ", k, v) + conn := v.(*WebsocketData) + conn.Ws.WriteMessage(1, data) + return true + }) +} + +// OnClose +// +// @Description: +// @receiver s +// @param conn +func (s *SocketV1) OnClose(id uuid.UUID, conn *websocket.Conn) { + // 在此处编写断开连接后的处理逻辑 + g.Log().Debugf(ctx, "WebSocket connection from %s has been closed.", conn.RemoteAddr()) + + // 可能的后续操作: + // 1. 更新连接状态或从连接池移除 + // 2. 发送通知或清理关联资源 + // 3. 执行特定于业务的断开处理 + m.Remove(id) + conn.Close() +}