From d29bed5c61354889fa68dfbc73d7bb0195c81f72 Mon Sep 17 00:00:00 2001 From: alber Date: 2025年6月17日 17:24:34 +0800 Subject: [PATCH 1/6] =?UTF-8?q?=E5=8F=96=E6=B6=88=E6=88=BF=E9=97=B4?= =?UTF-8?q?=E8=AE=A2=E9=98=85=E5=90=8E=E7=9A=84=E6=B6=88=E6=81=AF=E6=8B=89?= =?UTF-8?q?=E5=8F=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- internal/logic/room/api.go | 3 ++- internal/logic/room/app.go | 24 ------------------------ 2 files changed, 2 insertions(+), 25 deletions(-) diff --git a/internal/logic/room/api.go b/internal/logic/room/api.go index 49fe52dc..89427e54 100644 --- a/internal/logic/room/api.go +++ b/internal/logic/room/api.go @@ -23,7 +23,8 @@ type RoomIntService struct { // SubscribeRoom 订阅房间 func (s *RoomIntService) SubscribeRoom(ctx context.Context, request *pb.SubscribeRoomRequest) (*emptypb.Empty, error) { - return &emptypb.Empty{}, App.SubscribeRoom(ctx, request) + err := App.SubscribeRoom(ctx, request) + return &emptypb.Empty{}, err } // PushRoom 推送房间 diff --git a/internal/logic/room/app.go b/internal/logic/room/app.go index d86f9a57..a74d02b2 100644 --- a/internal/logic/room/app.go +++ b/internal/logic/room/app.go @@ -2,16 +2,13 @@ package room import ( "context" - "log/slog" "time" "google.golang.org/protobuf/proto" - "gim/pkg/grpclib/picker" "gim/pkg/mq" "gim/pkg/protocol/pb/connectpb" pb "gim/pkg/protocol/pb/logicpb" - "gim/pkg/rpc" "gim/pkg/util" ) @@ -56,27 +53,6 @@ func (s *app) Push(ctx context.Context, req *pb.PushRoomRequest) error { // SubscribeRoom 订阅房间 func (s *app) SubscribeRoom(ctx context.Context, req *pb.SubscribeRoomRequest) error { - if req.Seq == 0 { - return nil - } - - messages, err := MessageRepo.List(req.RoomId, req.Seq) - if err != nil { - return err - } - - var request connectpb.PushToDevicesRequest - for i := range messages { - request.DeviceMessageList = append(request.DeviceMessageList, &connectpb.DeviceMessage{ - DeviceId: req.DeviceId, - Message: messages[i], - }) - } - - _, err = rpc.GetConnectIntClient().PushToDevices(picker.ContextWithAddr(ctx, req.ConnAddr), &request) - if err != nil { - slog.Error("deliverMessage", "error", err) - } return nil } From 2358ce3fa90ecf53af4c28fe8bf35abba33a3093 Mon Sep 17 00:00:00 2001 From: alber Date: Sun, 7 Sep 2025 22:20:42 +0800 Subject: [PATCH 2/6] =?UTF-8?q?1.=20=E9=85=8D=E7=BD=AE=E7=B2=BE=E7=AE=80?= =?UTF-8?q?=202.=20=E9=A1=B9=E7=9B=AE=E7=9B=AE=E5=BD=95=E9=87=8D=E6=9E=84?= =?UTF-8?q?=203.=20=E6=B6=88=E6=81=AF=E8=A1=A8=E5=A2=9E=E5=8A=A0=E5=88=86?= =?UTF-8?q?=E5=8C=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- cmd/business/main.go | 6 +- cmd/logic/main.go | 13 +- config/compose_builder.go | 29 +- config/config.go | 15 +- config/k8s_builder.go | 34 +-- config/local_builder.go | 28 +- deploy/compose/compose.yaml | 10 +- deploy/k8s/sql/create_table.sql | 13 +- deploy/k8s/templates/mysql/stateful-set.yaml | 2 +- go.mod | 11 +- go.sum | 20 +- .../friend/{api.go => api/friend_ext.go} | 40 +-- .../{api_test.go => api/friend_ext_test.go} | 2 +- internal/business/friend/app.go | 164 ----------- internal/business/friend/app/friend.go | 190 +++++++++++++ .../friend/{entity.go => domain/friend.go} | 2 +- .../friend/{repo.go => repo/friend.go} | 19 +- internal/business/friend/repo/friend_test.go | 33 +++ internal/business/friend/repo_test.go | 31 --- internal/business/user/api/user_ext.go | 10 +- internal/connect/client_test.go | 28 +- internal/connect/conn.go | 23 -- .../device/{api.go => api/device_int.go} | 11 +- .../logic/device/{app.go => app/device.go} | 34 +-- .../device/{entity.go => domain/device.go} | 2 +- .../logic/device/{repo.go => repo/device.go} | 23 +- internal/logic/device/repo/device_test.go | 11 + internal/logic/device/repo_test.go | 11 - .../logic/group/{api.go => api/group_int.go} | 11 +- .../{api_test.go => api/group_int_test.go} | 2 +- internal/logic/group/app.go | 61 ----- internal/logic/group/app/group.go | 68 +++++ internal/logic/group/{ => domain}/group.go | 2 +- .../logic/group/{repo.go => repo/group.go} | 15 +- internal/logic/message/api/message_ext.go | 18 ++ .../message/{api.go => api/message_int.go} | 17 +- .../{api_test.go => api/message_int_test.go} | 3 +- internal/logic/message/app/device_ack.go | 35 +++ .../logic/message/{app.go => app/message.go} | 75 +---- internal/logic/message/domain/message.go | 1 - .../{device_ack_repo.go => device_ack.go} | 0 .../repo/{message_repo.go => message.go} | 0 .../message/repo/{seq_repo.go => seq.go} | 0 .../repo/{seq_repo_test.go => seq_test.go} | 0 .../{user_message_repo.go => user_message.go} | 0 ...sage_repo_test.go => user_message_test.go} | 0 pkg/grpclib/resolver/addrs/addrs_resolver.go | 61 ----- pkg/grpclib/resolver/k8s/k8s_resolver.go | 204 -------------- pkg/grpclib/resolver/k8s/k8s_resolver_test.go | 51 ---- pkg/interceptor/interceptor.go | 7 +- pkg/local/local.go | 32 --- pkg/md/context.go | 28 +- pkg/protocol/pb/connectpb/connect.ext.pb.go | 256 ++++-------------- pkg/protocol/pb/logicpb/message.ext.pb.go | 247 +++++++++++++---- .../pb/logicpb/message.ext_grpc.pb.go | 123 +++++++++ pkg/protocol/pb/logicpb/message.int.pb.go | 232 ++++++---------- .../pb/logicpb/message.int_grpc.pb.go | 41 --- pkg/protocol/proto/business/message.ext.proto | 14 + pkg/protocol/proto/connect/connect.ext.proto | 18 +- pkg/protocol/proto/logic/message.ext.proto | 15 + pkg/protocol/proto/logic/message.int.proto | 7 - pkg/rpc/rpc.go | 52 ++-- sql/create_table.sql | 13 +- 63 files changed, 1061 insertions(+), 1463 deletions(-) rename internal/business/friend/{api.go => api/friend_ext.go} (62%) rename internal/business/friend/{api_test.go => api/friend_ext_test.go} (99%) delete mode 100644 internal/business/friend/app.go create mode 100644 internal/business/friend/app/friend.go rename internal/business/friend/{entity.go => domain/friend.go} (95%) rename internal/business/friend/{repo.go => repo/friend.go} (59%) create mode 100644 internal/business/friend/repo/friend_test.go delete mode 100644 internal/business/friend/repo_test.go rename internal/logic/device/{api.go => api/device_int.go} (74%) rename internal/logic/device/{app.go => app/device.go} (50%) rename internal/logic/device/{entity.go => domain/device.go} (98%) rename internal/logic/device/{repo.go => repo/device.go} (69%) create mode 100644 internal/logic/device/repo/device_test.go delete mode 100644 internal/logic/device/repo_test.go rename internal/logic/group/{api.go => api/group_int.go} (78%) rename internal/logic/group/{api_test.go => api/group_int_test.go} (98%) delete mode 100644 internal/logic/group/app.go create mode 100644 internal/logic/group/app/group.go rename internal/logic/group/{ => domain}/group.go (97%) rename internal/logic/group/{repo.go => repo/group.go} (74%) create mode 100644 internal/logic/message/api/message_ext.go rename internal/logic/message/{api.go => api/message_int.go} (64%) rename internal/logic/message/{api_test.go => api/message_int_test.go} (98%) create mode 100644 internal/logic/message/app/device_ack.go rename internal/logic/message/{app.go => app/message.go} (55%) rename internal/logic/message/repo/{device_ack_repo.go => device_ack.go} (100%) rename internal/logic/message/repo/{message_repo.go => message.go} (100%) rename internal/logic/message/repo/{seq_repo.go => seq.go} (100%) rename internal/logic/message/repo/{seq_repo_test.go => seq_test.go} (100%) rename internal/logic/message/repo/{user_message_repo.go => user_message.go} (100%) rename internal/logic/message/repo/{user_message_repo_test.go => user_message_test.go} (100%) delete mode 100644 pkg/grpclib/resolver/addrs/addrs_resolver.go delete mode 100644 pkg/grpclib/resolver/k8s/k8s_resolver.go delete mode 100644 pkg/grpclib/resolver/k8s/k8s_resolver_test.go create mode 100644 pkg/protocol/pb/logicpb/message.ext_grpc.pb.go create mode 100644 pkg/protocol/proto/business/message.ext.proto diff --git a/cmd/business/main.go b/cmd/business/main.go index 858f8eec..12761219 100644 --- a/cmd/business/main.go +++ b/cmd/business/main.go @@ -10,7 +10,7 @@ import ( "google.golang.org/grpc" "gim/config" - "gim/internal/business/friend" + friendapi "gim/internal/business/friend/api" userapi "gim/internal/business/user/api" "gim/pkg/interceptor" "gim/pkg/logger" @@ -33,8 +33,8 @@ func main() { pb.RegisterUserIntServiceServer(server, &userapi.UserIntService{}) pb.RegisterUserExtServiceServer(server, &userapi.UserExtService{}) - pb.RegisterFriendExtServiceServer(server, &friend.FriendExtService{}) - listen, err := net.Listen("tcp", config.Config.UserRPCListenAddr) + pb.RegisterFriendExtServiceServer(server, &friendapi.FriendExtService{}) + listen, err := net.Listen("tcp", config.Config.BusinessRPCListenAddr) if err != nil { panic(err) } diff --git a/cmd/logic/main.go b/cmd/logic/main.go index 5ae38d76..4da1bbc2 100644 --- a/cmd/logic/main.go +++ b/cmd/logic/main.go @@ -10,9 +10,9 @@ import ( "google.golang.org/grpc" "gim/config" - "gim/internal/logic/device" - "gim/internal/logic/group" - "gim/internal/logic/message" + deviceapi "gim/internal/logic/device/api" + groupapi "gim/internal/logic/group/api" + messageapi "gim/internal/logic/message/api" "gim/internal/logic/room" "gim/pkg/interceptor" "gim/pkg/logger" @@ -33,9 +33,10 @@ func main() { server.GracefulStop() }() - pb.RegisterDeviceIntServiceServer(server, &device.DeviceIntService{}) - pb.RegisterMessageIntServiceServer(server, &message.MessageIntService{}) - pb.RegisterGroupIntServiceServer(server, &group.GroupIntService{}) + pb.RegisterDeviceIntServiceServer(server, &deviceapi.DeviceIntService{}) + pb.RegisterMessageExtServiceServer(server, &messageapi.MessageExtService{}) + pb.RegisterMessageIntServiceServer(server, &messageapi.MessageIntService{}) + pb.RegisterGroupIntServiceServer(server, &groupapi.GroupIntService{}) pb.RegisterRoomIntServiceServer(server, &room.RoomIntService{}) listen, err := net.Listen("tcp", config.Config.LogicRPCListenAddr) diff --git a/config/compose_builder.go b/config/compose_builder.go index c7b8612c..7abc252b 100644 --- a/config/compose_builder.go +++ b/config/compose_builder.go @@ -4,10 +4,6 @@ import ( "fmt" "log/slog" "net" - - "gim/pkg/protocol/pb/businesspb" - "gim/pkg/protocol/pb/logicpb" - "gim/pkg/ugrpc" ) type composeBuilder struct{} @@ -41,26 +37,11 @@ func (*composeBuilder) Build() Configuration { ConnectTCPListenAddr: ":8001", ConnectWSListenAddr: ":8002", - LogicRPCListenAddr: ":8010", - UserRPCListenAddr: ":8020", - FileHTTPListenAddr: "8030", - - DeviceIntClientBuilder: func() logicpb.DeviceIntServiceClient { - conn := ugrpc.NewClient("dns:///logic:8010") - return logicpb.NewDeviceIntServiceClient(conn) - }, - MessageIntClientBuilder: func() logicpb.MessageIntServiceClient { - conn := ugrpc.NewClient("dns:///logic:8010") - return logicpb.NewMessageIntServiceClient(conn) - }, - RoomIntClientBuilder: func() logicpb.RoomIntServiceClient { - conn := ugrpc.NewClient("dns:///logic:8010") - return logicpb.NewRoomIntServiceClient(conn) - }, + LogicRPCListenAddr: ":8010", + BusinessRPCListenAddr: ":8020", + FileHTTPListenAddr: "8030", - UserIntClientBuilder: func() businesspb.UserIntServiceClient { - conn := ugrpc.NewClient("dns:///business:8020") - return businesspb.NewUserIntServiceClient(conn) - }, + LogicServerAddr: "dns:///logic:8010", + BusinessServerAddr: "dns:///business:8020", } } diff --git a/config/config.go b/config/config.go index c48431a3..150611d3 100644 --- a/config/config.go +++ b/config/config.go @@ -3,9 +3,6 @@ package config import ( "log/slog" "os" - - "gim/pkg/protocol/pb/businesspb" - "gim/pkg/protocol/pb/logicpb" ) const EnvLocal = "local" @@ -39,14 +36,12 @@ type Configuration struct { ConnectTCPListenAddr string ConnectWSListenAddr string - LogicRPCListenAddr string - UserRPCListenAddr string - FileHTTPListenAddr string + LogicRPCListenAddr string + BusinessRPCListenAddr string + FileHTTPListenAddr string - DeviceIntClientBuilder func() logicpb.DeviceIntServiceClient - MessageIntClientBuilder func() logicpb.MessageIntServiceClient - RoomIntClientBuilder func() logicpb.RoomIntServiceClient - UserIntClientBuilder func() businesspb.UserIntServiceClient + LogicServerAddr string + BusinessServerAddr string } func init() { diff --git a/config/k8s_builder.go b/config/k8s_builder.go index 0cc501b8..90f325bc 100644 --- a/config/k8s_builder.go +++ b/config/k8s_builder.go @@ -7,15 +7,17 @@ import ( "os" "strconv" + "github.com/sercand/kuberesolver/v6" + "google.golang.org/grpc/resolver" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" - "gim/pkg/grpclib/resolver/k8s" - "gim/pkg/protocol/pb/businesspb" - "gim/pkg/protocol/pb/logicpb" - "gim/pkg/ugrpc" "gim/pkg/uk8s" ) +func init() { + resolver.Register(kuberesolver.NewBuilder(nil, "k8s")) +} + type k8sBuilder struct{} func (*k8sBuilder) Build() Configuration { @@ -51,26 +53,12 @@ func (*k8sBuilder) Build() Configuration { ConnectTCPListenAddr: ":8001", ConnectWSListenAddr: ":8002", - LogicRPCListenAddr: RPCListenAddr, - UserRPCListenAddr: RPCListenAddr, - FileHTTPListenAddr: "8005", + LogicRPCListenAddr: RPCListenAddr, + BusinessRPCListenAddr: RPCListenAddr, + FileHTTPListenAddr: "8005", - DeviceIntClientBuilder: func() logicpb.DeviceIntServiceClient { - conn := ugrpc.NewClient(k8s.GetK8STarget(namespace, "logic", RPCDialAddr)) - return logicpb.NewDeviceIntServiceClient(conn) - }, - MessageIntClientBuilder: func() logicpb.MessageIntServiceClient { - conn := ugrpc.NewClient(k8s.GetK8STarget(namespace, "logic", RPCDialAddr)) - return logicpb.NewMessageIntServiceClient(conn) - }, - RoomIntClientBuilder: func() logicpb.RoomIntServiceClient { - conn := ugrpc.NewClient(k8s.GetK8STarget(namespace, "logic", RPCDialAddr)) - return logicpb.NewRoomIntServiceClient(conn) - }, - UserIntClientBuilder: func() businesspb.UserIntServiceClient { - conn := ugrpc.NewClient(k8s.GetK8STarget(namespace, "business", RPCDialAddr)) - return businesspb.NewUserIntServiceClient(conn) - }, + LogicServerAddr: "k8s:///logic:8000", + BusinessServerAddr: "k8s:///business:8000", } } diff --git a/config/local_builder.go b/config/local_builder.go index e32044b4..656843dd 100644 --- a/config/local_builder.go +++ b/config/local_builder.go @@ -2,10 +2,6 @@ package config import ( "log/slog" - - "gim/pkg/protocol/pb/businesspb" - "gim/pkg/protocol/pb/logicpb" - "gim/pkg/ugrpc" ) type localBuilder struct{} @@ -28,25 +24,11 @@ func (*localBuilder) Build() Configuration { ConnectTCPListenAddr: ":8001", ConnectWSListenAddr: ":8002", - LogicRPCListenAddr: ":8010", - UserRPCListenAddr: ":8020", - FileHTTPListenAddr: "8030", + LogicRPCListenAddr: ":8010", + BusinessRPCListenAddr: ":8020", + FileHTTPListenAddr: "8030", - DeviceIntClientBuilder: func() logicpb.DeviceIntServiceClient { - conn := ugrpc.NewClient("127.0.0.1:8010") - return logicpb.NewDeviceIntServiceClient(conn) - }, - MessageIntClientBuilder: func() logicpb.MessageIntServiceClient { - conn := ugrpc.NewClient("127.0.0.1:8010") - return logicpb.NewMessageIntServiceClient(conn) - }, - RoomIntClientBuilder: func() logicpb.RoomIntServiceClient { - conn := ugrpc.NewClient("127.0.0.1:8010") - return logicpb.NewRoomIntServiceClient(conn) - }, - UserIntClientBuilder: func() businesspb.UserIntServiceClient { - conn := ugrpc.NewClient("127.0.0.1:8020") - return businesspb.NewUserIntServiceClient(conn) - }, + LogicServerAddr: "127.0.0.1:8010", + BusinessServerAddr: "127.0.0.1:8020", } } diff --git a/deploy/compose/compose.yaml b/deploy/compose/compose.yaml index c70c91f0..402687fd 100644 --- a/deploy/compose/compose.yaml +++ b/deploy/compose/compose.yaml @@ -5,7 +5,7 @@ services: mysql: container_name: mysql restart: always - image: mysql:8.4.3 + image: mysql:8.0.43 environment: MYSQL_ROOT_PASSWORD: 123456 ENV: compose @@ -35,7 +35,7 @@ services: connect: container_name: connect restart: always - image: connect:20250831.175743 + image: connect:20250907.220416 volumes: - /etc/localtime:/etc/localtime - /Users/alber/data/log/connect:/data/log/connect @@ -55,7 +55,7 @@ services: logic: container_name: logic restart: always - image: logic:20250831.175749 + image: logic:20250907.220423 volumes: - /etc/localtime:/etc/localtime - /Users/alber/data/log/logic:/data/log/logic @@ -72,7 +72,7 @@ services: business: container_name: business restart: always - image: business:20250831.175751 + image: business:20250907.220425 volumes: - /etc/localtime:/etc/localtime - /Users/alber/data/log/user:/data/log/user @@ -89,7 +89,7 @@ services: file: container_name: file restart: always - image: file:20250831.175753 + image: file:20250907.220428 volumes: - /etc/localtime:/etc/localtime - /Users/alber/data/file:/data/file diff --git a/deploy/k8s/sql/create_table.sql b/deploy/k8s/sql/create_table.sql index 74a4ed4e..1c66ec50 100644 --- a/deploy/k8s/sql/create_table.sql +++ b/deploy/k8s/sql/create_table.sql @@ -2,7 +2,7 @@ -- -- Host: 127.0.0.1 Database: gim -- ------------------------------------------------------ --- Server version 8.4.3 +-- Server version 8.0.43 /*!40103 SET @OLD_TIME_ZONE=@@TIME_ZONE */; /*!40103 SET TIME_ZONE='+00:00' */; /*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */; @@ -92,9 +92,10 @@ CREATE TABLE `message` ( `request_id` bigint NOT NULL COMMENT '请求id', `command` int NOT NULL COMMENT '消息类型', `content` blob NOT NULL COMMENT '消息内容', - `status` tinyint NOT NULL DEFAULT '0' COMMENT '消息状态,0:未处理1:消息撤回', PRIMARY KEY (`id`) -) ENGINE=InnoDB AUTO_INCREMENT=10000 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin COMMENT='消息'; +) ENGINE=InnoDB AUTO_INCREMENT=10000 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin COMMENT='消息' +/*!50100 PARTITION BY HASH (`id`) +PARTITIONS 8 */; /*!40101 SET character_set_client = @saved_cs_client */; -- @@ -148,7 +149,9 @@ CREATE TABLE `user_message` ( `updated_at` datetime NOT NULL COMMENT '更新时间', `message_id` bigint unsigned NOT NULL COMMENT '消息ID', PRIMARY KEY (`user_id`,`seq`) USING BTREE -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin COMMENT='用户消息'; +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin COMMENT='用户消息' +/*!50100 PARTITION BY HASH (`user_id`) +PARTITIONS 8 */; /*!40101 SET character_set_client = @saved_cs_client */; /*!40103 SET TIME_ZONE=@OLD_TIME_ZONE */; @@ -157,4 +160,4 @@ CREATE TABLE `user_message` ( /*!40014 SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS */; /*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */; --- Dump completed on 2025年08月31日 21:51:04 +-- Dump completed on 2025年09月07日 21:47:54 diff --git a/deploy/k8s/templates/mysql/stateful-set.yaml b/deploy/k8s/templates/mysql/stateful-set.yaml index e2fe4485..1b76079d 100644 --- a/deploy/k8s/templates/mysql/stateful-set.yaml +++ b/deploy/k8s/templates/mysql/stateful-set.yaml @@ -17,7 +17,7 @@ spec: terminationGracePeriodSeconds: 10 containers: - name: mysql - image: mysql:8.4.3 + image: mysql:8.0.43 imagePullPolicy: IfNotPresent args: - "--sql-mode=" diff --git a/go.mod b/go.mod index 9a544a85..fabaed30 100644 --- a/go.mod +++ b/go.mod @@ -7,24 +7,27 @@ require ( github.com/go-redis/redis v6.15.9+incompatible github.com/gorilla/websocket v1.5.3 github.com/json-iterator/go v1.1.12 + github.com/sercand/kuberesolver/v6 v6.0.1 google.golang.org/grpc v1.71.1 google.golang.org/protobuf v1.36.6 gopkg.in/natefinch/lumberjack.v2 v2.2.1 gorm.io/driver/mysql v1.5.7 gorm.io/gorm v1.25.12 - k8s.io/api v0.32.3 k8s.io/apimachinery v0.32.3 k8s.io/client-go v0.32.3 ) require ( filippo.io/edwards25519 v1.1.0 // indirect + github.com/beorn7/perks v1.0.1 // indirect github.com/bytedance/sonic v1.11.6 // indirect github.com/bytedance/sonic/loader v0.1.1 // indirect + github.com/cespare/xxhash/v2 v2.3.0 // indirect github.com/cloudwego/base64x v0.1.4 // indirect github.com/cloudwego/iasm v0.2.0 // indirect github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect github.com/emicklei/go-restful/v3 v3.11.0 // indirect + github.com/fsnotify/fsnotify v1.9.0 // indirect github.com/fxamacker/cbor/v2 v2.7.0 // indirect github.com/gabriel-vasile/mimetype v1.4.3 // indirect github.com/gin-contrib/sse v0.1.0 // indirect @@ -50,12 +53,17 @@ require ( github.com/leodido/go-urn v1.4.0 // indirect github.com/mailru/easyjson v0.7.7 // indirect github.com/mattn/go-isatty v0.0.20 // indirect + github.com/matttproud/golang_protobuf_extensions v1.0.4 // indirect github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect github.com/modern-go/reflect2 v1.0.2 // indirect github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 // indirect github.com/onsi/ginkgo v1.16.5 // indirect github.com/pelletier/go-toml/v2 v2.2.2 // indirect github.com/pkg/errors v0.9.1 // indirect + github.com/prometheus/client_golang v1.15.1 // indirect + github.com/prometheus/client_model v0.3.0 // indirect + github.com/prometheus/common v0.42.0 // indirect + github.com/prometheus/procfs v0.9.0 // indirect github.com/twitchyliquid64/golang-asm v0.15.1 // indirect github.com/ugorji/go/codec v1.2.12 // indirect github.com/x448/float16 v0.8.4 // indirect @@ -71,6 +79,7 @@ require ( gopkg.in/evanphx/json-patch.v4 v4.12.0 // indirect gopkg.in/inf.v0 v0.9.1 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect + k8s.io/api v0.32.3 // indirect k8s.io/klog/v2 v2.130.1 // indirect k8s.io/kube-openapi v0.0.0-20241105132330-32ad38e42d3f // indirect k8s.io/utils v0.0.0-20241104100929-3ea5e8cea738 // indirect diff --git a/go.sum b/go.sum index 1a85d599..3dff16cf 100644 --- a/go.sum +++ b/go.sum @@ -5,12 +5,16 @@ filippo.io/edwards25519 v1.1.0/go.mod h1:BxyFTGdWcka3PhytdK4V28tE5sGfRvvvRV7EaN4 github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU= github.com/antihax/optional v1.0.0/go.mod h1:uupD/76wgC+ih3iEmQUL+0Ugr19nfwCT1kdvxnR2qWY= +github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM= +github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw= github.com/bytedance/sonic v1.11.6 h1:oUp34TzMlL+OY1OUWxHqsdkgC/Zfc85zGqw9siXjrc0= github.com/bytedance/sonic v1.11.6/go.mod h1:LysEHSvpvDySVdC2f87zGWf6CIKJcAvqab1ZaiQtds4= github.com/bytedance/sonic/loader v0.1.1 h1:c+e5Pt1k/cy5wMveRDyk2X4B9hF4g7an8N3zCYjJFNM= github.com/bytedance/sonic/loader v0.1.1/go.mod h1:ncP89zfokxS5LZrJxl5z0UJcsk4M4yY2JpfqGeCtNLU= github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc= +github.com/cespare/xxhash/v2 v2.3.0 h1:UL815xU9SqsFlibzuggzjXhog7bL6oX9BbNZnL2UFvs= +github.com/cespare/xxhash/v2 v2.3.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= github.com/cloudwego/base64x v0.1.4 h1:jwCgWpFanWmN8xoIUHa2rtzmkd5J2plF/dnLS6Xd/0Y= github.com/cloudwego/base64x v0.1.4/go.mod h1:0zlkT4Wn5C6NdauXdJRhSKRlJvmclQ1hhJgA0rcu/8w= @@ -33,8 +37,9 @@ github.com/envoyproxy/go-control-plane v0.9.9-0.20201210154907-fd9021fe5dad/go.m github.com/envoyproxy/go-control-plane v0.9.9-0.20210512163311-63b5d3c536b0/go.mod h1:hliV/p42l8fGbc6Y9bQ70uLwIvmJyVE5k4iMKlh8wCQ= github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= -github.com/fsnotify/fsnotify v1.4.9 h1:hsms1Qyu0jgnwNXIxa+/V/PDsU6CfLf6CNO8H7IWoS4= github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ= +github.com/fsnotify/fsnotify v1.9.0 h1:2Ml+OJNzbYCTzsxtv8vKSFD9PbJjmhYF14k/jKC7S9k= +github.com/fsnotify/fsnotify v1.9.0/go.mod h1:8jBTzvmWwFyi3Pb8djgCCO5IBqzKJ/Jwo8TRcHyHii0= github.com/fxamacker/cbor/v2 v2.7.0 h1:iM5WgngdRBanHcxugY4JySA0nk1wZorNOpTgCMedv5E= github.com/fxamacker/cbor/v2 v2.7.0/go.mod h1:pxXPTn3joSm21Gbwsv0w9OSA2y1HFR9qXEeXQVeNoDQ= github.com/gabriel-vasile/mimetype v1.4.3 h1:in2uUcidCuFcDKtdcBxlR0rJ1+fsokWf+uqxgUFjbI0= @@ -82,6 +87,7 @@ github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfb github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= github.com/golang/protobuf v1.3.3/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw= +github.com/golang/protobuf v1.3.5/go.mod h1:6O5/vntMXwX2lRkT1hjjk0nAC1IDOTvTlVgjlRvqsdk= github.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8= github.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA= github.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs= @@ -144,6 +150,8 @@ github.com/mailru/easyjson v0.7.7 h1:UGYAvKxe3sBsEDzO8ZeWOSlIQfWFlxbzLZe7hwFURr0 github.com/mailru/easyjson v0.7.7/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc= github.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY= github.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y= +github.com/matttproud/golang_protobuf_extensions v1.0.4 h1:mmDVorXM7PCGKw94cs5zkfA9PSy5pEvNWRP0ET0TIVo= +github.com/matttproud/golang_protobuf_extensions v1.0.4/go.mod h1:BSXmuO+STAnVfrANrmjBb36TMTDstsz7MSK+HVaYKv4= github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg= github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= @@ -171,10 +179,20 @@ github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINE github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRIccs7FGNTlIRMkT8wgtp5eCXdBlqhYGL6U= github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/prometheus/client_golang v1.15.1 h1:8tXpTmJbyH5lydzFPoxSIJ0J46jdh3tylbvM1xCv0LI= +github.com/prometheus/client_golang v1.15.1/go.mod h1:e9yaBhRPU2pPNsZwE+JdQl0KEt1N9XgF6zxWmaC0xOk= github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= +github.com/prometheus/client_model v0.3.0 h1:UBgGFHqYdG/TPFD1B1ogZywDqEkwp3fBMvqdiQ7Xew4= +github.com/prometheus/client_model v0.3.0/go.mod h1:LDGWKZIo7rky3hgvBe+caln+Dr3dPggB5dvjtD7w9+w= +github.com/prometheus/common v0.42.0 h1:EKsfXEYo4JpWMHH5cg+KOUWeuJSov1Id8zGR8eeI1YM= +github.com/prometheus/common v0.42.0/go.mod h1:xBwqVerjNdUDjgODMpudtOMwlOwf2SaTr1yjz4b7Zbc= +github.com/prometheus/procfs v0.9.0 h1:wzCHvIvM5SxWqYvwgVL7yJY8Lz3PKn49KQtpgMYJfhI= +github.com/prometheus/procfs v0.9.0/go.mod h1:+pB4zwohETzFnmlpe6yd2lSc+0/46IYZRB/chUwxUZY= github.com/rogpeppe/fastuuid v1.2.0/go.mod h1:jVj6XXZzXRy/MSR5jhDC/2q6DgLz+nrA6LYCDYWNEvQ= 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/sercand/kuberesolver/v6 v6.0.1 h1:XZUTA0gy/lgDYp/UhEwv7Js24F1j8NJ833QrWv0Xux4= +github.com/sercand/kuberesolver/v6 v6.0.1/go.mod h1:C0tsTuRMONSY+Xf7pv7RMW1/JlewY1+wS8SZE+1lf1s= github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA= github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= diff --git a/internal/business/friend/api.go b/internal/business/friend/api/friend_ext.go similarity index 62% rename from internal/business/friend/api.go rename to internal/business/friend/api/friend_ext.go index 1ff7bc7c..150bdc1d 100644 --- a/internal/business/friend/api.go +++ b/internal/business/friend/api/friend_ext.go @@ -1,10 +1,11 @@ -package friend +package api import ( "context" "google.golang.org/protobuf/types/known/emptypb" + "gim/internal/business/friend/app" "gim/pkg/md" pb "gim/pkg/protocol/pb/businesspb" ) @@ -15,12 +16,10 @@ type FriendExtService struct { // SendMessage 发送好友消息 func (*FriendExtService) SendMessage(ctx context.Context, request *pb.SendFriendMessageRequest) (*pb.SendFriendMessageReply, error) { - userID, deviceID, err := md.GetData(ctx) - if err != nil { - return nil, err - } + userID := md.GetUserID(ctx) + deviceID := md.GetDeviceID(ctx) - messageId, err := App.SendToFriend(ctx, deviceID, userID, request) + messageId, err := app.FriendApp.SendToFriend(ctx, deviceID, userID, request) if err != nil { return nil, err } @@ -28,12 +27,9 @@ func (*FriendExtService) SendMessage(ctx context.Context, request *pb.SendFriend } func (s *FriendExtService) Add(ctx context.Context, request *pb.FriendAddRequest) (*emptypb.Empty, error) { - userID, _, err := md.GetData(ctx) - if err != nil { - return nil, err - } + userID := md.GetUserID(ctx) - err = App.AddFriend(ctx, userID, request.FriendId, request.Remarks, request.Description) + err := app.FriendApp.AddFriend(ctx, userID, request.FriendId, request.Remarks, request.Description) if err != nil { return nil, err } @@ -42,26 +38,19 @@ func (s *FriendExtService) Add(ctx context.Context, request *pb.FriendAddRequest } func (s *FriendExtService) Agree(ctx context.Context, request *pb.FriendAgreeRequest) (*emptypb.Empty, error) { - userID, _, err := md.GetData(ctx) - if err != nil { - return nil, err - } + userID := md.GetUserID(ctx) - err = App.AgreeAddFriend(ctx, userID, request.UserId, request.Remarks) + err := app.FriendApp.AgreeAddFriend(ctx, userID, request.UserId, request.Remarks) if err != nil { return nil, err } - return &emptypb.Empty{}, nil } func (s *FriendExtService) Set(ctx context.Context, request *pb.FriendSetRequest) (*pb.FriendSetReply, error) { - userID, _, err := md.GetData(ctx) - if err != nil { - return nil, err - } + userID := md.GetUserID(ctx) - err = App.SetFriend(ctx, userID, request) + err := app.FriendApp.SetFriend(ctx, userID, request) if err != nil { return nil, err } @@ -69,10 +58,7 @@ func (s *FriendExtService) Set(ctx context.Context, request *pb.FriendSetRequest } func (s *FriendExtService) GetFriends(ctx context.Context, request *emptypb.Empty) (*pb.GetFriendsReply, error) { - userId, _, err := md.GetData(ctx) - if err != nil { - return nil, err - } - friends, err := App.List(ctx, userId) + userId := md.GetUserID(ctx) + friends, err := app.FriendApp.List(ctx, userId) return &pb.GetFriendsReply{Friends: friends}, err } diff --git a/internal/business/friend/api_test.go b/internal/business/friend/api/friend_ext_test.go similarity index 99% rename from internal/business/friend/api_test.go rename to internal/business/friend/api/friend_ext_test.go index e6e303c3..70233f88 100644 --- a/internal/business/friend/api_test.go +++ b/internal/business/friend/api/friend_ext_test.go @@ -1,4 +1,4 @@ -package friend +package api import ( "context" diff --git a/internal/business/friend/app.go b/internal/business/friend/app.go deleted file mode 100644 index 5596de72..00000000 --- a/internal/business/friend/app.go +++ /dev/null @@ -1,164 +0,0 @@ -package friend - -import ( - "context" - "errors" - "time" - - userapp "gim/internal/business/user/app" - "gim/internal/logic/message" - "gim/pkg/gerrors" - pb "gim/pkg/protocol/pb/businesspb" - "gim/pkg/protocol/pb/connectpb" - "gim/pkg/protocol/pb/logicpb" - "gim/pkg/rpc" -) - -type app struct{} - -var App = new(app) - -// List 获取好友列表 -func (s *app) List(ctx context.Context, userID uint64) ([]*pb.Friend, error) { - friends, err := Repo.List(userID, FriendStatusAgree) - if err != nil { - return nil, err - } - - userIDs := make([]uint64, 0, len(friends)) - for i := range friends { - userIDs = append(userIDs, friends[i].UserID) - } - users, err := userapp.UserApp.GetUsers(ctx, userIDs) - if err != nil { - return nil, err - } - - var infos = make([]*pb.Friend, len(friends)) - for i := range friends { - friend := pb.Friend{ - UserId: friends[i].FriendID, - Remarks: friends[i].Remarks, - Extra: friends[i].Extra, - } - - user, ok := users[friends[i].FriendID] - if ok { - friend.Nickname = user.Nickname - friend.Sex = user.Sex - friend.AvatarUrl = user.AvatarUrl - friend.UserExtra = user.Extra - } - infos[i] = &friend - } - - return infos, nil -} - -// AddFriend 添加好友 -func (*app) AddFriend(ctx context.Context, userId, friendId uint64, remarks, description string) error { - friend, err := Repo.Get(userId, friendId) - if err != nil && !errors.Is(err, gerrors.ErrFriendNotFound) { - return err - } - if err == nil { - if friend.Status == FriendStatusApply { - return nil - } - if friend.Status == FriendStatusAgree { - return gerrors.ErrAlreadyIsFriend - } - } - - err = Repo.Create(&Friend{ - UserID: userId, - FriendID: friendId, - Remarks: remarks, - Status: FriendStatusApply, - }) - if err != nil { - return err - } - - user, err := userapp.UserApp.Get(ctx, userId) - if err != nil { - return err - } - - _, err = message.App.PushToUsersWithAny(ctx, []uint64{friendId}, connectpb.Command_ADD_FRIEND, &pb.AddFriendPush{ - FriendId: userId, - Nickname: user.Nickname, - AvatarUrl: user.AvatarUrl, - Description: description, - }, true) - return err -} - -// AgreeAddFriend 同意添加好友 -func (*app) AgreeAddFriend(ctx context.Context, userId, friendId uint64, remarks string) error { - friend, err := Repo.Get(friendId, userId) - if err != nil { - return err - } - if friend.Status == FriendStatusAgree { - return nil - } - friend.Status = FriendStatusAgree - err = Repo.Save(friend) - if err != nil { - return err - } - - err = Repo.Save(&Friend{ - UserID: userId, - FriendID: friendId, - Remarks: remarks, - Status: FriendStatusAgree, - }) - if err != nil { - return err - } - - user, err := userapp.UserApp.Get(ctx, userId) - if err != nil { - return err - } - - _, err = message.App.PushToUsersWithAny(ctx, []uint64{friendId}, connectpb.Command_AGREE_ADD_FRIEND, &pb.AgreeAddFriendPush{ - FriendId: userId, - Nickname: user.Nickname, - AvatarUrl: user.AvatarUrl, - }, true) - return err -} - -// SetFriend 设置好友信息 -func (*app) SetFriend(ctx context.Context, userId uint64, req *pb.FriendSetRequest) error { - friend, err := Repo.Get(userId, req.FriendId) - if err != nil { - return err - } - - friend.Remarks = req.Remarks - friend.Extra = req.Extra - friend.UpdatedAt = time.Now() - - return Repo.Save(friend) -} - -// SendToFriend 消息发送至好友 -func (*app) SendToFriend(ctx context.Context, fromDeviceID, fromUserID uint64, req *pb.SendFriendMessageRequest) (uint64, error) { - user, err := rpc.GetUser(fromDeviceID, fromUserID) - if err != nil { - return 0, err - } - - // 发给发送者 - push := logicpb.UserMessagePush{ - FromUser: user, - ToUserId: req.UserId, - Content: req.Content, - } - userIDs := []uint64{fromUserID, req.UserId} - return message.App.PushToUsersWithAny(ctx, userIDs, connectpb.Command_USER_MESSAGE, &push, true) -} diff --git a/internal/business/friend/app/friend.go b/internal/business/friend/app/friend.go new file mode 100644 index 00000000..2a10ffac --- /dev/null +++ b/internal/business/friend/app/friend.go @@ -0,0 +1,190 @@ +package app + +import ( + "context" + "errors" + "time" + + "gim/internal/business/friend/domain" + "gim/internal/business/friend/repo" + userapp "gim/internal/business/user/app" + "gim/pkg/gerrors" + pb "gim/pkg/protocol/pb/businesspb" + "gim/pkg/protocol/pb/connectpb" + "gim/pkg/protocol/pb/logicpb" + "gim/pkg/rpc" +) + +var FriendApp = new(friendApp) + +type friendApp struct{} + +// List 获取好友列表 +func (s *friendApp) List(ctx context.Context, userID uint64) ([]*pb.Friend, error) { + friends, err := repo.FriendRepo.List(userID, domain.FriendStatusAgree) + if err != nil { + return nil, err + } + + userIDs := make([]uint64, 0, len(friends)) + for i := range friends { + userIDs = append(userIDs, friends[i].UserID) + } + users, err := userapp.UserApp.GetUsers(ctx, userIDs) + if err != nil { + return nil, err + } + + var infos = make([]*pb.Friend, len(friends)) + for i := range friends { + friend := pb.Friend{ + UserId: friends[i].FriendID, + Remarks: friends[i].Remarks, + Extra: friends[i].Extra, + } + + user, ok := users[friends[i].FriendID] + if ok { + friend.Nickname = user.Nickname + friend.Sex = user.Sex + friend.AvatarUrl = user.AvatarUrl + friend.UserExtra = user.Extra + } + infos[i] = &friend + } + + return infos, nil +} + +// AddFriend 添加好友 +func (*friendApp) AddFriend(ctx context.Context, userId, friendId uint64, remarks, description string) error { + friend, err := repo.FriendRepo.Get(userId, friendId) + if err != nil && !errors.Is(err, gerrors.ErrFriendNotFound) { + return err + } + if err == nil { + if friend.Status == domain.FriendStatusApply { + return nil + } + if friend.Status == domain.FriendStatusAgree { + return gerrors.ErrAlreadyIsFriend + } + } + + err = repo.FriendRepo.Create(&domain.Friend{ + UserID: userId, + FriendID: friendId, + Remarks: remarks, + Status: domain.FriendStatusApply, + }) + if err != nil { + return err + } + + user, err := userapp.UserApp.Get(ctx, userId) + if err != nil { + return err + } + + _, err = rpc.PushToUsers(ctx, rpc.PushRequest{ + UserIDs: []uint64{friendId}, + Command: connectpb.Command(pb.Command_ADD_FRIEND), + Message: &pb.AddFriendPush{ + FriendId: userId, + Nickname: user.Nickname, + AvatarUrl: user.AvatarUrl, + Description: description, + }, + IsPersist: true, + }) + return err +} + +// AgreeAddFriend 同意添加好友 +func (*friendApp) AgreeAddFriend(ctx context.Context, userId, friendId uint64, remarks string) error { + friend, err := repo.FriendRepo.Get(friendId, userId) + if err != nil { + return err + } + if friend.Status == domain.FriendStatusAgree { + return nil + } + friend.Status = domain.FriendStatusAgree + err = repo.FriendRepo.Save(friend) + if err != nil { + return err + } + + err = repo.FriendRepo.Save(&domain.Friend{ + UserID: userId, + FriendID: friendId, + Remarks: remarks, + Status: domain.FriendStatusAgree, + }) + if err != nil { + return err + } + + user, err := userapp.UserApp.Get(ctx, userId) + if err != nil { + return err + } + + _, err = rpc.PushToUsers(ctx, rpc.PushRequest{ + UserIDs: []uint64{friendId}, + Command: connectpb.Command(pb.Command_AGREE_ADD_FRIEND), + Message: &pb.AgreeAddFriendPush{ + FriendId: userId, + Nickname: user.Nickname, + AvatarUrl: user.AvatarUrl, + }, + IsPersist: true, + }) + return err +} + +// SetFriend 设置好友信息 +func (*friendApp) SetFriend(ctx context.Context, userId uint64, req *pb.FriendSetRequest) error { + friend, err := repo.FriendRepo.Get(userId, req.FriendId) + if err != nil { + return err + } + + friend.Remarks = req.Remarks + friend.Extra = req.Extra + friend.UpdatedAt = time.Now() + + return repo.FriendRepo.Save(friend) +} + +// SendToFriend 消息发送至好友 +func (*friendApp) SendToFriend(ctx context.Context, fromDeviceID, fromUserID uint64, req *pb.SendFriendMessageRequest) (uint64, error) { + user, err := userapp.UserApp.Get(ctx, fromUserID) + if err != nil { + return 0, err + } + + // 发给发送者 + push := &logicpb.UserMessagePush{ + FromUser: &logicpb.User{ + UserId: fromUserID, + DeviceId: fromDeviceID, + Nickname: user.Nickname, + AvatarUrl: user.AvatarUrl, + Extra: user.Extra, + }, + ToUserId: req.UserId, + Content: req.Content, + } + + pushReply, err := rpc.PushToUsers(ctx, rpc.PushRequest{ + UserIDs: []uint64{fromUserID, req.UserId}, + Command: connectpb.Command_USER_MESSAGE, + Message: push, + IsPersist: true, + }) + if err != nil { + return 0, err + } + return pushReply.MessageId, nil +} diff --git a/internal/business/friend/entity.go b/internal/business/friend/domain/friend.go similarity index 95% rename from internal/business/friend/entity.go rename to internal/business/friend/domain/friend.go index 9ec727ed..028cac08 100644 --- a/internal/business/friend/entity.go +++ b/internal/business/friend/domain/friend.go @@ -1,4 +1,4 @@ -package friend +package domain import "time" diff --git a/internal/business/friend/repo.go b/internal/business/friend/repo/friend.go similarity index 59% rename from internal/business/friend/repo.go rename to internal/business/friend/repo/friend.go index 57c521ad..f116bd18 100644 --- a/internal/business/friend/repo.go +++ b/internal/business/friend/repo/friend.go @@ -1,21 +1,22 @@ -package friend +package repo import ( "errors" "gorm.io/gorm" + "gim/internal/business/friend/domain" "gim/pkg/db" "gim/pkg/gerrors" ) -type repo struct{} +var FriendRepo = new(friendRepo) -var Repo = new(repo) +type friendRepo struct{} // Get 获取好友 -func (*repo) Get(userId, friendId uint64) (*Friend, error) { - friend := Friend{} +func (*friendRepo) Get(userId, friendId uint64) (*domain.Friend, error) { + friend := domain.Friend{} err := db.DB.First(&friend, "user_id = ? and friend_id = ?", userId, friendId).Error if errors.Is(err, gorm.ErrRecordNotFound) { return nil, gerrors.ErrFriendNotFound @@ -24,18 +25,18 @@ func (*repo) Get(userId, friendId uint64) (*Friend, error) { } // Create 添加好友 -func (*repo) Create(friend *Friend) error { +func (*friendRepo) Create(friend *domain.Friend) error { return db.DB.Create(friend).Error } // Save 添加好友 -func (*repo) Save(friend *Friend) error { +func (*friendRepo) Save(friend *domain.Friend) error { return db.DB.Where("user_id = ? and friend_id = ?", friend.UserID, friend.FriendID).Save(friend).Error } // List 获取好友列表 -func (*repo) List(userId uint64, status int) ([]Friend, error) { - var friends []Friend +func (*friendRepo) List(userId uint64, status int) ([]domain.Friend, error) { + var friends []domain.Friend err := db.DB.Where("user_id = ? and status = ?", userId, status).Find(&friends).Error return friends, err } diff --git a/internal/business/friend/repo/friend_test.go b/internal/business/friend/repo/friend_test.go new file mode 100644 index 00000000..da23b317 --- /dev/null +++ b/internal/business/friend/repo/friend_test.go @@ -0,0 +1,33 @@ +package repo + +import ( + "testing" + + "gim/internal/business/friend/domain" +) + +func Test_friendRepo_Get(t *testing.T) { + friend, err := FriendRepo.Get(1, 2) + if err != nil { + t.Fatal(err) + } + t.Log(friend) +} + +func Test_friendRepo_Save(t *testing.T) { + err := FriendRepo.Save(&domain.Friend{ + UserID: 1, + FriendID: 2, + }) + t.Log(err) +} + +func Test_friendRepo_List(t *testing.T) { + friends, err := FriendRepo.List(1, domain.FriendStatusAgree) + if err != nil { + t.Fatal(err) + } + for _, friend := range friends { + t.Log(friend) + } +} diff --git a/internal/business/friend/repo_test.go b/internal/business/friend/repo_test.go deleted file mode 100644 index 79cd3b1b..00000000 --- a/internal/business/friend/repo_test.go +++ /dev/null @@ -1,31 +0,0 @@ -package friend - -import ( - "testing" -) - -func Test_friendDao_Get(t *testing.T) { - friend, err := Repo.Get(1, 2) - if err != nil { - t.Fatal(err) - } - t.Log(friend) -} - -func Test_friendDao_Save(t *testing.T) { - err := Repo.Save(&Friend{ - UserID: 1, - FriendID: 2, - }) - t.Log(err) -} - -func Test_friendDao_List(t *testing.T) { - friends, err := Repo.List(1, FriendStatusAgree) - if err != nil { - t.Fatal(err) - } - for _, friend := range friends { - t.Log(friend) - } -} diff --git a/internal/business/user/api/user_ext.go b/internal/business/user/api/user_ext.go index c15644a1..0c58e224 100644 --- a/internal/business/user/api/user_ext.go +++ b/internal/business/user/api/user_ext.go @@ -19,20 +19,14 @@ func (s *UserExtService) SignIn(ctx context.Context, req *pb.SignInRequest) (*pb } func (s *UserExtService) GetUser(ctx context.Context, req *pb.GetUserRequest) (*pb.GetUserReply, error) { - userID, _, err := md.GetData(ctx) - if err != nil { - return nil, err - } + userID := md.GetUserID(ctx) user, err := app.UserApp.Get(ctx, userID) return &pb.GetUserReply{User: user}, err } func (s *UserExtService) UpdateUser(ctx context.Context, req *pb.UpdateUserRequest) (*emptypb.Empty, error) { - userID, _, err := md.GetData(ctx) - if err != nil { - return nil, err - } + userID := md.GetUserID(ctx) return new(emptypb.Empty), app.UserApp.Update(ctx, userID, req) } diff --git a/internal/connect/client_test.go b/internal/connect/client_test.go index c1263b4a..66067cae 100644 --- a/internal/connect/client_test.go +++ b/internal/connect/client_test.go @@ -20,19 +20,19 @@ import ( ) func TestTCPClient(t *testing.T) { - runClient("tcp", "127.0.0.1:8001", 1, 1, 1) + runClient("tcp", "127.0.0.1:8001", 1, 1) } func TestWSClient(t *testing.T) { - runClient("ws", "ws://127.0.0.1:8002/ws", 1, 1, 1) + runClient("ws", "ws://127.0.0.1:8002/ws", 1, 1) } func TestGroupTCPClient(t *testing.T) { log.SetFlags(log.Lshortfile) - go runClient("tcp", "127.0.0.1:8001", 1, 1, 1) - go runClient("tcp", "127.0.0.1:8001", 2, 2, 1) + go runClient("tcp", "127.0.0.1:8001", 1, 1) + go runClient("tcp", "127.0.0.1:8001", 2, 2) select {} } @@ -115,11 +115,10 @@ func (c *wsConn) receive(handler func([]byte)) { type client struct { UserID uint64 DeviceID uint64 - Seq uint64 conn conn } -func runClient(network string, url string, userID, deviceID, seq uint64) { +func runClient(network string, url string, userID, deviceID uint64) { var conn conn var err error switch network { @@ -137,7 +136,6 @@ func runClient(network string, url string, userID, deviceID, seq uint64) { client := &client{ UserID: userID, DeviceID: deviceID, - Seq: seq, conn: conn, } client.run() @@ -226,24 +224,8 @@ func (c *client) handleMessage(buf []byte) { log.Println(c.info(), "登录响应:", jsonString(&message), jsonString(getReply(&message))) time.Sleep(1 * time.Second) - c.send(pb.Command_SYNC, getRequestID(), &pb.SyncRequest{ - Seq: 0, - }) case pb.Command_HEARTBEAT: log.Println(c.info(), "心跳响应") - case pb.Command_SYNC: - log.Println(c.info(), "消息同步开始") - reply := getReply(&message) - log.Println(c.info(), "消息同步响应", reply.Code, reply.Message) - var syncReply pb.SyncReply - err := proto.Unmarshal(reply.Data, &syncReply) - if err != nil { - log.Println(err) - } - for _, msg := range syncReply.Messages { - log.Println(c.info(), "消息同步", jsonString(msg)) - } - log.Println(c.info(), "消息同步结束") case pb.Command_SUBSCRIBE_ROOM: log.Println(c.info(), "订阅房间响应", jsonString(&message), jsonString(getReply(&message))) default: diff --git a/internal/connect/conn.go b/internal/connect/conn.go index f8cb3574..dc10fc9a 100644 --- a/internal/connect/conn.go +++ b/internal/connect/conn.go @@ -143,8 +143,6 @@ func (c *Conn) HandleMessage(buf []byte) { c.SignIn(message) case pb.Command_HEARTBEAT: c.Heartbeat(message) - case pb.Command_SYNC: - case pb.Command_SUBSCRIBE_ROOM: c.SubscribedRoom(message) default: @@ -212,27 +210,6 @@ func (c *Conn) Heartbeat(message *pb.Message) { slog.Info("heartbeat", "deviceID", c.DeviceID, "userID", c.UserID) } -func (c *Conn) Sync(message *pb.Message) { - var request pb.SyncRequest - err := proto.Unmarshal(message.Content, &request) - if err != nil { - slog.Error("proto unmarshal error", "error", err) - return - } - - reply, err := rpc.GetMessageIntClient().Sync(context.TODO(), &logicpb.SyncRequest{ - UserId: c.UserID, - Seq: request.Seq, - }) - if err != nil { - slog.Error("Sync error", "deviceID", c.DeviceID, "userID", c.UserID, "error", err) - } - - slog.Info("Sync", "deviceID", c.DeviceID, "userID", c.UserID, "request", &request, "reply", reply) - setContent(message, err, reply) - c.Send(message) -} - // SubscribedRoom 订阅房间 func (c *Conn) SubscribedRoom(message *pb.Message) { var subscribeRoom pb.SubscribeRoomRequest diff --git a/internal/logic/device/api.go b/internal/logic/device/api/device_int.go similarity index 74% rename from internal/logic/device/api.go rename to internal/logic/device/api/device_int.go index ae095402..c9ef6a50 100644 --- a/internal/logic/device/api.go +++ b/internal/logic/device/api/device_int.go @@ -1,10 +1,11 @@ -package device +package api import ( "context" "google.golang.org/protobuf/types/known/emptypb" + "gim/internal/logic/device/app" pb "gim/pkg/protocol/pb/logicpb" ) @@ -14,23 +15,23 @@ type DeviceIntService struct { // SignIn 设备登录 func (*DeviceIntService) SignIn(ctx context.Context, request *pb.SignInRequest) (*pb.SignInReply, error) { - err := App.SignIn(ctx, request) + err := app.DeviceApp.SignIn(ctx, request) return &pb.SignInReply{}, err } func (s *DeviceIntService) Heartbeat(ctx context.Context, request *pb.HeartbeatRequest) (*emptypb.Empty, error) { - err := App.Heartbeat(ctx, request.UserId, request.DeviceId) + err := app.DeviceApp.Heartbeat(ctx, request.UserId, request.DeviceId) return &emptypb.Empty{}, err } // Offline 设备离线 func (*DeviceIntService) Offline(ctx context.Context, request *pb.OfflineRequest) (*emptypb.Empty, error) { - err := App.Offline(ctx, request.DeviceId, request.ClientAddr) + err := app.DeviceApp.Offline(ctx, request.DeviceId, request.ClientAddr) return &emptypb.Empty{}, err } // Save 保存 func (*DeviceIntService) Save(ctx context.Context, request *pb.DeviceSaveRequest) (*pb.DeviceSaveReply, error) { - deviceID, err := App.Save(ctx, request.Device) + deviceID, err := app.DeviceApp.Save(ctx, request.Device) return &pb.DeviceSaveReply{DeviceId: deviceID}, err } diff --git a/internal/logic/device/app.go b/internal/logic/device/app/device.go similarity index 50% rename from internal/logic/device/app.go rename to internal/logic/device/app/device.go index c45094cc..3bfd812f 100644 --- a/internal/logic/device/app.go +++ b/internal/logic/device/app/device.go @@ -1,19 +1,21 @@ -package device +package app import ( "context" + "gim/internal/logic/device/domain" + "gim/internal/logic/device/repo" "gim/pkg/protocol/pb/businesspb" pb "gim/pkg/protocol/pb/logicpb" "gim/pkg/rpc" ) -type app struct{} +var DeviceApp = new(deviceApp) -var App = new(app) +type deviceApp struct{} // SignIn 登录 -func (*app) SignIn(ctx context.Context, request *pb.SignInRequest) error { +func (*deviceApp) SignIn(ctx context.Context, request *pb.SignInRequest) error { _, err := rpc.GetUserIntClient().Auth(ctx, &businesspb.AuthRequest{ UserId: request.UserId, DeviceId: request.DeviceId, @@ -23,39 +25,39 @@ func (*app) SignIn(ctx context.Context, request *pb.SignInRequest) error { return err } - device, err := Repo.Get(request.DeviceId) + device, err := repo.DeviceRepo.Get(request.DeviceId) if err != nil { return err } device.UserID = request.UserId device.ConnectAddr = request.ConnectAddr device.ClientAddr = request.ClientAddr - err = Repo.Save(device) + err = repo.DeviceRepo.Save(device) if err != nil { return err } - return Repo.SetOnline(request.DeviceId) + return repo.DeviceRepo.SetOnline(request.DeviceId) } // Heartbeat 设备离线 -func (*app) Heartbeat(_ context.Context, userID, deviceID uint64) error { - return Repo.SetOnline(deviceID) +func (*deviceApp) Heartbeat(_ context.Context, userID, deviceID uint64) error { + return repo.DeviceRepo.SetOnline(deviceID) } // Offline 设备离线 -func (*app) Offline(_ context.Context, deviceID uint64, clientAddr string) error { - return Repo.SetOffline(deviceID) +func (*deviceApp) Offline(_ context.Context, deviceID uint64, clientAddr string) error { + return repo.DeviceRepo.SetOffline(deviceID) } // ListByUserID 获取用户所有在线设备 -func (*app) ListByUserID(_ context.Context, userID uint64) ([]Device, error) { - return Repo.ListByUserID(userID) +func (*deviceApp) ListByUserID(_ context.Context, userID uint64) ([]domain.Device, error) { + return repo.DeviceRepo.ListByUserID(userID) } // Save 获取设备信息 -func (*app) Save(_ context.Context, pbdevice *pb.Device) (uint64, error) { - device := &Device{ +func (*deviceApp) Save(_ context.Context, pbdevice *pb.Device) (uint64, error) { + device := &domain.Device{ ID: pbdevice.Id, Type: pbdevice.Type, Brand: pbdevice.Brand, @@ -65,6 +67,6 @@ func (*app) Save(_ context.Context, pbdevice *pb.Device) (uint64, error) { BrandPushID: pbdevice.BranchPushId, } - err := Repo.Save(device) + err := repo.DeviceRepo.Save(device) return device.ID, err } diff --git a/internal/logic/device/entity.go b/internal/logic/device/domain/device.go similarity index 98% rename from internal/logic/device/entity.go rename to internal/logic/device/domain/device.go index b7d7d728..f223a8ba 100644 --- a/internal/logic/device/entity.go +++ b/internal/logic/device/domain/device.go @@ -1,4 +1,4 @@ -package device +package domain import ( "time" diff --git a/internal/logic/device/repo.go b/internal/logic/device/repo/device.go similarity index 69% rename from internal/logic/device/repo.go rename to internal/logic/device/repo/device.go index 575c735a..be34a5ba 100644 --- a/internal/logic/device/repo.go +++ b/internal/logic/device/repo/device.go @@ -1,4 +1,4 @@ -package device +package repo import ( "errors" @@ -8,17 +8,18 @@ import ( "github.com/go-redis/redis" "gorm.io/gorm" + "gim/internal/logic/device/domain" "gim/pkg/db" "gim/pkg/gerrors" ) -type repo struct{} +var DeviceRepo = new(deviceRepo) -var Repo = new(repo) +type deviceRepo struct{} // Get 获取设备 -func (*repo) Get(deviceID uint64) (*Device, error) { - var device Device +func (*deviceRepo) Get(deviceID uint64) (*domain.Device, error) { + var device domain.Device err := db.DB.First(&device, "id = ?", deviceID).Error if errors.Is(err, gorm.ErrRecordNotFound) { return nil, gerrors.ErrDeviceNotFound @@ -27,13 +28,13 @@ func (*repo) Get(deviceID uint64) (*Device, error) { } // Save 保存设备信息 -func (*repo) Save(device *Device) error { +func (*deviceRepo) Save(device *domain.Device) error { return db.DB.Save(&device).Error } // ListByUserID 获取用户设备 -func (r *repo) ListByUserID(userID uint64) ([]Device, error) { - var devices []Device +func (r *deviceRepo) ListByUserID(userID uint64) ([]domain.Device, error) { + var devices []domain.Device err := db.DB.Find(&devices, "user_id = ?", userID).Error if err != nil { return nil, err @@ -52,20 +53,20 @@ func (r *repo) ListByUserID(userID uint64) ([]Device, error) { const deviceStatus = "deviceStatus:%d" // SetOnline 设置在线 -func (*repo) SetOnline(deviceID uint64) error { +func (*deviceRepo) SetOnline(deviceID uint64) error { key := fmt.Sprintf(deviceStatus, deviceID) _, err := db.RedisCli.Set(key, "", 12*time.Minute).Result() return err } // SetOffline 设置在线 -func (*repo) SetOffline(deviceID uint64) error { +func (*deviceRepo) SetOffline(deviceID uint64) error { key := fmt.Sprintf(deviceStatus, deviceID) _, err := db.RedisCli.Del(key).Result() return err } -func (*repo) GetIsOnline(deviceID uint64) (bool, error) { +func (*deviceRepo) GetIsOnline(deviceID uint64) (bool, error) { key := fmt.Sprintf(deviceStatus, deviceID) _, err := db.RedisCli.Get(key).Result() if errors.Is(err, redis.Nil) { diff --git a/internal/logic/device/repo/device_test.go b/internal/logic/device/repo/device_test.go new file mode 100644 index 00000000..f26d4ab4 --- /dev/null +++ b/internal/logic/device/repo/device_test.go @@ -0,0 +1,11 @@ +package repo + +import ( + "testing" +) + +func Test_deviceRepo_Get(t *testing.T) { + device, err := DeviceRepo.Get(1) + t.Log(err) + t.Log(device) +} diff --git a/internal/logic/device/repo_test.go b/internal/logic/device/repo_test.go deleted file mode 100644 index 2eb05e16..00000000 --- a/internal/logic/device/repo_test.go +++ /dev/null @@ -1,11 +0,0 @@ -package device - -import ( - "testing" -) - -func Test_repo_Get(t *testing.T) { - device, err := Repo.Get(1) - t.Log(err) - t.Log(device) -} diff --git a/internal/logic/group/api.go b/internal/logic/group/api/group_int.go similarity index 78% rename from internal/logic/group/api.go rename to internal/logic/group/api/group_int.go index ffe550bb..bb6c54b9 100644 --- a/internal/logic/group/api.go +++ b/internal/logic/group/api/group_int.go @@ -1,10 +1,11 @@ -package group +package api import ( "context" "google.golang.org/protobuf/types/known/emptypb" + "gim/internal/logic/group/app" pb "gim/pkg/protocol/pb/logicpb" ) @@ -14,7 +15,7 @@ type GroupIntService struct { // Push 发送群组消息 func (*GroupIntService) Push(ctx context.Context, request *pb.GroupPushRequest) (*pb.GroupPushReply, error) { - messageID, err := App.Push(ctx, request) + messageID, err := app.GroupApp.Push(ctx, request) if err != nil { return nil, err } @@ -23,18 +24,18 @@ func (*GroupIntService) Push(ctx context.Context, request *pb.GroupPushRequest) // Create 创建群组 func (*GroupIntService) Create(ctx context.Context, request *pb.GroupCreateRequest) (*pb.GroupCreateReply, error) { - groupID, err := App.Create(ctx, request.Group) + groupID, err := app.GroupApp.Create(ctx, request.Group) return &pb.GroupCreateReply{GroupId: groupID}, err } // Update 更新群组 func (*GroupIntService) Update(ctx context.Context, request *pb.GroupUpdateRequest) (*emptypb.Empty, error) { - err := App.Update(ctx, request.Group) + err := app.GroupApp.Update(ctx, request.Group) return &emptypb.Empty{}, err } // Get 获取群组信息 func (*GroupIntService) Get(ctx context.Context, request *pb.GroupGetRequest) (*pb.GroupGetReply, error) { - group, err := App.Get(ctx, request.GroupId) + group, err := app.GroupApp.Get(ctx, request.GroupId) return &pb.GroupGetReply{Group: group}, err } diff --git a/internal/logic/group/api_test.go b/internal/logic/group/api/group_int_test.go similarity index 98% rename from internal/logic/group/api_test.go rename to internal/logic/group/api/group_int_test.go index 858b835e..ee04b856 100644 --- a/internal/logic/group/api_test.go +++ b/internal/logic/group/api/group_int_test.go @@ -1,4 +1,4 @@ -package group +package api import ( "context" diff --git a/internal/logic/group/app.go b/internal/logic/group/app.go deleted file mode 100644 index 0d6c22ce..00000000 --- a/internal/logic/group/app.go +++ /dev/null @@ -1,61 +0,0 @@ -package group - -import ( - "context" - - "gim/internal/logic/message" - pb "gim/pkg/protocol/pb/logicpb" -) - -type app struct{} - -var App = new(app) - -// Create 创建 -func (*app) Create(ctx context.Context, pbgroup *pb.Group) (uint64, error) { - group := &Group{ - ID: pbgroup.Id, - Name: pbgroup.Name, - AvatarUrl: pbgroup.AvatarUrl, - Introduction: pbgroup.Introduction, - Extra: pbgroup.Extra, - Members: pbgroup.Members, - } - err := Repo.Create(group) - if err != nil { - return 0, err - } - return group.ID, err -} - -// Get 获取群组信息 -func (*app) Get(ctx context.Context, groupID uint64) (*pb.Group, error) { - group, err := Repo.Get(groupID) - if err != nil { - return nil, err - } - return group.ToProto(), nil -} - -// Update 更新群组 -func (*app) Update(ctx context.Context, pbgroup *pb.Group) error { - group := &Group{ - ID: pbgroup.Id, - Name: pbgroup.Name, - AvatarUrl: pbgroup.AvatarUrl, - Introduction: pbgroup.Introduction, - Extra: pbgroup.Extra, - Members: pbgroup.Members, - } - return Repo.Save(group) -} - -// Push 发送群组消息 -func (*app) Push(ctx context.Context, request *pb.GroupPushRequest) (uint64, error) { - group, err := Repo.Get(request.GroupId) - if err != nil { - return 0, err - } - - return message.App.PushToUsersWithCommand(ctx, group.Members, request.Command, request.Content, request.IsPersist) -} diff --git a/internal/logic/group/app/group.go b/internal/logic/group/app/group.go new file mode 100644 index 00000000..99e4126b --- /dev/null +++ b/internal/logic/group/app/group.go @@ -0,0 +1,68 @@ +package app + +import ( + "context" + + "gim/internal/logic/group/domain" + "gim/internal/logic/group/repo" + messageapp "gim/internal/logic/message/app" + "gim/pkg/protocol/pb/connectpb" + pb "gim/pkg/protocol/pb/logicpb" +) + +var GroupApp = new(groupApp) + +type groupApp struct{} + +// Create 创建 +func (*groupApp) Create(ctx context.Context, pbgroup *pb.Group) (uint64, error) { + group := &domain.Group{ + ID: pbgroup.Id, + Name: pbgroup.Name, + AvatarUrl: pbgroup.AvatarUrl, + Introduction: pbgroup.Introduction, + Extra: pbgroup.Extra, + Members: pbgroup.Members, + } + err := repo.GroupRepo.Create(group) + if err != nil { + return 0, err + } + return group.ID, err +} + +// Get 获取群组信息 +func (*groupApp) Get(ctx context.Context, groupID uint64) (*pb.Group, error) { + group, err := repo.GroupRepo.Get(groupID) + if err != nil { + return nil, err + } + return group.ToProto(), nil +} + +// Update 更新群组 +func (*groupApp) Update(ctx context.Context, pbgroup *pb.Group) error { + group := &domain.Group{ + ID: pbgroup.Id, + Name: pbgroup.Name, + AvatarUrl: pbgroup.AvatarUrl, + Introduction: pbgroup.Introduction, + Extra: pbgroup.Extra, + Members: pbgroup.Members, + } + return repo.GroupRepo.Save(group) +} + +// Push 发送群组消息 +func (*groupApp) Push(ctx context.Context, request *pb.GroupPushRequest) (uint64, error) { + group, err := repo.GroupRepo.Get(request.GroupId) + if err != nil { + return 0, err + } + + message := &connectpb.Message{ + Command: request.Command, + Content: request.Content, + } + return messageapp.MessageApp.PushToUsers(ctx, group.Members, message, request.IsPersist) +} diff --git a/internal/logic/group/group.go b/internal/logic/group/domain/group.go similarity index 97% rename from internal/logic/group/group.go rename to internal/logic/group/domain/group.go index 4d3540d2..cf0d4398 100644 --- a/internal/logic/group/group.go +++ b/internal/logic/group/domain/group.go @@ -1,4 +1,4 @@ -package group +package domain import ( "time" diff --git a/internal/logic/group/repo.go b/internal/logic/group/repo/group.go similarity index 74% rename from internal/logic/group/repo.go rename to internal/logic/group/repo/group.go index aed6baaf..95fa4947 100644 --- a/internal/logic/group/repo.go +++ b/internal/logic/group/repo/group.go @@ -1,4 +1,4 @@ -package group +package repo import ( "errors" @@ -8,20 +8,21 @@ import ( "github.com/go-redis/redis" "gorm.io/gorm" + "gim/internal/logic/group/domain" "gim/pkg/db" "gim/pkg/gerrors" ) const GroupKey = "group:%d" -type repo struct{} +var GroupRepo = new(groupRepo) -var Repo = new(repo) +type groupRepo struct{} // Get 获取群组信息 -func (*repo) Get(groupId uint64) (*Group, error) { +func (*groupRepo) Get(groupId uint64) (*domain.Group, error) { key := fmt.Sprintf(GroupKey, groupId) - var group Group + var group domain.Group err := db.RedisCli.GetAny(key, &group) if err != nil && !errors.Is(err, redis.Nil) { return nil, err @@ -45,12 +46,12 @@ func (*repo) Get(groupId uint64) (*Group, error) { return &group, nil } -func (*repo) Create(group *Group) error { +func (*groupRepo) Create(group *domain.Group) error { return db.DB.Create(group).Error } // Save 修改群组信息 -func (*repo) Save(group *Group) error { +func (*groupRepo) Save(group *domain.Group) error { err := db.DB.Save(group).Error if err != nil { return err diff --git a/internal/logic/message/api/message_ext.go b/internal/logic/message/api/message_ext.go new file mode 100644 index 00000000..d6cb4322 --- /dev/null +++ b/internal/logic/message/api/message_ext.go @@ -0,0 +1,18 @@ +package api + +import ( + "context" + + "gim/internal/logic/message/app" + "gim/pkg/md" + pb "gim/pkg/protocol/pb/logicpb" +) + +type MessageExtService struct { + pb.UnsafeMessageExtServiceServer +} + +func (m MessageExtService) Sync(ctx context.Context, request *pb.SyncRequest) (*pb.SyncReply, error) { + userID := md.GetUserID(ctx) + return app.MessageApp.Sync(ctx, userID, request.Seq) +} diff --git a/internal/logic/message/api.go b/internal/logic/message/api/message_int.go similarity index 64% rename from internal/logic/message/api.go rename to internal/logic/message/api/message_int.go index cc25739f..8277eb66 100644 --- a/internal/logic/message/api.go +++ b/internal/logic/message/api/message_int.go @@ -1,10 +1,11 @@ -package message +package api import ( "context" "google.golang.org/protobuf/types/known/emptypb" + "gim/internal/logic/message/app" "gim/pkg/protocol/pb/connectpb" pb "gim/pkg/protocol/pb/logicpb" ) @@ -13,18 +14,18 @@ type MessageIntService struct { pb.UnsafeMessageIntServiceServer } -func (m MessageIntService) Sync(ctx context.Context, request *pb.SyncRequest) (*connectpb.SyncReply, error) { - return App.Sync(ctx, request.UserId, request.Seq) -} - // MessageACK 设备收到消息ack func (*MessageIntService) MessageACK(ctx context.Context, request *pb.MessageACKRequest) (*emptypb.Empty, error) { - return &emptypb.Empty{}, App.MessageAck(ctx, request.UserId, request.DeviceId, request.DeviceAck) + return &emptypb.Empty{}, app.DeviceACKApp.MessageAck(ctx, request.UserId, request.DeviceId, request.DeviceAck) } // PushToUsers 推送 func (*MessageIntService) PushToUsers(ctx context.Context, request *pb.PushToUsersRequest) (*pb.PushToUsersReply, error) { - messageID, err := App.PushToUsersWithCommand(ctx, request.UserIds, request.Command, request.Content, request.IsPersist) + message := &connectpb.Message{ + Command: request.Command, + Content: request.Content, + } + messageID, err := app.MessageApp.PushToUsers(ctx, request.UserIds, message, request.IsPersist) if err != nil { return nil, err } @@ -33,6 +34,6 @@ func (*MessageIntService) PushToUsers(ctx context.Context, request *pb.PushToUse // PushToAll 全服推送 func (s *MessageIntService) PushToAll(ctx context.Context, request *pb.PushToAllRequest) (*emptypb.Empty, error) { - err := App.PushToAll(ctx, request) + err := app.MessageApp.PushToAll(ctx, request) return &emptypb.Empty{}, err } diff --git a/internal/logic/message/api_test.go b/internal/logic/message/api/message_int_test.go similarity index 98% rename from internal/logic/message/api_test.go rename to internal/logic/message/api/message_int_test.go index 6ac86698..ac23a1a0 100644 --- a/internal/logic/message/api_test.go +++ b/internal/logic/message/api/message_int_test.go @@ -1,4 +1,4 @@ -package message +package api import ( "context" @@ -20,7 +20,6 @@ func getClient() pb.MessageIntServiceClient { func TestMessageIntService_PushToUsers(t *testing.T) { reply, err := getClient().PushToUsers(context.TODO(), &pb.PushToUsersRequest{ - UserIds: []uint64{1}, Command: 200, Content: []byte("hello gim"), diff --git a/internal/logic/message/app/device_ack.go b/internal/logic/message/app/device_ack.go new file mode 100644 index 00000000..5aea2d69 --- /dev/null +++ b/internal/logic/message/app/device_ack.go @@ -0,0 +1,35 @@ +package app + +import ( + "context" + + "gim/internal/logic/message/repo" +) + +var DeviceACKApp = new(deviceACKApp) + +type deviceACKApp struct{} + +// getMaxByUserId 根据用户id获取最大ack +func (*deviceACKApp) getMaxByUserId(ctx context.Context, userId uint64) (uint64, error) { + acks, err := repo.DeviceACKRepo.Get(userId) + if err != nil { + return 0, err + } + + var max uint64 = 0 + for i := range acks { + if acks[i]> max { + max = acks[i] + } + } + return max, nil +} + +// MessageAck 收到消息回执 +func (*deviceACKApp) MessageAck(ctx context.Context, userId, deviceId, ack uint64) error { + if ack <= 0 { + return nil + } + return repo.DeviceACKRepo.Set(userId, deviceId, ack) +} diff --git a/internal/logic/message/app.go b/internal/logic/message/app/message.go similarity index 55% rename from internal/logic/message/app.go rename to internal/logic/message/app/message.go index 61045d3d..2813aec6 100644 --- a/internal/logic/message/app.go +++ b/internal/logic/message/app/message.go @@ -1,4 +1,4 @@ -package message +package app import ( "context" @@ -7,7 +7,8 @@ import ( "google.golang.org/protobuf/proto" - "gim/internal/logic/device" + deviceapp "gim/internal/logic/device/app" + devicedomain "gim/internal/logic/device/domain" "gim/internal/logic/message/domain" "gim/internal/logic/message/repo" "gim/pkg/md" @@ -19,36 +20,12 @@ import ( const pageSize = 50 // 最大消息同步数量 -var App = new(app) +var MessageApp = new(messageApp) -type app struct{} - -func (a *app) PushToUsersWithAny(ctx context.Context, userIDs []uint64, command connectpb.Command, any proto.Message, isPersist bool) (uint64, error) { - bytes, err := proto.Marshal(any) - if err != nil { - slog.Error("PushToUser", "error", err) - return 0, err - } - return a.PushToUsersWithCommand(ctx, userIDs, command, bytes, isPersist) -} - -func (a *app) PushToUsersWithCommand(ctx context.Context, toUserIDs []uint64, command connectpb.Command, content []byte, - isPersist bool) (uint64, error) { - message := connectpb.Message{ - Command: command, - Content: content, - Seq: 0, - } - messageID, err := a.PushToUsers(ctx, toUserIDs, &message, isPersist) - if err != nil { - slog.Error("PushToUser", "error", err) - return 0, err - } - return messageID, nil -} +type messageApp struct{} // PushToUsers 发送消息 -func (a *app) PushToUsers(ctx context.Context, userIDs []uint64, message *connectpb.Message, isPersist bool) (uint64, error) { +func (a *messageApp) PushToUsers(ctx context.Context, userIDs []uint64, message *connectpb.Message, isPersist bool) (uint64, error) { message.CreatedAt = time.Now().Unix() slog.Debug("SendToUser", "request_id", md.GetRequestID(ctx), "to_user_ids", userIDs) @@ -76,7 +53,7 @@ func (a *app) PushToUsers(ctx context.Context, userIDs []uint64, message *connec return messageID, nil } -func (a *app) PushToUser(ctx context.Context, userID, messageID uint64, message connectpb.Message, isPersist bool) error { +func (a *messageApp) PushToUser(ctx context.Context, userID, messageID uint64, message connectpb.Message, isPersist bool) error { slog.Debug("PushToUser", "userID", userID, "messageID", messageID, "message", message) var ( seq uint64 @@ -101,7 +78,7 @@ func (a *app) PushToUser(ctx context.Context, userID, messageID uint64, message } message.Seq = seq - devices, err := device.App.ListByUserID(ctx, userID) + devices, err := deviceapp.DeviceApp.ListByUserID(ctx, userID) if err != nil { return err } @@ -115,7 +92,7 @@ func (a *app) PushToUser(ctx context.Context, userID, messageID uint64, message return nil } -func (a *app) PushToDevice(ctx context.Context, device *device.Device, message *connectpb.Message) error { +func (a *messageApp) PushToDevice(ctx context.Context, device *devicedomain.Device, message *connectpb.Message) error { slog.Debug("PushToDevice", "device", device, "message", message) if device.IsOnline { request := &connectpb.PushToDevicesRequest{ @@ -136,7 +113,7 @@ func (a *app) PushToDevice(ctx context.Context, device *device.Device, message * } // PushToAll 全服推送 -func (*app) PushToAll(ctx context.Context, req *pb.PushToAllRequest) error { +func (*messageApp) PushToAll(ctx context.Context, req *pb.PushToAllRequest) error { msg := connectpb.PushAllMessage{ Message: &connectpb.Message{ Command: req.Command, @@ -152,49 +129,25 @@ func (*app) PushToAll(ctx context.Context, req *pb.PushToAllRequest) error { } // Sync 消息同步 -func (a *app) Sync(ctx context.Context, userId, seq uint64) (*connectpb.SyncReply, error) { +func (a *messageApp) Sync(ctx context.Context, userId, seq uint64) (*pb.SyncReply, error) { messages, hasMore, err := a.listByUserIdAndSeq(ctx, userId, seq) if err != nil { return nil, err } pbMessages := domain.MessagesToPB(messages) - reply := &connectpb.SyncReply{Messages: pbMessages, HasMore: hasMore} + reply := &pb.SyncReply{Messages: pbMessages, HasMore: hasMore} return reply, nil } // listByUserIdAndSeq 查询消息 -func (a *app) listByUserIdAndSeq(ctx context.Context, userId, seq uint64) ([]domain.UserMessage, bool, error) { +func (a *messageApp) listByUserIdAndSeq(ctx context.Context, userId, seq uint64) ([]domain.UserMessage, bool, error) { var err error if seq == 0 { - seq, err = a.getMaxByUserId(ctx, userId) + seq, err = DeviceACKApp.getMaxByUserId(ctx, userId) if err != nil { return nil, false, err } } return repo.UserMessageRepo.ListBySeq(userId, seq, pageSize) } - -// getMaxByUserId 根据用户id获取最大ack -func (*app) getMaxByUserId(ctx context.Context, userId uint64) (uint64, error) { - acks, err := repo.DeviceACKRepo.Get(userId) - if err != nil { - return 0, err - } - - var max uint64 = 0 - for i := range acks { - if acks[i]> max { - max = acks[i] - } - } - return max, nil -} - -// MessageAck 收到消息回执 -func (*app) MessageAck(ctx context.Context, userId, deviceId, ack uint64) error { - if ack <= 0 { - return nil - } - return repo.DeviceACKRepo.Set(userId, deviceId, ack) -} diff --git a/internal/logic/message/domain/message.go b/internal/logic/message/domain/message.go index d7ac5c20..fdcf7bfc 100644 --- a/internal/logic/message/domain/message.go +++ b/internal/logic/message/domain/message.go @@ -13,7 +13,6 @@ type Message struct { RequestID string // 请求id Command connectpb.Command // 指令 Content []byte // 消息内容 - Status int8 // 消息状态,0:未处理;1:消息撤回 } func (m *Message) TableName() string { diff --git a/internal/logic/message/repo/device_ack_repo.go b/internal/logic/message/repo/device_ack.go similarity index 100% rename from internal/logic/message/repo/device_ack_repo.go rename to internal/logic/message/repo/device_ack.go diff --git a/internal/logic/message/repo/message_repo.go b/internal/logic/message/repo/message.go similarity index 100% rename from internal/logic/message/repo/message_repo.go rename to internal/logic/message/repo/message.go diff --git a/internal/logic/message/repo/seq_repo.go b/internal/logic/message/repo/seq.go similarity index 100% rename from internal/logic/message/repo/seq_repo.go rename to internal/logic/message/repo/seq.go diff --git a/internal/logic/message/repo/seq_repo_test.go b/internal/logic/message/repo/seq_test.go similarity index 100% rename from internal/logic/message/repo/seq_repo_test.go rename to internal/logic/message/repo/seq_test.go diff --git a/internal/logic/message/repo/user_message_repo.go b/internal/logic/message/repo/user_message.go similarity index 100% rename from internal/logic/message/repo/user_message_repo.go rename to internal/logic/message/repo/user_message.go diff --git a/internal/logic/message/repo/user_message_repo_test.go b/internal/logic/message/repo/user_message_test.go similarity index 100% rename from internal/logic/message/repo/user_message_repo_test.go rename to internal/logic/message/repo/user_message_test.go diff --git a/pkg/grpclib/resolver/addrs/addrs_resolver.go b/pkg/grpclib/resolver/addrs/addrs_resolver.go deleted file mode 100644 index 682bcd0b..00000000 --- a/pkg/grpclib/resolver/addrs/addrs_resolver.go +++ /dev/null @@ -1,61 +0,0 @@ -package addrs - -import ( - "strings" - - "google.golang.org/grpc/resolver" -) - -// 实现多个IP地址解析,比如,addrs:///127.0.0.1:50000,127.0.0.1:50001 -func init() { - RegisterResolver() -} - -func RegisterResolver() { - resolver.Register(NewAddrsBuilder()) -} - -type addrsBuilder struct{} - -func NewAddrsBuilder() resolver.Builder { - return &addrsBuilder{} -} - -func (b *addrsBuilder) Build(target resolver.Target, clientConn resolver.ClientConn, opts resolver.BuildOptions) (resolver.Resolver, error) { - ips := strings.Split(target.Endpoint(), ",") - - state := resolver.State{ - Addresses: getAddrs(ips), - } - _ = clientConn.UpdateState(state) - return &addrsResolver{ - addrs: ips, - clientConn: clientConn, - }, nil -} - -func (b *addrsBuilder) Scheme() string { - return "addrs" -} - -type addrsResolver struct { - addrs []string - clientConn resolver.ClientConn -} - -func (r *addrsResolver) ResolveNow(opt resolver.ResolveNowOptions) { - state := resolver.State{ - Addresses: getAddrs(r.addrs), - } - _ = r.clientConn.UpdateState(state) -} - -func (r *addrsResolver) Close() {} - -func getAddrs(ips []string) []resolver.Address { - addresses := make([]resolver.Address, len(ips)) - for i := range ips { - addresses[i].Addr = ips[i] - } - return addresses -} diff --git a/pkg/grpclib/resolver/k8s/k8s_resolver.go b/pkg/grpclib/resolver/k8s/k8s_resolver.go deleted file mode 100644 index 69dd075e..00000000 --- a/pkg/grpclib/resolver/k8s/k8s_resolver.go +++ /dev/null @@ -1,204 +0,0 @@ -package k8s - -import ( - "context" - "errors" - "fmt" - "log/slog" - "sort" - "strings" - "time" - - "google.golang.org/grpc/resolver" - v1 "k8s.io/api/core/v1" - metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" - "k8s.io/client-go/kubernetes" - corev1 "k8s.io/client-go/kubernetes/typed/core/v1" - "k8s.io/client-go/rest" -) - -var k8sClientSet *kubernetes.Clientset - -func GetK8sClient() (*kubernetes.Clientset, error) { - if k8sClientSet == nil { - config, err := rest.InClusterConfig() - if err != nil { - return nil, err - } - k8sClientSet, err = kubernetes.NewForConfig(config) - if err != nil { - return nil, err - } - } - return k8sClientSet, nil -} - -// 实现k8s地址解析,根据k8s的service的endpoints解析 比如,k8s:///namespace.server:port -func init() { - resolver.Register(&k8sBuilder{}) -} - -func GetK8STarget(namespace, server, port string) string { - return fmt.Sprintf("k8s:///%s.%s:%s", namespace, server, port) -} - -type k8sBuilder struct{} - -func (b *k8sBuilder) Build(target resolver.Target, clientConn resolver.ClientConn, opts resolver.BuildOptions) (resolver.Resolver, error) { - return newK8sResolver(target, clientConn) -} - -func (b *k8sBuilder) Scheme() string { - return "k8s" -} - -// k8sResolver k8s地址解析器 -type k8sResolver struct { - log *slog.Logger - clientConn resolver.ClientConn - endpointsClient corev1.EndpointsInterface - service string - - cancel context.CancelFunc - - ips []string - port string -} - -func newK8sResolver(target resolver.Target, clientConn resolver.ClientConn) (*k8sResolver, error) { - log := slog.With("target", target.Endpoint()) - log.Info("k8s resolver build") - namespace, service, port, err := parseTarget(target) - if err != nil { - log.Error("k8s resolver error", "error", err) - return nil, err - } - - k8sClient, err := GetK8sClient() - if err != nil { - log.Error("k8s resolver error", "error", err) - return nil, err - } - - ctx, cancel := context.WithCancel(context.Background()) - client := k8sClient.CoreV1().Endpoints(namespace) - k8sResolver := &k8sResolver{ - log: log, - clientConn: clientConn, - endpointsClient: client, - service: service, - cancel: cancel, - port: port, - } - err = k8sResolver.updateState(true) - if err != nil { - log.Error("k8s resolver error", "error", err) - return nil, err - } - - ticker := time.NewTicker(time.Second) - // 监听变化 - go func() { - for { - select { - case <-ctx.done(): - return - case <-ticker.c: - _ = k8sResolver.updateState(false) - } - } - }() - return k8sResolver, nil -} - -// ResolveNow grpc感知到连接异常,会做通知,观察日志得知 -func (r *k8sResolver) ResolveNow(opt resolver.ResolveNowOptions) { - r.log.Info("k8s resolver resolveNow") -} - -func (r *k8sResolver) Close() { - r.log.Info("k8s resolver close") - r.cancel() -} - -// updateState 更新地址列表 -func (r *k8sResolver) updateState(isFromNew bool) error { - endpoints, err := r.endpointsClient.Get(context.TODO(), r.service, metav1.GetOptions{}) - if err != nil { - r.log.Error("k8s resolver error", "error", err) - return err - } - newIPs := getIPs(endpoints) - if len(newIPs) == 0 { - return nil - } - if !isFromNew && isEqualIPs(r.ips, newIPs) { - return nil - } - r.ips = newIPs - - addresses := make([]resolver.Address, 0, len(r.ips)) - for _, ip := range r.ips { - addresses = append(addresses, resolver.Address{ - Addr: ip + ":" + r.port, - }) - } - state := resolver.State{ - Addresses: addresses, - } - r.log.Info("k8s resolver updateState", "is_from_new", isFromNew, "service", r.service, "addresses", addresses) - // 这里地址数量不能为0,为0会返回错误 - err = r.clientConn.UpdateState(state) - if err != nil { - r.log.Error("k8s resolver error", "error", err) - return err - } - return nil -} - -// parseTarget 对grpc的Endpoint进行解析,格式必须是:k8s:///namespace.server:port -func parseTarget(target resolver.Target) (namespace string, service string, port string, err error) { - namespaceAndServerPort := strings.Split(target.Endpoint(), ".") - if len(namespaceAndServerPort) != 2 { - err = errors.New("endpoint must is namespace.server:port") - return - } - namespace = namespaceAndServerPort[0] - serverAndPort := strings.Split(namespaceAndServerPort[1], ":") - if len(serverAndPort) != 2 { - err = errors.New("endpoint must is namespace.server:port") - return - } - service = serverAndPort[0] - port = serverAndPort[1] - return -} - -// isEqualIPs 判断两个地址列表是否相等 -func isEqualIPs(s1, s2 []string) bool { - if len(s1) != len(s2) { - return false - } - - sort.Strings(s1) - sort.Strings(s2) - for i := range s1 { - if s1[i] != s2[i] { - return false - } - } - return true -} - -// getIPs 获取EndpointSlice里面的IP列表 -func getIPs(endpoints *v1.Endpoints) []string { - ips := make([]string, 0, 10) - if len(endpoints.Subsets) <= 0 { - return ips - } - - for _, address := range endpoints.Subsets[0].Addresses { - ips = append(ips, address.IP) - } - return ips -} diff --git a/pkg/grpclib/resolver/k8s/k8s_resolver_test.go b/pkg/grpclib/resolver/k8s/k8s_resolver_test.go deleted file mode 100644 index 6bc7113c..00000000 --- a/pkg/grpclib/resolver/k8s/k8s_resolver_test.go +++ /dev/null @@ -1,51 +0,0 @@ -package k8s - -import ( - "testing" - - "google.golang.org/grpc" - "google.golang.org/grpc/credentials/insecure" -) - -func TestClient(t *testing.T) { - _, err := grpc.NewClient("172.18.0.2:8000", grpc.WithTransportCredentials(insecure.NewCredentials())) - if err != nil { - panic(err) - } -} - -func Test_isEqualIPs(t *testing.T) { - type args struct { - s1 []string - s2 []string - } - tests := []struct { - name string - args args - want bool - }{ - { - name: "", - args: args{s1: []string{"1", "2"}, s2: []string{"2", "1"}}, - want: true, - }, - { - name: "", - args: args{s1: []string{"1", "2"}, s2: []string{"1", "2"}}, - want: true, - }, - { - name: "", - args: args{s1: []string{"1", "2"}, s2: []string{"1"}}, - want: false, - }, - } - - for _, tt := range tests { - t.Run(tt.name, func(t *testing.T) { - if got := isEqualIPs(tt.args.s1, tt.args.s2); got != tt.want { - t.Errorf("isEqual() = %v, want %v", got, tt.want) - } - }) - } -} diff --git a/pkg/interceptor/interceptor.go b/pkg/interceptor/interceptor.go index f24c3156..c9fcb03e 100644 --- a/pkg/interceptor/interceptor.go +++ b/pkg/interceptor/interceptor.go @@ -38,13 +38,10 @@ func handleWithAuth(ctx context.Context, req interface{}, info *grpc.UnaryServer serverName := strings.Split(info.FullMethod, "/")[1] if !strings.HasSuffix(serverName, "IntService") { if _, ok := urlWhitelist[info.FullMethod]; !ok { - userID, _, err := md.GetData(ctx) - if err != nil { - return nil, err - } + userID := md.GetUserID(ctx) token := md.GetToken(ctx) - _, err = rpc.GetUserIntClient().Auth(ctx, &businesspb.AuthRequest{ + _, err := rpc.GetUserIntClient().Auth(ctx, &businesspb.AuthRequest{ UserId: userID, Token: token, }) diff --git a/pkg/local/local.go b/pkg/local/local.go index d7d245da..a03dc5ee 100644 --- a/pkg/local/local.go +++ b/pkg/local/local.go @@ -1,37 +1,5 @@ package local -import ( - "google.golang.org/grpc" - "google.golang.org/grpc/credentials/insecure" - - "gim/config" - "gim/pkg/protocol/pb/businesspb" - "gim/pkg/protocol/pb/logicpb" -) - func Init() { - logicConn, err := grpc.NewClient("127.0.0.1:8010", grpc.WithTransportCredentials(insecure.NewCredentials())) - if err != nil { - panic(err) - } - - config.Config.DeviceIntClientBuilder = func() logicpb.DeviceIntServiceClient { - return logicpb.NewDeviceIntServiceClient(logicConn) - } - - config.Config.MessageIntClientBuilder = func() logicpb.MessageIntServiceClient { - return logicpb.NewMessageIntServiceClient(logicConn) - } - - config.Config.RoomIntClientBuilder = func() logicpb.RoomIntServiceClient { - return logicpb.NewRoomIntServiceClient(logicConn) - } - config.Config.UserIntClientBuilder = func() businesspb.UserIntServiceClient { - conn, err := grpc.NewClient("127.0.0.1:8020", grpc.WithTransportCredentials(insecure.NewCredentials())) - if err != nil { - panic(err) - } - return businesspb.NewUserIntServiceClient(conn) - } } diff --git a/pkg/md/context.go b/pkg/md/context.go index acabb51a..bafb5f5c 100644 --- a/pkg/md/context.go +++ b/pkg/md/context.go @@ -5,8 +5,6 @@ import ( "strconv" "google.golang.org/grpc/metadata" - - "gim/pkg/gerrors" ) const ( @@ -38,26 +36,14 @@ func GetRequestID(ctx context.Context) string { return Get(ctx, CtxRequestID) } -// GetData 获取ctx的用户数据,依次返回user_id,device_id -func GetData(ctx context.Context) (uint64, uint64, error) { - var ( - userID uint64 - deviceID uint64 - err error - ) - - userIDStr := Get(ctx, CtxUserID) - userID, err = strconv.ParseUint(userIDStr, 10, 64) - if err != nil { - return 0, 0, gerrors.ErrUnauthorized - } +func GetUserID(ctx context.Context) uint64 { + userID, _ := strconv.ParseUint(Get(ctx, CtxUserID), 10, 64) + return userID +} - deviceIDStr := Get(ctx, CtxDeviceID) - deviceID, err = strconv.ParseUint(deviceIDStr, 10, 64) - if err != nil { - return 0, 0, gerrors.ErrUnauthorized - } - return userID, deviceID, nil +func GetDeviceID(ctx context.Context) uint64 { + deviceID, _ := strconv.ParseUint(Get(ctx, CtxDeviceID), 10, 64) + return deviceID } // GetToken 获取ctx的token diff --git a/pkg/protocol/pb/connectpb/connect.ext.pb.go b/pkg/protocol/pb/connectpb/connect.ext.pb.go index 4912c74a..66567230 100644 --- a/pkg/protocol/pb/connectpb/connect.ext.pb.go +++ b/pkg/protocol/pb/connectpb/connect.ext.pb.go @@ -23,18 +23,12 @@ const ( type Command int32 const ( - Command_UNKNOWN Command = 0 // 未知 - Command_SIGN_IN Command = 1 // 设备登录请求 - Command_HEARTBEAT Command = 2 // 心跳 - Command_SYNC Command = 3 // 消息同步 - Command_SUBSCRIBE_ROOM Command = 4 // 订阅房间 - Command_USER_MESSAGE Command = 100 // 用户消息 - Command_GROUP_MESSAGE Command = 101 // 群组消息 - Command_ADD_FRIEND Command = 110 // 添加好友请求 - Command_AGREE_ADD_FRIEND Command = 111 // 同意添加好友 - Command_UPDATE_GROUP Command = 120 // 更新群组 - Command_ADD_GROUP_MEMBERS Command = 121 // 添加群组成员 - Command_REMOVE_GROUP_MEMBER Command = 122 // 移除群组成员 + Command_UNKNOWN Command = 0 // 未知 + Command_SIGN_IN Command = 1 // 设备登录请求 + Command_HEARTBEAT Command = 2 // 心跳 + Command_SUBSCRIBE_ROOM Command = 3 // 订阅房间 + Command_USER_MESSAGE Command = 100 // 用户消息 + Command_GROUP_MESSAGE Command = 101 // 群组消息 ) // Enum value maps for Command. @@ -43,29 +37,17 @@ var ( 0: "UNKNOWN", 1: "SIGN_IN", 2: "HEARTBEAT", - 3: "SYNC", - 4: "SUBSCRIBE_ROOM", + 3: "SUBSCRIBE_ROOM", 100: "USER_MESSAGE", 101: "GROUP_MESSAGE", - 110: "ADD_FRIEND", - 111: "AGREE_ADD_FRIEND", - 120: "UPDATE_GROUP", - 121: "ADD_GROUP_MEMBERS", - 122: "REMOVE_GROUP_MEMBER", } Command_value = map[string]int32{ - "UNKNOWN": 0, - "SIGN_IN": 1, - "HEARTBEAT": 2, - "SYNC": 3, - "SUBSCRIBE_ROOM": 4, - "USER_MESSAGE": 100, - "GROUP_MESSAGE": 101, - "ADD_FRIEND": 110, - "AGREE_ADD_FRIEND": 111, - "UPDATE_GROUP": 120, - "ADD_GROUP_MEMBERS": 121, - "REMOVE_GROUP_MEMBER": 122, + "UNKNOWN": 0, + "SIGN_IN": 1, + "HEARTBEAT": 2, + "SUBSCRIBE_ROOM": 3, + "USER_MESSAGE": 100, + "GROUP_MESSAGE": 101, } ) @@ -248,108 +230,6 @@ func (x *SignInRequest) GetToken() string { return "" } -type SyncRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - Seq uint64 `protobuf:"varint,1,opt,name=seq,proto3" json:"seq,omitempty"` // 序列号 -} - -func (x *SyncRequest) Reset() { - *x = SyncRequest{} - if protoimpl.UnsafeEnabled { - mi := &file_connect_connect_ext_proto_msgTypes[2] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *SyncRequest) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*SyncRequest) ProtoMessage() {} - -func (x *SyncRequest) ProtoReflect() protoreflect.Message { - mi := &file_connect_connect_ext_proto_msgTypes[2] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use SyncRequest.ProtoReflect.Descriptor instead. -func (*SyncRequest) Descriptor() ([]byte, []int) { - return file_connect_connect_ext_proto_rawDescGZIP(), []int{2} -} - -func (x *SyncRequest) GetSeq() uint64 { - if x != nil { - return x.Seq - } - return 0 -} - -type SyncReply struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - Messages []*Message `protobuf:"bytes,1,rep,name=messages,proto3" json:"messages,omitempty"` // 消息列表 - HasMore bool `protobuf:"varint,2,opt,name=has_more,json=hasMore,proto3" json:"has_more,omitempty"` // 是否有更多数据 -} - -func (x *SyncReply) Reset() { - *x = SyncReply{} - if protoimpl.UnsafeEnabled { - mi := &file_connect_connect_ext_proto_msgTypes[3] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *SyncReply) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*SyncReply) ProtoMessage() {} - -func (x *SyncReply) ProtoReflect() protoreflect.Message { - mi := &file_connect_connect_ext_proto_msgTypes[3] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use SyncReply.ProtoReflect.Descriptor instead. -func (*SyncReply) Descriptor() ([]byte, []int) { - return file_connect_connect_ext_proto_rawDescGZIP(), []int{3} -} - -func (x *SyncReply) GetMessages() []*Message { - if x != nil { - return x.Messages - } - return nil -} - -func (x *SyncReply) GetHasMore() bool { - if x != nil { - return x.HasMore - } - return false -} - // 订阅房间请求 type SubscribeRoomRequest struct { state protoimpl.MessageState @@ -362,7 +242,7 @@ type SubscribeRoomRequest struct { func (x *SubscribeRoomRequest) Reset() { *x = SubscribeRoomRequest{} if protoimpl.UnsafeEnabled { - mi := &file_connect_connect_ext_proto_msgTypes[4] + mi := &file_connect_connect_ext_proto_msgTypes[2] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -375,7 +255,7 @@ func (x *SubscribeRoomRequest) String() string { func (*SubscribeRoomRequest) ProtoMessage() {} func (x *SubscribeRoomRequest) ProtoReflect() protoreflect.Message { - mi := &file_connect_connect_ext_proto_msgTypes[4] + mi := &file_connect_connect_ext_proto_msgTypes[2] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -388,7 +268,7 @@ func (x *SubscribeRoomRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use SubscribeRoomRequest.ProtoReflect.Descriptor instead. func (*SubscribeRoomRequest) Descriptor() ([]byte, []int) { - return file_connect_connect_ext_proto_rawDescGZIP(), []int{4} + return file_connect_connect_ext_proto_rawDescGZIP(), []int{2} } func (x *SubscribeRoomRequest) GetRoomId() uint64 { @@ -411,7 +291,7 @@ type Reply struct { func (x *Reply) Reset() { *x = Reply{} if protoimpl.UnsafeEnabled { - mi := &file_connect_connect_ext_proto_msgTypes[5] + mi := &file_connect_connect_ext_proto_msgTypes[3] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -424,7 +304,7 @@ func (x *Reply) String() string { func (*Reply) ProtoMessage() {} func (x *Reply) ProtoReflect() protoreflect.Message { - mi := &file_connect_connect_ext_proto_msgTypes[5] + mi := &file_connect_connect_ext_proto_msgTypes[3] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -437,7 +317,7 @@ func (x *Reply) ProtoReflect() protoreflect.Message { // Deprecated: Use Reply.ProtoReflect.Descriptor instead. func (*Reply) Descriptor() ([]byte, []int) { - return file_connect_connect_ext_proto_rawDescGZIP(), []int{5} + return file_connect_connect_ext_proto_rawDescGZIP(), []int{3} } func (x *Reply) GetCode() int32 { @@ -483,39 +363,24 @@ var file_connect_connect_ext_proto_rawDesc = []byte{ 0x04, 0x52, 0x06, 0x75, 0x73, 0x65, 0x72, 0x49, 0x64, 0x12, 0x1b, 0x0a, 0x09, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x08, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x49, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, - 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x22, 0x1f, 0x0a, 0x0b, - 0x53, 0x79, 0x6e, 0x63, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x10, 0x0a, 0x03, 0x73, - 0x65, 0x71, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x03, 0x73, 0x65, 0x71, 0x22, 0x54, 0x0a, - 0x09, 0x53, 0x79, 0x6e, 0x63, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x2c, 0x0a, 0x08, 0x6d, 0x65, - 0x73, 0x73, 0x61, 0x67, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x63, - 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x2e, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x52, 0x08, - 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x73, 0x12, 0x19, 0x0a, 0x08, 0x68, 0x61, 0x73, 0x5f, - 0x6d, 0x6f, 0x72, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x68, 0x61, 0x73, 0x4d, - 0x6f, 0x72, 0x65, 0x22, 0x2f, 0x0a, 0x14, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, - 0x52, 0x6f, 0x6f, 0x6d, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x17, 0x0a, 0x07, 0x72, - 0x6f, 0x6f, 0x6d, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x06, 0x72, 0x6f, - 0x6f, 0x6d, 0x49, 0x64, 0x22, 0x49, 0x0a, 0x05, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x12, 0x0a, - 0x04, 0x63, 0x6f, 0x64, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x04, 0x63, 0x6f, 0x64, - 0x65, 0x12, 0x18, 0x0a, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x64, - 0x61, 0x74, 0x61, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x04, 0x64, 0x61, 0x74, 0x61, 0x2a, - 0xdd, 0x01, 0x0a, 0x07, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x12, 0x0b, 0x0a, 0x07, 0x55, - 0x4e, 0x4b, 0x4e, 0x4f, 0x57, 0x4e, 0x10, 0x00, 0x12, 0x0b, 0x0a, 0x07, 0x53, 0x49, 0x47, 0x4e, - 0x5f, 0x49, 0x4e, 0x10, 0x01, 0x12, 0x0d, 0x0a, 0x09, 0x48, 0x45, 0x41, 0x52, 0x54, 0x42, 0x45, - 0x41, 0x54, 0x10, 0x02, 0x12, 0x08, 0x0a, 0x04, 0x53, 0x59, 0x4e, 0x43, 0x10, 0x03, 0x12, 0x12, - 0x0a, 0x0e, 0x53, 0x55, 0x42, 0x53, 0x43, 0x52, 0x49, 0x42, 0x45, 0x5f, 0x52, 0x4f, 0x4f, 0x4d, - 0x10, 0x04, 0x12, 0x10, 0x0a, 0x0c, 0x55, 0x53, 0x45, 0x52, 0x5f, 0x4d, 0x45, 0x53, 0x53, 0x41, - 0x47, 0x45, 0x10, 0x64, 0x12, 0x11, 0x0a, 0x0d, 0x47, 0x52, 0x4f, 0x55, 0x50, 0x5f, 0x4d, 0x45, - 0x53, 0x53, 0x41, 0x47, 0x45, 0x10, 0x65, 0x12, 0x0e, 0x0a, 0x0a, 0x41, 0x44, 0x44, 0x5f, 0x46, - 0x52, 0x49, 0x45, 0x4e, 0x44, 0x10, 0x6e, 0x12, 0x14, 0x0a, 0x10, 0x41, 0x47, 0x52, 0x45, 0x45, - 0x5f, 0x41, 0x44, 0x44, 0x5f, 0x46, 0x52, 0x49, 0x45, 0x4e, 0x44, 0x10, 0x6f, 0x12, 0x10, 0x0a, - 0x0c, 0x55, 0x50, 0x44, 0x41, 0x54, 0x45, 0x5f, 0x47, 0x52, 0x4f, 0x55, 0x50, 0x10, 0x78, 0x12, - 0x15, 0x0a, 0x11, 0x41, 0x44, 0x44, 0x5f, 0x47, 0x52, 0x4f, 0x55, 0x50, 0x5f, 0x4d, 0x45, 0x4d, - 0x42, 0x45, 0x52, 0x53, 0x10, 0x79, 0x12, 0x17, 0x0a, 0x13, 0x52, 0x45, 0x4d, 0x4f, 0x56, 0x45, - 0x5f, 0x47, 0x52, 0x4f, 0x55, 0x50, 0x5f, 0x4d, 0x45, 0x4d, 0x42, 0x45, 0x52, 0x10, 0x7a, 0x42, - 0x1f, 0x5a, 0x1d, 0x67, 0x69, 0x6d, 0x2f, 0x70, 0x6b, 0x67, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, - 0x63, 0x6f, 0x6c, 0x2f, 0x70, 0x62, 0x2f, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x70, 0x62, - 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x22, 0x2f, 0x0a, 0x14, + 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x52, 0x6f, 0x6f, 0x6d, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x12, 0x17, 0x0a, 0x07, 0x72, 0x6f, 0x6f, 0x6d, 0x5f, 0x69, 0x64, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x06, 0x72, 0x6f, 0x6f, 0x6d, 0x49, 0x64, 0x22, 0x49, 0x0a, + 0x05, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x12, 0x0a, 0x04, 0x63, 0x6f, 0x64, 0x65, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x05, 0x52, 0x04, 0x63, 0x6f, 0x64, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x6d, 0x65, + 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x6d, 0x65, 0x73, + 0x73, 0x61, 0x67, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x64, 0x61, 0x74, 0x61, 0x18, 0x03, 0x20, 0x01, + 0x28, 0x0c, 0x52, 0x04, 0x64, 0x61, 0x74, 0x61, 0x2a, 0x6b, 0x0a, 0x07, 0x43, 0x6f, 0x6d, 0x6d, + 0x61, 0x6e, 0x64, 0x12, 0x0b, 0x0a, 0x07, 0x55, 0x4e, 0x4b, 0x4e, 0x4f, 0x57, 0x4e, 0x10, 0x00, + 0x12, 0x0b, 0x0a, 0x07, 0x53, 0x49, 0x47, 0x4e, 0x5f, 0x49, 0x4e, 0x10, 0x01, 0x12, 0x0d, 0x0a, + 0x09, 0x48, 0x45, 0x41, 0x52, 0x54, 0x42, 0x45, 0x41, 0x54, 0x10, 0x02, 0x12, 0x12, 0x0a, 0x0e, + 0x53, 0x55, 0x42, 0x53, 0x43, 0x52, 0x49, 0x42, 0x45, 0x5f, 0x52, 0x4f, 0x4f, 0x4d, 0x10, 0x03, + 0x12, 0x10, 0x0a, 0x0c, 0x55, 0x53, 0x45, 0x52, 0x5f, 0x4d, 0x45, 0x53, 0x53, 0x41, 0x47, 0x45, + 0x10, 0x64, 0x12, 0x11, 0x0a, 0x0d, 0x47, 0x52, 0x4f, 0x55, 0x50, 0x5f, 0x4d, 0x45, 0x53, 0x53, + 0x41, 0x47, 0x45, 0x10, 0x65, 0x42, 0x1f, 0x5a, 0x1d, 0x67, 0x69, 0x6d, 0x2f, 0x70, 0x6b, 0x67, + 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2f, 0x70, 0x62, 0x2f, 0x63, 0x6f, 0x6e, + 0x6e, 0x65, 0x63, 0x74, 0x70, 0x62, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( @@ -531,24 +396,21 @@ func file_connect_connect_ext_proto_rawDescGZIP() []byte { } var file_connect_connect_ext_proto_enumTypes = make([]protoimpl.EnumInfo, 1) -var file_connect_connect_ext_proto_msgTypes = make([]protoimpl.MessageInfo, 6) +var file_connect_connect_ext_proto_msgTypes = make([]protoimpl.MessageInfo, 4) var file_connect_connect_ext_proto_goTypes = []interface{}{ (Command)(0), // 0: connect.Command (*Message)(nil), // 1: connect.Message (*SignInRequest)(nil), // 2: connect.SignInRequest - (*SyncRequest)(nil), // 3: connect.SyncRequest - (*SyncReply)(nil), // 4: connect.SyncReply - (*SubscribeRoomRequest)(nil), // 5: connect.SubscribeRoomRequest - (*Reply)(nil), // 6: connect.Reply + (*SubscribeRoomRequest)(nil), // 3: connect.SubscribeRoomRequest + (*Reply)(nil), // 4: connect.Reply } var file_connect_connect_ext_proto_depIdxs = []int32{ 0, // 0: connect.Message.command:type_name -> connect.Command - 1, // 1: connect.SyncReply.messages:type_name -> connect.Message - 2, // [2:2] is the sub-list for method output_type - 2, // [2:2] is the sub-list for method input_type - 2, // [2:2] is the sub-list for extension type_name - 2, // [2:2] is the sub-list for extension extendee - 0, // [0:2] is the sub-list for field type_name + 1, // [1:1] is the sub-list for method output_type + 1, // [1:1] is the sub-list for method input_type + 1, // [1:1] is the sub-list for extension type_name + 1, // [1:1] is the sub-list for extension extendee + 0, // [0:1] is the sub-list for field type_name } func init() { file_connect_connect_ext_proto_init() } @@ -582,30 +444,6 @@ func file_connect_connect_ext_proto_init() { } } file_connect_connect_ext_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*SyncRequest); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_connect_connect_ext_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*SyncReply); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_connect_connect_ext_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*SubscribeRoomRequest); i { case 0: return &v.state @@ -617,7 +455,7 @@ func file_connect_connect_ext_proto_init() { return nil } } - file_connect_connect_ext_proto_msgTypes[5].Exporter = func(v interface{}, i int) interface{} { + file_connect_connect_ext_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*Reply); i { case 0: return &v.state @@ -636,7 +474,7 @@ func file_connect_connect_ext_proto_init() { GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: file_connect_connect_ext_proto_rawDesc, NumEnums: 1, - NumMessages: 6, + NumMessages: 4, NumExtensions: 0, NumServices: 0, }, diff --git a/pkg/protocol/pb/logicpb/message.ext.pb.go b/pkg/protocol/pb/logicpb/message.ext.pb.go index 5637407c..067545cc 100644 --- a/pkg/protocol/pb/logicpb/message.ext.pb.go +++ b/pkg/protocol/pb/logicpb/message.ext.pb.go @@ -7,6 +7,7 @@ package logicpb import ( + connectpb "gim/pkg/protocol/pb/connectpb" protoreflect "google.golang.org/protobuf/reflect/protoreflect" protoimpl "google.golang.org/protobuf/runtime/protoimpl" reflect "reflect" @@ -20,6 +21,108 @@ const ( _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20) ) +type SyncRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Seq uint64 `protobuf:"varint,1,opt,name=seq,proto3" json:"seq,omitempty"` // 序列号 +} + +func (x *SyncRequest) Reset() { + *x = SyncRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_logic_message_ext_proto_msgTypes[0] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *SyncRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*SyncRequest) ProtoMessage() {} + +func (x *SyncRequest) ProtoReflect() protoreflect.Message { + mi := &file_logic_message_ext_proto_msgTypes[0] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use SyncRequest.ProtoReflect.Descriptor instead. +func (*SyncRequest) Descriptor() ([]byte, []int) { + return file_logic_message_ext_proto_rawDescGZIP(), []int{0} +} + +func (x *SyncRequest) GetSeq() uint64 { + if x != nil { + return x.Seq + } + return 0 +} + +type SyncReply struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Messages []*connectpb.Message `protobuf:"bytes,1,rep,name=messages,proto3" json:"messages,omitempty"` // 消息列表 + HasMore bool `protobuf:"varint,2,opt,name=has_more,json=hasMore,proto3" json:"has_more,omitempty"` // 是否有更多数据 +} + +func (x *SyncReply) Reset() { + *x = SyncReply{} + if protoimpl.UnsafeEnabled { + mi := &file_logic_message_ext_proto_msgTypes[1] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *SyncReply) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*SyncReply) ProtoMessage() {} + +func (x *SyncReply) ProtoReflect() protoreflect.Message { + mi := &file_logic_message_ext_proto_msgTypes[1] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use SyncReply.ProtoReflect.Descriptor instead. +func (*SyncReply) Descriptor() ([]byte, []int) { + return file_logic_message_ext_proto_rawDescGZIP(), []int{1} +} + +func (x *SyncReply) GetMessages() []*connectpb.Message { + if x != nil { + return x.Messages + } + return nil +} + +func (x *SyncReply) GetHasMore() bool { + if x != nil { + return x.HasMore + } + return false +} + type User struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -35,7 +138,7 @@ type User struct { func (x *User) Reset() { *x = User{} if protoimpl.UnsafeEnabled { - mi := &file_logic_message_ext_proto_msgTypes[0] + mi := &file_logic_message_ext_proto_msgTypes[2] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -48,7 +151,7 @@ func (x *User) String() string { func (*User) ProtoMessage() {} func (x *User) ProtoReflect() protoreflect.Message { - mi := &file_logic_message_ext_proto_msgTypes[0] + mi := &file_logic_message_ext_proto_msgTypes[2] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -61,7 +164,7 @@ func (x *User) ProtoReflect() protoreflect.Message { // Deprecated: Use User.ProtoReflect.Descriptor instead. func (*User) Descriptor() ([]byte, []int) { - return file_logic_message_ext_proto_rawDescGZIP(), []int{0} + return file_logic_message_ext_proto_rawDescGZIP(), []int{2} } func (x *User) GetUserId() uint64 { @@ -113,7 +216,7 @@ type UserMessagePush struct { func (x *UserMessagePush) Reset() { *x = UserMessagePush{} if protoimpl.UnsafeEnabled { - mi := &file_logic_message_ext_proto_msgTypes[1] + mi := &file_logic_message_ext_proto_msgTypes[3] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -126,7 +229,7 @@ func (x *UserMessagePush) String() string { func (*UserMessagePush) ProtoMessage() {} func (x *UserMessagePush) ProtoReflect() protoreflect.Message { - mi := &file_logic_message_ext_proto_msgTypes[1] + mi := &file_logic_message_ext_proto_msgTypes[3] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -139,7 +242,7 @@ func (x *UserMessagePush) ProtoReflect() protoreflect.Message { // Deprecated: Use UserMessagePush.ProtoReflect.Descriptor instead. func (*UserMessagePush) Descriptor() ([]byte, []int) { - return file_logic_message_ext_proto_rawDescGZIP(), []int{1} + return file_logic_message_ext_proto_rawDescGZIP(), []int{3} } func (x *UserMessagePush) GetFromUser() *User { @@ -177,7 +280,7 @@ type GroupMessagePush struct { func (x *GroupMessagePush) Reset() { *x = GroupMessagePush{} if protoimpl.UnsafeEnabled { - mi := &file_logic_message_ext_proto_msgTypes[2] + mi := &file_logic_message_ext_proto_msgTypes[4] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -190,7 +293,7 @@ func (x *GroupMessagePush) String() string { func (*GroupMessagePush) ProtoMessage() {} func (x *GroupMessagePush) ProtoReflect() protoreflect.Message { - mi := &file_logic_message_ext_proto_msgTypes[2] + mi := &file_logic_message_ext_proto_msgTypes[4] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -203,7 +306,7 @@ func (x *GroupMessagePush) ProtoReflect() protoreflect.Message { // Deprecated: Use GroupMessagePush.ProtoReflect.Descriptor instead. func (*GroupMessagePush) Descriptor() ([]byte, []int) { - return file_logic_message_ext_proto_rawDescGZIP(), []int{2} + return file_logic_message_ext_proto_rawDescGZIP(), []int{4} } func (x *GroupMessagePush) GetFromUser() *User { @@ -232,32 +335,46 @@ var File_logic_message_ext_proto protoreflect.FileDescriptor var file_logic_message_ext_proto_rawDesc = []byte{ 0x0a, 0x17, 0x6c, 0x6f, 0x67, 0x69, 0x63, 0x2f, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x2e, 0x65, 0x78, 0x74, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x05, 0x6c, 0x6f, 0x67, 0x69, 0x63, - 0x22, 0x8d, 0x01, 0x0a, 0x04, 0x55, 0x73, 0x65, 0x72, 0x12, 0x17, 0x0a, 0x07, 0x75, 0x73, 0x65, - 0x72, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x06, 0x75, 0x73, 0x65, 0x72, - 0x49, 0x64, 0x12, 0x1b, 0x0a, 0x09, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x08, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x49, 0x64, 0x12, - 0x1a, 0x0a, 0x08, 0x6e, 0x69, 0x63, 0x6b, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x08, 0x6e, 0x69, 0x63, 0x6b, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x1d, 0x0a, 0x0a, 0x61, - 0x76, 0x61, 0x74, 0x61, 0x72, 0x5f, 0x75, 0x72, 0x6c, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x09, 0x61, 0x76, 0x61, 0x74, 0x61, 0x72, 0x55, 0x72, 0x6c, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x78, - 0x74, 0x72, 0x61, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x78, 0x74, 0x72, 0x61, - 0x22, 0x73, 0x0a, 0x0f, 0x55, 0x73, 0x65, 0x72, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x50, - 0x75, 0x73, 0x68, 0x12, 0x28, 0x0a, 0x09, 0x66, 0x72, 0x6f, 0x6d, 0x5f, 0x75, 0x73, 0x65, 0x72, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0b, 0x2e, 0x6c, 0x6f, 0x67, 0x69, 0x63, 0x2e, 0x55, - 0x73, 0x65, 0x72, 0x52, 0x08, 0x66, 0x72, 0x6f, 0x6d, 0x55, 0x73, 0x65, 0x72, 0x12, 0x1c, 0x0a, - 0x0a, 0x74, 0x6f, 0x5f, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x04, 0x52, 0x08, 0x74, 0x6f, 0x55, 0x73, 0x65, 0x72, 0x49, 0x64, 0x12, 0x18, 0x0a, 0x07, 0x63, - 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x07, 0x63, 0x6f, - 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x22, 0x71, 0x0a, 0x10, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x4d, 0x65, - 0x73, 0x73, 0x61, 0x67, 0x65, 0x50, 0x75, 0x73, 0x68, 0x12, 0x28, 0x0a, 0x09, 0x66, 0x72, 0x6f, - 0x6d, 0x5f, 0x75, 0x73, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0b, 0x2e, 0x6c, - 0x6f, 0x67, 0x69, 0x63, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x52, 0x08, 0x66, 0x72, 0x6f, 0x6d, 0x55, - 0x73, 0x65, 0x72, 0x12, 0x19, 0x0a, 0x08, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x5f, 0x69, 0x64, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x07, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x49, 0x64, 0x12, 0x18, - 0x0a, 0x07, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0c, 0x52, - 0x07, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x42, 0x1d, 0x5a, 0x1b, 0x67, 0x69, 0x6d, 0x2f, - 0x70, 0x6b, 0x67, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2f, 0x70, 0x62, 0x2f, - 0x6c, 0x6f, 0x67, 0x69, 0x63, 0x70, 0x62, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x1a, 0x19, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x2f, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, + 0x74, 0x2e, 0x65, 0x78, 0x74, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0x1f, 0x0a, 0x0b, 0x53, + 0x79, 0x6e, 0x63, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x10, 0x0a, 0x03, 0x73, 0x65, + 0x71, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x03, 0x73, 0x65, 0x71, 0x22, 0x54, 0x0a, 0x09, + 0x53, 0x79, 0x6e, 0x63, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x2c, 0x0a, 0x08, 0x6d, 0x65, 0x73, + 0x73, 0x61, 0x67, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x63, 0x6f, + 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x2e, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x52, 0x08, 0x6d, + 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x73, 0x12, 0x19, 0x0a, 0x08, 0x68, 0x61, 0x73, 0x5f, 0x6d, + 0x6f, 0x72, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x68, 0x61, 0x73, 0x4d, 0x6f, + 0x72, 0x65, 0x22, 0x8d, 0x01, 0x0a, 0x04, 0x55, 0x73, 0x65, 0x72, 0x12, 0x17, 0x0a, 0x07, 0x75, + 0x73, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x06, 0x75, 0x73, + 0x65, 0x72, 0x49, 0x64, 0x12, 0x1b, 0x0a, 0x09, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x69, + 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x08, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x49, + 0x64, 0x12, 0x1a, 0x0a, 0x08, 0x6e, 0x69, 0x63, 0x6b, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x08, 0x6e, 0x69, 0x63, 0x6b, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x1d, 0x0a, + 0x0a, 0x61, 0x76, 0x61, 0x74, 0x61, 0x72, 0x5f, 0x75, 0x72, 0x6c, 0x18, 0x04, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x09, 0x61, 0x76, 0x61, 0x74, 0x61, 0x72, 0x55, 0x72, 0x6c, 0x12, 0x14, 0x0a, 0x05, + 0x65, 0x78, 0x74, 0x72, 0x61, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x78, 0x74, + 0x72, 0x61, 0x22, 0x73, 0x0a, 0x0f, 0x55, 0x73, 0x65, 0x72, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, + 0x65, 0x50, 0x75, 0x73, 0x68, 0x12, 0x28, 0x0a, 0x09, 0x66, 0x72, 0x6f, 0x6d, 0x5f, 0x75, 0x73, + 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0b, 0x2e, 0x6c, 0x6f, 0x67, 0x69, 0x63, + 0x2e, 0x55, 0x73, 0x65, 0x72, 0x52, 0x08, 0x66, 0x72, 0x6f, 0x6d, 0x55, 0x73, 0x65, 0x72, 0x12, + 0x1c, 0x0a, 0x0a, 0x74, 0x6f, 0x5f, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x04, 0x52, 0x08, 0x74, 0x6f, 0x55, 0x73, 0x65, 0x72, 0x49, 0x64, 0x12, 0x18, 0x0a, + 0x07, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x07, + 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x22, 0x71, 0x0a, 0x10, 0x47, 0x72, 0x6f, 0x75, 0x70, + 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x50, 0x75, 0x73, 0x68, 0x12, 0x28, 0x0a, 0x09, 0x66, + 0x72, 0x6f, 0x6d, 0x5f, 0x75, 0x73, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0b, + 0x2e, 0x6c, 0x6f, 0x67, 0x69, 0x63, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x52, 0x08, 0x66, 0x72, 0x6f, + 0x6d, 0x55, 0x73, 0x65, 0x72, 0x12, 0x19, 0x0a, 0x08, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x5f, 0x69, + 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x07, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x49, 0x64, + 0x12, 0x18, 0x0a, 0x07, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, + 0x0c, 0x52, 0x07, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x32, 0x41, 0x0a, 0x11, 0x4d, 0x65, + 0x73, 0x73, 0x61, 0x67, 0x65, 0x45, 0x78, 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, + 0x2c, 0x0a, 0x04, 0x53, 0x79, 0x6e, 0x63, 0x12, 0x12, 0x2e, 0x6c, 0x6f, 0x67, 0x69, 0x63, 0x2e, + 0x53, 0x79, 0x6e, 0x63, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x10, 0x2e, 0x6c, 0x6f, + 0x67, 0x69, 0x63, 0x2e, 0x53, 0x79, 0x6e, 0x63, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x42, 0x1d, 0x5a, + 0x1b, 0x67, 0x69, 0x6d, 0x2f, 0x70, 0x6b, 0x67, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, + 0x6c, 0x2f, 0x70, 0x62, 0x2f, 0x6c, 0x6f, 0x67, 0x69, 0x63, 0x70, 0x62, 0x62, 0x06, 0x70, 0x72, + 0x6f, 0x74, 0x6f, 0x33, } var ( @@ -272,20 +389,26 @@ func file_logic_message_ext_proto_rawDescGZIP() []byte { return file_logic_message_ext_proto_rawDescData } -var file_logic_message_ext_proto_msgTypes = make([]protoimpl.MessageInfo, 3) +var file_logic_message_ext_proto_msgTypes = make([]protoimpl.MessageInfo, 5) var file_logic_message_ext_proto_goTypes = []interface{}{ - (*User)(nil), // 0: logic.User - (*UserMessagePush)(nil), // 1: logic.UserMessagePush - (*GroupMessagePush)(nil), // 2: logic.GroupMessagePush + (*SyncRequest)(nil), // 0: logic.SyncRequest + (*SyncReply)(nil), // 1: logic.SyncReply + (*User)(nil), // 2: logic.User + (*UserMessagePush)(nil), // 3: logic.UserMessagePush + (*GroupMessagePush)(nil), // 4: logic.GroupMessagePush + (*connectpb.Message)(nil), // 5: connect.Message } var file_logic_message_ext_proto_depIdxs = []int32{ - 0, // 0: logic.UserMessagePush.from_user:type_name -> logic.User - 0, // 1: logic.GroupMessagePush.from_user:type_name -> logic.User - 2, // [2:2] is the sub-list for method output_type - 2, // [2:2] is the sub-list for method input_type - 2, // [2:2] is the sub-list for extension type_name - 2, // [2:2] is the sub-list for extension extendee - 0, // [0:2] is the sub-list for field type_name + 5, // 0: logic.SyncReply.messages:type_name -> connect.Message + 2, // 1: logic.UserMessagePush.from_user:type_name -> logic.User + 2, // 2: logic.GroupMessagePush.from_user:type_name -> logic.User + 0, // 3: logic.MessageExtService.Sync:input_type -> logic.SyncRequest + 1, // 4: logic.MessageExtService.Sync:output_type -> logic.SyncReply + 4, // [4:5] is the sub-list for method output_type + 3, // [3:4] is the sub-list for method input_type + 3, // [3:3] is the sub-list for extension type_name + 3, // [3:3] is the sub-list for extension extendee + 0, // [0:3] is the sub-list for field type_name } func init() { file_logic_message_ext_proto_init() } @@ -295,7 +418,7 @@ func file_logic_message_ext_proto_init() { } if !protoimpl.UnsafeEnabled { file_logic_message_ext_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*User); i { + switch v := v.(*SyncRequest); i { case 0: return &v.state case 1: @@ -307,7 +430,7 @@ func file_logic_message_ext_proto_init() { } } file_logic_message_ext_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*UserMessagePush); i { + switch v := v.(*SyncReply); i { case 0: return &v.state case 1: @@ -319,6 +442,30 @@ func file_logic_message_ext_proto_init() { } } file_logic_message_ext_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*User); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_logic_message_ext_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*UserMessagePush); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_logic_message_ext_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*GroupMessagePush); i { case 0: return &v.state @@ -337,9 +484,9 @@ func file_logic_message_ext_proto_init() { GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: file_logic_message_ext_proto_rawDesc, NumEnums: 0, - NumMessages: 3, + NumMessages: 5, NumExtensions: 0, - NumServices: 0, + NumServices: 1, }, GoTypes: file_logic_message_ext_proto_goTypes, DependencyIndexes: file_logic_message_ext_proto_depIdxs, diff --git a/pkg/protocol/pb/logicpb/message.ext_grpc.pb.go b/pkg/protocol/pb/logicpb/message.ext_grpc.pb.go new file mode 100644 index 00000000..55be50de --- /dev/null +++ b/pkg/protocol/pb/logicpb/message.ext_grpc.pb.go @@ -0,0 +1,123 @@ +// Code generated by protoc-gen-go-grpc. DO NOT EDIT. +// versions: +// - protoc-gen-go-grpc v1.5.1 +// - protoc v5.29.3 +// source: logic/message.ext.proto + +package logicpb + +import ( + context "context" + grpc "google.golang.org/grpc" + codes "google.golang.org/grpc/codes" + status "google.golang.org/grpc/status" +) + +// This is a compile-time assertion to ensure that this generated file +// is compatible with the grpc package it is being compiled against. +// Requires gRPC-Go v1.64.0 or later. +const _ = grpc.SupportPackageIsVersion9 + +const ( + MessageExtService_Sync_FullMethodName = "/logic.MessageExtService/Sync" +) + +// MessageExtServiceClient is the client API for MessageExtService service. +// +// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://pkg.go.dev/google.golang.org/grpc/?tab=doc#ClientConn.NewStream. +type MessageExtServiceClient interface { + // 消息同步 + Sync(ctx context.Context, in *SyncRequest, opts ...grpc.CallOption) (*SyncReply, error) +} + +type messageExtServiceClient struct { + cc grpc.ClientConnInterface +} + +func NewMessageExtServiceClient(cc grpc.ClientConnInterface) MessageExtServiceClient { + return &messageExtServiceClient{cc} +} + +func (c *messageExtServiceClient) Sync(ctx context.Context, in *SyncRequest, opts ...grpc.CallOption) (*SyncReply, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) + out := new(SyncReply) + err := c.cc.Invoke(ctx, MessageExtService_Sync_FullMethodName, in, out, cOpts...) + if err != nil { + return nil, err + } + return out, nil +} + +// MessageExtServiceServer is the server API for MessageExtService service. +// All implementations must embed UnimplementedMessageExtServiceServer +// for forward compatibility. +type MessageExtServiceServer interface { + // 消息同步 + Sync(context.Context, *SyncRequest) (*SyncReply, error) + mustEmbedUnimplementedMessageExtServiceServer() +} + +// UnimplementedMessageExtServiceServer must be embedded to have +// forward compatible implementations. +// +// NOTE: this should be embedded by value instead of pointer to avoid a nil +// pointer dereference when methods are called. +type UnimplementedMessageExtServiceServer struct{} + +func (UnimplementedMessageExtServiceServer) Sync(context.Context, *SyncRequest) (*SyncReply, error) { + return nil, status.Errorf(codes.Unimplemented, "method Sync not implemented") +} +func (UnimplementedMessageExtServiceServer) mustEmbedUnimplementedMessageExtServiceServer() {} +func (UnimplementedMessageExtServiceServer) testEmbeddedByValue() {} + +// UnsafeMessageExtServiceServer may be embedded to opt out of forward compatibility for this service. +// Use of this interface is not recommended, as added methods to MessageExtServiceServer will +// result in compilation errors. +type UnsafeMessageExtServiceServer interface { + mustEmbedUnimplementedMessageExtServiceServer() +} + +func RegisterMessageExtServiceServer(s grpc.ServiceRegistrar, srv MessageExtServiceServer) { + // If the following call pancis, it indicates UnimplementedMessageExtServiceServer was + // embedded by pointer and is nil. This will cause panics if an + // unimplemented method is ever invoked, so we test this at initialization + // time to prevent it from happening at runtime later due to I/O. + if t, ok := srv.(interface{ testEmbeddedByValue() }); ok { + t.testEmbeddedByValue() + } + s.RegisterService(&MessageExtService_ServiceDesc, srv) +} + +func _MessageExtService_Sync_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(SyncRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(MessageExtServiceServer).Sync(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: MessageExtService_Sync_FullMethodName, + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(MessageExtServiceServer).Sync(ctx, req.(*SyncRequest)) + } + return interceptor(ctx, in, info, handler) +} + +// MessageExtService_ServiceDesc is the grpc.ServiceDesc for MessageExtService service. +// It's only intended for direct use with grpc.RegisterService, +// and not to be introspected or modified (even as a copy) +var MessageExtService_ServiceDesc = grpc.ServiceDesc{ + ServiceName: "logic.MessageExtService", + HandlerType: (*MessageExtServiceServer)(nil), + Methods: []grpc.MethodDesc{ + { + MethodName: "Sync", + Handler: _MessageExtService_Sync_Handler, + }, + }, + Streams: []grpc.StreamDesc{}, + Metadata: "logic/message.ext.proto", +} diff --git a/pkg/protocol/pb/logicpb/message.int.pb.go b/pkg/protocol/pb/logicpb/message.int.pb.go index 9911dd42..1a44fc89 100644 --- a/pkg/protocol/pb/logicpb/message.int.pb.go +++ b/pkg/protocol/pb/logicpb/message.int.pb.go @@ -22,61 +22,6 @@ const ( _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20) ) -type SyncRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - UserId uint64 `protobuf:"varint,1,opt,name=user_id,json=userId,proto3" json:"user_id,omitempty"` // 用户ID - Seq uint64 `protobuf:"varint,2,opt,name=seq,proto3" json:"seq,omitempty"` // 序列号 -} - -func (x *SyncRequest) Reset() { - *x = SyncRequest{} - if protoimpl.UnsafeEnabled { - mi := &file_logic_message_int_proto_msgTypes[0] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *SyncRequest) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*SyncRequest) ProtoMessage() {} - -func (x *SyncRequest) ProtoReflect() protoreflect.Message { - mi := &file_logic_message_int_proto_msgTypes[0] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use SyncRequest.ProtoReflect.Descriptor instead. -func (*SyncRequest) Descriptor() ([]byte, []int) { - return file_logic_message_int_proto_rawDescGZIP(), []int{0} -} - -func (x *SyncRequest) GetUserId() uint64 { - if x != nil { - return x.UserId - } - return 0 -} - -func (x *SyncRequest) GetSeq() uint64 { - if x != nil { - return x.Seq - } - return 0 -} - type MessageACKRequest struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -91,7 +36,7 @@ type MessageACKRequest struct { func (x *MessageACKRequest) Reset() { *x = MessageACKRequest{} if protoimpl.UnsafeEnabled { - mi := &file_logic_message_int_proto_msgTypes[1] + mi := &file_logic_message_int_proto_msgTypes[0] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -104,7 +49,7 @@ func (x *MessageACKRequest) String() string { func (*MessageACKRequest) ProtoMessage() {} func (x *MessageACKRequest) ProtoReflect() protoreflect.Message { - mi := &file_logic_message_int_proto_msgTypes[1] + mi := &file_logic_message_int_proto_msgTypes[0] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -117,7 +62,7 @@ func (x *MessageACKRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use MessageACKRequest.ProtoReflect.Descriptor instead. func (*MessageACKRequest) Descriptor() ([]byte, []int) { - return file_logic_message_int_proto_rawDescGZIP(), []int{1} + return file_logic_message_int_proto_rawDescGZIP(), []int{0} } func (x *MessageACKRequest) GetUserId() uint64 { @@ -162,7 +107,7 @@ type PushToUsersRequest struct { func (x *PushToUsersRequest) Reset() { *x = PushToUsersRequest{} if protoimpl.UnsafeEnabled { - mi := &file_logic_message_int_proto_msgTypes[2] + mi := &file_logic_message_int_proto_msgTypes[1] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -175,7 +120,7 @@ func (x *PushToUsersRequest) String() string { func (*PushToUsersRequest) ProtoMessage() {} func (x *PushToUsersRequest) ProtoReflect() protoreflect.Message { - mi := &file_logic_message_int_proto_msgTypes[2] + mi := &file_logic_message_int_proto_msgTypes[1] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -188,7 +133,7 @@ func (x *PushToUsersRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use PushToUsersRequest.ProtoReflect.Descriptor instead. func (*PushToUsersRequest) Descriptor() ([]byte, []int) { - return file_logic_message_int_proto_rawDescGZIP(), []int{2} + return file_logic_message_int_proto_rawDescGZIP(), []int{1} } func (x *PushToUsersRequest) GetUserIds() []uint64 { @@ -230,7 +175,7 @@ type PushToUsersReply struct { func (x *PushToUsersReply) Reset() { *x = PushToUsersReply{} if protoimpl.UnsafeEnabled { - mi := &file_logic_message_int_proto_msgTypes[3] + mi := &file_logic_message_int_proto_msgTypes[2] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -243,7 +188,7 @@ func (x *PushToUsersReply) String() string { func (*PushToUsersReply) ProtoMessage() {} func (x *PushToUsersReply) ProtoReflect() protoreflect.Message { - mi := &file_logic_message_int_proto_msgTypes[3] + mi := &file_logic_message_int_proto_msgTypes[2] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -256,7 +201,7 @@ func (x *PushToUsersReply) ProtoReflect() protoreflect.Message { // Deprecated: Use PushToUsersReply.ProtoReflect.Descriptor instead. func (*PushToUsersReply) Descriptor() ([]byte, []int) { - return file_logic_message_int_proto_rawDescGZIP(), []int{3} + return file_logic_message_int_proto_rawDescGZIP(), []int{2} } func (x *PushToUsersReply) GetMessageId() uint64 { @@ -278,7 +223,7 @@ type PushToAllRequest struct { func (x *PushToAllRequest) Reset() { *x = PushToAllRequest{} if protoimpl.UnsafeEnabled { - mi := &file_logic_message_int_proto_msgTypes[4] + mi := &file_logic_message_int_proto_msgTypes[3] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -291,7 +236,7 @@ func (x *PushToAllRequest) String() string { func (*PushToAllRequest) ProtoMessage() {} func (x *PushToAllRequest) ProtoReflect() protoreflect.Message { - mi := &file_logic_message_int_proto_msgTypes[4] + mi := &file_logic_message_int_proto_msgTypes[3] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -304,7 +249,7 @@ func (x *PushToAllRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use PushToAllRequest.ProtoReflect.Descriptor instead. func (*PushToAllRequest) Descriptor() ([]byte, []int) { - return file_logic_message_int_proto_rawDescGZIP(), []int{4} + return file_logic_message_int_proto_rawDescGZIP(), []int{3} } func (x *PushToAllRequest) GetCommand() connectpb.Command { @@ -329,57 +274,50 @@ var file_logic_message_int_proto_rawDesc = []byte{ 0x1a, 0x1b, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x65, 0x6d, 0x70, 0x74, 0x79, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x19, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x2f, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x2e, 0x65, - 0x78, 0x74, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0x38, 0x0a, 0x0b, 0x53, 0x79, 0x6e, 0x63, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x17, 0x0a, 0x07, 0x75, 0x73, 0x65, 0x72, 0x5f, - 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x06, 0x75, 0x73, 0x65, 0x72, 0x49, 0x64, - 0x12, 0x10, 0x0a, 0x03, 0x73, 0x65, 0x71, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x03, 0x73, - 0x65, 0x71, 0x22, 0x8b, 0x01, 0x0a, 0x11, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x41, 0x43, - 0x4b, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x17, 0x0a, 0x07, 0x75, 0x73, 0x65, 0x72, - 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x06, 0x75, 0x73, 0x65, 0x72, 0x49, - 0x64, 0x12, 0x1b, 0x0a, 0x09, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x04, 0x52, 0x08, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x49, 0x64, 0x12, 0x1d, - 0x0a, 0x0a, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x61, 0x63, 0x6b, 0x18, 0x03, 0x20, 0x01, - 0x28, 0x04, 0x52, 0x09, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x41, 0x63, 0x6b, 0x12, 0x21, 0x0a, - 0x0c, 0x72, 0x65, 0x63, 0x65, 0x69, 0x76, 0x65, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x04, 0x20, - 0x01, 0x28, 0x03, 0x52, 0x0b, 0x72, 0x65, 0x63, 0x65, 0x69, 0x76, 0x65, 0x54, 0x69, 0x6d, 0x65, - 0x22, 0x94, 0x01, 0x0a, 0x12, 0x50, 0x75, 0x73, 0x68, 0x54, 0x6f, 0x55, 0x73, 0x65, 0x72, 0x73, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x19, 0x0a, 0x08, 0x75, 0x73, 0x65, 0x72, 0x5f, - 0x69, 0x64, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x04, 0x52, 0x07, 0x75, 0x73, 0x65, 0x72, 0x49, - 0x64, 0x73, 0x12, 0x2a, 0x0a, 0x07, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x0e, 0x32, 0x10, 0x2e, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x2e, 0x43, 0x6f, - 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x52, 0x07, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x12, 0x18, - 0x0a, 0x07, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0c, 0x52, - 0x07, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x12, 0x1d, 0x0a, 0x0a, 0x69, 0x73, 0x5f, 0x70, - 0x65, 0x72, 0x73, 0x69, 0x73, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, 0x69, 0x73, - 0x50, 0x65, 0x72, 0x73, 0x69, 0x73, 0x74, 0x22, 0x31, 0x0a, 0x10, 0x50, 0x75, 0x73, 0x68, 0x54, - 0x6f, 0x55, 0x73, 0x65, 0x72, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x1d, 0x0a, 0x0a, 0x6d, - 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, - 0x09, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x49, 0x64, 0x22, 0x58, 0x0a, 0x10, 0x50, 0x75, - 0x73, 0x68, 0x54, 0x6f, 0x41, 0x6c, 0x6c, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x2a, - 0x0a, 0x07, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, - 0x10, 0x2e, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, - 0x64, 0x52, 0x07, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x12, 0x18, 0x0a, 0x07, 0x63, 0x6f, - 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x07, 0x63, 0x6f, 0x6e, - 0x74, 0x65, 0x6e, 0x74, 0x32, 0x84, 0x02, 0x0a, 0x11, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, - 0x49, 0x6e, 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x2e, 0x0a, 0x04, 0x53, 0x79, - 0x6e, 0x63, 0x12, 0x12, 0x2e, 0x6c, 0x6f, 0x67, 0x69, 0x63, 0x2e, 0x53, 0x79, 0x6e, 0x63, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x12, 0x2e, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, - 0x2e, 0x53, 0x79, 0x6e, 0x63, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x3e, 0x0a, 0x0a, 0x4d, 0x65, - 0x73, 0x73, 0x61, 0x67, 0x65, 0x41, 0x43, 0x4b, 0x12, 0x18, 0x2e, 0x6c, 0x6f, 0x67, 0x69, 0x63, - 0x2e, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x41, 0x43, 0x4b, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, - 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x12, 0x41, 0x0a, 0x0b, 0x50, 0x75, - 0x73, 0x68, 0x54, 0x6f, 0x55, 0x73, 0x65, 0x72, 0x73, 0x12, 0x19, 0x2e, 0x6c, 0x6f, 0x67, 0x69, - 0x63, 0x2e, 0x50, 0x75, 0x73, 0x68, 0x54, 0x6f, 0x55, 0x73, 0x65, 0x72, 0x73, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x1a, 0x17, 0x2e, 0x6c, 0x6f, 0x67, 0x69, 0x63, 0x2e, 0x50, 0x75, 0x73, - 0x68, 0x54, 0x6f, 0x55, 0x73, 0x65, 0x72, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x3c, 0x0a, - 0x09, 0x50, 0x75, 0x73, 0x68, 0x54, 0x6f, 0x41, 0x6c, 0x6c, 0x12, 0x17, 0x2e, 0x6c, 0x6f, 0x67, - 0x69, 0x63, 0x2e, 0x50, 0x75, 0x73, 0x68, 0x54, 0x6f, 0x41, 0x6c, 0x6c, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, - 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x42, 0x1d, 0x5a, 0x1b, 0x67, - 0x69, 0x6d, 0x2f, 0x70, 0x6b, 0x67, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2f, - 0x70, 0x62, 0x2f, 0x6c, 0x6f, 0x67, 0x69, 0x63, 0x70, 0x62, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, - 0x6f, 0x33, + 0x78, 0x74, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0x8b, 0x01, 0x0a, 0x11, 0x4d, 0x65, 0x73, + 0x73, 0x61, 0x67, 0x65, 0x41, 0x43, 0x4b, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x17, + 0x0a, 0x07, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, + 0x06, 0x75, 0x73, 0x65, 0x72, 0x49, 0x64, 0x12, 0x1b, 0x0a, 0x09, 0x64, 0x65, 0x76, 0x69, 0x63, + 0x65, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x08, 0x64, 0x65, 0x76, 0x69, + 0x63, 0x65, 0x49, 0x64, 0x12, 0x1d, 0x0a, 0x0a, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x61, + 0x63, 0x6b, 0x18, 0x03, 0x20, 0x01, 0x28, 0x04, 0x52, 0x09, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, + 0x41, 0x63, 0x6b, 0x12, 0x21, 0x0a, 0x0c, 0x72, 0x65, 0x63, 0x65, 0x69, 0x76, 0x65, 0x5f, 0x74, + 0x69, 0x6d, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0b, 0x72, 0x65, 0x63, 0x65, 0x69, + 0x76, 0x65, 0x54, 0x69, 0x6d, 0x65, 0x22, 0x94, 0x01, 0x0a, 0x12, 0x50, 0x75, 0x73, 0x68, 0x54, + 0x6f, 0x55, 0x73, 0x65, 0x72, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x19, 0x0a, + 0x08, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x04, 0x52, + 0x07, 0x75, 0x73, 0x65, 0x72, 0x49, 0x64, 0x73, 0x12, 0x2a, 0x0a, 0x07, 0x63, 0x6f, 0x6d, 0x6d, + 0x61, 0x6e, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x10, 0x2e, 0x63, 0x6f, 0x6e, 0x6e, + 0x65, 0x63, 0x74, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x52, 0x07, 0x63, 0x6f, 0x6d, + 0x6d, 0x61, 0x6e, 0x64, 0x12, 0x18, 0x0a, 0x07, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x18, + 0x03, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x07, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x12, 0x1d, + 0x0a, 0x0a, 0x69, 0x73, 0x5f, 0x70, 0x65, 0x72, 0x73, 0x69, 0x73, 0x74, 0x18, 0x04, 0x20, 0x01, + 0x28, 0x08, 0x52, 0x09, 0x69, 0x73, 0x50, 0x65, 0x72, 0x73, 0x69, 0x73, 0x74, 0x22, 0x31, 0x0a, + 0x10, 0x50, 0x75, 0x73, 0x68, 0x54, 0x6f, 0x55, 0x73, 0x65, 0x72, 0x73, 0x52, 0x65, 0x70, 0x6c, + 0x79, 0x12, 0x1d, 0x0a, 0x0a, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x5f, 0x69, 0x64, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x09, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x49, 0x64, + 0x22, 0x58, 0x0a, 0x10, 0x50, 0x75, 0x73, 0x68, 0x54, 0x6f, 0x41, 0x6c, 0x6c, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x12, 0x2a, 0x0a, 0x07, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x10, 0x2e, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x2e, + 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x52, 0x07, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, + 0x12, 0x18, 0x0a, 0x07, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x0c, 0x52, 0x07, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x32, 0xd4, 0x01, 0x0a, 0x11, 0x4d, + 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x49, 0x6e, 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, + 0x12, 0x3e, 0x0a, 0x0a, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x41, 0x43, 0x4b, 0x12, 0x18, + 0x2e, 0x6c, 0x6f, 0x67, 0x69, 0x63, 0x2e, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x41, 0x43, + 0x4b, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, + 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, + 0x12, 0x41, 0x0a, 0x0b, 0x50, 0x75, 0x73, 0x68, 0x54, 0x6f, 0x55, 0x73, 0x65, 0x72, 0x73, 0x12, + 0x19, 0x2e, 0x6c, 0x6f, 0x67, 0x69, 0x63, 0x2e, 0x50, 0x75, 0x73, 0x68, 0x54, 0x6f, 0x55, 0x73, + 0x65, 0x72, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x17, 0x2e, 0x6c, 0x6f, 0x67, + 0x69, 0x63, 0x2e, 0x50, 0x75, 0x73, 0x68, 0x54, 0x6f, 0x55, 0x73, 0x65, 0x72, 0x73, 0x52, 0x65, + 0x70, 0x6c, 0x79, 0x12, 0x3c, 0x0a, 0x09, 0x50, 0x75, 0x73, 0x68, 0x54, 0x6f, 0x41, 0x6c, 0x6c, + 0x12, 0x17, 0x2e, 0x6c, 0x6f, 0x67, 0x69, 0x63, 0x2e, 0x50, 0x75, 0x73, 0x68, 0x54, 0x6f, 0x41, + 0x6c, 0x6c, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, + 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, + 0x79, 0x42, 0x1d, 0x5a, 0x1b, 0x67, 0x69, 0x6d, 0x2f, 0x70, 0x6b, 0x67, 0x2f, 0x70, 0x72, 0x6f, + 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2f, 0x70, 0x62, 0x2f, 0x6c, 0x6f, 0x67, 0x69, 0x63, 0x70, 0x62, + 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( @@ -394,30 +332,26 @@ func file_logic_message_int_proto_rawDescGZIP() []byte { return file_logic_message_int_proto_rawDescData } -var file_logic_message_int_proto_msgTypes = make([]protoimpl.MessageInfo, 5) +var file_logic_message_int_proto_msgTypes = make([]protoimpl.MessageInfo, 4) var file_logic_message_int_proto_goTypes = []interface{}{ - (*SyncRequest)(nil), // 0: logic.SyncRequest - (*MessageACKRequest)(nil), // 1: logic.MessageACKRequest - (*PushToUsersRequest)(nil), // 2: logic.PushToUsersRequest - (*PushToUsersReply)(nil), // 3: logic.PushToUsersReply - (*PushToAllRequest)(nil), // 4: logic.PushToAllRequest - (connectpb.Command)(0), // 5: connect.Command - (*connectpb.SyncReply)(nil), // 6: connect.SyncReply - (*emptypb.Empty)(nil), // 7: google.protobuf.Empty + (*MessageACKRequest)(nil), // 0: logic.MessageACKRequest + (*PushToUsersRequest)(nil), // 1: logic.PushToUsersRequest + (*PushToUsersReply)(nil), // 2: logic.PushToUsersReply + (*PushToAllRequest)(nil), // 3: logic.PushToAllRequest + (connectpb.Command)(0), // 4: connect.Command + (*emptypb.Empty)(nil), // 5: google.protobuf.Empty } var file_logic_message_int_proto_depIdxs = []int32{ - 5, // 0: logic.PushToUsersRequest.command:type_name -> connect.Command - 5, // 1: logic.PushToAllRequest.command:type_name -> connect.Command - 0, // 2: logic.MessageIntService.Sync:input_type -> logic.SyncRequest - 1, // 3: logic.MessageIntService.MessageACK:input_type -> logic.MessageACKRequest - 2, // 4: logic.MessageIntService.PushToUsers:input_type -> logic.PushToUsersRequest - 4, // 5: logic.MessageIntService.PushToAll:input_type -> logic.PushToAllRequest - 6, // 6: logic.MessageIntService.Sync:output_type -> connect.SyncReply - 7, // 7: logic.MessageIntService.MessageACK:output_type -> google.protobuf.Empty - 3, // 8: logic.MessageIntService.PushToUsers:output_type -> logic.PushToUsersReply - 7, // 9: logic.MessageIntService.PushToAll:output_type -> google.protobuf.Empty - 6, // [6:10] is the sub-list for method output_type - 2, // [2:6] is the sub-list for method input_type + 4, // 0: logic.PushToUsersRequest.command:type_name -> connect.Command + 4, // 1: logic.PushToAllRequest.command:type_name -> connect.Command + 0, // 2: logic.MessageIntService.MessageACK:input_type -> logic.MessageACKRequest + 1, // 3: logic.MessageIntService.PushToUsers:input_type -> logic.PushToUsersRequest + 3, // 4: logic.MessageIntService.PushToAll:input_type -> logic.PushToAllRequest + 5, // 5: logic.MessageIntService.MessageACK:output_type -> google.protobuf.Empty + 2, // 6: logic.MessageIntService.PushToUsers:output_type -> logic.PushToUsersReply + 5, // 7: logic.MessageIntService.PushToAll:output_type -> google.protobuf.Empty + 5, // [5:8] is the sub-list for method output_type + 2, // [2:5] is the sub-list for method input_type 2, // [2:2] is the sub-list for extension type_name 2, // [2:2] is the sub-list for extension extendee 0, // [0:2] is the sub-list for field type_name @@ -430,18 +364,6 @@ func file_logic_message_int_proto_init() { } if !protoimpl.UnsafeEnabled { file_logic_message_int_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*SyncRequest); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_logic_message_int_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*MessageACKRequest); i { case 0: return &v.state @@ -453,7 +375,7 @@ func file_logic_message_int_proto_init() { return nil } } - file_logic_message_int_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} { + file_logic_message_int_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*PushToUsersRequest); i { case 0: return &v.state @@ -465,7 +387,7 @@ func file_logic_message_int_proto_init() { return nil } } - file_logic_message_int_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} { + file_logic_message_int_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*PushToUsersReply); i { case 0: return &v.state @@ -477,7 +399,7 @@ func file_logic_message_int_proto_init() { return nil } } - file_logic_message_int_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} { + file_logic_message_int_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*PushToAllRequest); i { case 0: return &v.state @@ -496,7 +418,7 @@ func file_logic_message_int_proto_init() { GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: file_logic_message_int_proto_rawDesc, NumEnums: 0, - NumMessages: 5, + NumMessages: 4, NumExtensions: 0, NumServices: 1, }, diff --git a/pkg/protocol/pb/logicpb/message.int_grpc.pb.go b/pkg/protocol/pb/logicpb/message.int_grpc.pb.go index 13d4cf14..0620ffbe 100644 --- a/pkg/protocol/pb/logicpb/message.int_grpc.pb.go +++ b/pkg/protocol/pb/logicpb/message.int_grpc.pb.go @@ -8,7 +8,6 @@ package logicpb import ( context "context" - connectpb "gim/pkg/protocol/pb/connectpb" grpc "google.golang.org/grpc" codes "google.golang.org/grpc/codes" status "google.golang.org/grpc/status" @@ -21,7 +20,6 @@ import ( const _ = grpc.SupportPackageIsVersion9 const ( - MessageIntService_Sync_FullMethodName = "/logic.MessageIntService/Sync" MessageIntService_MessageACK_FullMethodName = "/logic.MessageIntService/MessageACK" MessageIntService_PushToUsers_FullMethodName = "/logic.MessageIntService/PushToUsers" MessageIntService_PushToAll_FullMethodName = "/logic.MessageIntService/PushToAll" @@ -31,8 +29,6 @@ const ( // // For semantics around ctx use and closing/ending streaming RPCs, please refer to https://pkg.go.dev/google.golang.org/grpc/?tab=doc#ClientConn.NewStream. type MessageIntServiceClient interface { - // 消息同步 - Sync(ctx context.Context, in *SyncRequest, opts ...grpc.CallOption) (*connectpb.SyncReply, error) // 设备收到消息回执 MessageACK(ctx context.Context, in *MessageACKRequest, opts ...grpc.CallOption) (*emptypb.Empty, error) // 推送 @@ -49,16 +45,6 @@ func NewMessageIntServiceClient(cc grpc.ClientConnInterface) MessageIntServiceCl return &messageIntServiceClient{cc} } -func (c *messageIntServiceClient) Sync(ctx context.Context, in *SyncRequest, opts ...grpc.CallOption) (*connectpb.SyncReply, error) { - cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) - out := new(connectpb.SyncReply) - err := c.cc.Invoke(ctx, MessageIntService_Sync_FullMethodName, in, out, cOpts...) - if err != nil { - return nil, err - } - return out, nil -} - func (c *messageIntServiceClient) MessageACK(ctx context.Context, in *MessageACKRequest, opts ...grpc.CallOption) (*emptypb.Empty, error) { cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) out := new(emptypb.Empty) @@ -93,8 +79,6 @@ func (c *messageIntServiceClient) PushToAll(ctx context.Context, in *PushToAllRe // All implementations must embed UnimplementedMessageIntServiceServer // for forward compatibility. type MessageIntServiceServer interface { - // 消息同步 - Sync(context.Context, *SyncRequest) (*connectpb.SyncReply, error) // 设备收到消息回执 MessageACK(context.Context, *MessageACKRequest) (*emptypb.Empty, error) // 推送 @@ -111,9 +95,6 @@ type MessageIntServiceServer interface { // pointer dereference when methods are called. type UnimplementedMessageIntServiceServer struct{} -func (UnimplementedMessageIntServiceServer) Sync(context.Context, *SyncRequest) (*connectpb.SyncReply, error) { - return nil, status.Errorf(codes.Unimplemented, "method Sync not implemented") -} func (UnimplementedMessageIntServiceServer) MessageACK(context.Context, *MessageACKRequest) (*emptypb.Empty, error) { return nil, status.Errorf(codes.Unimplemented, "method MessageACK not implemented") } @@ -144,24 +125,6 @@ func RegisterMessageIntServiceServer(s grpc.ServiceRegistrar, srv MessageIntServ s.RegisterService(&MessageIntService_ServiceDesc, srv) } -func _MessageIntService_Sync_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(SyncRequest) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(MessageIntServiceServer).Sync(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: MessageIntService_Sync_FullMethodName, - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(MessageIntServiceServer).Sync(ctx, req.(*SyncRequest)) - } - return interceptor(ctx, in, info, handler) -} - func _MessageIntService_MessageACK_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { in := new(MessageACKRequest) if err := dec(in); err != nil { @@ -223,10 +186,6 @@ var MessageIntService_ServiceDesc = grpc.ServiceDesc{ ServiceName: "logic.MessageIntService", HandlerType: (*MessageIntServiceServer)(nil), Methods: []grpc.MethodDesc{ - { - MethodName: "Sync", - Handler: _MessageIntService_Sync_Handler, - }, { MethodName: "MessageACK", Handler: _MessageIntService_MessageACK_Handler, diff --git a/pkg/protocol/proto/business/message.ext.proto b/pkg/protocol/proto/business/message.ext.proto new file mode 100644 index 00000000..bda8bbb7 --- /dev/null +++ b/pkg/protocol/proto/business/message.ext.proto @@ -0,0 +1,14 @@ +syntax = "proto3"; +package business; +option go_package = "gim/pkg/protocol/pb/businesspb"; + + +enum Command{ + DEFAULT = 0; + ADD_FRIEND = 110; // 添加好友请求 + AGREE_ADD_FRIEND = 111; // 同意添加好友 + + UPDATE_GROUP = 120; // 更新群组 + ADD_GROUP_MEMBERS = 121; // 添加群组成员 + REMOVE_GROUP_MEMBER = 122; // 移除群组成员 +} \ No newline at end of file diff --git a/pkg/protocol/proto/connect/connect.ext.proto b/pkg/protocol/proto/connect/connect.ext.proto index bf46e5fe..ce51e88e 100644 --- a/pkg/protocol/proto/connect/connect.ext.proto +++ b/pkg/protocol/proto/connect/connect.ext.proto @@ -6,18 +6,10 @@ enum Command { UNKNOWN = 0; // 未知 SIGN_IN = 1; // 设备登录请求 HEARTBEAT = 2; // 心跳 - SYNC = 3; // 消息同步 - SUBSCRIBE_ROOM = 4; // 订阅房间 + SUBSCRIBE_ROOM = 3; // 订阅房间 USER_MESSAGE = 100; // 用户消息 GROUP_MESSAGE = 101; // 群组消息 - - ADD_FRIEND = 110; // 添加好友请求 - AGREE_ADD_FRIEND = 111; // 同意添加好友 - - UPDATE_GROUP = 120; // 更新群组 - ADD_GROUP_MEMBERS = 121; // 添加群组成员 - REMOVE_GROUP_MEMBER = 122; // 移除群组成员 } // 消息 @@ -37,14 +29,6 @@ message SignInRequest { string token = 3; // token } -message SyncRequest { - uint64 seq = 1; // 序列号 -} -message SyncReply { - repeated connect.Message messages = 1; // 消息列表 - bool has_more = 2; // 是否有更多数据 -} - // 订阅房间请求 message SubscribeRoomRequest { uint64 room_id = 1; // 房间ID,如果为0,取消房间订阅 diff --git a/pkg/protocol/proto/logic/message.ext.proto b/pkg/protocol/proto/logic/message.ext.proto index b470ea2a..f194e986 100644 --- a/pkg/protocol/proto/logic/message.ext.proto +++ b/pkg/protocol/proto/logic/message.ext.proto @@ -2,6 +2,21 @@ syntax = "proto3"; package logic; option go_package = "gim/pkg/protocol/pb/logicpb"; +import "connect/connect.ext.proto"; + +service MessageExtService { + // 消息同步 + rpc Sync (SyncRequest) returns (SyncReply); +} + +message SyncRequest { + uint64 seq = 1; // 序列号 +} +message SyncReply { + repeated connect.Message messages = 1; // 消息列表 + bool has_more = 2; // 是否有更多数据 +} + message User { uint64 user_id = 1; // 发送者id uint64 device_id = 2; // 发送者设备id diff --git a/pkg/protocol/proto/logic/message.int.proto b/pkg/protocol/proto/logic/message.int.proto index 02f911db..d00a47e5 100644 --- a/pkg/protocol/proto/logic/message.int.proto +++ b/pkg/protocol/proto/logic/message.int.proto @@ -7,8 +7,6 @@ import "google/protobuf/empty.proto"; import "connect/connect.ext.proto"; service MessageIntService { - // 消息同步 - rpc Sync (SyncRequest) returns (connect.SyncReply); // 设备收到消息回执 rpc MessageACK (MessageACKRequest) returns (google.protobuf.Empty); // 推送 @@ -17,11 +15,6 @@ service MessageIntService { rpc PushToAll(PushToAllRequest)returns(google.protobuf.Empty); } -message SyncRequest { - uint64 user_id = 1; // 用户ID - uint64 seq = 2; // 序列号 -} - message MessageACKRequest { uint64 user_id = 1; // 用户id uint64 device_id = 2; // 设备id diff --git a/pkg/rpc/rpc.go b/pkg/rpc/rpc.go index 7b8582fc..31aef91a 100644 --- a/pkg/rpc/rpc.go +++ b/pkg/rpc/rpc.go @@ -4,6 +4,8 @@ import ( "context" "sync" + "google.golang.org/protobuf/proto" + "gim/config" "gim/pkg/protocol/pb/businesspb" "gim/pkg/protocol/pb/connectpb" @@ -14,10 +16,15 @@ import ( var connectIntClients sync.Map var ( - deviceIntClient logicpb.DeviceIntServiceClient - messageIntClient logicpb.MessageIntServiceClient - roomIntClient logicpb.RoomIntServiceClient - userIntClient businesspb.UserIntServiceClient + logicConn = ugrpc.NewClient(config.Config.LogicServerAddr) + businessConn = ugrpc.NewClient(config.Config.BusinessServerAddr) +) + +var ( + deviceIntClient = logicpb.NewDeviceIntServiceClient(logicConn) + messageIntClient = logicpb.NewMessageIntServiceClient(logicConn) + roomIntClient = logicpb.NewRoomIntServiceClient(logicConn) + userIntClient = businesspb.NewUserIntServiceClient(businessConn) ) func GetConnectIntClient(addr string) connectpb.ConnectIntServiceClient { @@ -33,43 +40,38 @@ func GetConnectIntClient(addr string) connectpb.ConnectIntServiceClient { } func GetDeviceIntClient() logicpb.DeviceIntServiceClient { - if deviceIntClient == nil { - deviceIntClient = config.Config.DeviceIntClientBuilder() - } return deviceIntClient } func GetMessageIntClient() logicpb.MessageIntServiceClient { - if messageIntClient == nil { - messageIntClient = config.Config.MessageIntClientBuilder() - } return messageIntClient } func GetRoomIntClient() logicpb.RoomIntServiceClient { - if roomIntClient == nil { - roomIntClient = config.Config.RoomIntClientBuilder() - } return roomIntClient } func GetUserIntClient() businesspb.UserIntServiceClient { - if userIntClient == nil { - userIntClient = config.Config.UserIntClientBuilder() - } return userIntClient } -func GetUser(deviceID, userID uint64) (*logicpb.User, error) { - user, err := GetUserIntClient().GetUser(context.TODO(), &businesspb.GetUserRequest{UserId: userID}) +type PushRequest struct { + UserIDs []uint64 + Command connectpb.Command + Message proto.Message + IsPersist bool +} + +func PushToUsers(ctx context.Context, request PushRequest) (*logicpb.PushToUsersReply, error) { + content, err := proto.Marshal(request.Message) if err != nil { return nil, err } - return &logicpb.User{ - UserId: userID, - DeviceId: deviceID, - AvatarUrl: user.User.AvatarUrl, - Nickname: user.User.Nickname, - Extra: user.User.Extra, - }, nil + return GetMessageIntClient().PushToUsers(ctx, &logicpb.PushToUsersRequest{ + UserIds: request.UserIDs, + Command: request.Command, + Content: content, + IsPersist: request.IsPersist, + }) + } diff --git a/sql/create_table.sql b/sql/create_table.sql index 74a4ed4e..1c66ec50 100644 --- a/sql/create_table.sql +++ b/sql/create_table.sql @@ -2,7 +2,7 @@ -- -- Host: 127.0.0.1 Database: gim -- ------------------------------------------------------ --- Server version 8.4.3 +-- Server version 8.0.43 /*!40103 SET @OLD_TIME_ZONE=@@TIME_ZONE */; /*!40103 SET TIME_ZONE='+00:00' */; /*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */; @@ -92,9 +92,10 @@ CREATE TABLE `message` ( `request_id` bigint NOT NULL COMMENT '请求id', `command` int NOT NULL COMMENT '消息类型', `content` blob NOT NULL COMMENT '消息内容', - `status` tinyint NOT NULL DEFAULT '0' COMMENT '消息状态,0:未处理1:消息撤回', PRIMARY KEY (`id`) -) ENGINE=InnoDB AUTO_INCREMENT=10000 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin COMMENT='消息'; +) ENGINE=InnoDB AUTO_INCREMENT=10000 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin COMMENT='消息' +/*!50100 PARTITION BY HASH (`id`) +PARTITIONS 8 */; /*!40101 SET character_set_client = @saved_cs_client */; -- @@ -148,7 +149,9 @@ CREATE TABLE `user_message` ( `updated_at` datetime NOT NULL COMMENT '更新时间', `message_id` bigint unsigned NOT NULL COMMENT '消息ID', PRIMARY KEY (`user_id`,`seq`) USING BTREE -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin COMMENT='用户消息'; +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin COMMENT='用户消息' +/*!50100 PARTITION BY HASH (`user_id`) +PARTITIONS 8 */; /*!40101 SET character_set_client = @saved_cs_client */; /*!40103 SET TIME_ZONE=@OLD_TIME_ZONE */; @@ -157,4 +160,4 @@ CREATE TABLE `user_message` ( /*!40014 SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS */; /*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */; --- Dump completed on 2025年08月31日 21:51:04 +-- Dump completed on 2025年09月07日 21:47:54 From e662fd625ee1bcb4f3bd27f86d4e466b9d85a7b5 Mon Sep 17 00:00:00 2001 From: alber Date: Sun, 7 Sep 2025 22:21:34 +0800 Subject: [PATCH 3/6] =?UTF-8?q?=E6=8E=A8=E5=8A=A8=E6=8C=87=E4=BB=A4?= =?UTF-8?q?=E6=8B=86=E5=88=86=E5=90=84=E4=B8=AA=E7=9B=B8=E5=85=B3=E4=B8=9A?= =?UTF-8?q?=E5=8A=A1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../{message_repo_test.go => message_test.go} | 1 - pkg/protocol/pb/businesspb/message.ext.pb.go | 146 ++++++++++++++++++ 2 files changed, 146 insertions(+), 1 deletion(-) rename internal/logic/message/repo/{message_repo_test.go => message_test.go} (95%) create mode 100644 pkg/protocol/pb/businesspb/message.ext.pb.go diff --git a/internal/logic/message/repo/message_repo_test.go b/internal/logic/message/repo/message_test.go similarity index 95% rename from internal/logic/message/repo/message_repo_test.go rename to internal/logic/message/repo/message_test.go index b1a27326..ce7f27e3 100644 --- a/internal/logic/message/repo/message_repo_test.go +++ b/internal/logic/message/repo/message_test.go @@ -11,7 +11,6 @@ func Test_messageRepo_Save(t *testing.T) { RequestID: "1", Command: 1, Content: []byte("hello world"), - Status: 0, } err := MessageRepo.Save(&msg) t.Log(err) diff --git a/pkg/protocol/pb/businesspb/message.ext.pb.go b/pkg/protocol/pb/businesspb/message.ext.pb.go new file mode 100644 index 00000000..5ffe6660 --- /dev/null +++ b/pkg/protocol/pb/businesspb/message.ext.pb.go @@ -0,0 +1,146 @@ +// Code generated by protoc-gen-go. DO NOT EDIT. +// versions: +// protoc-gen-go v1.28.1 +// protoc v5.29.3 +// source: business/message.ext.proto + +package businesspb + +import ( + protoreflect "google.golang.org/protobuf/reflect/protoreflect" + protoimpl "google.golang.org/protobuf/runtime/protoimpl" + reflect "reflect" + sync "sync" +) + +const ( + // Verify that this generated code is sufficiently up-to-date. + _ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion) + // Verify that runtime/protoimpl is sufficiently up-to-date. + _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20) +) + +type Command int32 + +const ( + Command_DEFAULT Command = 0 + Command_ADD_FRIEND Command = 110 // 添加好友请求 + Command_AGREE_ADD_FRIEND Command = 111 // 同意添加好友 + Command_UPDATE_GROUP Command = 120 // 更新群组 + Command_ADD_GROUP_MEMBERS Command = 121 // 添加群组成员 + Command_REMOVE_GROUP_MEMBER Command = 122 // 移除群组成员 +) + +// Enum value maps for Command. +var ( + Command_name = map[int32]string{ + 0: "DEFAULT", + 110: "ADD_FRIEND", + 111: "AGREE_ADD_FRIEND", + 120: "UPDATE_GROUP", + 121: "ADD_GROUP_MEMBERS", + 122: "REMOVE_GROUP_MEMBER", + } + Command_value = map[string]int32{ + "DEFAULT": 0, + "ADD_FRIEND": 110, + "AGREE_ADD_FRIEND": 111, + "UPDATE_GROUP": 120, + "ADD_GROUP_MEMBERS": 121, + "REMOVE_GROUP_MEMBER": 122, + } +) + +func (x Command) Enum() *Command { + p := new(Command) + *p = x + return p +} + +func (x Command) String() string { + return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) +} + +func (Command) Descriptor() protoreflect.EnumDescriptor { + return file_business_message_ext_proto_enumTypes[0].Descriptor() +} + +func (Command) Type() protoreflect.EnumType { + return &file_business_message_ext_proto_enumTypes[0] +} + +func (x Command) Number() protoreflect.EnumNumber { + return protoreflect.EnumNumber(x) +} + +// Deprecated: Use Command.Descriptor instead. +func (Command) EnumDescriptor() ([]byte, []int) { + return file_business_message_ext_proto_rawDescGZIP(), []int{0} +} + +var File_business_message_ext_proto protoreflect.FileDescriptor + +var file_business_message_ext_proto_rawDesc = []byte{ + 0x0a, 0x1a, 0x62, 0x75, 0x73, 0x69, 0x6e, 0x65, 0x73, 0x73, 0x2f, 0x6d, 0x65, 0x73, 0x73, 0x61, + 0x67, 0x65, 0x2e, 0x65, 0x78, 0x74, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x08, 0x62, 0x75, + 0x73, 0x69, 0x6e, 0x65, 0x73, 0x73, 0x2a, 0x7e, 0x0a, 0x07, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, + 0x64, 0x12, 0x0b, 0x0a, 0x07, 0x44, 0x45, 0x46, 0x41, 0x55, 0x4c, 0x54, 0x10, 0x00, 0x12, 0x0e, + 0x0a, 0x0a, 0x41, 0x44, 0x44, 0x5f, 0x46, 0x52, 0x49, 0x45, 0x4e, 0x44, 0x10, 0x6e, 0x12, 0x14, + 0x0a, 0x10, 0x41, 0x47, 0x52, 0x45, 0x45, 0x5f, 0x41, 0x44, 0x44, 0x5f, 0x46, 0x52, 0x49, 0x45, + 0x4e, 0x44, 0x10, 0x6f, 0x12, 0x10, 0x0a, 0x0c, 0x55, 0x50, 0x44, 0x41, 0x54, 0x45, 0x5f, 0x47, + 0x52, 0x4f, 0x55, 0x50, 0x10, 0x78, 0x12, 0x15, 0x0a, 0x11, 0x41, 0x44, 0x44, 0x5f, 0x47, 0x52, + 0x4f, 0x55, 0x50, 0x5f, 0x4d, 0x45, 0x4d, 0x42, 0x45, 0x52, 0x53, 0x10, 0x79, 0x12, 0x17, 0x0a, + 0x13, 0x52, 0x45, 0x4d, 0x4f, 0x56, 0x45, 0x5f, 0x47, 0x52, 0x4f, 0x55, 0x50, 0x5f, 0x4d, 0x45, + 0x4d, 0x42, 0x45, 0x52, 0x10, 0x7a, 0x42, 0x20, 0x5a, 0x1e, 0x67, 0x69, 0x6d, 0x2f, 0x70, 0x6b, + 0x67, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2f, 0x70, 0x62, 0x2f, 0x62, 0x75, + 0x73, 0x69, 0x6e, 0x65, 0x73, 0x73, 0x70, 0x62, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, +} + +var ( + file_business_message_ext_proto_rawDescOnce sync.Once + file_business_message_ext_proto_rawDescData = file_business_message_ext_proto_rawDesc +) + +func file_business_message_ext_proto_rawDescGZIP() []byte { + file_business_message_ext_proto_rawDescOnce.Do(func() { + file_business_message_ext_proto_rawDescData = protoimpl.X.CompressGZIP(file_business_message_ext_proto_rawDescData) + }) + return file_business_message_ext_proto_rawDescData +} + +var file_business_message_ext_proto_enumTypes = make([]protoimpl.EnumInfo, 1) +var file_business_message_ext_proto_goTypes = []interface{}{ + (Command)(0), // 0: business.Command +} +var file_business_message_ext_proto_depIdxs = []int32{ + 0, // [0:0] is the sub-list for method output_type + 0, // [0:0] is the sub-list for method input_type + 0, // [0:0] is the sub-list for extension type_name + 0, // [0:0] is the sub-list for extension extendee + 0, // [0:0] is the sub-list for field type_name +} + +func init() { file_business_message_ext_proto_init() } +func file_business_message_ext_proto_init() { + if File_business_message_ext_proto != nil { + return + } + type x struct{} + out := protoimpl.TypeBuilder{ + File: protoimpl.DescBuilder{ + GoPackagePath: reflect.TypeOf(x{}).PkgPath(), + RawDescriptor: file_business_message_ext_proto_rawDesc, + NumEnums: 1, + NumMessages: 0, + NumExtensions: 0, + NumServices: 0, + }, + GoTypes: file_business_message_ext_proto_goTypes, + DependencyIndexes: file_business_message_ext_proto_depIdxs, + EnumInfos: file_business_message_ext_proto_enumTypes, + }.Build() + File_business_message_ext_proto = out.File + file_business_message_ext_proto_rawDesc = nil + file_business_message_ext_proto_goTypes = nil + file_business_message_ext_proto_depIdxs = nil +} From 8aad446cfe7b9c2dd2929ddf0762afdc11953e51 Mon Sep 17 00:00:00 2001 From: alber Date: 2025年9月27日 11:00:36 +0800 Subject: [PATCH 4/6] =?UTF-8?q?1.=E5=A2=9E=E5=8A=A0ctx=E9=80=8F=E4=BC=A0?= =?UTF-8?q?=202.=E6=B6=88=E6=81=AF=E5=8F=91=E9=80=81=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- go.mod | 4 +- go.sum | 8 ++++ internal/business/friend/app/friend.go | 16 ++++---- internal/business/friend/repo/friend.go | 17 +++++---- internal/business/friend/repo/friend_test.go | 7 ++-- internal/business/user/app/auth_app.go | 8 ++-- internal/business/user/app/user_app.go | 10 ++--- internal/business/user/repo/auth_repo.go | 13 ++++--- internal/business/user/repo/user_repo.go | 21 +++++----- internal/business/user/repo/user_repo_test.go | 5 ++- internal/connect/client_test.go | 4 +- internal/connect/mq.go | 9 +++-- internal/logic/device/app/device.go | 22 +++++------ internal/logic/device/repo/device.go | 27 ++++++------- internal/logic/device/repo/device_test.go | 3 +- internal/logic/group/app/group.go | 8 ++-- internal/logic/group/repo/group.go | 19 +++++----- internal/logic/message/app/device_ack.go | 4 +- internal/logic/message/app/message.go | 33 ++++++++-------- internal/logic/message/repo/device_ack.go | 9 +++-- internal/logic/message/repo/message.go | 10 +++-- internal/logic/message/repo/message_test.go | 5 ++- internal/logic/message/repo/seq.go | 9 +++-- internal/logic/message/repo/seq_test.go | 3 +- internal/logic/message/repo/user_message.go | 38 ++++++++++--------- .../logic/message/repo/user_message_test.go | 5 ++- internal/logic/room/app.go | 2 +- pkg/mq/mq.go | 6 ++- pkg/uredis/redis.go | 13 ++++--- 29 files changed, 184 insertions(+), 154 deletions(-) diff --git a/go.mod b/go.mod index fabaed30..eef2d15a 100644 --- a/go.mod +++ b/go.mod @@ -6,7 +6,7 @@ require ( github.com/gin-gonic/gin v1.10.0 github.com/go-redis/redis v6.15.9+incompatible github.com/gorilla/websocket v1.5.3 - github.com/json-iterator/go v1.1.12 + github.com/redis/go-redis/v9 v9.14.0 github.com/sercand/kuberesolver/v6 v6.0.1 google.golang.org/grpc v1.71.1 google.golang.org/protobuf v1.36.6 @@ -26,6 +26,7 @@ require ( github.com/cloudwego/base64x v0.1.4 // indirect github.com/cloudwego/iasm v0.2.0 // indirect github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect + github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f // indirect github.com/emicklei/go-restful/v3 v3.11.0 // indirect github.com/fsnotify/fsnotify v1.9.0 // indirect github.com/fxamacker/cbor/v2 v2.7.0 // indirect @@ -49,6 +50,7 @@ require ( github.com/jinzhu/inflection v1.0.0 // indirect github.com/jinzhu/now v1.1.5 // indirect github.com/josharian/intern v1.0.0 // indirect + github.com/json-iterator/go v1.1.12 // indirect github.com/klauspost/cpuid/v2 v2.2.7 // indirect github.com/leodido/go-urn v1.4.0 // indirect github.com/mailru/easyjson v0.7.7 // indirect diff --git a/go.sum b/go.sum index 3dff16cf..26f67b05 100644 --- a/go.sum +++ b/go.sum @@ -7,6 +7,10 @@ github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAE github.com/antihax/optional v1.0.0/go.mod h1:uupD/76wgC+ih3iEmQUL+0Ugr19nfwCT1kdvxnR2qWY= github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM= github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw= +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.11.6 h1:oUp34TzMlL+OY1OUWxHqsdkgC/Zfc85zGqw9siXjrc0= github.com/bytedance/sonic v1.11.6/go.mod h1:LysEHSvpvDySVdC2f87zGWf6CIKJcAvqab1ZaiQtds4= github.com/bytedance/sonic/loader v0.1.1 h1:c+e5Pt1k/cy5wMveRDyk2X4B9hF4g7an8N3zCYjJFNM= @@ -28,6 +32,8 @@ github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSs github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM= github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f h1:lO4WD4F/rVNCu3HqELle0jiPLLBs70cWOduZpkS1E78= +github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f/go.mod h1:cuUVRXasLTGF7a8hSLbxyZXjz+1KgoB3wDUb6vlszIc= github.com/emicklei/go-restful/v3 v3.11.0 h1:rAQeMHw1c7zTmncogyy8VvRZwtkmkZ4FxERmMY4rD+g= github.com/emicklei/go-restful/v3 v3.11.0/go.mod h1:6n3XBCmQQb25CM2LCACGz8ukIrRry+4bhvbpWn3mrbc= github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= @@ -188,6 +194,8 @@ github.com/prometheus/common v0.42.0 h1:EKsfXEYo4JpWMHH5cg+KOUWeuJSov1Id8zGR8eeI github.com/prometheus/common v0.42.0/go.mod h1:xBwqVerjNdUDjgODMpudtOMwlOwf2SaTr1yjz4b7Zbc= github.com/prometheus/procfs v0.9.0 h1:wzCHvIvM5SxWqYvwgVL7yJY8Lz3PKn49KQtpgMYJfhI= github.com/prometheus/procfs v0.9.0/go.mod h1:+pB4zwohETzFnmlpe6yd2lSc+0/46IYZRB/chUwxUZY= +github.com/redis/go-redis/v9 v9.14.0 h1:u4tNCjXOyzfgeLN+vAZaW1xUooqWDqVEsZN0U01jfAE= +github.com/redis/go-redis/v9 v9.14.0/go.mod h1:huWgSWd8mW6+m0VPhJjSSQ+d6Nh1VICQ6Q5lHuCH/Iw= github.com/rogpeppe/fastuuid v1.2.0/go.mod h1:jVj6XXZzXRy/MSR5jhDC/2q6DgLz+nrA6LYCDYWNEvQ= 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= diff --git a/internal/business/friend/app/friend.go b/internal/business/friend/app/friend.go index 2a10ffac..16c3735a 100644 --- a/internal/business/friend/app/friend.go +++ b/internal/business/friend/app/friend.go @@ -21,7 +21,7 @@ type friendApp struct{} // List 获取好友列表 func (s *friendApp) List(ctx context.Context, userID uint64) ([]*pb.Friend, error) { - friends, err := repo.FriendRepo.List(userID, domain.FriendStatusAgree) + friends, err := repo.FriendRepo.List(ctx, userID, domain.FriendStatusAgree) if err != nil { return nil, err } @@ -58,7 +58,7 @@ func (s *friendApp) List(ctx context.Context, userID uint64) ([]*pb.Friend, erro // AddFriend 添加好友 func (*friendApp) AddFriend(ctx context.Context, userId, friendId uint64, remarks, description string) error { - friend, err := repo.FriendRepo.Get(userId, friendId) + friend, err := repo.FriendRepo.Get(ctx, userId, friendId) if err != nil && !errors.Is(err, gerrors.ErrFriendNotFound) { return err } @@ -71,7 +71,7 @@ func (*friendApp) AddFriend(ctx context.Context, userId, friendId uint64, remark } } - err = repo.FriendRepo.Create(&domain.Friend{ + err = repo.FriendRepo.Create(ctx, &domain.Friend{ UserID: userId, FriendID: friendId, Remarks: remarks, @@ -102,7 +102,7 @@ func (*friendApp) AddFriend(ctx context.Context, userId, friendId uint64, remark // AgreeAddFriend 同意添加好友 func (*friendApp) AgreeAddFriend(ctx context.Context, userId, friendId uint64, remarks string) error { - friend, err := repo.FriendRepo.Get(friendId, userId) + friend, err := repo.FriendRepo.Get(ctx, friendId, userId) if err != nil { return err } @@ -110,12 +110,12 @@ func (*friendApp) AgreeAddFriend(ctx context.Context, userId, friendId uint64, r return nil } friend.Status = domain.FriendStatusAgree - err = repo.FriendRepo.Save(friend) + err = repo.FriendRepo.Save(ctx, friend) if err != nil { return err } - err = repo.FriendRepo.Save(&domain.Friend{ + err = repo.FriendRepo.Save(ctx, &domain.Friend{ UserID: userId, FriendID: friendId, Remarks: remarks, @@ -145,7 +145,7 @@ func (*friendApp) AgreeAddFriend(ctx context.Context, userId, friendId uint64, r // SetFriend 设置好友信息 func (*friendApp) SetFriend(ctx context.Context, userId uint64, req *pb.FriendSetRequest) error { - friend, err := repo.FriendRepo.Get(userId, req.FriendId) + friend, err := repo.FriendRepo.Get(ctx, userId, req.FriendId) if err != nil { return err } @@ -154,7 +154,7 @@ func (*friendApp) SetFriend(ctx context.Context, userId uint64, req *pb.FriendSe friend.Extra = req.Extra friend.UpdatedAt = time.Now() - return repo.FriendRepo.Save(friend) + return repo.FriendRepo.Save(ctx, friend) } // SendToFriend 消息发送至好友 diff --git a/internal/business/friend/repo/friend.go b/internal/business/friend/repo/friend.go index f116bd18..7ec000cc 100644 --- a/internal/business/friend/repo/friend.go +++ b/internal/business/friend/repo/friend.go @@ -1,6 +1,7 @@ package repo import ( + "context" "errors" "gorm.io/gorm" @@ -15,9 +16,9 @@ var FriendRepo = new(friendRepo) type friendRepo struct{} // Get 获取好友 -func (*friendRepo) Get(userId, friendId uint64) (*domain.Friend, error) { +func (*friendRepo) Get(ctx context.Context, userId, friendId uint64) (*domain.Friend, error) { friend := domain.Friend{} - err := db.DB.First(&friend, "user_id = ? and friend_id = ?", userId, friendId).Error + err := db.DB.WithContext(ctx).First(&friend, "user_id = ? and friend_id = ?", userId, friendId).Error if errors.Is(err, gorm.ErrRecordNotFound) { return nil, gerrors.ErrFriendNotFound } @@ -25,18 +26,18 @@ func (*friendRepo) Get(userId, friendId uint64) (*domain.Friend, error) { } // Create 添加好友 -func (*friendRepo) Create(friend *domain.Friend) error { - return db.DB.Create(friend).Error +func (*friendRepo) Create(ctx context.Context, friend *domain.Friend) error { + return db.DB.WithContext(ctx).Create(friend).Error } // Save 添加好友 -func (*friendRepo) Save(friend *domain.Friend) error { - return db.DB.Where("user_id = ? and friend_id = ?", friend.UserID, friend.FriendID).Save(friend).Error +func (*friendRepo) Save(ctx context.Context, friend *domain.Friend) error { + return db.DB.WithContext(ctx).Where("user_id = ? and friend_id = ?", friend.UserID, friend.FriendID).Save(friend).Error } // List 获取好友列表 -func (*friendRepo) List(userId uint64, status int) ([]domain.Friend, error) { +func (*friendRepo) List(ctx context.Context, userId uint64, status int) ([]domain.Friend, error) { var friends []domain.Friend - err := db.DB.Where("user_id = ? and status = ?", userId, status).Find(&friends).Error + err := db.DB.WithContext(ctx).Where("user_id = ? and status = ?", userId, status).Find(&friends).Error return friends, err } diff --git a/internal/business/friend/repo/friend_test.go b/internal/business/friend/repo/friend_test.go index da23b317..434b64fb 100644 --- a/internal/business/friend/repo/friend_test.go +++ b/internal/business/friend/repo/friend_test.go @@ -1,13 +1,14 @@ package repo import ( + "context" "testing" "gim/internal/business/friend/domain" ) func Test_friendRepo_Get(t *testing.T) { - friend, err := FriendRepo.Get(1, 2) + friend, err := FriendRepo.Get(context.Background(), 1, 2) if err != nil { t.Fatal(err) } @@ -15,7 +16,7 @@ func Test_friendRepo_Get(t *testing.T) { } func Test_friendRepo_Save(t *testing.T) { - err := FriendRepo.Save(&domain.Friend{ + err := FriendRepo.Save(context.Background(), &domain.Friend{ UserID: 1, FriendID: 2, }) @@ -23,7 +24,7 @@ func Test_friendRepo_Save(t *testing.T) { } func Test_friendRepo_List(t *testing.T) { - friends, err := FriendRepo.List(1, domain.FriendStatusAgree) + friends, err := FriendRepo.List(context.Background(), 1, domain.FriendStatusAgree) if err != nil { t.Fatal(err) } diff --git a/internal/business/user/app/auth_app.go b/internal/business/user/app/auth_app.go index de789d1c..e4036153 100644 --- a/internal/business/user/app/auth_app.go +++ b/internal/business/user/app/auth_app.go @@ -25,7 +25,7 @@ func (*authApp) SignIn(ctx context.Context, request *pb.SignInRequest) (*pb.Sign return nil, gerrors.ErrBadCode } - user, err := repo.UserRepo.GetByPhoneNumber(request.PhoneNumber) + user, err := repo.UserRepo.GetByPhoneNumber(ctx, request.PhoneNumber) if err != nil && !errors.Is(err, gerrors.ErrUserNotFound) { return nil, err } @@ -37,7 +37,7 @@ func (*authApp) SignIn(ctx context.Context, request *pb.SignInRequest) (*pb.Sign CreatedAt: time.Now(), UpdatedAt: time.Now(), } - err := repo.UserRepo.Save(user) + err := repo.UserRepo.Save(ctx, user) if err != nil { return nil, err } @@ -52,7 +52,7 @@ func (*authApp) SignIn(ctx context.Context, request *pb.SignInRequest) (*pb.Sign // 方便测试 token := "0" //token := util.RandString(40) - err = repo.AuthRepo.Set(user.ID, reply.DeviceId, domain.Device{ + err = repo.AuthRepo.Set(ctx, user.ID, reply.DeviceId, domain.Device{ Type: request.Device.Type, Token: token, Expire: time.Now().AddDate(0, 3, 0).Unix(), @@ -76,7 +76,7 @@ func verify(phoneNumber, code string) bool { // Auth 验证用户是否登录 func (*authApp) Auth(ctx context.Context, userID, deviceID uint64, token string) error { - device, err := repo.AuthRepo.Get(userID, deviceID) + device, err := repo.AuthRepo.Get(ctx, userID, deviceID) if errors.Is(err, redis.Nil) { return gerrors.ErrUnauthorized } diff --git a/internal/business/user/app/user_app.go b/internal/business/user/app/user_app.go index a10437f8..02be61eb 100644 --- a/internal/business/user/app/user_app.go +++ b/internal/business/user/app/user_app.go @@ -13,12 +13,12 @@ type userApp struct{} var UserApp = new(userApp) func (*userApp) Get(ctx context.Context, userID uint64) (*pb.User, error) { - user, err := repo.UserRepo.Get(userID) + user, err := repo.UserRepo.Get(ctx, userID) return user.ToProto(), err } func (*userApp) Update(ctx context.Context, userID uint64, req *pb.UpdateUserRequest) error { - u, err := repo.UserRepo.Get(userID) + u, err := repo.UserRepo.Get(ctx, userID) if err != nil { return err } @@ -32,11 +32,11 @@ func (*userApp) Update(ctx context.Context, userID uint64, req *pb.UpdateUserReq u.Extra = req.Extra u.UpdatedAt = time.Now() - return repo.UserRepo.Save(u) + return repo.UserRepo.Save(ctx, u) } func (*userApp) GetUsers(ctx context.Context, userIDs []uint64) (map[uint64]*pb.User, error) { - users, err := repo.UserRepo.GetByIDs(userIDs) + users, err := repo.UserRepo.GetByIDs(ctx, userIDs) if err != nil { return nil, err } @@ -49,7 +49,7 @@ func (*userApp) GetUsers(ctx context.Context, userIDs []uint64) (map[uint64]*pb. } func (*userApp) Search(ctx context.Context, key string) ([]*pb.User, error) { - users, err := repo.UserRepo.Search(key) + users, err := repo.UserRepo.Search(ctx, key) if err != nil { return nil, err } diff --git a/internal/business/user/repo/auth_repo.go b/internal/business/user/repo/auth_repo.go index 9b5252f3..05d62144 100644 --- a/internal/business/user/repo/auth_repo.go +++ b/internal/business/user/repo/auth_repo.go @@ -1,6 +1,7 @@ package repo import ( + "context" "encoding/json" "fmt" "strconv" @@ -16,9 +17,9 @@ type authRepo struct{} var AuthRepo = new(authRepo) -func (*authRepo) Get(userID, deviceID uint64) (*domain.Device, error) { +func (*authRepo) Get(ctx context.Context, userID, deviceID uint64) (*domain.Device, error) { key := fmt.Sprintf(AuthKey, userID) - bytes, err := db.RedisCli.HGet(key, strconv.FormatUint(deviceID, 10)).Bytes() + bytes, err := db.RedisCli.HGet(ctx, key, strconv.FormatUint(deviceID, 10)).Bytes() if err != nil { return nil, err } @@ -28,20 +29,20 @@ func (*authRepo) Get(userID, deviceID uint64) (*domain.Device, error) { return &device, err } -func (*authRepo) Set(userID, deviceID uint64, device domain.Device) error { +func (*authRepo) Set(ctx context.Context, userID, deviceID uint64, device domain.Device) error { bytes, err := json.Marshal(device) if err != nil { return err } key := fmt.Sprintf(AuthKey, userID) - _, err = db.RedisCli.HSet(key, strconv.FormatUint(deviceID, 10), bytes).Result() + _, err = db.RedisCli.HSet(ctx, key, strconv.FormatUint(deviceID, 10), bytes).Result() return err } -func (*authRepo) GetAll(userID uint64) (map[uint64]domain.Device, error) { +func (*authRepo) GetAll(ctx context.Context, userID uint64) (map[uint64]domain.Device, error) { key := fmt.Sprintf(AuthKey, userID) - result, err := db.RedisCli.HGetAll(key).Result() + result, err := db.RedisCli.HGetAll(ctx, key).Result() if err != nil { return nil, err } diff --git a/internal/business/user/repo/user_repo.go b/internal/business/user/repo/user_repo.go index 555c30be..4b709221 100644 --- a/internal/business/user/repo/user_repo.go +++ b/internal/business/user/repo/user_repo.go @@ -1,6 +1,7 @@ package repo import ( + "context" "errors" "gorm.io/gorm" @@ -15,18 +16,18 @@ type userRepo struct{} var UserRepo = new(userRepo) // Get 获取单个用户 -func (*userRepo) Get(userID uint64) (*domain.User, error) { +func (*userRepo) Get(ctx context.Context, userID uint64) (*domain.User, error) { var user domain.User - err := db.DB.First(&user, "id = ?", userID).Error + err := db.DB.WithContext(ctx).First(&user, "id = ?", userID).Error if errors.Is(err, gorm.ErrRecordNotFound) { return nil, gerrors.ErrUserNotFound } return &user, err } -func (*userRepo) GetByPhoneNumber(phoneNumber string) (*domain.User, error) { +func (*userRepo) GetByPhoneNumber(ctx context.Context, phoneNumber string) (*domain.User, error) { var user domain.User - err := db.DB.First(&user, "phone_number = ?", phoneNumber).Error + err := db.DB.WithContext(ctx).First(&user, "phone_number = ?", phoneNumber).Error if errors.Is(err, gorm.ErrRecordNotFound) { return nil, gerrors.ErrUserNotFound } @@ -34,17 +35,17 @@ func (*userRepo) GetByPhoneNumber(phoneNumber string) (*domain.User, error) { } // GetByIDs 获取多个用户 -func (*userRepo) GetByIDs(userIDs []uint64) ([]domain.User, error) { +func (*userRepo) GetByIDs(ctx context.Context, userIDs []uint64) ([]domain.User, error) { var users []domain.User - err := db.DB.Find(&users, "id in (?)", userIDs).Error + err := db.DB.WithContext(ctx).Find(&users, "id in (?)", userIDs).Error return users, err } // Search 搜索用户 -func (*userRepo) Search(key string) ([]domain.User, error) { +func (*userRepo) Search(ctx context.Context, key string) ([]domain.User, error) { var users []domain.User key = "%" + key + "%" - err := db.DB.Where("phone_number like ? or nickname like ?", key, key).Find(&users).Error + err := db.DB.WithContext(ctx).Where("phone_number like ? or nickname like ?", key, key).Find(&users).Error if err != nil { return nil, err } @@ -52,6 +53,6 @@ func (*userRepo) Search(key string) ([]domain.User, error) { } // Save 保存用户 -func (*userRepo) Save(user *domain.User) error { - return db.DB.Save(user).Error +func (*userRepo) Save(ctx context.Context, user *domain.User) error { + return db.DB.WithContext(ctx).Save(user).Error } diff --git a/internal/business/user/repo/user_repo_test.go b/internal/business/user/repo/user_repo_test.go index c6eebe0a..5a0afd0b 100644 --- a/internal/business/user/repo/user_repo_test.go +++ b/internal/business/user/repo/user_repo_test.go @@ -1,13 +1,14 @@ package repo import ( + "context" "testing" "gim/internal/business/user/domain" ) func Test_userRepo_Get(t *testing.T) { - user, err := UserRepo.Get(10000) + user, err := UserRepo.Get(context.Background(), 10000) if err != nil { t.Fatal(err) } @@ -15,7 +16,7 @@ func Test_userRepo_Get(t *testing.T) { } func Test_userRepo_Save(t *testing.T) { - err := UserRepo.Save(&domain.User{ + err := UserRepo.Save(context.Background(), &domain.User{ PhoneNumber: "1", Nickname: "1", Sex: 1, diff --git a/internal/connect/client_test.go b/internal/connect/client_test.go index 66067cae..a8a331aa 100644 --- a/internal/connect/client_test.go +++ b/internal/connect/client_test.go @@ -2,6 +2,7 @@ package connect import ( "bufio" + "encoding/json" "fmt" "io" "log" @@ -12,7 +13,6 @@ import ( "time" "github.com/gorilla/websocket" - jsoniter "github.com/json-iterator/go" "google.golang.org/protobuf/proto" "gim/pkg/codec" @@ -240,6 +240,6 @@ func getReply(message *pb.Message) *pb.Reply { } func jsonString(any any) string { - bytes, _ := jsoniter.Marshal(any) + bytes, _ := json.Marshal(any) return string(bytes) } diff --git a/internal/connect/mq.go b/internal/connect/mq.go index 818587bf..cf9097c4 100644 --- a/internal/connect/mq.go +++ b/internal/connect/mq.go @@ -1,10 +1,11 @@ package connect import ( + "context" "log/slog" "time" - "github.com/go-redis/redis" + "github.com/redis/go-redis/v9" "google.golang.org/protobuf/proto" "gim/config" @@ -15,13 +16,13 @@ import ( // StartSubscribe 启动MQ消息处理逻辑 func StartSubscribe() { - pushRoomPriorityChannel := db.RedisCli.Subscribe(mq.PushRoomPriorityTopic).Channel() - pushRoomChannel := db.RedisCli.Subscribe(mq.PushRoomTopic).Channel() + pushRoomPriorityChannel := db.RedisCli.Subscribe(context.TODO(), mq.PushRoomPriorityTopic).Channel() + pushRoomChannel := db.RedisCli.Subscribe(context.TODO(), mq.PushRoomTopic).Channel() for i := 0; i < config.Config.PushRoomSubscribeNum; i++ { go handlePushRoomMsg(pushRoomPriorityChannel, pushRoomChannel) } - pushAllChannel := db.RedisCli.Subscribe(mq.PushAllTopic).Channel() + pushAllChannel := db.RedisCli.Subscribe(context.TODO(), mq.PushAllTopic).Channel() for i := 0; i < config.Config.PushAllSubscribeNum; i++ { go handlePushAllMsg(pushAllChannel) } diff --git a/internal/logic/device/app/device.go b/internal/logic/device/app/device.go index 3bfd812f..bb49d799 100644 --- a/internal/logic/device/app/device.go +++ b/internal/logic/device/app/device.go @@ -25,38 +25,38 @@ func (*deviceApp) SignIn(ctx context.Context, request *pb.SignInRequest) error { return err } - device, err := repo.DeviceRepo.Get(request.DeviceId) + device, err := repo.DeviceRepo.Get(ctx, request.DeviceId) if err != nil { return err } device.UserID = request.UserId device.ConnectAddr = request.ConnectAddr device.ClientAddr = request.ClientAddr - err = repo.DeviceRepo.Save(device) + err = repo.DeviceRepo.Save(ctx, device) if err != nil { return err } - return repo.DeviceRepo.SetOnline(request.DeviceId) + return repo.DeviceRepo.SetOnline(ctx, request.DeviceId) } // Heartbeat 设备离线 -func (*deviceApp) Heartbeat(_ context.Context, userID, deviceID uint64) error { - return repo.DeviceRepo.SetOnline(deviceID) +func (*deviceApp) Heartbeat(ctx context.Context, userID, deviceID uint64) error { + return repo.DeviceRepo.SetOnline(ctx, deviceID) } // Offline 设备离线 -func (*deviceApp) Offline(_ context.Context, deviceID uint64, clientAddr string) error { - return repo.DeviceRepo.SetOffline(deviceID) +func (*deviceApp) Offline(ctx context.Context, deviceID uint64, clientAddr string) error { + return repo.DeviceRepo.SetOffline(ctx, deviceID) } // ListByUserID 获取用户所有在线设备 -func (*deviceApp) ListByUserID(_ context.Context, userID uint64) ([]domain.Device, error) { - return repo.DeviceRepo.ListByUserID(userID) +func (*deviceApp) ListByUserID(ctx context.Context, userID uint64) ([]domain.Device, error) { + return repo.DeviceRepo.ListByUserID(ctx, userID) } // Save 获取设备信息 -func (*deviceApp) Save(_ context.Context, pbdevice *pb.Device) (uint64, error) { +func (*deviceApp) Save(ctx context.Context, pbdevice *pb.Device) (uint64, error) { device := &domain.Device{ ID: pbdevice.Id, Type: pbdevice.Type, @@ -67,6 +67,6 @@ func (*deviceApp) Save(_ context.Context, pbdevice *pb.Device) (uint64, error) { BrandPushID: pbdevice.BranchPushId, } - err := repo.DeviceRepo.Save(device) + err := repo.DeviceRepo.Save(ctx, device) return device.ID, err } diff --git a/internal/logic/device/repo/device.go b/internal/logic/device/repo/device.go index be34a5ba..e52d8c58 100644 --- a/internal/logic/device/repo/device.go +++ b/internal/logic/device/repo/device.go @@ -1,6 +1,7 @@ package repo import ( + "context" "errors" "fmt" "time" @@ -18,9 +19,9 @@ var DeviceRepo = new(deviceRepo) type deviceRepo struct{} // Get 获取设备 -func (*deviceRepo) Get(deviceID uint64) (*domain.Device, error) { +func (*deviceRepo) Get(ctx context.Context, deviceID uint64) (*domain.Device, error) { var device domain.Device - err := db.DB.First(&device, "id = ?", deviceID).Error + err := db.DB.WithContext(ctx).First(&device, "id = ?", deviceID).Error if errors.Is(err, gorm.ErrRecordNotFound) { return nil, gerrors.ErrDeviceNotFound } @@ -28,20 +29,20 @@ func (*deviceRepo) Get(deviceID uint64) (*domain.Device, error) { } // Save 保存设备信息 -func (*deviceRepo) Save(device *domain.Device) error { - return db.DB.Save(&device).Error +func (*deviceRepo) Save(ctx context.Context, device *domain.Device) error { + return db.DB.WithContext(ctx).Save(&device).Error } // ListByUserID 获取用户设备 -func (r *deviceRepo) ListByUserID(userID uint64) ([]domain.Device, error) { +func (r *deviceRepo) ListByUserID(ctx context.Context, userID uint64) ([]domain.Device, error) { var devices []domain.Device - err := db.DB.Find(&devices, "user_id = ?", userID).Error + err := db.DB.WithContext(ctx).Find(&devices, "user_id = ?", userID).Error if err != nil { return nil, err } for i := range devices { - isOnline, err := r.GetIsOnline(devices[i].ID) + isOnline, err := r.GetIsOnline(ctx, devices[i].ID) if err != nil { return nil, err } @@ -53,22 +54,22 @@ func (r *deviceRepo) ListByUserID(userID uint64) ([]domain.Device, error) { const deviceStatus = "deviceStatus:%d" // SetOnline 设置在线 -func (*deviceRepo) SetOnline(deviceID uint64) error { +func (*deviceRepo) SetOnline(ctx context.Context, deviceID uint64) error { key := fmt.Sprintf(deviceStatus, deviceID) - _, err := db.RedisCli.Set(key, "", 12*time.Minute).Result() + _, err := db.RedisCli.Set(ctx, key, "", 12*time.Minute).Result() return err } // SetOffline 设置在线 -func (*deviceRepo) SetOffline(deviceID uint64) error { +func (*deviceRepo) SetOffline(ctx context.Context, deviceID uint64) error { key := fmt.Sprintf(deviceStatus, deviceID) - _, err := db.RedisCli.Del(key).Result() + _, err := db.RedisCli.Del(ctx, key).Result() return err } -func (*deviceRepo) GetIsOnline(deviceID uint64) (bool, error) { +func (*deviceRepo) GetIsOnline(ctx context.Context, deviceID uint64) (bool, error) { key := fmt.Sprintf(deviceStatus, deviceID) - _, err := db.RedisCli.Get(key).Result() + _, err := db.RedisCli.Get(ctx, key).Result() if errors.Is(err, redis.Nil) { return false, nil } diff --git a/internal/logic/device/repo/device_test.go b/internal/logic/device/repo/device_test.go index f26d4ab4..82dec18a 100644 --- a/internal/logic/device/repo/device_test.go +++ b/internal/logic/device/repo/device_test.go @@ -1,11 +1,12 @@ package repo import ( + "context" "testing" ) func Test_deviceRepo_Get(t *testing.T) { - device, err := DeviceRepo.Get(1) + device, err := DeviceRepo.Get(context.Background(), 1) t.Log(err) t.Log(device) } diff --git a/internal/logic/group/app/group.go b/internal/logic/group/app/group.go index 99e4126b..ddb262d8 100644 --- a/internal/logic/group/app/group.go +++ b/internal/logic/group/app/group.go @@ -24,7 +24,7 @@ func (*groupApp) Create(ctx context.Context, pbgroup *pb.Group) (uint64, error) Extra: pbgroup.Extra, Members: pbgroup.Members, } - err := repo.GroupRepo.Create(group) + err := repo.GroupRepo.Create(ctx, group) if err != nil { return 0, err } @@ -33,7 +33,7 @@ func (*groupApp) Create(ctx context.Context, pbgroup *pb.Group) (uint64, error) // Get 获取群组信息 func (*groupApp) Get(ctx context.Context, groupID uint64) (*pb.Group, error) { - group, err := repo.GroupRepo.Get(groupID) + group, err := repo.GroupRepo.Get(ctx, groupID) if err != nil { return nil, err } @@ -50,12 +50,12 @@ func (*groupApp) Update(ctx context.Context, pbgroup *pb.Group) error { Extra: pbgroup.Extra, Members: pbgroup.Members, } - return repo.GroupRepo.Save(group) + return repo.GroupRepo.Save(ctx, group) } // Push 发送群组消息 func (*groupApp) Push(ctx context.Context, request *pb.GroupPushRequest) (uint64, error) { - group, err := repo.GroupRepo.Get(request.GroupId) + group, err := repo.GroupRepo.Get(ctx, request.GroupId) if err != nil { return 0, err } diff --git a/internal/logic/group/repo/group.go b/internal/logic/group/repo/group.go index 95fa4947..c564bfb6 100644 --- a/internal/logic/group/repo/group.go +++ b/internal/logic/group/repo/group.go @@ -1,6 +1,7 @@ package repo import ( + "context" "errors" "fmt" "time" @@ -20,10 +21,10 @@ var GroupRepo = new(groupRepo) type groupRepo struct{} // Get 获取群组信息 -func (*groupRepo) Get(groupId uint64) (*domain.Group, error) { +func (*groupRepo) Get(ctx context.Context, groupId uint64) (*domain.Group, error) { key := fmt.Sprintf(GroupKey, groupId) var group domain.Group - err := db.RedisCli.GetAny(key, &group) + err := db.RedisCli.GetAny(ctx, key, &group) if err != nil && !errors.Is(err, redis.Nil) { return nil, err } @@ -31,7 +32,7 @@ func (*groupRepo) Get(groupId uint64) (*domain.Group, error) { return &group, nil } - err = db.DB.First(&group, "id = ?", groupId).Error + err = db.DB.WithContext(ctx).First(&group, "id = ?", groupId).Error if errors.Is(err, gorm.ErrRecordNotFound) { return nil, gerrors.ErrGroupNotFound } @@ -39,24 +40,24 @@ func (*groupRepo) Get(groupId uint64) (*domain.Group, error) { return nil, err } - err = db.RedisCli.SetAny(key, &group, 24*time.Hour) + err = db.RedisCli.SetAny(ctx, key, &group, 24*time.Hour) if err != nil { return nil, err } return &group, nil } -func (*groupRepo) Create(group *domain.Group) error { - return db.DB.Create(group).Error +func (*groupRepo) Create(ctx context.Context, group *domain.Group) error { + return db.DB.WithContext(ctx).Create(group).Error } // Save 修改群组信息 -func (*groupRepo) Save(group *domain.Group) error { - err := db.DB.Save(group).Error +func (*groupRepo) Save(ctx context.Context, group *domain.Group) error { + err := db.DB.WithContext(ctx).Save(group).Error if err != nil { return err } key := fmt.Sprintf(GroupKey, group.ID) - return db.RedisCli.Del(key).Err() + return db.RedisCli.Del(ctx, key).Err() } diff --git a/internal/logic/message/app/device_ack.go b/internal/logic/message/app/device_ack.go index 5aea2d69..24cf2616 100644 --- a/internal/logic/message/app/device_ack.go +++ b/internal/logic/message/app/device_ack.go @@ -12,7 +12,7 @@ type deviceACKApp struct{} // getMaxByUserId 根据用户id获取最大ack func (*deviceACKApp) getMaxByUserId(ctx context.Context, userId uint64) (uint64, error) { - acks, err := repo.DeviceACKRepo.Get(userId) + acks, err := repo.DeviceACKRepo.Get(ctx, userId) if err != nil { return 0, err } @@ -31,5 +31,5 @@ func (*deviceACKApp) MessageAck(ctx context.Context, userId, deviceId, ack uint6 if ack <= 0 { return nil } - return repo.DeviceACKRepo.Set(userId, deviceId, ack) + return repo.DeviceACKRepo.Set(ctx, userId, deviceId, ack) } diff --git a/internal/logic/message/app/message.go b/internal/logic/message/app/message.go index 2813aec6..7b9d85a7 100644 --- a/internal/logic/message/app/message.go +++ b/internal/logic/message/app/message.go @@ -37,7 +37,7 @@ func (a *messageApp) PushToUsers(ctx context.Context, userIDs []uint64, message Content: message.Content, CreatedAt: time.Unix(message.CreatedAt, 0), } - err := repo.MessageRepo.Save(&msg) + err := repo.MessageRepo.Save(ctx, &msg) if err != nil { return 0, err } @@ -45,7 +45,13 @@ func (a *messageApp) PushToUsers(ctx context.Context, userIDs []uint64, message } for _, userID := range userIDs { - err := a.PushToUser(ctx, userID, messageID, *message, isPersist) + msg := &connectpb.Message{ + RequestId: message.RequestId, + Command: message.Command, + Content: message.Content, + CreatedAt: message.CreatedAt, + } + err := a.PushToUser(ctx, userID, messageID, msg, isPersist) if err != nil { slog.Error("PushToUser", "error", err, "userID", userID) } @@ -53,38 +59,29 @@ func (a *messageApp) PushToUsers(ctx context.Context, userIDs []uint64, message return messageID, nil } -func (a *messageApp) PushToUser(ctx context.Context, userID, messageID uint64, message connectpb.Message, isPersist bool) error { +func (a *messageApp) PushToUser(ctx context.Context, userID, messageID uint64, message *connectpb.Message, isPersist bool) error { slog.Debug("PushToUser", "userID", userID, "messageID", messageID, "message", message) - var ( - seq uint64 - err error - ) - if isPersist { - seq, err = repo.SeqRepo.Incr(repo.SeqObjectTypeUser, userID) - if err != nil { - return err - } + if isPersist { userMessage := domain.UserMessage{ UserID: userID, - Seq: seq, MessageID: messageID, } - err = repo.UserMessageRepo.Create(&userMessage) + err := repo.UserMessageRepo.Create(ctx, &userMessage) if err != nil { return err } + message.Seq = userMessage.Seq } - message.Seq = seq devices, err := deviceapp.DeviceApp.ListByUserID(ctx, userID) if err != nil { return err } for i := range devices { - err = a.PushToDevice(ctx, &devices[i], &message) + err = a.PushToDevice(ctx, &devices[i], message) if err != nil { return err } @@ -125,7 +122,7 @@ func (*messageApp) PushToAll(ctx context.Context, req *pb.PushToAllRequest) erro if err != nil { return err } - return mq.Publish(mq.PushAllTopic, bytes) + return mq.Publish(ctx, mq.PushAllTopic, bytes) } // Sync 消息同步 @@ -149,5 +146,5 @@ func (a *messageApp) listByUserIdAndSeq(ctx context.Context, userId, seq uint64) return nil, false, err } } - return repo.UserMessageRepo.ListBySeq(userId, seq, pageSize) + return repo.UserMessageRepo.ListBySeq(ctx, userId, seq, pageSize) } diff --git a/internal/logic/message/repo/device_ack.go b/internal/logic/message/repo/device_ack.go index 153282cc..833ad399 100644 --- a/internal/logic/message/repo/device_ack.go +++ b/internal/logic/message/repo/device_ack.go @@ -1,6 +1,7 @@ package repo import ( + "context" "fmt" "strconv" @@ -14,15 +15,15 @@ type deviceACKRepo struct{} var DeviceACKRepo = new(deviceACKRepo) // Set 设置设备同步序列号 -func (c *deviceACKRepo) Set(userId, deviceId, ack uint64) error { +func (c *deviceACKRepo) Set(ctx context.Context, userId, deviceId, ack uint64) error { key := fmt.Sprintf(DeviceACKKey, userId) - _, err := db.RedisCli.HSet(key, strconv.FormatUint(deviceId, 10), strconv.FormatUint(ack, 10)).Result() + _, err := db.RedisCli.HSet(ctx, key, strconv.FormatUint(deviceId, 10), strconv.FormatUint(ack, 10)).Result() return err } -func (c *deviceACKRepo) Get(userId uint64) (map[uint64]uint64, error) { +func (c *deviceACKRepo) Get(ctx context.Context, userId uint64) (map[uint64]uint64, error) { key := fmt.Sprintf(DeviceACKKey, userId) - result, err := db.RedisCli.HGetAll(key).Result() + result, err := db.RedisCli.HGetAll(ctx, key).Result() if err != nil { return nil, err } diff --git a/internal/logic/message/repo/message.go b/internal/logic/message/repo/message.go index fad65eab..98351c0d 100644 --- a/internal/logic/message/repo/message.go +++ b/internal/logic/message/repo/message.go @@ -1,6 +1,8 @@ package repo import ( + "context" + "gim/internal/logic/message/domain" "gim/pkg/db" ) @@ -9,12 +11,12 @@ var MessageRepo = new(messageRepo) type messageRepo struct{} -func (*messageRepo) Save(message *domain.Message) error { - return db.DB.Create(&message).Error +func (*messageRepo) Save(ctx context.Context, message *domain.Message) error { + return db.DB.WithContext(ctx).Create(&message).Error } -func (*messageRepo) GetByIDs(ids []int64) ([]domain.Message, error) { +func (*messageRepo) GetByIDs(ctx context.Context, ids []int64) ([]domain.Message, error) { var messages []domain.Message - err := db.DB.Find(&messages, "id in (?)", ids).Error + err := db.DB.WithContext(ctx).Find(&messages, "id in (?)", ids).Error return messages, err } diff --git a/internal/logic/message/repo/message_test.go b/internal/logic/message/repo/message_test.go index ce7f27e3..94374d3f 100644 --- a/internal/logic/message/repo/message_test.go +++ b/internal/logic/message/repo/message_test.go @@ -1,6 +1,7 @@ package repo import ( + "context" "testing" "gim/internal/logic/message/domain" @@ -12,12 +13,12 @@ func Test_messageRepo_Save(t *testing.T) { Command: 1, Content: []byte("hello world"), } - err := MessageRepo.Save(&msg) + err := MessageRepo.Save(context.Background(), &msg) t.Log(err) } func Test_messageRepo_GetByIDs(t *testing.T) { - msgs, err := MessageRepo.GetByIDs([]int64{1}) + msgs, err := MessageRepo.GetByIDs(context.Background(), []int64{1}) t.Log(err) t.Log(msgs) } diff --git a/internal/logic/message/repo/seq.go b/internal/logic/message/repo/seq.go index f1ec9327..59d75347 100644 --- a/internal/logic/message/repo/seq.go +++ b/internal/logic/message/repo/seq.go @@ -1,6 +1,7 @@ package repo import ( + "context" "database/sql" "errors" @@ -17,23 +18,23 @@ type seqRepo struct{} var SeqRepo = new(seqRepo) // Incr 自增seq,并且获取自增后的值 -func (*seqRepo) Incr(objectType int, objectId uint64) (uint64, error) { +func (*seqRepo) Incr(ctx context.Context, objectType int, objectId uint64) (uint64, error) { tx := db.DB.Begin() defer tx.Rollback() var seq uint64 - err := tx.Raw("select seq from seq where object_type = ? and object_id = ? for update", objectType, objectId). + err := tx.WithContext(ctx).Raw("select seq from seq where object_type = ? and object_id = ? for update", objectType, objectId). Row().Scan(&seq) if err != nil && !errors.Is(err, sql.ErrNoRows) { return 0, err } if errors.Is(err, sql.ErrNoRows) { - err = tx.Exec("insert into seq (object_type,object_id,seq) values (?,?,?)", objectType, objectId, seq+1).Error + err = tx.WithContext(ctx).Exec("insert into seq (object_type,object_id,seq) values (?,?,?)", objectType, objectId, seq+1).Error if err != nil { return 0, err } } else { - err = tx.Exec("update seq set seq = seq + 1 where object_type = ? and object_id = ?", objectType, objectId).Error + err = tx.WithContext(ctx).Exec("update seq set seq = seq + 1 where object_type = ? and object_id = ?", objectType, objectId).Error if err != nil { return 0, err } diff --git a/internal/logic/message/repo/seq_test.go b/internal/logic/message/repo/seq_test.go index b9f4960e..5feef47a 100644 --- a/internal/logic/message/repo/seq_test.go +++ b/internal/logic/message/repo/seq_test.go @@ -1,10 +1,11 @@ package repo import ( + "context" "fmt" "testing" ) func Test_seqDao_Incr(t *testing.T) { - fmt.Println(SeqRepo.Incr(1, 5)) + fmt.Println(SeqRepo.Incr(context.Background(), 1, 5)) } diff --git a/internal/logic/message/repo/user_message.go b/internal/logic/message/repo/user_message.go index 9969d65c..04a95c6a 100644 --- a/internal/logic/message/repo/user_message.go +++ b/internal/logic/message/repo/user_message.go @@ -1,6 +1,8 @@ package repo import ( + "context" + "gim/internal/logic/message/domain" "gim/pkg/db" ) @@ -10,28 +12,30 @@ var UserMessageRepo = new(userMessageRepo) type userMessageRepo struct{} // Create 创建 -func (d *userMessageRepo) Create(message *domain.UserMessage) error { - return db.DB.Create(&message).Error -} - -// ListBySeq 根据类型和id查询大于序号大于seq的消息 -func (d *userMessageRepo) ListBySeq(userId, seq uint64, limit int64) ([]domain.UserMessage, bool, error) { - DB := db.DB.Table("user_message"). - Where("user_id = ? and seq> ?", userId, seq) - - var count int64 - err := DB.Count(&count).Error +func (d *userMessageRepo) Create(ctx context.Context, message *domain.UserMessage) error { + seq, err := SeqRepo.Incr(ctx, SeqObjectTypeUser, message.UserID) if err != nil { - return nil, false, err - } - if count == 0 { - return nil, false, nil + return err } + message.Seq = seq + return db.DB.WithContext(ctx).Create(&message).Error +} +// ListBySeq 根据类型和id查询大于序号大于seq的消息 +func (d *userMessageRepo) ListBySeq(ctx context.Context, userId, seq uint64, limit int64) ([]domain.UserMessage, bool, error) { var messages []domain.UserMessage - err = DB.Limit(int(limit)).Preload("Message").Find(&messages).Error + limitint := int(limit) + err := db.DB.WithContext(ctx).Table("user_message"). + Where("user_id = ? and seq> ?", userId, seq). + Limit(limitint + 1). + Preload("Message"). + Find(&messages).Error if err != nil { return nil, false, err } - return messages, count> limit, nil + hasMore := len(messages)> limitint + if hasMore { + messages = messages[:limitint] + } + return messages, hasMore, nil } diff --git a/internal/logic/message/repo/user_message_test.go b/internal/logic/message/repo/user_message_test.go index c56f3903..3a8412d9 100644 --- a/internal/logic/message/repo/user_message_test.go +++ b/internal/logic/message/repo/user_message_test.go @@ -1,6 +1,7 @@ package repo import ( + "context" "testing" "gim/internal/logic/message/domain" @@ -12,11 +13,11 @@ func TestUserMessageDao_Add(t *testing.T) { Seq: 1, MessageID: 1, } - t.Log(UserMessageRepo.Create(&message)) + t.Log(UserMessageRepo.Create(context.Background(), &message)) } func TestUserMessageDao_ListByUserIdAndUserSeq(t *testing.T) { - messages, hasMore, err := UserMessageRepo.ListBySeq(1, 0, 100) + messages, hasMore, err := UserMessageRepo.ListBySeq(context.Background(), 1, 0, 1) if err != nil { t.Fatal(err) } diff --git a/internal/logic/room/app.go b/internal/logic/room/app.go index 5169f4d1..c1006ee5 100644 --- a/internal/logic/room/app.go +++ b/internal/logic/room/app.go @@ -36,7 +36,7 @@ func (s *app) Push(ctx context.Context, req *pb.PushRoomRequest) error { if req.IsPriority { topicName = mq.PushRoomPriorityTopic } - return mq.Publish(topicName, buf) + return mq.Publish(ctx, topicName, buf) } // SubscribeRoom 订阅房间 diff --git a/pkg/mq/mq.go b/pkg/mq/mq.go index 4cc4f5e1..eb8aefb0 100644 --- a/pkg/mq/mq.go +++ b/pkg/mq/mq.go @@ -1,6 +1,8 @@ package mq import ( + "context" + "gim/pkg/db" ) @@ -10,7 +12,7 @@ const ( PushAllTopic = "push_all_topic" // 全服消息队列 ) -func Publish(topic string, bytes []byte) error { - _, err := db.RedisCli.Publish(topic, bytes).Result() +func Publish(ctx context.Context, topic string, bytes []byte) error { + _, err := db.RedisCli.Publish(ctx, topic, bytes).Result() return err } diff --git a/pkg/uredis/redis.go b/pkg/uredis/redis.go index 0c169258..6b65d493 100644 --- a/pkg/uredis/redis.go +++ b/pkg/uredis/redis.go @@ -1,11 +1,12 @@ package uredis import ( + "context" "encoding/json" "log/slog" "time" - "github.com/go-redis/redis" + "github.com/redis/go-redis/v9" ) type Client struct { @@ -19,7 +20,7 @@ func NewClient(addr, password string) *Client { Password: password, }) - _, err := client.Ping().Result() + _, err := client.Ping(context.Background()).Result() if err != nil { slog.Error("redis ping error", "error", err) panic(err) @@ -28,18 +29,18 @@ func NewClient(addr, password string) *Client { } // SetAny 将指定值设置到redis中,使用json的序列化方式 -func (c *Client) SetAny(key string, value any, duration time.Duration) error { +func (c *Client) SetAny(ctx context.Context, key string, value any, duration time.Duration) error { bytes, err := json.Marshal(value) if err != nil { return err } - return c.Set(key, bytes, duration).Err() + return c.Set(ctx, key, bytes, duration).Err() } // GetAny 从redis中读取指定值,使用json的反序列化方式 -func (c *Client) GetAny(key string, value any) error { - bytes, err := c.Get(key).Bytes() +func (c *Client) GetAny(ctx context.Context, key string, value any) error { + bytes, err := c.Get(ctx, key).Bytes() if err != nil { return err } From c18ba10009d5f208b5da9346ffbc41aff789d955 Mon Sep 17 00:00:00 2001 From: alber Date: 2025年9月27日 14:26:38 +0800 Subject: [PATCH 5/6] =?UTF-8?q?1.=E5=90=8C=E6=AD=A5=E6=9B=B4=E6=96=B0?= =?UTF-8?q?=E6=96=87=E6=A1=A3=202.ack=E6=8C=81=E4=B9=85=E5=8C=96=E4=BF=9D?= =?UTF-8?q?=E5=AD=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 30 +-- deploy/k8s/sql/create_table.sql | 19 +- go.mod | 6 +- go.sum | 4 + internal/logic/message/api/message_ext.go | 11 +- internal/logic/message/api/message_int.go | 5 - internal/logic/message/app/device_ack.go | 8 +- internal/logic/message/domain/device_ack.go | 11 + internal/logic/message/repo/device_ack.go | 37 ++- .../logic/message/repo/device_ack_test.go | 23 ++ pkg/db/db.go | 4 +- pkg/protocol/pb/logicpb/message.ext.pb.go | 199 ++++++++++------ .../pb/logicpb/message.ext_grpc.pb.go | 43 +++- pkg/protocol/pb/logicpb/message.int.pb.go | 213 +++++------------- .../pb/logicpb/message.int_grpc.pb.go | 40 ---- pkg/protocol/proto/logic/message.ext.proto | 7 + pkg/protocol/proto/logic/message.int.proto | 8 - sql/create_table.sql | 19 +- 18 files changed, 359 insertions(+), 328 deletions(-) create mode 100644 internal/logic/message/domain/device_ack.go create mode 100644 internal/logic/message/repo/device_ack_test.go diff --git a/README.md b/README.md index a092dc88..c8c944c3 100644 --- a/README.md +++ b/README.md @@ -6,9 +6,9 @@ gim是一个即时通讯服务器,代码全部使用golang完成。主要特 4.单聊,群聊,以及房间聊天场景 5.支持服务水平扩展 6.使用领域驱动设计 -7.支持裸机部署和k8s部署 +7.支持docker compose和k8s部署 gim可以作为以业务服务器的一个组件,为现有业务服务器提供im的能力,业务服务器 -只需要实现user.int.proto协议中定义的GRPC接口,为gim服务提供基本的用户功能即可 +只需要实现user.int.proto协议中定义的GRPC接口,为gim服务提供基本的鉴权功能即可 ### 使用技术: 数据库:MySQL+Redis 通讯框架:GRPC @@ -34,15 +34,16 @@ sql: 项目sql文件 维持与客户端的TCP和WebSocket长连接,心跳,以及TCP拆包粘包,消息编解码 2.logic 设备信息,好友信息,群组信息管理,消息转发逻辑 -3.user -一个简单的用户服务,可以根据自己的业务需求,进行扩展,但是前提是,你的业务服务器实现了user.int.proto接口 +3.business +一个简单的业务服务,可以根据自己的业务需求,进行扩展,但是前提是,你的业务服务器实现了user.int.proto的Auth接口 ### 客户端接入流程 -1.调用RegisterDevice接口,完成设备注册,获取设备ID(device_id),注意,一个设备只需完成一次注册即可,后续如果本地有device_id,就不需要注册了,举个例子,如果是APP第一次安装,就需要调用这个接口,后面即便是换账号登录,也不需要重新注册。 -2.调用SignIn接口,完成账户登录,获取账户登录的token。 -3.建立长连接,使用步骤2拿到的token,完成长连接登录。 +1. 调用business.UserExtService.SignIn接口,进行登录,获取device_id,user_id以及token +2. 建立长连接,使用步骤1拿到的device_id,user_id,token,完成长连接登录。 如果是web端,需要调用建立WebSocket时,如果是APP端,就需要建立TCP长连接。 在完成建立TCP长连接时,第一个包应该是长连接登录包(SignInInput),如果信息无误,客户端就会成功建立长连接。 -4.使用长连接发送消息同步包(SyncInput),完成离线消息同步,注意:seq字段是客户端接收到消息的最大同步序列号,如果用户是换设备登录或者第一次登录,seq应该传0。 +3. 调用logic.MessageExtService.Sync,完成离线消息同步 +注意:seq字段是客户端接收到消息的最大同步序列号,如果用户是换设备登录或者第一次登录,seq应该传0。 + 接下来,用户可以使用LogicExt.SendMessage接口来发送消息,消息接收方可以使用长连接接收到对应的消息。 ### 单用户多设备支持,离线消息同步 每个用户都会维护一个自增的序列号,当用户A给用户B发送消息是,首先会获取A的最大序列号,设置为这条消息的seq,持久化到用户A的消息列表, @@ -64,18 +65,5 @@ sql: 项目sql文件 采用写扩散,群组成员信息持久化到数据库保存。支持消息离线同步。 #### 房间: 采用读扩散,会将消息短暂的保存到Redis,长连接登录消息同步不会同步离线消息。 -### 核心流程时序图 -#### 长连接登录 -![登录.png](https://upload-images.jianshu.io/upload_images/5760439-2e54d3c5dd0a44c1.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240) -#### 离线消息同步 -![离线消息同步.png](https://upload-images.jianshu.io/upload_images/5760439-aa513ea0de851e12.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240) -#### 心跳 -![心跳.png](https://upload-images.jianshu.io/upload_images/5760439-26d491374da3843b.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240) -#### 消息单发 -c1.d1和c1.d2分别表示c1用户的两个设备d1和d2,c2.d3和c2.d4同理 -![消息单发.png](https://upload-images.jianshu.io/upload_images/5760439-35f1a91c8d7fffa6.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240) -#### 群组消息群发 -c1,c2.c3表示一个群组中的三个用户 -![消息群发.png](https://upload-images.jianshu.io/upload_images/5760439-47a87c45b899b3f9.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240) ### github https://github.com/alberliu/gim diff --git a/deploy/k8s/sql/create_table.sql b/deploy/k8s/sql/create_table.sql index 1c66ec50..08717df2 100644 --- a/deploy/k8s/sql/create_table.sql +++ b/deploy/k8s/sql/create_table.sql @@ -42,6 +42,23 @@ CREATE TABLE `device` ( ) ENGINE=InnoDB AUTO_INCREMENT=10000 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin COMMENT='设备'; /*!40101 SET character_set_client = @saved_cs_client */; +-- +-- Table structure for table `device_ack` +-- + +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `device_ack` ( + `device_id` bigint unsigned NOT NULL COMMENT '设备ID', + `created_at` datetime NOT NULL COMMENT '创建时间', + `updated_at` datetime NOT NULL COMMENT '更新时间', + `user_id` bigint unsigned NOT NULL COMMENT '用户ID', + `ack` bigint unsigned NOT NULL COMMENT '序列号', + PRIMARY KEY (`device_id`), + KEY `idx_user_id` (`user_id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin COMMENT='ack'; +/*!40101 SET character_set_client = @saved_cs_client */; + -- -- Table structure for table `friend` -- @@ -160,4 +177,4 @@ PARTITIONS 8 */; /*!40014 SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS */; /*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */; --- Dump completed on 2025年09月07日 21:47:54 +-- Dump completed on 2025年09月27日 13:25:11 diff --git a/go.mod b/go.mod index eef2d15a..b88f906b 100644 --- a/go.mod +++ b/go.mod @@ -1,6 +1,6 @@ module gim -go 1.23.8 +go 1.25.1 require ( github.com/gin-gonic/gin v1.10.0 @@ -12,7 +12,7 @@ require ( google.golang.org/protobuf v1.36.6 gopkg.in/natefinch/lumberjack.v2 v2.2.1 gorm.io/driver/mysql v1.5.7 - gorm.io/gorm v1.25.12 + gorm.io/gorm v1.31.0 k8s.io/apimachinery v0.32.3 k8s.io/client-go v0.32.3 ) @@ -75,7 +75,7 @@ require ( golang.org/x/oauth2 v0.25.0 // indirect golang.org/x/sys v0.29.0 // indirect golang.org/x/term v0.28.0 // indirect - golang.org/x/text v0.24.0 // indirect + golang.org/x/text v0.29.0 // indirect golang.org/x/time v0.7.0 // indirect google.golang.org/genproto v0.0.0-20211207154714-918901c715cf // indirect gopkg.in/evanphx/json-patch.v4 v4.12.0 // indirect diff --git a/go.sum b/go.sum index 26f67b05..fe18f0d4 100644 --- a/go.sum +++ b/go.sum @@ -302,6 +302,8 @@ golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.24.0 h1:dd5Bzh4yt5KYA8f9CJHCP4FB4D51c2c6JvN37xJJkJ0= golang.org/x/text v0.24.0/go.mod h1:L8rBsPeo2pSS+xqN0d5u2ikmjtmoJbDBT1b7nHvFCdU= +golang.org/x/text v0.29.0 h1:1neNs90w9YzJ9BocxfsQNHKuAT4pkghyXc4nhZ6sJvk= +golang.org/x/text v0.29.0/go.mod h1:7MhJOA9CD2qZyOKYazxdYMF85OwPdEr9jTtBpO7ydH4= 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= @@ -374,6 +376,8 @@ gorm.io/driver/mysql v1.5.7/go.mod h1:sEtPWMiqiN1N1cMXoXmBbd8C6/l+TESwriotuRRpkD gorm.io/gorm v1.25.7/go.mod h1:hbnx/Oo0ChWMn1BIhpy1oYozzpM15i4YPuHDmfYtwg8= gorm.io/gorm v1.25.12 h1:I0u8i2hWQItBq1WfE0o2+WuL9+8L21K9e2HHSTE/0f8= gorm.io/gorm v1.25.12/go.mod h1:xh7N7RHfYlNc5EmcI/El95gXusucDrQnHXe0+CgWcLQ= +gorm.io/gorm v1.31.0 h1:0VlycGreVhK7RF/Bwt51Fk8v0xLiiiFdbGDPIZQ7mJY= +gorm.io/gorm v1.31.0/go.mod h1:XyQVbO2k6YkOis7C2437jSit3SsDK72s7n7rsSHd+Gs= honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= k8s.io/api v0.32.3 h1:Hw7KqxRusq+6QSplE3NYG4MBxZw1BZnq4aP4cJVINls= diff --git a/internal/logic/message/api/message_ext.go b/internal/logic/message/api/message_ext.go index d6cb4322..0edbfe1d 100644 --- a/internal/logic/message/api/message_ext.go +++ b/internal/logic/message/api/message_ext.go @@ -3,6 +3,8 @@ package api import ( "context" + "google.golang.org/protobuf/types/known/emptypb" + "gim/internal/logic/message/app" "gim/pkg/md" pb "gim/pkg/protocol/pb/logicpb" @@ -12,7 +14,14 @@ type MessageExtService struct { pb.UnsafeMessageExtServiceServer } -func (m MessageExtService) Sync(ctx context.Context, request *pb.SyncRequest) (*pb.SyncReply, error) { +func (*MessageExtService) Sync(ctx context.Context, request *pb.SyncRequest) (*pb.SyncReply, error) { userID := md.GetUserID(ctx) return app.MessageApp.Sync(ctx, userID, request.Seq) } + +// MessageACK 设备收到消息ack +func (*MessageExtService) MessageACK(ctx context.Context, request *pb.MessageACKRequest) (*emptypb.Empty, error) { + userID := md.GetUserID(ctx) + deviceID := md.GetDeviceID(ctx) + return &emptypb.Empty{}, app.DeviceACKApp.MessageAck(ctx, userID, deviceID, request.DeviceAck) +} diff --git a/internal/logic/message/api/message_int.go b/internal/logic/message/api/message_int.go index 8277eb66..b98b7502 100644 --- a/internal/logic/message/api/message_int.go +++ b/internal/logic/message/api/message_int.go @@ -14,11 +14,6 @@ type MessageIntService struct { pb.UnsafeMessageIntServiceServer } -// MessageACK 设备收到消息ack -func (*MessageIntService) MessageACK(ctx context.Context, request *pb.MessageACKRequest) (*emptypb.Empty, error) { - return &emptypb.Empty{}, app.DeviceACKApp.MessageAck(ctx, request.UserId, request.DeviceId, request.DeviceAck) -} - // PushToUsers 推送 func (*MessageIntService) PushToUsers(ctx context.Context, request *pb.PushToUsersRequest) (*pb.PushToUsersReply, error) { message := &connectpb.Message{ diff --git a/internal/logic/message/app/device_ack.go b/internal/logic/message/app/device_ack.go index 24cf2616..244686de 100644 --- a/internal/logic/message/app/device_ack.go +++ b/internal/logic/message/app/device_ack.go @@ -12,15 +12,15 @@ type deviceACKApp struct{} // getMaxByUserId 根据用户id获取最大ack func (*deviceACKApp) getMaxByUserId(ctx context.Context, userId uint64) (uint64, error) { - acks, err := repo.DeviceACKRepo.Get(ctx, userId) + acks, err := repo.DeviceACKRepo.List(ctx, userId) if err != nil { return 0, err } var max uint64 = 0 - for i := range acks { - if acks[i]> max { - max = acks[i] + for _, ack := range acks { + if ack.ACK> max { + max = ack.ACK } } return max, nil diff --git a/internal/logic/message/domain/device_ack.go b/internal/logic/message/domain/device_ack.go new file mode 100644 index 00000000..29e49274 --- /dev/null +++ b/internal/logic/message/domain/device_ack.go @@ -0,0 +1,11 @@ +package domain + +import "time" + +type DeviceACK struct { + DeviceID uint64 // 设备ID + CreatedAt time.Time // 创建时间 + UpdatedAt time.Time // 更新时间 + UserID uint64 // 用户ID + ACK uint64 // ack +} diff --git a/internal/logic/message/repo/device_ack.go b/internal/logic/message/repo/device_ack.go index 833ad399..d3d1f44d 100644 --- a/internal/logic/message/repo/device_ack.go +++ b/internal/logic/message/repo/device_ack.go @@ -2,37 +2,30 @@ package repo import ( "context" - "fmt" - "strconv" + "gorm.io/gorm" + "gorm.io/gorm/clause" + + "gim/internal/logic/message/domain" "gim/pkg/db" ) -const DeviceACKKey = "device_ack:%d" - type deviceACKRepo struct{} var DeviceACKRepo = new(deviceACKRepo) // Set 设置设备同步序列号 -func (c *deviceACKRepo) Set(ctx context.Context, userId, deviceId, ack uint64) error { - key := fmt.Sprintf(DeviceACKKey, userId) - _, err := db.RedisCli.HSet(ctx, key, strconv.FormatUint(deviceId, 10), strconv.FormatUint(ack, 10)).Result() - return err -} - -func (c *deviceACKRepo) Get(ctx context.Context, userId uint64) (map[uint64]uint64, error) { - key := fmt.Sprintf(DeviceACKKey, userId) - result, err := db.RedisCli.HGetAll(ctx, key).Result() - if err != nil { - return nil, err +func (c *deviceACKRepo) Set(ctx context.Context, userID, deviceID, ack uint64) error { + deviceACK := &domain.DeviceACK{ + DeviceID: deviceID, + UserID: userID, + ACK: ack, } + return db.DB.WithContext(ctx).Clauses(clause.OnConflict{ + DoUpdates: clause.AssignmentColumns([]string{"ack", "updated_at"}), + }).Create(deviceACK).Error +} - acks := make(map[uint64]uint64, len(result)) - for k, v := range result { - deviceId, _ := strconv.ParseUint(k, 10, 64) - ack, _ := strconv.ParseUint(v, 10, 64) - acks[deviceId] = ack - } - return acks, nil +func (c *deviceACKRepo) List(ctx context.Context, userID uint64) ([]domain.DeviceACK, error) { + return gorm.G[domain.DeviceACK](db.DB).Where("user_id = ?", userID).Find(ctx) } diff --git a/internal/logic/message/repo/device_ack_test.go b/internal/logic/message/repo/device_ack_test.go new file mode 100644 index 00000000..c73359e8 --- /dev/null +++ b/internal/logic/message/repo/device_ack_test.go @@ -0,0 +1,23 @@ +package repo + +import ( + "context" + "testing" +) + +func Test_deviceACKRepo_Set(t *testing.T) { + err := DeviceACKRepo.Set(context.TODO(), 1, 1, 2) + if err != nil { + t.Fatal(err) + } +} + +func Test_deviceACKRepo_List(t *testing.T) { + acks, err := DeviceACKRepo.List(context.TODO(), 1) + if err != nil { + t.Fatal(err) + } + for _, ack := range acks { + t.Log(ack) + } +} diff --git a/pkg/db/db.go b/pkg/db/db.go index d60e5436..7acd14f5 100644 --- a/pkg/db/db.go +++ b/pkg/db/db.go @@ -17,11 +17,11 @@ var ( ) func init() { - DB = NewDB(config.Config.MySQL) + DB = newDB(config.Config.MySQL) RedisCli = uredis.NewClient(config.Config.RedisHost, config.Config.RedisPassword) } -func NewDB(dsn string) *gorm.DB { +func newDB(dsn string) *gorm.DB { db, err := gorm.Open( mysql.Open(dsn), &gorm.Config{ diff --git a/pkg/protocol/pb/logicpb/message.ext.pb.go b/pkg/protocol/pb/logicpb/message.ext.pb.go index 067545cc..120e86af 100644 --- a/pkg/protocol/pb/logicpb/message.ext.pb.go +++ b/pkg/protocol/pb/logicpb/message.ext.pb.go @@ -10,6 +10,7 @@ import ( connectpb "gim/pkg/protocol/pb/connectpb" protoreflect "google.golang.org/protobuf/reflect/protoreflect" protoimpl "google.golang.org/protobuf/runtime/protoimpl" + emptypb "google.golang.org/protobuf/types/known/emptypb" reflect "reflect" sync "sync" ) @@ -123,6 +124,53 @@ func (x *SyncReply) GetHasMore() bool { return false } +type MessageACKRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + DeviceAck uint64 `protobuf:"varint,1,opt,name=device_ack,json=deviceAck,proto3" json:"device_ack,omitempty"` // 设备收到消息的确认号 +} + +func (x *MessageACKRequest) Reset() { + *x = MessageACKRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_logic_message_ext_proto_msgTypes[2] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *MessageACKRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*MessageACKRequest) ProtoMessage() {} + +func (x *MessageACKRequest) ProtoReflect() protoreflect.Message { + mi := &file_logic_message_ext_proto_msgTypes[2] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use MessageACKRequest.ProtoReflect.Descriptor instead. +func (*MessageACKRequest) Descriptor() ([]byte, []int) { + return file_logic_message_ext_proto_rawDescGZIP(), []int{2} +} + +func (x *MessageACKRequest) GetDeviceAck() uint64 { + if x != nil { + return x.DeviceAck + } + return 0 +} + type User struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -138,7 +186,7 @@ type User struct { func (x *User) Reset() { *x = User{} if protoimpl.UnsafeEnabled { - mi := &file_logic_message_ext_proto_msgTypes[2] + mi := &file_logic_message_ext_proto_msgTypes[3] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -151,7 +199,7 @@ func (x *User) String() string { func (*User) ProtoMessage() {} func (x *User) ProtoReflect() protoreflect.Message { - mi := &file_logic_message_ext_proto_msgTypes[2] + mi := &file_logic_message_ext_proto_msgTypes[3] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -164,7 +212,7 @@ func (x *User) ProtoReflect() protoreflect.Message { // Deprecated: Use User.ProtoReflect.Descriptor instead. func (*User) Descriptor() ([]byte, []int) { - return file_logic_message_ext_proto_rawDescGZIP(), []int{2} + return file_logic_message_ext_proto_rawDescGZIP(), []int{3} } func (x *User) GetUserId() uint64 { @@ -216,7 +264,7 @@ type UserMessagePush struct { func (x *UserMessagePush) Reset() { *x = UserMessagePush{} if protoimpl.UnsafeEnabled { - mi := &file_logic_message_ext_proto_msgTypes[3] + mi := &file_logic_message_ext_proto_msgTypes[4] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -229,7 +277,7 @@ func (x *UserMessagePush) String() string { func (*UserMessagePush) ProtoMessage() {} func (x *UserMessagePush) ProtoReflect() protoreflect.Message { - mi := &file_logic_message_ext_proto_msgTypes[3] + mi := &file_logic_message_ext_proto_msgTypes[4] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -242,7 +290,7 @@ func (x *UserMessagePush) ProtoReflect() protoreflect.Message { // Deprecated: Use UserMessagePush.ProtoReflect.Descriptor instead. func (*UserMessagePush) Descriptor() ([]byte, []int) { - return file_logic_message_ext_proto_rawDescGZIP(), []int{3} + return file_logic_message_ext_proto_rawDescGZIP(), []int{4} } func (x *UserMessagePush) GetFromUser() *User { @@ -280,7 +328,7 @@ type GroupMessagePush struct { func (x *GroupMessagePush) Reset() { *x = GroupMessagePush{} if protoimpl.UnsafeEnabled { - mi := &file_logic_message_ext_proto_msgTypes[4] + mi := &file_logic_message_ext_proto_msgTypes[5] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -293,7 +341,7 @@ func (x *GroupMessagePush) String() string { func (*GroupMessagePush) ProtoMessage() {} func (x *GroupMessagePush) ProtoReflect() protoreflect.Message { - mi := &file_logic_message_ext_proto_msgTypes[4] + mi := &file_logic_message_ext_proto_msgTypes[5] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -306,7 +354,7 @@ func (x *GroupMessagePush) ProtoReflect() protoreflect.Message { // Deprecated: Use GroupMessagePush.ProtoReflect.Descriptor instead. func (*GroupMessagePush) Descriptor() ([]byte, []int) { - return file_logic_message_ext_proto_rawDescGZIP(), []int{4} + return file_logic_message_ext_proto_rawDescGZIP(), []int{5} } func (x *GroupMessagePush) GetFromUser() *User { @@ -335,46 +383,55 @@ var File_logic_message_ext_proto protoreflect.FileDescriptor var file_logic_message_ext_proto_rawDesc = []byte{ 0x0a, 0x17, 0x6c, 0x6f, 0x67, 0x69, 0x63, 0x2f, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x2e, 0x65, 0x78, 0x74, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x05, 0x6c, 0x6f, 0x67, 0x69, 0x63, - 0x1a, 0x19, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x2f, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, - 0x74, 0x2e, 0x65, 0x78, 0x74, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0x1f, 0x0a, 0x0b, 0x53, - 0x79, 0x6e, 0x63, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x10, 0x0a, 0x03, 0x73, 0x65, - 0x71, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x03, 0x73, 0x65, 0x71, 0x22, 0x54, 0x0a, 0x09, - 0x53, 0x79, 0x6e, 0x63, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x2c, 0x0a, 0x08, 0x6d, 0x65, 0x73, - 0x73, 0x61, 0x67, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x63, 0x6f, - 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x2e, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x52, 0x08, 0x6d, - 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x73, 0x12, 0x19, 0x0a, 0x08, 0x68, 0x61, 0x73, 0x5f, 0x6d, - 0x6f, 0x72, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x68, 0x61, 0x73, 0x4d, 0x6f, - 0x72, 0x65, 0x22, 0x8d, 0x01, 0x0a, 0x04, 0x55, 0x73, 0x65, 0x72, 0x12, 0x17, 0x0a, 0x07, 0x75, - 0x73, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x06, 0x75, 0x73, - 0x65, 0x72, 0x49, 0x64, 0x12, 0x1b, 0x0a, 0x09, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x69, - 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x08, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x49, - 0x64, 0x12, 0x1a, 0x0a, 0x08, 0x6e, 0x69, 0x63, 0x6b, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x08, 0x6e, 0x69, 0x63, 0x6b, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x1d, 0x0a, - 0x0a, 0x61, 0x76, 0x61, 0x74, 0x61, 0x72, 0x5f, 0x75, 0x72, 0x6c, 0x18, 0x04, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x09, 0x61, 0x76, 0x61, 0x74, 0x61, 0x72, 0x55, 0x72, 0x6c, 0x12, 0x14, 0x0a, 0x05, - 0x65, 0x78, 0x74, 0x72, 0x61, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x78, 0x74, - 0x72, 0x61, 0x22, 0x73, 0x0a, 0x0f, 0x55, 0x73, 0x65, 0x72, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, - 0x65, 0x50, 0x75, 0x73, 0x68, 0x12, 0x28, 0x0a, 0x09, 0x66, 0x72, 0x6f, 0x6d, 0x5f, 0x75, 0x73, - 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0b, 0x2e, 0x6c, 0x6f, 0x67, 0x69, 0x63, - 0x2e, 0x55, 0x73, 0x65, 0x72, 0x52, 0x08, 0x66, 0x72, 0x6f, 0x6d, 0x55, 0x73, 0x65, 0x72, 0x12, - 0x1c, 0x0a, 0x0a, 0x74, 0x6f, 0x5f, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x04, 0x52, 0x08, 0x74, 0x6f, 0x55, 0x73, 0x65, 0x72, 0x49, 0x64, 0x12, 0x18, 0x0a, - 0x07, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x07, - 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x22, 0x71, 0x0a, 0x10, 0x47, 0x72, 0x6f, 0x75, 0x70, - 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x50, 0x75, 0x73, 0x68, 0x12, 0x28, 0x0a, 0x09, 0x66, - 0x72, 0x6f, 0x6d, 0x5f, 0x75, 0x73, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0b, - 0x2e, 0x6c, 0x6f, 0x67, 0x69, 0x63, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x52, 0x08, 0x66, 0x72, 0x6f, - 0x6d, 0x55, 0x73, 0x65, 0x72, 0x12, 0x19, 0x0a, 0x08, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x5f, 0x69, - 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x07, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x49, 0x64, - 0x12, 0x18, 0x0a, 0x07, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, - 0x0c, 0x52, 0x07, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x32, 0x41, 0x0a, 0x11, 0x4d, 0x65, - 0x73, 0x73, 0x61, 0x67, 0x65, 0x45, 0x78, 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, - 0x2c, 0x0a, 0x04, 0x53, 0x79, 0x6e, 0x63, 0x12, 0x12, 0x2e, 0x6c, 0x6f, 0x67, 0x69, 0x63, 0x2e, - 0x53, 0x79, 0x6e, 0x63, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x10, 0x2e, 0x6c, 0x6f, - 0x67, 0x69, 0x63, 0x2e, 0x53, 0x79, 0x6e, 0x63, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x42, 0x1d, 0x5a, - 0x1b, 0x67, 0x69, 0x6d, 0x2f, 0x70, 0x6b, 0x67, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, - 0x6c, 0x2f, 0x70, 0x62, 0x2f, 0x6c, 0x6f, 0x67, 0x69, 0x63, 0x70, 0x62, 0x62, 0x06, 0x70, 0x72, - 0x6f, 0x74, 0x6f, 0x33, + 0x1a, 0x1b, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, + 0x66, 0x2f, 0x65, 0x6d, 0x70, 0x74, 0x79, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x19, 0x63, + 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x2f, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x2e, 0x65, + 0x78, 0x74, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0x1f, 0x0a, 0x0b, 0x53, 0x79, 0x6e, 0x63, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x10, 0x0a, 0x03, 0x73, 0x65, 0x71, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x04, 0x52, 0x03, 0x73, 0x65, 0x71, 0x22, 0x54, 0x0a, 0x09, 0x53, 0x79, 0x6e, + 0x63, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x2c, 0x0a, 0x08, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, + 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x63, 0x6f, 0x6e, 0x6e, 0x65, + 0x63, 0x74, 0x2e, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x52, 0x08, 0x6d, 0x65, 0x73, 0x73, + 0x61, 0x67, 0x65, 0x73, 0x12, 0x19, 0x0a, 0x08, 0x68, 0x61, 0x73, 0x5f, 0x6d, 0x6f, 0x72, 0x65, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x68, 0x61, 0x73, 0x4d, 0x6f, 0x72, 0x65, 0x22, + 0x32, 0x0a, 0x11, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x41, 0x43, 0x4b, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x12, 0x1d, 0x0a, 0x0a, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x61, + 0x63, 0x6b, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x09, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, + 0x41, 0x63, 0x6b, 0x22, 0x8d, 0x01, 0x0a, 0x04, 0x55, 0x73, 0x65, 0x72, 0x12, 0x17, 0x0a, 0x07, + 0x75, 0x73, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x06, 0x75, + 0x73, 0x65, 0x72, 0x49, 0x64, 0x12, 0x1b, 0x0a, 0x09, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x5f, + 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x08, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, + 0x49, 0x64, 0x12, 0x1a, 0x0a, 0x08, 0x6e, 0x69, 0x63, 0x6b, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x03, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6e, 0x69, 0x63, 0x6b, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x1d, + 0x0a, 0x0a, 0x61, 0x76, 0x61, 0x74, 0x61, 0x72, 0x5f, 0x75, 0x72, 0x6c, 0x18, 0x04, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x09, 0x61, 0x76, 0x61, 0x74, 0x61, 0x72, 0x55, 0x72, 0x6c, 0x12, 0x14, 0x0a, + 0x05, 0x65, 0x78, 0x74, 0x72, 0x61, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x78, + 0x74, 0x72, 0x61, 0x22, 0x73, 0x0a, 0x0f, 0x55, 0x73, 0x65, 0x72, 0x4d, 0x65, 0x73, 0x73, 0x61, + 0x67, 0x65, 0x50, 0x75, 0x73, 0x68, 0x12, 0x28, 0x0a, 0x09, 0x66, 0x72, 0x6f, 0x6d, 0x5f, 0x75, + 0x73, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0b, 0x2e, 0x6c, 0x6f, 0x67, 0x69, + 0x63, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x52, 0x08, 0x66, 0x72, 0x6f, 0x6d, 0x55, 0x73, 0x65, 0x72, + 0x12, 0x1c, 0x0a, 0x0a, 0x74, 0x6f, 0x5f, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x04, 0x52, 0x08, 0x74, 0x6f, 0x55, 0x73, 0x65, 0x72, 0x49, 0x64, 0x12, 0x18, + 0x0a, 0x07, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0c, 0x52, + 0x07, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x22, 0x71, 0x0a, 0x10, 0x47, 0x72, 0x6f, 0x75, + 0x70, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x50, 0x75, 0x73, 0x68, 0x12, 0x28, 0x0a, 0x09, + 0x66, 0x72, 0x6f, 0x6d, 0x5f, 0x75, 0x73, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x0b, 0x2e, 0x6c, 0x6f, 0x67, 0x69, 0x63, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x52, 0x08, 0x66, 0x72, + 0x6f, 0x6d, 0x55, 0x73, 0x65, 0x72, 0x12, 0x19, 0x0a, 0x08, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x5f, + 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x07, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x49, + 0x64, 0x12, 0x18, 0x0a, 0x07, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x18, 0x03, 0x20, 0x01, + 0x28, 0x0c, 0x52, 0x07, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x32, 0x81, 0x01, 0x0a, 0x11, + 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x45, 0x78, 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, + 0x65, 0x12, 0x2c, 0x0a, 0x04, 0x53, 0x79, 0x6e, 0x63, 0x12, 0x12, 0x2e, 0x6c, 0x6f, 0x67, 0x69, + 0x63, 0x2e, 0x53, 0x79, 0x6e, 0x63, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x10, 0x2e, + 0x6c, 0x6f, 0x67, 0x69, 0x63, 0x2e, 0x53, 0x79, 0x6e, 0x63, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, + 0x3e, 0x0a, 0x0a, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x41, 0x43, 0x4b, 0x12, 0x18, 0x2e, + 0x6c, 0x6f, 0x67, 0x69, 0x63, 0x2e, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x41, 0x43, 0x4b, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, + 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x42, + 0x1d, 0x5a, 0x1b, 0x67, 0x69, 0x6d, 0x2f, 0x70, 0x6b, 0x67, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, + 0x63, 0x6f, 0x6c, 0x2f, 0x70, 0x62, 0x2f, 0x6c, 0x6f, 0x67, 0x69, 0x63, 0x70, 0x62, 0x62, 0x06, + 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( @@ -389,23 +446,27 @@ func file_logic_message_ext_proto_rawDescGZIP() []byte { return file_logic_message_ext_proto_rawDescData } -var file_logic_message_ext_proto_msgTypes = make([]protoimpl.MessageInfo, 5) +var file_logic_message_ext_proto_msgTypes = make([]protoimpl.MessageInfo, 6) var file_logic_message_ext_proto_goTypes = []interface{}{ (*SyncRequest)(nil), // 0: logic.SyncRequest (*SyncReply)(nil), // 1: logic.SyncReply - (*User)(nil), // 2: logic.User - (*UserMessagePush)(nil), // 3: logic.UserMessagePush - (*GroupMessagePush)(nil), // 4: logic.GroupMessagePush - (*connectpb.Message)(nil), // 5: connect.Message + (*MessageACKRequest)(nil), // 2: logic.MessageACKRequest + (*User)(nil), // 3: logic.User + (*UserMessagePush)(nil), // 4: logic.UserMessagePush + (*GroupMessagePush)(nil), // 5: logic.GroupMessagePush + (*connectpb.Message)(nil), // 6: connect.Message + (*emptypb.Empty)(nil), // 7: google.protobuf.Empty } var file_logic_message_ext_proto_depIdxs = []int32{ - 5, // 0: logic.SyncReply.messages:type_name -> connect.Message - 2, // 1: logic.UserMessagePush.from_user:type_name -> logic.User - 2, // 2: logic.GroupMessagePush.from_user:type_name -> logic.User + 6, // 0: logic.SyncReply.messages:type_name -> connect.Message + 3, // 1: logic.UserMessagePush.from_user:type_name -> logic.User + 3, // 2: logic.GroupMessagePush.from_user:type_name -> logic.User 0, // 3: logic.MessageExtService.Sync:input_type -> logic.SyncRequest - 1, // 4: logic.MessageExtService.Sync:output_type -> logic.SyncReply - 4, // [4:5] is the sub-list for method output_type - 3, // [3:4] is the sub-list for method input_type + 2, // 4: logic.MessageExtService.MessageACK:input_type -> logic.MessageACKRequest + 1, // 5: logic.MessageExtService.Sync:output_type -> logic.SyncReply + 7, // 6: logic.MessageExtService.MessageACK:output_type -> google.protobuf.Empty + 5, // [5:7] is the sub-list for method output_type + 3, // [3:5] is the sub-list for method input_type 3, // [3:3] is the sub-list for extension type_name 3, // [3:3] is the sub-list for extension extendee 0, // [0:3] is the sub-list for field type_name @@ -442,7 +503,7 @@ func file_logic_message_ext_proto_init() { } } file_logic_message_ext_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*User); i { + switch v := v.(*MessageACKRequest); i { case 0: return &v.state case 1: @@ -454,7 +515,7 @@ func file_logic_message_ext_proto_init() { } } file_logic_message_ext_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*UserMessagePush); i { + switch v := v.(*User); i { case 0: return &v.state case 1: @@ -466,6 +527,18 @@ func file_logic_message_ext_proto_init() { } } file_logic_message_ext_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*UserMessagePush); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_logic_message_ext_proto_msgTypes[5].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*GroupMessagePush); i { case 0: return &v.state @@ -484,7 +557,7 @@ func file_logic_message_ext_proto_init() { GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: file_logic_message_ext_proto_rawDesc, NumEnums: 0, - NumMessages: 5, + NumMessages: 6, NumExtensions: 0, NumServices: 1, }, diff --git a/pkg/protocol/pb/logicpb/message.ext_grpc.pb.go b/pkg/protocol/pb/logicpb/message.ext_grpc.pb.go index 55be50de..86a688d3 100644 --- a/pkg/protocol/pb/logicpb/message.ext_grpc.pb.go +++ b/pkg/protocol/pb/logicpb/message.ext_grpc.pb.go @@ -11,6 +11,7 @@ import ( grpc "google.golang.org/grpc" codes "google.golang.org/grpc/codes" status "google.golang.org/grpc/status" + emptypb "google.golang.org/protobuf/types/known/emptypb" ) // This is a compile-time assertion to ensure that this generated file @@ -19,7 +20,8 @@ import ( const _ = grpc.SupportPackageIsVersion9 const ( - MessageExtService_Sync_FullMethodName = "/logic.MessageExtService/Sync" + MessageExtService_Sync_FullMethodName = "/logic.MessageExtService/Sync" + MessageExtService_MessageACK_FullMethodName = "/logic.MessageExtService/MessageACK" ) // MessageExtServiceClient is the client API for MessageExtService service. @@ -28,6 +30,8 @@ const ( type MessageExtServiceClient interface { // 消息同步 Sync(ctx context.Context, in *SyncRequest, opts ...grpc.CallOption) (*SyncReply, error) + // 设备收到消息回执 + MessageACK(ctx context.Context, in *MessageACKRequest, opts ...grpc.CallOption) (*emptypb.Empty, error) } type messageExtServiceClient struct { @@ -48,12 +52,24 @@ func (c *messageExtServiceClient) Sync(ctx context.Context, in *SyncRequest, opt return out, nil } +func (c *messageExtServiceClient) MessageACK(ctx context.Context, in *MessageACKRequest, opts ...grpc.CallOption) (*emptypb.Empty, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) + out := new(emptypb.Empty) + err := c.cc.Invoke(ctx, MessageExtService_MessageACK_FullMethodName, in, out, cOpts...) + if err != nil { + return nil, err + } + return out, nil +} + // MessageExtServiceServer is the server API for MessageExtService service. // All implementations must embed UnimplementedMessageExtServiceServer // for forward compatibility. type MessageExtServiceServer interface { // 消息同步 Sync(context.Context, *SyncRequest) (*SyncReply, error) + // 设备收到消息回执 + MessageACK(context.Context, *MessageACKRequest) (*emptypb.Empty, error) mustEmbedUnimplementedMessageExtServiceServer() } @@ -67,6 +83,9 @@ type UnimplementedMessageExtServiceServer struct{} func (UnimplementedMessageExtServiceServer) Sync(context.Context, *SyncRequest) (*SyncReply, error) { return nil, status.Errorf(codes.Unimplemented, "method Sync not implemented") } +func (UnimplementedMessageExtServiceServer) MessageACK(context.Context, *MessageACKRequest) (*emptypb.Empty, error) { + return nil, status.Errorf(codes.Unimplemented, "method MessageACK not implemented") +} func (UnimplementedMessageExtServiceServer) mustEmbedUnimplementedMessageExtServiceServer() {} func (UnimplementedMessageExtServiceServer) testEmbeddedByValue() {} @@ -106,6 +125,24 @@ func _MessageExtService_Sync_Handler(srv interface{}, ctx context.Context, dec f return interceptor(ctx, in, info, handler) } +func _MessageExtService_MessageACK_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(MessageACKRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(MessageExtServiceServer).MessageACK(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: MessageExtService_MessageACK_FullMethodName, + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(MessageExtServiceServer).MessageACK(ctx, req.(*MessageACKRequest)) + } + return interceptor(ctx, in, info, handler) +} + // MessageExtService_ServiceDesc is the grpc.ServiceDesc for MessageExtService service. // It's only intended for direct use with grpc.RegisterService, // and not to be introspected or modified (even as a copy) @@ -117,6 +154,10 @@ var MessageExtService_ServiceDesc = grpc.ServiceDesc{ MethodName: "Sync", Handler: _MessageExtService_Sync_Handler, }, + { + MethodName: "MessageACK", + Handler: _MessageExtService_MessageACK_Handler, + }, }, Streams: []grpc.StreamDesc{}, Metadata: "logic/message.ext.proto", diff --git a/pkg/protocol/pb/logicpb/message.int.pb.go b/pkg/protocol/pb/logicpb/message.int.pb.go index 1a44fc89..ced95983 100644 --- a/pkg/protocol/pb/logicpb/message.int.pb.go +++ b/pkg/protocol/pb/logicpb/message.int.pb.go @@ -22,77 +22,6 @@ const ( _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20) ) -type MessageACKRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - UserId uint64 `protobuf:"varint,1,opt,name=user_id,json=userId,proto3" json:"user_id,omitempty"` // 用户id - DeviceId uint64 `protobuf:"varint,2,opt,name=device_id,json=deviceId,proto3" json:"device_id,omitempty"` // 设备id - DeviceAck uint64 `protobuf:"varint,3,opt,name=device_ack,json=deviceAck,proto3" json:"device_ack,omitempty"` // 设备收到消息的确认号 - ReceiveTime int64 `protobuf:"varint,4,opt,name=receive_time,json=receiveTime,proto3" json:"receive_time,omitempty"` // 消息接收时间戳,精确到毫秒 -} - -func (x *MessageACKRequest) Reset() { - *x = MessageACKRequest{} - if protoimpl.UnsafeEnabled { - mi := &file_logic_message_int_proto_msgTypes[0] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *MessageACKRequest) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*MessageACKRequest) ProtoMessage() {} - -func (x *MessageACKRequest) ProtoReflect() protoreflect.Message { - mi := &file_logic_message_int_proto_msgTypes[0] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use MessageACKRequest.ProtoReflect.Descriptor instead. -func (*MessageACKRequest) Descriptor() ([]byte, []int) { - return file_logic_message_int_proto_rawDescGZIP(), []int{0} -} - -func (x *MessageACKRequest) GetUserId() uint64 { - if x != nil { - return x.UserId - } - return 0 -} - -func (x *MessageACKRequest) GetDeviceId() uint64 { - if x != nil { - return x.DeviceId - } - return 0 -} - -func (x *MessageACKRequest) GetDeviceAck() uint64 { - if x != nil { - return x.DeviceAck - } - return 0 -} - -func (x *MessageACKRequest) GetReceiveTime() int64 { - if x != nil { - return x.ReceiveTime - } - return 0 -} - type PushToUsersRequest struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -107,7 +36,7 @@ type PushToUsersRequest struct { func (x *PushToUsersRequest) Reset() { *x = PushToUsersRequest{} if protoimpl.UnsafeEnabled { - mi := &file_logic_message_int_proto_msgTypes[1] + mi := &file_logic_message_int_proto_msgTypes[0] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -120,7 +49,7 @@ func (x *PushToUsersRequest) String() string { func (*PushToUsersRequest) ProtoMessage() {} func (x *PushToUsersRequest) ProtoReflect() protoreflect.Message { - mi := &file_logic_message_int_proto_msgTypes[1] + mi := &file_logic_message_int_proto_msgTypes[0] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -133,7 +62,7 @@ func (x *PushToUsersRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use PushToUsersRequest.ProtoReflect.Descriptor instead. func (*PushToUsersRequest) Descriptor() ([]byte, []int) { - return file_logic_message_int_proto_rawDescGZIP(), []int{1} + return file_logic_message_int_proto_rawDescGZIP(), []int{0} } func (x *PushToUsersRequest) GetUserIds() []uint64 { @@ -175,7 +104,7 @@ type PushToUsersReply struct { func (x *PushToUsersReply) Reset() { *x = PushToUsersReply{} if protoimpl.UnsafeEnabled { - mi := &file_logic_message_int_proto_msgTypes[2] + mi := &file_logic_message_int_proto_msgTypes[1] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -188,7 +117,7 @@ func (x *PushToUsersReply) String() string { func (*PushToUsersReply) ProtoMessage() {} func (x *PushToUsersReply) ProtoReflect() protoreflect.Message { - mi := &file_logic_message_int_proto_msgTypes[2] + mi := &file_logic_message_int_proto_msgTypes[1] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -201,7 +130,7 @@ func (x *PushToUsersReply) ProtoReflect() protoreflect.Message { // Deprecated: Use PushToUsersReply.ProtoReflect.Descriptor instead. func (*PushToUsersReply) Descriptor() ([]byte, []int) { - return file_logic_message_int_proto_rawDescGZIP(), []int{2} + return file_logic_message_int_proto_rawDescGZIP(), []int{1} } func (x *PushToUsersReply) GetMessageId() uint64 { @@ -223,7 +152,7 @@ type PushToAllRequest struct { func (x *PushToAllRequest) Reset() { *x = PushToAllRequest{} if protoimpl.UnsafeEnabled { - mi := &file_logic_message_int_proto_msgTypes[3] + mi := &file_logic_message_int_proto_msgTypes[2] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -236,7 +165,7 @@ func (x *PushToAllRequest) String() string { func (*PushToAllRequest) ProtoMessage() {} func (x *PushToAllRequest) ProtoReflect() protoreflect.Message { - mi := &file_logic_message_int_proto_msgTypes[3] + mi := &file_logic_message_int_proto_msgTypes[2] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -249,7 +178,7 @@ func (x *PushToAllRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use PushToAllRequest.ProtoReflect.Descriptor instead. func (*PushToAllRequest) Descriptor() ([]byte, []int) { - return file_logic_message_int_proto_rawDescGZIP(), []int{3} + return file_logic_message_int_proto_rawDescGZIP(), []int{2} } func (x *PushToAllRequest) GetCommand() connectpb.Command { @@ -274,50 +203,37 @@ var file_logic_message_int_proto_rawDesc = []byte{ 0x1a, 0x1b, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x65, 0x6d, 0x70, 0x74, 0x79, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x19, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x2f, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x2e, 0x65, - 0x78, 0x74, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0x8b, 0x01, 0x0a, 0x11, 0x4d, 0x65, 0x73, - 0x73, 0x61, 0x67, 0x65, 0x41, 0x43, 0x4b, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x17, - 0x0a, 0x07, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, - 0x06, 0x75, 0x73, 0x65, 0x72, 0x49, 0x64, 0x12, 0x1b, 0x0a, 0x09, 0x64, 0x65, 0x76, 0x69, 0x63, - 0x65, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x08, 0x64, 0x65, 0x76, 0x69, - 0x63, 0x65, 0x49, 0x64, 0x12, 0x1d, 0x0a, 0x0a, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x61, - 0x63, 0x6b, 0x18, 0x03, 0x20, 0x01, 0x28, 0x04, 0x52, 0x09, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, - 0x41, 0x63, 0x6b, 0x12, 0x21, 0x0a, 0x0c, 0x72, 0x65, 0x63, 0x65, 0x69, 0x76, 0x65, 0x5f, 0x74, - 0x69, 0x6d, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0b, 0x72, 0x65, 0x63, 0x65, 0x69, - 0x76, 0x65, 0x54, 0x69, 0x6d, 0x65, 0x22, 0x94, 0x01, 0x0a, 0x12, 0x50, 0x75, 0x73, 0x68, 0x54, - 0x6f, 0x55, 0x73, 0x65, 0x72, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x19, 0x0a, - 0x08, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x04, 0x52, - 0x07, 0x75, 0x73, 0x65, 0x72, 0x49, 0x64, 0x73, 0x12, 0x2a, 0x0a, 0x07, 0x63, 0x6f, 0x6d, 0x6d, - 0x61, 0x6e, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x10, 0x2e, 0x63, 0x6f, 0x6e, 0x6e, - 0x65, 0x63, 0x74, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x52, 0x07, 0x63, 0x6f, 0x6d, - 0x6d, 0x61, 0x6e, 0x64, 0x12, 0x18, 0x0a, 0x07, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x18, - 0x03, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x07, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x12, 0x1d, - 0x0a, 0x0a, 0x69, 0x73, 0x5f, 0x70, 0x65, 0x72, 0x73, 0x69, 0x73, 0x74, 0x18, 0x04, 0x20, 0x01, - 0x28, 0x08, 0x52, 0x09, 0x69, 0x73, 0x50, 0x65, 0x72, 0x73, 0x69, 0x73, 0x74, 0x22, 0x31, 0x0a, - 0x10, 0x50, 0x75, 0x73, 0x68, 0x54, 0x6f, 0x55, 0x73, 0x65, 0x72, 0x73, 0x52, 0x65, 0x70, 0x6c, - 0x79, 0x12, 0x1d, 0x0a, 0x0a, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x5f, 0x69, 0x64, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x09, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x49, 0x64, - 0x22, 0x58, 0x0a, 0x10, 0x50, 0x75, 0x73, 0x68, 0x54, 0x6f, 0x41, 0x6c, 0x6c, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x12, 0x2a, 0x0a, 0x07, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x10, 0x2e, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x2e, - 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x52, 0x07, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, - 0x12, 0x18, 0x0a, 0x07, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x0c, 0x52, 0x07, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x32, 0xd4, 0x01, 0x0a, 0x11, 0x4d, - 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x49, 0x6e, 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, - 0x12, 0x3e, 0x0a, 0x0a, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x41, 0x43, 0x4b, 0x12, 0x18, - 0x2e, 0x6c, 0x6f, 0x67, 0x69, 0x63, 0x2e, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x41, 0x43, - 0x4b, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, - 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, - 0x12, 0x41, 0x0a, 0x0b, 0x50, 0x75, 0x73, 0x68, 0x54, 0x6f, 0x55, 0x73, 0x65, 0x72, 0x73, 0x12, - 0x19, 0x2e, 0x6c, 0x6f, 0x67, 0x69, 0x63, 0x2e, 0x50, 0x75, 0x73, 0x68, 0x54, 0x6f, 0x55, 0x73, - 0x65, 0x72, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x17, 0x2e, 0x6c, 0x6f, 0x67, - 0x69, 0x63, 0x2e, 0x50, 0x75, 0x73, 0x68, 0x54, 0x6f, 0x55, 0x73, 0x65, 0x72, 0x73, 0x52, 0x65, - 0x70, 0x6c, 0x79, 0x12, 0x3c, 0x0a, 0x09, 0x50, 0x75, 0x73, 0x68, 0x54, 0x6f, 0x41, 0x6c, 0x6c, - 0x12, 0x17, 0x2e, 0x6c, 0x6f, 0x67, 0x69, 0x63, 0x2e, 0x50, 0x75, 0x73, 0x68, 0x54, 0x6f, 0x41, - 0x6c, 0x6c, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, - 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, - 0x79, 0x42, 0x1d, 0x5a, 0x1b, 0x67, 0x69, 0x6d, 0x2f, 0x70, 0x6b, 0x67, 0x2f, 0x70, 0x72, 0x6f, - 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2f, 0x70, 0x62, 0x2f, 0x6c, 0x6f, 0x67, 0x69, 0x63, 0x70, 0x62, - 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x78, 0x74, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0x94, 0x01, 0x0a, 0x12, 0x50, 0x75, 0x73, + 0x68, 0x54, 0x6f, 0x55, 0x73, 0x65, 0x72, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, + 0x19, 0x0a, 0x08, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, + 0x04, 0x52, 0x07, 0x75, 0x73, 0x65, 0x72, 0x49, 0x64, 0x73, 0x12, 0x2a, 0x0a, 0x07, 0x63, 0x6f, + 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x10, 0x2e, 0x63, 0x6f, + 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x52, 0x07, 0x63, + 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x12, 0x18, 0x0a, 0x07, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, + 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x07, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, + 0x12, 0x1d, 0x0a, 0x0a, 0x69, 0x73, 0x5f, 0x70, 0x65, 0x72, 0x73, 0x69, 0x73, 0x74, 0x18, 0x04, + 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, 0x69, 0x73, 0x50, 0x65, 0x72, 0x73, 0x69, 0x73, 0x74, 0x22, + 0x31, 0x0a, 0x10, 0x50, 0x75, 0x73, 0x68, 0x54, 0x6f, 0x55, 0x73, 0x65, 0x72, 0x73, 0x52, 0x65, + 0x70, 0x6c, 0x79, 0x12, 0x1d, 0x0a, 0x0a, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x5f, 0x69, + 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x09, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, + 0x49, 0x64, 0x22, 0x58, 0x0a, 0x10, 0x50, 0x75, 0x73, 0x68, 0x54, 0x6f, 0x41, 0x6c, 0x6c, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x2a, 0x0a, 0x07, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, + 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x10, 0x2e, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, + 0x74, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x52, 0x07, 0x63, 0x6f, 0x6d, 0x6d, 0x61, + 0x6e, 0x64, 0x12, 0x18, 0x0a, 0x07, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x0c, 0x52, 0x07, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x32, 0x94, 0x01, 0x0a, + 0x11, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x49, 0x6e, 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, + 0x63, 0x65, 0x12, 0x41, 0x0a, 0x0b, 0x50, 0x75, 0x73, 0x68, 0x54, 0x6f, 0x55, 0x73, 0x65, 0x72, + 0x73, 0x12, 0x19, 0x2e, 0x6c, 0x6f, 0x67, 0x69, 0x63, 0x2e, 0x50, 0x75, 0x73, 0x68, 0x54, 0x6f, + 0x55, 0x73, 0x65, 0x72, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x17, 0x2e, 0x6c, + 0x6f, 0x67, 0x69, 0x63, 0x2e, 0x50, 0x75, 0x73, 0x68, 0x54, 0x6f, 0x55, 0x73, 0x65, 0x72, 0x73, + 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x3c, 0x0a, 0x09, 0x50, 0x75, 0x73, 0x68, 0x54, 0x6f, 0x41, + 0x6c, 0x6c, 0x12, 0x17, 0x2e, 0x6c, 0x6f, 0x67, 0x69, 0x63, 0x2e, 0x50, 0x75, 0x73, 0x68, 0x54, + 0x6f, 0x41, 0x6c, 0x6c, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x67, 0x6f, + 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, + 0x70, 0x74, 0x79, 0x42, 0x1d, 0x5a, 0x1b, 0x67, 0x69, 0x6d, 0x2f, 0x70, 0x6b, 0x67, 0x2f, 0x70, + 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2f, 0x70, 0x62, 0x2f, 0x6c, 0x6f, 0x67, 0x69, 0x63, + 0x70, 0x62, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( @@ -332,26 +248,23 @@ func file_logic_message_int_proto_rawDescGZIP() []byte { return file_logic_message_int_proto_rawDescData } -var file_logic_message_int_proto_msgTypes = make([]protoimpl.MessageInfo, 4) +var file_logic_message_int_proto_msgTypes = make([]protoimpl.MessageInfo, 3) var file_logic_message_int_proto_goTypes = []interface{}{ - (*MessageACKRequest)(nil), // 0: logic.MessageACKRequest - (*PushToUsersRequest)(nil), // 1: logic.PushToUsersRequest - (*PushToUsersReply)(nil), // 2: logic.PushToUsersReply - (*PushToAllRequest)(nil), // 3: logic.PushToAllRequest - (connectpb.Command)(0), // 4: connect.Command - (*emptypb.Empty)(nil), // 5: google.protobuf.Empty + (*PushToUsersRequest)(nil), // 0: logic.PushToUsersRequest + (*PushToUsersReply)(nil), // 1: logic.PushToUsersReply + (*PushToAllRequest)(nil), // 2: logic.PushToAllRequest + (connectpb.Command)(0), // 3: connect.Command + (*emptypb.Empty)(nil), // 4: google.protobuf.Empty } var file_logic_message_int_proto_depIdxs = []int32{ - 4, // 0: logic.PushToUsersRequest.command:type_name -> connect.Command - 4, // 1: logic.PushToAllRequest.command:type_name -> connect.Command - 0, // 2: logic.MessageIntService.MessageACK:input_type -> logic.MessageACKRequest - 1, // 3: logic.MessageIntService.PushToUsers:input_type -> logic.PushToUsersRequest - 3, // 4: logic.MessageIntService.PushToAll:input_type -> logic.PushToAllRequest - 5, // 5: logic.MessageIntService.MessageACK:output_type -> google.protobuf.Empty - 2, // 6: logic.MessageIntService.PushToUsers:output_type -> logic.PushToUsersReply - 5, // 7: logic.MessageIntService.PushToAll:output_type -> google.protobuf.Empty - 5, // [5:8] is the sub-list for method output_type - 2, // [2:5] is the sub-list for method input_type + 3, // 0: logic.PushToUsersRequest.command:type_name -> connect.Command + 3, // 1: logic.PushToAllRequest.command:type_name -> connect.Command + 0, // 2: logic.MessageIntService.PushToUsers:input_type -> logic.PushToUsersRequest + 2, // 3: logic.MessageIntService.PushToAll:input_type -> logic.PushToAllRequest + 1, // 4: logic.MessageIntService.PushToUsers:output_type -> logic.PushToUsersReply + 4, // 5: logic.MessageIntService.PushToAll:output_type -> google.protobuf.Empty + 4, // [4:6] is the sub-list for method output_type + 2, // [2:4] is the sub-list for method input_type 2, // [2:2] is the sub-list for extension type_name 2, // [2:2] is the sub-list for extension extendee 0, // [0:2] is the sub-list for field type_name @@ -364,18 +277,6 @@ func file_logic_message_int_proto_init() { } if !protoimpl.UnsafeEnabled { file_logic_message_int_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*MessageACKRequest); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_logic_message_int_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*PushToUsersRequest); i { case 0: return &v.state @@ -387,7 +288,7 @@ func file_logic_message_int_proto_init() { return nil } } - file_logic_message_int_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} { + file_logic_message_int_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*PushToUsersReply); i { case 0: return &v.state @@ -399,7 +300,7 @@ func file_logic_message_int_proto_init() { return nil } } - file_logic_message_int_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} { + file_logic_message_int_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*PushToAllRequest); i { case 0: return &v.state @@ -418,7 +319,7 @@ func file_logic_message_int_proto_init() { GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: file_logic_message_int_proto_rawDesc, NumEnums: 0, - NumMessages: 4, + NumMessages: 3, NumExtensions: 0, NumServices: 1, }, diff --git a/pkg/protocol/pb/logicpb/message.int_grpc.pb.go b/pkg/protocol/pb/logicpb/message.int_grpc.pb.go index 0620ffbe..273de63b 100644 --- a/pkg/protocol/pb/logicpb/message.int_grpc.pb.go +++ b/pkg/protocol/pb/logicpb/message.int_grpc.pb.go @@ -20,7 +20,6 @@ import ( const _ = grpc.SupportPackageIsVersion9 const ( - MessageIntService_MessageACK_FullMethodName = "/logic.MessageIntService/MessageACK" MessageIntService_PushToUsers_FullMethodName = "/logic.MessageIntService/PushToUsers" MessageIntService_PushToAll_FullMethodName = "/logic.MessageIntService/PushToAll" ) @@ -29,8 +28,6 @@ const ( // // For semantics around ctx use and closing/ending streaming RPCs, please refer to https://pkg.go.dev/google.golang.org/grpc/?tab=doc#ClientConn.NewStream. type MessageIntServiceClient interface { - // 设备收到消息回执 - MessageACK(ctx context.Context, in *MessageACKRequest, opts ...grpc.CallOption) (*emptypb.Empty, error) // 推送 PushToUsers(ctx context.Context, in *PushToUsersRequest, opts ...grpc.CallOption) (*PushToUsersReply, error) // 全服推送 @@ -45,16 +42,6 @@ func NewMessageIntServiceClient(cc grpc.ClientConnInterface) MessageIntServiceCl return &messageIntServiceClient{cc} } -func (c *messageIntServiceClient) MessageACK(ctx context.Context, in *MessageACKRequest, opts ...grpc.CallOption) (*emptypb.Empty, error) { - cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) - out := new(emptypb.Empty) - err := c.cc.Invoke(ctx, MessageIntService_MessageACK_FullMethodName, in, out, cOpts...) - if err != nil { - return nil, err - } - return out, nil -} - func (c *messageIntServiceClient) PushToUsers(ctx context.Context, in *PushToUsersRequest, opts ...grpc.CallOption) (*PushToUsersReply, error) { cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) out := new(PushToUsersReply) @@ -79,8 +66,6 @@ func (c *messageIntServiceClient) PushToAll(ctx context.Context, in *PushToAllRe // All implementations must embed UnimplementedMessageIntServiceServer // for forward compatibility. type MessageIntServiceServer interface { - // 设备收到消息回执 - MessageACK(context.Context, *MessageACKRequest) (*emptypb.Empty, error) // 推送 PushToUsers(context.Context, *PushToUsersRequest) (*PushToUsersReply, error) // 全服推送 @@ -95,9 +80,6 @@ type MessageIntServiceServer interface { // pointer dereference when methods are called. type UnimplementedMessageIntServiceServer struct{} -func (UnimplementedMessageIntServiceServer) MessageACK(context.Context, *MessageACKRequest) (*emptypb.Empty, error) { - return nil, status.Errorf(codes.Unimplemented, "method MessageACK not implemented") -} func (UnimplementedMessageIntServiceServer) PushToUsers(context.Context, *PushToUsersRequest) (*PushToUsersReply, error) { return nil, status.Errorf(codes.Unimplemented, "method PushToUsers not implemented") } @@ -125,24 +107,6 @@ func RegisterMessageIntServiceServer(s grpc.ServiceRegistrar, srv MessageIntServ s.RegisterService(&MessageIntService_ServiceDesc, srv) } -func _MessageIntService_MessageACK_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(MessageACKRequest) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(MessageIntServiceServer).MessageACK(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: MessageIntService_MessageACK_FullMethodName, - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(MessageIntServiceServer).MessageACK(ctx, req.(*MessageACKRequest)) - } - return interceptor(ctx, in, info, handler) -} - func _MessageIntService_PushToUsers_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { in := new(PushToUsersRequest) if err := dec(in); err != nil { @@ -186,10 +150,6 @@ var MessageIntService_ServiceDesc = grpc.ServiceDesc{ ServiceName: "logic.MessageIntService", HandlerType: (*MessageIntServiceServer)(nil), Methods: []grpc.MethodDesc{ - { - MethodName: "MessageACK", - Handler: _MessageIntService_MessageACK_Handler, - }, { MethodName: "PushToUsers", Handler: _MessageIntService_PushToUsers_Handler, diff --git a/pkg/protocol/proto/logic/message.ext.proto b/pkg/protocol/proto/logic/message.ext.proto index f194e986..1cd20702 100644 --- a/pkg/protocol/proto/logic/message.ext.proto +++ b/pkg/protocol/proto/logic/message.ext.proto @@ -2,11 +2,14 @@ syntax = "proto3"; package logic; option go_package = "gim/pkg/protocol/pb/logicpb"; +import "google/protobuf/empty.proto"; import "connect/connect.ext.proto"; service MessageExtService { // 消息同步 rpc Sync (SyncRequest) returns (SyncReply); + // 设备收到消息回执 + rpc MessageACK (MessageACKRequest) returns (google.protobuf.Empty); } message SyncRequest { @@ -17,6 +20,10 @@ message SyncReply { bool has_more = 2; // 是否有更多数据 } +message MessageACKRequest { + uint64 device_ack = 1; // 设备收到消息的确认号 +} + message User { uint64 user_id = 1; // 发送者id uint64 device_id = 2; // 发送者设备id diff --git a/pkg/protocol/proto/logic/message.int.proto b/pkg/protocol/proto/logic/message.int.proto index d00a47e5..f7526d75 100644 --- a/pkg/protocol/proto/logic/message.int.proto +++ b/pkg/protocol/proto/logic/message.int.proto @@ -7,20 +7,12 @@ import "google/protobuf/empty.proto"; import "connect/connect.ext.proto"; service MessageIntService { - // 设备收到消息回执 - rpc MessageACK (MessageACKRequest) returns (google.protobuf.Empty); // 推送 rpc PushToUsers (PushToUsersRequest) returns (PushToUsersReply); // 全服推送 rpc PushToAll(PushToAllRequest)returns(google.protobuf.Empty); } -message MessageACKRequest { - uint64 user_id = 1; // 用户id - uint64 device_id = 2; // 设备id - uint64 device_ack = 3; // 设备收到消息的确认号 - int64 receive_time = 4; // 消息接收时间戳,精确到毫秒 -} message PushToUsersRequest{ repeated uint64 user_ids = 1; // 用户ID diff --git a/sql/create_table.sql b/sql/create_table.sql index 1c66ec50..08717df2 100644 --- a/sql/create_table.sql +++ b/sql/create_table.sql @@ -42,6 +42,23 @@ CREATE TABLE `device` ( ) ENGINE=InnoDB AUTO_INCREMENT=10000 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin COMMENT='设备'; /*!40101 SET character_set_client = @saved_cs_client */; +-- +-- Table structure for table `device_ack` +-- + +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `device_ack` ( + `device_id` bigint unsigned NOT NULL COMMENT '设备ID', + `created_at` datetime NOT NULL COMMENT '创建时间', + `updated_at` datetime NOT NULL COMMENT '更新时间', + `user_id` bigint unsigned NOT NULL COMMENT '用户ID', + `ack` bigint unsigned NOT NULL COMMENT '序列号', + PRIMARY KEY (`device_id`), + KEY `idx_user_id` (`user_id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin COMMENT='ack'; +/*!40101 SET character_set_client = @saved_cs_client */; + -- -- Table structure for table `friend` -- @@ -160,4 +177,4 @@ PARTITIONS 8 */; /*!40014 SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS */; /*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */; --- Dump completed on 2025年09月07日 21:47:54 +-- Dump completed on 2025年09月27日 13:25:11 From f07fa13e57fbc904d7fb12199af9fb753ea8db04 Mon Sep 17 00:00:00 2001 From: alber Date: 2025年9月29日 09:04:41 +0800 Subject: [PATCH 6/6] =?UTF-8?q?=E6=9B=B4=E6=96=B0=E6=96=87=E6=A1=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index c8c944c3..a5a43848 100644 --- a/README.md +++ b/README.md @@ -8,7 +8,7 @@ gim是一个即时通讯服务器,代码全部使用golang完成。主要特 6.使用领域驱动设计 7.支持docker compose和k8s部署 gim可以作为以业务服务器的一个组件,为现有业务服务器提供im的能力,业务服务器 -只需要实现user.int.proto协议中定义的GRPC接口,为gim服务提供基本的鉴权功能即可 +只需要实现user.int.proto协议中UserIntService.Auth接口,为gim服务提供基本的鉴权功能即可 ### 使用技术: 数据库:MySQL+Redis 通讯框架:GRPC @@ -44,7 +44,7 @@ sql: 项目sql文件 3. 调用logic.MessageExtService.Sync,完成离线消息同步 注意:seq字段是客户端接收到消息的最大同步序列号,如果用户是换设备登录或者第一次登录,seq应该传0。 -接下来,用户可以使用LogicExt.SendMessage接口来发送消息,消息接收方可以使用长连接接收到对应的消息。 +接下来,用户可以使用MessageIntService.PushToUsers接口来发送消息,消息接收方可以使用长连接接收到对应的消息。 ### 单用户多设备支持,离线消息同步 每个用户都会维护一个自增的序列号,当用户A给用户B发送消息是,首先会获取A的最大序列号,设置为这条消息的seq,持久化到用户A的消息列表, 再通过长连接下发到用户A账号登录的所有设备,再获取用户B的最大序列号,设置为这条消息的seq,持久化到用户B的消息列表,再通过长连接下发

AltStyle によって変換されたページ (->オリジナル) /