diff --git a/cmd/robot/friend.go b/cmd/robot/friend.go index 6e7bfa868..1c4e79fb8 100644 --- a/cmd/robot/friend.go +++ b/cmd/robot/friend.go @@ -2,24 +2,79 @@ package robot import ( "go_dreamfactory/comm" + "go_dreamfactory/modules/friend" "go_dreamfactory/pb" "log" ) func (r *Robot) handleFriendMsg(msg *pb.UserMessage) { switch msg.SubType { - case "apply": + case friend.Friend_SubType_Apply: r.handleFriendApply(msg) + case friend.Friend_SubType_ApplyList: + r.handleFriendApplyList(msg) + case friend.Friend_SubType_Agree: + r.handleFriendAgree(msg) + case friend.Friend_SubType_Refuse: + r.handleFriendRefuse(msg) + case friend.Friend_SubType_Blacklist: + r.handleFriendBlacklist(msg) + case friend.Friend_SubType_AddBlack: + r.handleFriendAddBlack(msg) + case friend.Friend_SubType_DelBlack: + r.handleFriendDelBlack(msg) + case friend.Friend_SubType_Search: + r.handleFriendSearch(msg) } } -//添加好友 +//好友列表 +func (r *Robot) FriendList() { + req := &pb.FriendListReq{} + head := &pb.UserMessage{MainType: string(comm.SM_FriendModule), SubType: friend.Friend_SubType_List} + defer traceFunc(head.MainType, head.SubType, r.user.UserData.GetUid(), req) + err := r.SendToClient(head, req) + if err != nil { + log.Fatal(err) + } +} + +func (r *Robot) handleFriendList(msg *pb.UserMessage) { + rsp := &pb.FriendListRsp{} + if !comm.ProtoDecode(msg, rsp) { + return + } + printReply(msg, rsp) +} + +//好友搜索 +func (r *Robot) FriendSearch(nickName string) { + req := &pb.FriendSearchReq{ + NickName: nickName, + } + head := &pb.UserMessage{MainType: string(comm.SM_FriendModule), SubType: friend.Friend_SubType_Search} + defer traceFunc(head.MainType, head.SubType, r.user.UserData.GetUid(), req) + err := r.SendToClient(head, req) + if err != nil { + log.Fatal(err) + } +} + +func (r *Robot) handleFriendSearch(msg *pb.UserMessage) { + rsp := &pb.FriendSearchRsp{} + if !comm.ProtoDecode(msg, rsp) { + return + } + printReply(msg, rsp) +} + +//好友申请 func (r *Robot) FriendApply(friendId string) { req := &pb.FriendApplyReq{ FriendId: friendId, } - head := &pb.UserMessage{MainType: "friend", SubType: "apply"} - defer traceFunc(head.MainType, head.SubType, r.user.UserData.GetUserId(), req) + head := &pb.UserMessage{MainType: string(comm.SM_FriendModule), SubType: friend.Friend_SubType_Apply} + defer traceFunc(head.MainType, head.SubType, r.user.UserData.GetUid(), req) err := r.SendToClient(head, req) if err != nil { log.Fatal(err) @@ -33,3 +88,123 @@ func (r *Robot) handleFriendApply(msg *pb.UserMessage) { } printReply(msg, rsp) } + +//申请列表 +func (r *Robot) FriendApplyList() { + req := &pb.FriendApplyListReq{} + head := &pb.UserMessage{MainType: string(comm.SM_FriendModule), SubType: friend.Friend_SubType_ApplyList} + defer traceFunc(head.MainType, head.SubType, r.user.UserData.GetUid(), req) + err := r.SendToClient(head, req) + if err != nil { + log.Fatal(err) + } +} + +func (r *Robot) handleFriendApplyList(msg *pb.UserMessage) { + rsp := &pb.FriendApplyListRsp{} + if !comm.ProtoDecode(msg, rsp) { + return + } + printReply(msg, rsp) +} + +//同意 +func (r *Robot) FriendAgree(friendIds []string) { + req := &pb.FriendAgreeReq{ + FriendIds: friendIds, + } + head := &pb.UserMessage{MainType: string(comm.SM_FriendModule), SubType: friend.Friend_SubType_Apply} + defer traceFunc(head.MainType, head.SubType, r.user.UserData.GetUid(), req) + err := r.SendToClient(head, req) + if err != nil { + log.Fatal(err) + } +} + +func (r *Robot) handleFriendAgree(msg *pb.UserMessage) { + rsp := &pb.FriendAgreeRsp{} + if !comm.ProtoDecode(msg, rsp) { + return + } + printReply(msg, rsp) +} + +//拒绝 +func (r *Robot) FriendRefuse(friendIds []string) { + req := &pb.FriendRefuseReq{ + FriendIds: friendIds, + } + head := &pb.UserMessage{MainType: string(comm.SM_FriendModule), SubType: friend.Friend_SubType_Refuse} + defer traceFunc(head.MainType, head.SubType, r.user.UserData.GetUid(), req) + err := r.SendToClient(head, req) + if err != nil { + log.Fatal(err) + } +} + +func (r *Robot) handleFriendRefuse(msg *pb.UserMessage) { + rsp := &pb.FriendRefuseRsp{} + if !comm.ProtoDecode(msg, rsp) { + return + } + printReply(msg, rsp) +} + +//黑名单列表 +func (r *Robot) FriendBlacklist() { + req := &pb.FriendBlackListReq{} + head := &pb.UserMessage{MainType: string(comm.SM_FriendModule), SubType: friend.Friend_SubType_Blacklist} + defer traceFunc(head.MainType, head.SubType, r.user.UserData.GetUid(), req) + err := r.SendToClient(head, req) + if err != nil { + log.Fatal(err) + } +} + +func (r *Robot) handleFriendBlacklist(msg *pb.UserMessage) { + rsp := &pb.FriendBlackListRsp{} + if !comm.ProtoDecode(msg, rsp) { + return + } + printReply(msg, rsp) +} + +//添加黑名单 +func (r *Robot) FriendAddBlack() { + req := &pb.FriendBlackAddReq{} + head := &pb.UserMessage{MainType: string(comm.SM_FriendModule), SubType: friend.Friend_SubType_AddBlack} + defer traceFunc(head.MainType, head.SubType, r.user.UserData.GetUid(), req) + err := r.SendToClient(head, req) + if err != nil { + log.Fatal(err) + } +} + +func (r *Robot) handleFriendAddBlack(msg *pb.UserMessage) { + rsp := &pb.FriendBlackAddRsp{} + if !comm.ProtoDecode(msg, rsp) { + return + } + printReply(msg, rsp) +} + +//删除黑名单 +func (r *Robot) FriendDelBlack(friendId string) { + req := &pb.FriendDelBlackReq{ + FriendId: friendId, + } + head := &pb.UserMessage{MainType: string(comm.SM_FriendModule), SubType: friend.Friend_SubType_DelBlack} + defer traceFunc(head.MainType, head.SubType, r.user.UserData.GetUid(), req) + err := r.SendToClient(head, req) + if err != nil { + log.Fatal(err) + } +} + +func (r *Robot) handleFriendDelBlack(msg *pb.UserMessage) { + rsp := &pb.FriendDelBlackRsp{} + if !comm.ProtoDecode(msg, rsp) { + return + } + printReply(msg, rsp) +} diff --git a/cmd/robot/pack.go b/cmd/robot/pack.go index 4bdecfc09..a0815089a 100644 --- a/cmd/robot/pack.go +++ b/cmd/robot/pack.go @@ -17,7 +17,7 @@ func (r *Robot) handlePackMsg(msg *pb.UserMessage) { func (r *Robot) QueryUserPack() { req := &pb.GetlistReq{IType: 1} head := &pb.UserMessage{MainType: "pack", SubType: "queryuserpackreq"} - defer traceFunc(head.MainType, head.SubType, r.user.UserData.GetUserId(), req) + defer traceFunc(head.MainType, head.SubType, r.user.UserData.GetUid(), req) err := r.SendToClient(head, req) if err != nil { log.Fatal(err) diff --git a/cmd/robot/robot.go b/cmd/robot/robot.go index d241a87eb..d4d903b57 100644 --- a/cmd/robot/robot.go +++ b/cmd/robot/robot.go @@ -9,9 +9,9 @@ import ( "log" "net/http" + "github.com/golang/protobuf/proto" "github.com/gorilla/websocket" jsoniter "github.com/json-iterator/go" - "google.golang.org/protobuf/proto" ) type Robot struct { @@ -79,13 +79,21 @@ func (r *Robot) handleMsg(msg *pb.UserMessage) { //在这里添加玩家成功登录以后的测试方法 func (r *Robot) onUserLoaded() { //user - r.CreateUser("user671") + // r.CreateUser("乐谷4") //friend - r.FriendApply("629f147e3d276120561bfa18") + // r.FriendApply("629f147e3d276120561bfa18") + // r.FriendAgree([]string{}) + // r.FriendRefuse([]string{}) + // r.FriendApplyList() + // r.FriendList() + // r.FriendBlacklist() + // r.FriendAddBlack() + // r.FriendDelBlack("") + r.FriendSearch("乐谷5") //pack - r.QueryUserPack() + // r.QueryUserPack() } @@ -137,10 +145,12 @@ func (r *Robot) AccountRegister() { } } +//打印响应 func printReply(msg *pb.UserMessage, rsp interface{}) { log.Printf("rsp [%s.%s] [%d] [%v]", msg.MainType, msg.SubType, msg.Code, rsp) } +//方法参数跟踪 func traceFunc(module string, funcName string, uid string, funcArgs interface{}) { log.Printf("req [%s.%s] [%s] [%v]", module, funcName, uid, funcArgs) } diff --git a/cmd/robot/user.go b/cmd/robot/user.go index e8883c0a5..d5d203360 100644 --- a/cmd/robot/user.go +++ b/cmd/robot/user.go @@ -2,6 +2,7 @@ package robot import ( "go_dreamfactory/comm" + "go_dreamfactory/modules/user" "go_dreamfactory/pb" "log" ) @@ -40,11 +41,11 @@ func (r *Robot) CreateUser(NickName string) { } head := &pb.UserMessage{ - MainType: "user", - SubType: "create", + MainType: string(comm.SM_UserModule), + SubType: user.User_SubType_Create, } - defer traceFunc(head.MainType, head.SubType, r.user.UserData.GetUserId(), req) + defer traceFunc(head.MainType, head.SubType, r.user.UserData.GetUid(), req) err := r.SendToClient(head, req) if err != nil { log.Fatal(err) diff --git a/comm/core.go b/comm/core.go index 1888e5496..d5246fce7 100644 --- a/comm/core.go +++ b/comm/core.go @@ -7,13 +7,19 @@ import ( "go_dreamfactory/lego/core" "go_dreamfactory/lego/sys/log" - "google.golang.org/protobuf/proto" + "github.com/golang/protobuf/proto" + "github.com/golang/protobuf/ptypes" ) const ( SC_ServiceGateRouteComp core.S_Comps = "SC_GateRouteComp" //s_comps.ISC_GateRouteComp ) +const ( + Service_Gateway = "gateway" + Service_Worker = "worker" +) + //模块名定义处 const ( SM_GateModule core.M_Modules = "gateway" //gate模块 网关服务模块 @@ -55,15 +61,15 @@ type IUserSession interface { GetIP() string GetGatewayServiceId() string IsLogin() bool - Build(uid string) (err error) - UnBuild(ServiceMethod string, msg proto.Message) (err error) + Bind(uid string, wokerId string) (err error) + UnBind() (err error) SendMsg(mainType, subType string, code pb.ErrorCode, msg proto.Message) (err error) Close() (err error) ToString() string } func ProtoDecode(msg *pb.UserMessage, req proto.Message) (ok bool) { - err := proto.Unmarshal(msg.Data, req) + err := ptypes.UnmarshalAny(msg.Data, req) if err != nil { log.Errorf("%s.%s %v", msg.MainType, msg.SubType, err) return @@ -72,7 +78,7 @@ func ProtoDecode(msg *pb.UserMessage, req proto.Message) (ok bool) { } func ProtoEncode(rsp proto.Message, msg *pb.UserMessage) (ok bool) { - data, err := proto.Marshal(rsp) + data, err := ptypes.MarshalAny(rsp) if err != nil { log.Errorf("%s.%s %v", msg.MainType, msg.SubType, err) return diff --git a/comm/imodule.go b/comm/imodule.go index 0d976e1fa..b1dae9bd5 100644 --- a/comm/imodule.go +++ b/comm/imodule.go @@ -11,6 +11,10 @@ type ( } //背包模块对外接口定义 提供给其他模块使用的 IPack interface { + //查询用户背包物品数量 + QueryUserPackItemAmount(uId string, itemid int32) (amount uint32) + ///添加单个物品到背包 (可以加物品和减物品) + AddItemToUserPack(uId string, itemid, addnum int32) (err error) ///添加多个物品到背包 (可以加物品和减物品) AddItemsToUserPack(uId string, items map[int32]int32) (err error) } diff --git a/comm/usersession.go b/comm/usersession.go index 58c382607..b08f3b5a2 100644 --- a/comm/usersession.go +++ b/comm/usersession.go @@ -8,7 +8,8 @@ import ( "go_dreamfactory/lego/base" "go_dreamfactory/lego/sys/log" - "google.golang.org/protobuf/proto" + "github.com/golang/protobuf/proto" + "github.com/golang/protobuf/ptypes" ) /* @@ -58,25 +59,27 @@ func (this *UserSession) IsLogin() bool { return this.UserId != "" } -//绑定uid 登录后操作 -func (this *UserSession) Build(uid string) (err error) { +///绑定uid 登录后操作 +///uid 用户id +///wokerId 用户绑定worker服务id +func (this *UserSession) Bind(uid string, wokerId string) (err error) { reply := &pb.RPCMessageReply{} - if err := this.service.RpcCallById(this.GatewayServiceId, string(Rpc_GatewayAgentBuild), context.Background(), &pb.AgentBuildReq{ + if err := this.service.RpcCall(context.Background(), fmt.Sprintf("%s/%s", Service_Gateway, this.GatewayServiceId), string(Rpc_GatewayAgentBuild), &pb.AgentBuildReq{ UserSessionId: this.SessionId, UserId: uid, }, reply); err != nil { - log.Errorf("UserSession:%s UserId:%s Build:%s err:%v", this.SessionId, this.UserId, err) + log.Errorf("Bind UserSession:%s UserId:%s err:%v", this.SessionId, this.UserId, err) } return } //解绑uid 注销和切换账号是处理 -func (this *UserSession) UnBuild(ServiceMethod string, msg proto.Message) (err error) { +func (this *UserSession) UnBind() (err error) { reply := &pb.RPCMessageReply{} - if err := this.service.RpcCallById(this.GatewayServiceId, string(Rpc_GatewayAgentUnBuild), context.Background(), &pb.AgentUnBuildReq{ + if err := this.service.RpcCall(context.Background(), fmt.Sprintf("%s/%s", Service_Gateway, this.GatewayServiceId), string(Rpc_GatewayAgentUnBuild), &pb.AgentUnBuildReq{ UserSessionId: this.SessionId, }, reply); err != nil { - log.Errorf("UserSession:%s UserId:%s UnBuild err:%v", this.SessionId, this.UserId, err) + log.Errorf("UnBuild UserSession:%s UserId:%s err:%v", this.SessionId, this.UserId, err) } return } @@ -84,16 +87,16 @@ func (this *UserSession) UnBuild(ServiceMethod string, msg proto.Message) (err e //向用户发送消息 func (this *UserSession) SendMsg(mainType, subType string, code pb.ErrorCode, msg proto.Message) (err error) { reply := &pb.RPCMessageReply{} - data, _ := proto.Marshal(msg) + data, _ := ptypes.MarshalAny(msg) log.Debugf("SendMsg to SessionId:[%s] UserId:[%s] Code:%d Data: %v", this.UserId, code, msg) - if err := this.service.RpcCallById(this.GatewayServiceId, string(Rpc_GatewayAgentSendMsg), context.Background(), &pb.AgentSendMessageReq{ + if err := this.service.RpcCall(context.Background(), fmt.Sprintf("%s/%s", Service_Gateway, this.GatewayServiceId), string(Rpc_GatewayAgentSendMsg), &pb.AgentSendMessageReq{ UserSessionId: this.SessionId, MainType: mainType, SubType: subType, Code: code, Data: data, }, reply); err != nil { - log.Errorf("UserSession:%s UserId:%s SendMsg:%s err:%v", this.SessionId, this.UserId, mainType, err) + log.Errorf("SendMsg:%s UserSession:%s UserId:%s err:%v", mainType, this.SessionId, this.UserId, err) } return } @@ -101,10 +104,10 @@ func (this *UserSession) SendMsg(mainType, subType string, code pb.ErrorCode, ms //关闭用户连接对象 func (this *UserSession) Close() (err error) { reply := &pb.RPCMessageReply{} - if err := this.service.RpcCallById(this.GatewayServiceId, string(Rpc_GatewayAgentSendMsg), context.Background(), &pb.AgentCloseeReq{ + if err := this.service.RpcCall(context.Background(), fmt.Sprintf("%s/%s", Service_Gateway, this.GatewayServiceId), string(Rpc_GatewayAgentSendMsg), &pb.AgentCloseeReq{ UserSessionId: this.SessionId, }, reply); err != nil { - log.Errorf("UserSession:%s UserId:%d Close:%s err:%v", this.SessionId, this.UserId, err) + log.Errorf("Close UserSession:%s UserId:%d err:%v", this.SessionId, this.UserId, err) } return } diff --git a/go.mod b/go.mod index c632988c2..3f7ae1d15 100644 --- a/go.mod +++ b/go.mod @@ -7,12 +7,14 @@ require ( github.com/go-playground/validator/v10 v10.10.1 github.com/go-redis/redis/v8 v8.11.5 github.com/golang-jwt/jwt v3.2.2+incompatible + github.com/golang/protobuf v1.5.2 github.com/gorilla/websocket v1.4.2 github.com/hashicorp/consul/api v1.12.0 github.com/json-iterator/go v1.1.12 github.com/mitchellh/hashstructure v1.1.0 github.com/nacos-group/nacos-sdk-go v1.0.8 github.com/natefinch/lumberjack v2.0.0+incompatible + github.com/rcrowley/go-metrics v0.0.0-20201227073835-cf1acfcdf475 github.com/robfig/cron/v3 v3.0.1 github.com/rs/xid v1.3.0 github.com/satori/go.uuid v1.2.0 @@ -53,6 +55,7 @@ require ( github.com/go-ping/ping v0.0.0-20211130115550-779d1e919534 // indirect github.com/go-playground/locales v0.14.0 // indirect github.com/go-playground/universal-translator v0.18.0 // indirect + github.com/go-redis/redis_rate/v9 v9.1.2 // indirect github.com/go-stack/stack v1.8.0 // indirect github.com/go-task/slim-sprig v0.0.0-20210107165309-348f09dbbbc0 // indirect github.com/gogo/protobuf v1.3.2 // indirect @@ -68,6 +71,7 @@ require ( github.com/hashicorp/golang-lru v0.5.4 // indirect github.com/hashicorp/serf v0.9.7 // indirect github.com/inconshreveable/mousetrap v1.0.0 // indirect + github.com/influxdata/influxdb1-client v0.0.0-20220302092344-a9ab5670611c // indirect github.com/jmespath/go-jmespath v0.4.0 // indirect github.com/juju/ratelimit v1.0.1 // indirect github.com/julienschmidt/httprouter v1.3.0 // indirect diff --git a/go.sum b/go.sum index b304dc2d4..992ed8e23 100644 --- a/go.sum +++ b/go.sum @@ -170,6 +170,7 @@ github.com/go-redis/redis/v8 v8.8.2/go.mod h1:F7resOH5Kdug49Otu24RjHWwgK7u9AmtqW github.com/go-redis/redis/v8 v8.11.4/go.mod h1:2Z2wHZXdQpCDXEGzqMockDpNyYvi2l4Pxt6RJr792+w= github.com/go-redis/redis/v8 v8.11.5 h1:AcZZR7igkdvfVmQTPnu9WE37LRrO/YrBH5zWyjDC0oI= github.com/go-redis/redis/v8 v8.11.5/go.mod h1:gREzHqY1hg6oD9ngVRbLStwAWKhA0FEgq8Jd4h5lpwo= +github.com/go-redis/redis_rate/v9 v9.1.2 h1:H0l5VzoAtOE6ydd38j8MCq3ABlGLnvvbA1xDSVVCHgQ= github.com/go-redis/redis_rate/v9 v9.1.2/go.mod h1:oam2de2apSgRG8aJzwJddXbNu91Iyz1m8IKJE2vpvlQ= github.com/go-sql-driver/mysql v1.5.0/go.mod h1:DCzpHaOWr8IXmIStZouvnhqoel9Qv2LBy8hT2VhHyBg= github.com/go-stack/stack v1.8.0 h1:5SgMzNM5HxrEjV0ww2lTmX6E2Izsfxas4+YHWRs3Lsk= @@ -359,6 +360,7 @@ github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1: github.com/ianlancetaylor/demangle v0.0.0-20200824232613-28f6c0f3b639/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= github.com/inconshreveable/mousetrap v1.0.0 h1:Z8tu5sraLXCXIcARxBp/8cbvlwVa7Z1NHg9XEKhtSvM= github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8= +github.com/influxdata/influxdb1-client v0.0.0-20220302092344-a9ab5670611c h1:qSHzRbhzK8RdXOsAdfDgO49TtqC1oZ+acxPrkfTxcCs= github.com/influxdata/influxdb1-client v0.0.0-20220302092344-a9ab5670611c/go.mod h1:qj24IKcXYK6Iy9ceXlo3Tc+vtHo9lIhSX5JddghvEPo= github.com/jehiah/go-strftime v0.0.0-20171201141054-1d33003b3869 h1:IPJ3dvxmJ4uczJe5YQdrYB16oTJlGSC/OyZDqUk9xX4= github.com/jehiah/go-strftime v0.0.0-20171201141054-1d33003b3869/go.mod h1:cJ6Cj7dQo+O6GJNiMx+Pa94qKj+TG8ONdKHgMNIyyag= @@ -548,6 +550,7 @@ github.com/prometheus/procfs v0.0.0-20180725123919-05ee40e3a273/go.mod h1:c3At6R github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= github.com/prometheus/procfs v0.0.2/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= github.com/prometheus/procfs v0.0.8/go.mod h1:7Qr8sr6344vo1JqZ6HhLceV9o3AJ1Ff+GxbHq6oeK9A= +github.com/rcrowley/go-metrics v0.0.0-20201227073835-cf1acfcdf475 h1:N/ElC8H3+5XpJzTSTfLsJV/mx9Q9g7kxmchpfZyxgzM= github.com/rcrowley/go-metrics v0.0.0-20201227073835-cf1acfcdf475/go.mod h1:bCqnVzQkZxMG4s8nGwiZ5l3QUCyqpo9Y+/ZMZ9VjZe4= github.com/robfig/cron/v3 v3.0.1 h1:WdRxkvbJztn8LMz/QEvLN5sBU+xKpSqwwUO1Pjr4qDs= github.com/robfig/cron/v3 v3.0.1/go.mod h1:eQICP3HwyT7UooqI/z+Ov+PtYAWygg1TEWWzGIFLtro= diff --git a/lego/base/core.go b/lego/base/core.go index efc0baff7..372f62a16 100644 --- a/lego/base/core.go +++ b/lego/base/core.go @@ -74,12 +74,9 @@ type IRPCXServiceSession interface { type IRPCXService interface { IClusterServiceBase - DefauleRpcRouteRules(stype string, sip string) (ss IRPCXServiceSession, err error) //默认rpc路由规则 Register(rcvr interface{}) (err error) RegisterFunction(fn interface{}) (err error) RegisterFunctionName(name string, fn interface{}) (err error) - RpcCallById(sId string, serviceMethod string, ctx context.Context, args interface{}, reply interface{}) (err error) - RpcGoById(sId string, serviceMethod string, ctx context.Context, args interface{}, reply interface{}) (call *client.Call, err error) - RpcCallByType(sType string, serviceMethod string, ctx context.Context, args interface{}, reply interface{}) (err error) - RpcGoByType(sType string, serviceMethod string, ctx context.Context, args interface{}, reply interface{}) (call *client.Call, err error) + RpcCall(ctx context.Context, servicePath string, serviceMethod string, args interface{}, reply interface{}) (err error) + RpcGo(ctx context.Context, servicePath string, serviceMethod string, args interface{}, reply interface{}) (call *client.Call, err error) } diff --git a/lego/base/rpcx/service.go b/lego/base/rpcx/service.go index fb0462c5b..28b09d2c5 100644 --- a/lego/base/rpcx/service.go +++ b/lego/base/rpcx/service.go @@ -4,29 +4,22 @@ import ( "context" "fmt" "runtime" - "sync" - "go_dreamfactory/lego" "go_dreamfactory/lego/base" "go_dreamfactory/lego/core" "go_dreamfactory/lego/core/cbase" "go_dreamfactory/lego/sys/cron" "go_dreamfactory/lego/sys/event" "go_dreamfactory/lego/sys/log" - "go_dreamfactory/lego/sys/registry" "go_dreamfactory/lego/sys/rpcx" - "go_dreamfactory/lego/utils/container/sortslice" - "go_dreamfactory/lego/utils/container/version" "github.com/smallnest/rpcx/client" ) type RPCXService struct { - cbase.ServiceBase //继承服务基类 + cbase.ServiceBase //继承服务基类+ opts *Options //服务启动的配置信息数据 - serverList sync.Map //集群服务会话管理列表对象 rpcxService base.IRPCXService //服务自身 通过接口可以实现上层服务类重构底层接口 - IsInClustered bool //当前服务是否已加入到集群中 } func (this *RPCXService) GetTag() string { @@ -89,12 +82,7 @@ func (this *RPCXService) InitSys() { } else { log.Infof("Sys event Init success !") } - if err := registry.OnInit(this.opts.Setting.Sys["registry"], registry.SetService(this.rpcxService), registry.SetListener(this.rpcxService.(registry.IListener))); err != nil { - log.Panicf(fmt.Sprintf("Sys registry Init err:%v", err)) - } else { - log.Infof("Sys registry Init success !") - } - if err := rpcx.OnInit(this.opts.Setting.Sys["rpcx"], rpcx.SetServiceId(this.GetId()), rpcx.SetPort(this.GetPort())); err != nil { + if err := rpcx.OnInit(this.opts.Setting.Sys["rpcx"], rpcx.SetServiceTag(this.GetTag()), rpcx.SetServiceId(this.GetId()), rpcx.SetServiceType(this.GetType()), rpcx.SetServiceVersion(this.GetVersion()), rpcx.SetServiceAddr(fmt.Sprintf("%s:%d", this.GetIp(), this.GetPort()))); err != nil { log.Panicf(fmt.Sprintf("Sys rpcx Init err:%v", err)) } else { log.Infof("Sys rpcx Init success !") @@ -103,9 +91,6 @@ func (this *RPCXService) InitSys() { if err := rpcx.Start(); err != nil { log.Panicf(fmt.Sprintf("Sys rpcx Start err:%v", err)) } - if err := registry.Start(); err != nil { - log.Panicf(fmt.Sprintf("Sys registry Start err:%v", err)) - } }) } @@ -126,142 +111,11 @@ func (this *RPCXService) Destroy() (err error) { if err = rpcx.Stop(); err != nil { return } - if err = registry.Stop(); err != nil { - return - } cron.Stop() err = this.ServiceBase.Destroy() return } -//注册服务会话 当有新的服务加入时 -func (this *RPCXService) FindServiceHandlefunc(node registry.ServiceNode) { - if _, ok := this.serverList.Load(node.Id); !ok { - if s, err := NewServiceSession(&node); err != nil { - log.Errorf("创建服务会话失败【%s】 err:%v", node.Id, err) - } else { - this.serverList.Store(node.Id, s) - } - } - if this.IsInClustered { - event.TriggerEvent(core.Event_FindNewService, node) //触发发现新的服务事件 - } else { - if node.Id == this.opts.Setting.Id { //发现自己 加入集群成功 - this.IsInClustered = true - event.TriggerEvent(core.Event_RegistryStart) - } - } -} - -//更新服务会话 当有新的服务加入时 -func (this *RPCXService) UpDataServiceHandlefunc(node registry.ServiceNode) { - if ss, ok := this.serverList.Load(node.Id); ok { //已经在缓存中 需要更新节点信息 - session := ss.(base.IRPCXServiceSession) - if session.GetRpcId() != node.RpcId { - if s, err := NewServiceSession(&node); err != nil { - log.Errorf("更新服务会话失败【%s】 err:%v", node.Id, err) - } else { - this.serverList.Store(node.Id, s) - } - event.TriggerEvent(core.Event_FindNewService, node) //触发发现新的服务事件 - } else { - if session.GetVersion() != node.Version { - session.SetVersion(node.Version) - } - if session.GetPreWeight() != node.PreWeight { - session.SetPreWeight(node.PreWeight) - } - event.TriggerEvent(core.Event_UpDataOldService, node) //触发发现新的服务事件 - } - } -} - -//注销服务会话 -func (this *RPCXService) LoseServiceHandlefunc(sId string) { - session, ok := this.serverList.Load(sId) - if ok && session != nil { - session.(base.IRPCXServiceSession).Done() - this.serverList.Delete(sId) - } - event.TriggerEvent(core.Event_LoseService, sId) //触发发现新的服务事件 -} - -func (this *RPCXService) getServiceSessionByType(sType string, sIp string) (ss []base.IRPCXServiceSession, err error) { - ss = make([]base.IRPCXServiceSession, 0) - if nodes := registry.GetServiceByType(sType); nodes == nil { - log.Errorf("获取目标类型 type【%s】ip [%s] 服务集失败", sType, sIp) - return nil, err - } else { - if sIp == core.AutoIp { - for _, v := range nodes { - if s, ok := this.serverList.Load(v.Id); ok { - ss = append(ss, s.(base.IRPCXServiceSession)) - } else { - s, err = NewServiceSession(v) - if err != nil { - log.Errorf("创建服务会话失败【%s】 err:%v", v.Id, err) - continue - } else { - this.serverList.Store(v.Id, s) - ss = append(ss, s.(base.IRPCXServiceSession)) - } - } - } - } else { - for _, v := range nodes { - if v.IP == sIp { - if s, ok := this.serverList.Load(v.Id); ok { - ss = append(ss, s.(base.IRPCXServiceSession)) - } else { - s, err = NewServiceSession(v) - if err != nil { - log.Errorf("创建服务会话失败【%s】 err:%v", v.Id, err) - continue - } else { - this.serverList.Store(v.Id, s) - ss = append(ss, s.(base.IRPCXServiceSession)) - } - } - } - } - } - } - return -} - -//默认路由规则 -func (this *RPCXService) DefauleRpcRouteRules(stype string, sip string) (ss base.IRPCXServiceSession, err error) { - if s, e := this.getServiceSessionByType(stype, sip); e != nil { - return nil, e - } else { - ss := make([]interface{}, len(s)) - for i, v := range s { - ss[i] = v - } - if len(ss) > 0 { - //排序找到最优服务 - sortslice.Sort(ss, func(a interface{}, b interface{}) int8 { - as := a.(base.IRPCXServiceSession) - bs := b.(base.IRPCXServiceSession) - if iscompare := version.CompareStrVer(as.GetVersion(), bs.GetVersion()); iscompare != 0 { - return iscompare - } else { - if as.GetPreWeight() < bs.GetPreWeight() { - return 1 - } else if as.GetPreWeight() > bs.GetPreWeight() { - return -1 - } else { - return 0 - } - } - }) - return ss[0].(base.IRPCXServiceSession), nil - } else { - return nil, fmt.Errorf("未找到IP[%s]类型%s】的服务信息", sip, stype) - } - } -} - //注册服务对象 func (this *RPCXService) Register(rcvr interface{}) (err error) { err = rpcx.Register(rcvr) @@ -281,65 +135,11 @@ func (this *RPCXService) RegisterFunctionName(name string, fn interface{}) (err } //同步 执行目标远程服务方法 -func (this *RPCXService) RpcCallById(sId string, serviceMethod string, ctx context.Context, args interface{}, reply interface{}) (err error) { - defer lego.Recover(fmt.Sprintf("RpcCallById sId:%s rkey:%v arg %v", sId, serviceMethod, args)) - ss, ok := this.serverList.Load(sId) - if !ok { - if node, err := registry.GetServiceById(sId); err != nil { - log.Errorf("未找到目标服务【%s】节点 err:%v", sId, err) - return fmt.Errorf("No Found " + sId) - } else { - ss, err = NewServiceSession(node) - if err != nil { - return fmt.Errorf(fmt.Sprintf("创建服务会话失败【%s】 err:%v", sId, err)) - } else { - this.serverList.Store(node.Id, ss) - } - } - } - err = ss.(base.IRPCXServiceSession).Call(ctx, serviceMethod, args, reply) - return +func (this *RPCXService) RpcCall(ctx context.Context, servicePath string, serviceMethod string, args interface{}, reply interface{}) (err error) { + return rpcx.Call(ctx, servicePath, serviceMethod, args, reply) } //异步 执行目标远程服务方法 -func (this *RPCXService) RpcGoById(sId string, serviceMethod string, ctx context.Context, args interface{}, reply interface{}) (call *client.Call, err error) { - defer lego.Recover(fmt.Sprintf("RpcGoById sId:%s rkey:%v arg %v", sId, serviceMethod, args)) - ss, ok := this.serverList.Load(sId) - if !ok { - if node, err := registry.GetServiceById(sId); err != nil { - log.Errorf("未找到目标服务【%s】节点 err:%v", sId, err) - return nil, fmt.Errorf("No Found " + sId) - } else { - ss, err = NewServiceSession(node) - if err != nil { - return nil, fmt.Errorf(fmt.Sprintf("创建服务会话失败【%s】 err:%v", sId, err)) - } else { - this.serverList.Store(node.Id, ss) - } - } - } - call, err = ss.(base.IRPCXServiceSession).Go(ctx, serviceMethod, args, reply) - return -} - -func (this *RPCXService) RpcCallByType(sType string, serviceMethod string, ctx context.Context, args interface{}, reply interface{}) (err error) { - defer lego.Recover(fmt.Sprintf("RpcCallByType sType:%s rkey:%s arg %v", sType, serviceMethod, args)) - ss, err := this.rpcxService.DefauleRpcRouteRules(sType, core.AutoIp) - if err != nil { - log.Errorf("未找到目标服务【%s】节点 err:%v", sType, err) - return err - } - err = ss.Call(ctx, serviceMethod, args, reply) - return -} - -func (this *RPCXService) RpcGoByType(sType string, serviceMethod string, ctx context.Context, args interface{}, reply interface{}) (call *client.Call, err error) { - defer lego.Recover(fmt.Sprintf("RpcCallByType sType:%s rkey:%s arg %v", sType, serviceMethod, args)) - ss, err := this.rpcxService.DefauleRpcRouteRules(sType, core.AutoIp) - if err != nil { - log.Errorf("未找到目标服务【%s】节点 err:%v", sType, err) - return nil, err - } - call, err = ss.Go(ctx, serviceMethod, args, reply) - return +func (this *RPCXService) RpcGo(ctx context.Context, servicePath string, serviceMethod string, args interface{}, reply interface{}) (call *client.Call, err error) { + return rpcx.Go(ctx, servicePath, serviceMethod, args, reply, nil) } diff --git a/lego/base/rpcx/servicesession.go b/lego/base/rpcx/servicesession.go deleted file mode 100644 index 44085e5af..000000000 --- a/lego/base/rpcx/servicesession.go +++ /dev/null @@ -1,64 +0,0 @@ -package rpcx - -import ( - "context" - "fmt" - - "go_dreamfactory/lego/base" - "go_dreamfactory/lego/sys/registry" - "go_dreamfactory/lego/sys/rpcx" - - "github.com/smallnest/rpcx/client" -) - -func NewServiceSession(node *registry.ServiceNode) (ss base.IRPCXServiceSession, err error) { - session := new(ServiceSession) - session.node = node - session.client, err = rpcx.NewRpcClient(fmt.Sprintf("%s:%d", node.IP, node.Port), node.Id) - ss = session - return -} - -type ServiceSession struct { - node *registry.ServiceNode - client rpcx.IRPCXClient -} - -func (this *ServiceSession) GetId() string { - return this.node.Id -} -func (this *ServiceSession) GetIp() string { - return this.node.IP -} - -func (this *ServiceSession) GetRpcId() string { - return this.node.RpcId -} - -func (this *ServiceSession) GetType() string { - return this.node.Type -} -func (this *ServiceSession) GetVersion() string { - return this.node.Version -} -func (this *ServiceSession) SetVersion(v string) { - this.node.Version = v -} - -func (this *ServiceSession) GetPreWeight() float64 { - return this.node.PreWeight -} - -func (this *ServiceSession) SetPreWeight(p float64) { - this.node.PreWeight = p -} -func (this *ServiceSession) Done() { - this.client.Stop() -} -func (this *ServiceSession) Call(ctx context.Context, serviceMethod string, args interface{}, reply interface{}) error { - return this.client.Call(ctx, serviceMethod, args, reply) -} - -func (this *ServiceSession) Go(ctx context.Context, serviceMethod string, args interface{}, reply interface{}) (*client.Call, error) { - return this.client.Go(ctx, serviceMethod, args, reply, nil) -} diff --git a/lego/sys/rpcx/client.go b/lego/sys/rpcx/client.go index 3a3425bd8..440a2ea67 100644 --- a/lego/sys/rpcx/client.go +++ b/lego/sys/rpcx/client.go @@ -2,30 +2,102 @@ package rpcx import ( "context" + "errors" + "strings" "github.com/smallnest/rpcx/client" + "github.com/smallnest/rpcx/share" ) -func newClient(addr string, sId string) (c *Client, err error) { - c = &Client{} - d, err := client.NewPeer2PeerDiscovery("tcp@"+addr, "") - c.xclient = client.NewXClient(sId, client.Failfast, client.RandomSelect, d, client.DefaultOption) +func newClient(rpcx *RPCX) (c *Client) { + c = &Client{ + rpcx: rpcx, + clients: make(map[string]client.XClient), + // msgChan: make(chan *protocol.Message, 1000), + } return } type Client struct { - xclient client.XClient + rpcx *RPCX + clients map[string]client.XClient + // msgChan chan *protocol.Message // 接收rpcXServer推送消息 +} + +// DoMessage 服务端消息处理 +func (this *Client) DoMessage() { + // for msg := range this.msgChan { + + // } +} + +func (this *Client) Start() (err error) { + return } func (this *Client) Stop() (err error) { - err = this.xclient.Close() + for _, v := range this.clients { + v.Close() + } return } -func (this *Client) Call(ctx context.Context, serviceMethod string, args interface{}, reply interface{}) (err error) { - err = this.xclient.Call(ctx, string(serviceMethod), args, reply) +//同步调用 +func (this *Client) Call(ctx context.Context, servicePath string, serviceMethod string, args interface{}, reply interface{}) (err error) { + if servicePath == "" { + err = errors.New("servicePath no cant null") + return + } + var ( + spath []string + d *client.ConsulDiscovery + c client.XClient + ok bool + ) + spath = strings.Split(servicePath, "/") + if c, ok = this.clients[spath[0]]; !ok { + if d, err = client.NewConsulDiscovery(this.rpcx.options.ServiceTag, spath[0], this.rpcx.options.ConsulServers, nil); err != nil { + return + } + c = client.NewXClient(spath[0], client.Failfast, client.RandomSelect, d, client.DefaultOption) + c.SetSelector(newSelector()) + this.clients[spath[0]] = c + } + ctx = context.WithValue(ctx, share.ReqMetaDataKey, map[string]string{ + CallRoutRulesKey: servicePath, + ServiceAddrKey: "tcp@" + this.rpcx.options.ServiceAddr, + ServiceMetaKey: this.rpcx.metadata, + }) + err = c.Call(ctx, serviceMethod, args, reply) return } -func (this *Client) Go(ctx context.Context, serviceMethod string, args interface{}, reply interface{}, done chan *client.Call) (*client.Call, error) { - return this.xclient.Go(ctx, string(serviceMethod), args, reply, done) + +//异步调用 +func (this *Client) Go(ctx context.Context, servicePath string, serviceMethod string, args interface{}, reply interface{}, done chan *client.Call) (call *client.Call, err error) { + // return this.xclient.Go(ctx, string(serviceMethod), args, reply, done) + if servicePath == "" { + err = errors.New("servicePath no cant null") + return + } + var ( + spath []string + d *client.ConsulDiscovery + c client.XClient + ok bool + ) + spath = strings.Split(servicePath, "/") + if c, ok = this.clients[spath[0]]; !ok { + if d, err = client.NewConsulDiscovery(this.rpcx.options.ServiceTag, spath[0], this.rpcx.options.ConsulServers, nil); err != nil { + return + } + c = client.NewXClient(spath[0], client.Failfast, client.RandomSelect, d, client.DefaultOption) + c.SetSelector(newSelector()) + this.clients[spath[0]] = c + } + ctx = context.WithValue(ctx, share.ReqMetaDataKey, map[string]string{ + CallRoutRulesKey: servicePath, + ServiceAddrKey: "tcp@" + this.rpcx.options.ServiceAddr, + ServiceMetaKey: this.rpcx.metadata, + }) + return c.Go(ctx, string(serviceMethod), args, reply, done) } diff --git a/lego/sys/rpcx/core.go b/lego/sys/rpcx/core.go index c1f6f48af..cfd0a0d1c 100644 --- a/lego/sys/rpcx/core.go +++ b/lego/sys/rpcx/core.go @@ -2,16 +2,23 @@ package rpcx import ( "context" + "fmt" + "net/url" "github.com/smallnest/rpcx/client" ) +const ( + ServiceMetaKey = "smeta" + ServiceAddrKey = "addr" + CallRoutRulesKey = "callrules" +) + type ( ISys interface { IRPCXServer - NewRpcClient(addr, sId string) (clent IRPCXClient, err error) + IRPCXClient } - IRPCXServer interface { Start() (err error) Stop() (err error) @@ -22,9 +29,10 @@ type ( } IRPCXClient interface { + Start() (err error) Stop() (err error) - Call(ctx context.Context, serviceMethod string, args interface{}, reply interface{}) error - Go(ctx context.Context, serviceMethod string, args interface{}, reply interface{}, done chan *client.Call) (*client.Call, error) + Call(ctx context.Context, servicePath string, serviceMethod string, args interface{}, reply interface{}) (err error) + Go(ctx context.Context, servicePath string, serviceMethod string, args interface{}, reply interface{}, done chan *client.Call) (call *client.Call, err error) } ) @@ -33,12 +41,20 @@ var ( ) func OnInit(config map[string]interface{}, option ...Option) (err error) { - defsys, err = newSys(newOptions(config, option...)) + var options Options + if options, err = newOptions(config, option...); err != nil { + return + } + defsys, err = newSys(options) return } func NewSys(option ...Option) (sys ISys, err error) { - sys, err = newSys(newOptionsByOption(option...)) + var options Options + if options, err = newOptionsByOption(option...); err != nil { + return + } + sys, err = newSys(options) return } @@ -64,6 +80,51 @@ func UnregisterAll() (err error) { return defsys.UnregisterAll() } -func NewRpcClient(addr, sId string) (clent IRPCXClient, err error) { - return defsys.NewRpcClient(addr, sId) +func Call(ctx context.Context, servicePath string, serviceMethod string, args interface{}, reply interface{}) (err error) { + return defsys.Call(ctx, servicePath, serviceMethod, args, reply) +} + +func Go(ctx context.Context, servicePath string, serviceMethod string, args interface{}, reply interface{}, done chan *client.Call) (call *client.Call, err error) { + return defsys.Go(ctx, servicePath, serviceMethod, args, reply, done) +} + +//服务元数据转服务节点信息 +func smetaToServiceNode(meta string) (node *ServiceNode, err error) { + if meta == "" { + fmt.Errorf("meta is nill") + return + } + node = &ServiceNode{} + data := make(map[string]string) + metadata, _ := url.ParseQuery(meta) + for k, v := range metadata { + if len(v) > 0 { + data[k] = v[0] + } + } + if sid, ok := data["sid"]; !ok { + err = fmt.Errorf("no found sid") + return + } else { + node.ServiceId = sid + } + if stype, ok := data["stype"]; !ok { + err = fmt.Errorf("no found stype") + return + } else { + node.ServiceType = stype + } + if version, ok := data["version"]; !ok { + err = fmt.Errorf("no found version") + return + } else { + node.Version = version + } + if addr, ok := data["addr"]; !ok { + err = fmt.Errorf("no found addr") + return + } else { + node.ServiceAddr = addr + } + return } diff --git a/lego/sys/rpcx/options.go b/lego/sys/rpcx/options.go index aab6fd0b1..675fdced9 100644 --- a/lego/sys/rpcx/options.go +++ b/lego/sys/rpcx/options.go @@ -1,19 +1,42 @@ package rpcx import ( + "errors" "go_dreamfactory/lego/sys/log" "go_dreamfactory/lego/utils/mapstructure" +) - "github.com/smallnest/rpcx/client" +type RpcxStartType int8 + +const ( + RpcxStartByService RpcxStartType = iota //启动服务端 + RpcxStartByClient //启动客户端 + RpcxStartByAll //服务端客户端都启动 ) type Option func(*Options) type Options struct { - ServiceId string //服务id - Port int //监听地址 - FailMode client.FailMode //失败模式 - Debug bool //日志是否开启 - Log log.ILog + ServiceTag string //集群标签 + ServiceType string //服务类型 + ServiceId string //服务id + ServiceVersion string //服务版本 + ServiceAddr string //服务地址 + ConsulServers []string //Consul集群服务地址 + RpcxStartType RpcxStartType //Rpcx启动类型 + Debug bool //日志是否开启 + Log log.ILog +} + +func SetServiceTag(v string) Option { + return func(o *Options) { + o.ServiceTag = v + } +} + +func SetServiceType(v string) Option { + return func(o *Options) { + o.ServiceType = v + } } func SetServiceId(v string) Option { @@ -21,11 +44,25 @@ func SetServiceId(v string) Option { o.ServiceId = v } } -func SetPort(v int) Option { + +func SetServiceVersion(v string) Option { return func(o *Options) { - o.Port = v + o.ServiceVersion = v } } + +func SetServiceAddr(v string) Option { + return func(o *Options) { + o.ServiceAddr = v + } +} + +func SetConsulServers(v []string) Option { + return func(o *Options) { + o.ConsulServers = v + } +} + func SetDebug(v bool) Option { return func(o *Options) { o.Debug = v @@ -37,7 +74,7 @@ func SetLog(v log.ILog) Option { } } -func newOptions(config map[string]interface{}, opts ...Option) Options { +func newOptions(config map[string]interface{}, opts ...Option) (Options, error) { options := Options{ Debug: true, Log: log.Clone(log.SetLoglayer(2)), @@ -48,10 +85,13 @@ func newOptions(config map[string]interface{}, opts ...Option) Options { for _, o := range opts { o(&options) } - return options + if len(options.ServiceTag) == 0 || len(options.ServiceType) == 0 || len(options.ServiceId) == 0 || len(options.ConsulServers) == 0 { + return options, errors.New("[Sys.RPCX] newOptions err: 启动参数异常") + } + return options, nil } -func newOptionsByOption(opts ...Option) Options { +func newOptionsByOption(opts ...Option) (Options, error) { options := Options{ Debug: true, Log: log.Clone(log.SetLoglayer(2)), @@ -59,5 +99,8 @@ func newOptionsByOption(opts ...Option) Options { for _, o := range opts { o(&options) } - return options + if len(options.ServiceTag) == 0 || len(options.ServiceType) == 0 || len(options.ServiceId) == 0 || len(options.ConsulServers) == 0 { + return options, errors.New("[Sys.RPCX] newOptions err: 启动参数异常") + } + return options, nil } diff --git a/lego/sys/rpcx/rpcx.go b/lego/sys/rpcx/rpcx.go index 9bc9a1272..65ff7ae93 100644 --- a/lego/sys/rpcx/rpcx.go +++ b/lego/sys/rpcx/rpcx.go @@ -1,40 +1,60 @@ package rpcx +import ( + "context" + "fmt" + + "github.com/smallnest/rpcx/client" +) + func newSys(options Options) (sys *RPCX, err error) { sys = &RPCX{ - options: options, - service: newService(options), + options: options, + metadata: fmt.Sprintf("stype=%s&sid=%s&version=%s&addr=%s", options.ServiceType, options.ServiceId, options.ServiceVersion, "tcp@"+options.ServiceAddr), } + sys.service, err = newService(sys) + sys.client = newClient(sys) + // if options.RpcxStartType == RpcxStartByAll || options.RpcxStartType == RpcxStartByService { //创建RPCX 服务端 + + // } + + // if options.RpcxStartType == RpcxStartByAll || options.RpcxStartType == RpcxStartByClient { //创建RPCX 客户端 + + // } return } type RPCX struct { - options Options - service IRPCXServer + options Options + metadata string + service IRPCXServer + client IRPCXClient } func (this *RPCX) Start() (err error) { this.service.Start() + this.client.Start() return } func (this *RPCX) Stop() (err error) { - err = this.service.Stop() + this.service.Stop() + this.client.Stop() return } func (this *RPCX) Register(rcvr interface{}) (err error) { - err = this.service.Register(rcvr) + this.service.Register(rcvr) return } func (this *RPCX) RegisterFunction(fn interface{}) (err error) { - err = this.service.RegisterFunction(fn) + this.service.RegisterFunction(fn) return } func (this *RPCX) RegisterFunctionName(name string, fn interface{}) (err error) { - err = this.service.RegisterFunctionName(name, fn) + this.service.RegisterFunctionName(name, fn) return } @@ -42,6 +62,54 @@ func (this *RPCX) UnregisterAll() (err error) { return this.service.UnregisterAll() } -func (this *RPCX) NewRpcClient(addr, sId string) (clent IRPCXClient, err error) { - return newClient(addr, sId) +//同步调用 +func (this *RPCX) Call(ctx context.Context, servicePath string, serviceMethod string, args interface{}, reply interface{}) (err error) { + return this.client.Call(ctx, servicePath, serviceMethod, args, reply) +} + +//异步调用 +func (this *RPCX) Go(ctx context.Context, servicePath string, serviceMethod string, args interface{}, reply interface{}, done chan *client.Call) (call *client.Call, err error) { + return this.client.Go(ctx, servicePath, serviceMethod, args, reply, done) +} + +// func (this *RPCX) PostCall(ctx context.Context, serviceName, methodName string, args, reply interface{}) (interface{}, error) { +// clientConn := ctx.Value(server.RemoteConnContextKey).(net.Conn) +// fmt.Printf("PostCall servicePath:%v serviceMethod:%v RemoteAddr:%v \n", serviceName, methodName, clientConn.RemoteAddr().String()) +// return args, nil +// } + +///日志*********************************************************************** +func (this *RPCX) Debug() bool { + return this.options.Debug +} + +func (this *RPCX) Debugf(format string, a ...interface{}) { + if this.options.Debug { + this.options.Log.Debugf("[SYS RPCX] "+format, a...) + } +} +func (this *RPCX) Infof(format string, a ...interface{}) { + if this.options.Debug { + this.options.Log.Infof("[SYS RPCX] "+format, a...) + } +} +func (this *RPCX) Warnf(format string, a ...interface{}) { + if this.options.Debug { + this.options.Log.Warnf("[SYS RPCX] "+format, a...) + } +} +func (this *RPCX) Errorf(format string, a ...interface{}) { + if this.options.Debug { + this.options.Log.Errorf("[SYS RPCX] "+format, a...) + } +} +func (this *RPCX) Panicf(format string, a ...interface{}) { + if this.options.Debug { + this.options.Log.Panicf("[SYS RPCX] "+format, a...) + } +} +func (this *RPCX) Fatalf(format string, a ...interface{}) { + if this.options.Debug { + this.options.Log.Fatalf("[SYS RPCX] "+format, a...) + } } diff --git a/lego/sys/rpcx/rpcx_test.go b/lego/sys/rpcx/rpcx_test.go new file mode 100644 index 000000000..0e535f86c --- /dev/null +++ b/lego/sys/rpcx/rpcx_test.go @@ -0,0 +1,178 @@ +package rpcx + +import ( + "context" + "fmt" + "net" + "os" + "os/signal" + "syscall" + "testing" + "time" + + "go_dreamfactory/lego/sys/log" + + "github.com/rcrowley/go-metrics" + "github.com/smallnest/rpcx/client" + "github.com/smallnest/rpcx/protocol" + "github.com/smallnest/rpcx/server" + "github.com/smallnest/rpcx/serverplugin" + "github.com/smallnest/rpcx/share" +) + +func Test_Sys(t *testing.T) { + if err := log.OnInit(nil); err != nil { + fmt.Printf("err:%v", err) + return + } + if sys, err := NewSys( + SetServiceTag("dreamfactory"), + SetServiceType("worker"), + SetServiceId("worker_1"), + SetServiceVersion("1.0.0"), + SetServiceAddr("127.0.0.1:9978"), + SetConsulServers([]string{"10.0.0.9:8500"}), + ); err != nil { + fmt.Printf("err:%v", err) + return + } else { + if err = sys.Register(new(Arith)); err != nil { + fmt.Printf("err:%v", err) + return + } + if err = sys.Start(); err != nil { + fmt.Printf("err:%v", err) + return + } + go func() { + time.Sleep(time.Second * 3) + if err = sys.Call(context.Background(), "worker/worker_1", "Mul", &Args{A: 1, B: 2}, &Reply{}); err != nil { + fmt.Printf("Call:%v \n", err) + return + } + }() + } + + sigterm := make(chan os.Signal, 1) + signal.Notify(sigterm, syscall.SIGINT, syscall.SIGTERM) + select { + case <-sigterm: + fmt.Printf("terminating: via signal\n") + } +} + +var addr = "127.0.0.1:9978" + +// go server.go +func Test_RPCX(t *testing.T) { + s := server.NewServer() + if err := addRegistryPlugin(s); err != nil { + fmt.Printf("err:%v", err) + return + } + go func() { + time.Sleep(time.Second) + s.RegisterName("worker", new(Arith), "stype=worker&sid=worker_1&version=1.0.0&addr=tcp@127.0.0.1:9978") + }() + + go func() { + time.Sleep(time.Second * 3) + if d, err := client.NewConsulDiscovery("rpcx_test", "worker", []string{"10.0.0.9:8500"}, nil); err != nil { + fmt.Printf("NewConsulDiscovery err:%v", err) + return + } else { + xclient := client.NewXClient("worker", client.Failfast, client.RandomSelect, d, client.DefaultOption) + xclient.SetSelector(newSelector()) + ctx := context.WithValue(context.Background(), share.ReqMetaDataKey, map[string]string{"RoutRules": "worker/worker_1"}) + if err = xclient.Call(ctx, "Mul", &Args{A: 1, B: 2}, &Reply{}); err != nil { + fmt.Printf("Call:%v \n", err) + return + } + } + + }() + + s.Serve("tcp", addr) +} + +func addRegistryPlugin(s *server.Server) (err error) { + r := &serverplugin.ConsulRegisterPlugin{ + ServiceAddress: "tcp@" + addr, + ConsulServers: []string{"10.0.0.9:8500"}, + BasePath: "rpcx_test", + Metrics: metrics.NewRegistry(), + UpdateInterval: time.Minute, + } + err = r.Start() + if err != nil { + return + } + s.Plugins.Add(r) + s.Plugins.Add(&call{}) + return +} + +type call struct{} + +// func (this *call) PostCall(ctx context.Context, serviceName, methodName string, args, reply interface{}) (interface{}, error) { +// clientConn := ctx.Value(server.RemoteConnContextKey).(net.Conn) +// RoutRules := ctx.Value("RoutRules") +// fmt.Printf("PostCall servicePath:%v serviceMethod:%v RoutRules:%s RemoteAddr:%v \n", serviceName, methodName, RoutRules, clientConn.RemoteAddr().String()) +// return args, nil +// } + +// func (this *call) PreCall(ctx context.Context, serviceName, methodName string, args interface{}) (interface{}, error) { +// clientConn := ctx.Value(server.RemoteConnContextKey).(net.Conn) +// RoutRules := ctx.Value("RoutRules").(string) +// fmt.Printf("PostCall servicePath:%v serviceMethod:%v RoutRules:%s RemoteAddr:%v \n", serviceName, methodName, RoutRules, clientConn.RemoteAddr().String()) +// return args, nil +// } + +// func (this *call) PreReadRequest(ctx context.Context) error { +// clientConn := ctx.Value(server.RemoteConnContextKey).(net.Conn) +// RoutRules := ctx.Value(share.ReqMetaDataKey).(map[string]string) +// fmt.Printf("PreReadRequest RoutRules:%s RemoteAddr:%v \n", RoutRules, clientConn.RemoteAddr().String()) +// return nil +// } + +// func (this *call) PreWriteResponse(ctx context.Context, args *protocol.Message, repy *protocol.Message, errInter error) error { +// clientConn := ctx.Value(server.RemoteConnContextKey).(net.Conn) +// RoutRules := ctx.Value("RoutRules").(string) +// fmt.Printf("PreReadRequest RoutRules:%s RemoteAddr:%v \n", RoutRules, clientConn.RemoteAddr().String()) +// return nil +// } + +func (this *call) PreHandleRequest(ctx context.Context, r *protocol.Message) error { + clientConn := ctx.Value(server.RemoteConnContextKey).(net.Conn) + RoutRules := ctx.Value(share.ReqMetaDataKey).(map[string]string) + fmt.Printf("PreReadRequest RoutRules:%s RemoteAddr:%v \n", RoutRules, clientConn.RemoteAddr().String()) + return nil +} + +type Args struct { + A int + B int +} + +type Reply struct { + C int +} + +type Arith int + +func (t *Arith) Mul(ctx context.Context, args *Args, reply *Reply) error { + reply.C = args.A * args.B + fmt.Printf("call: %d * %d = %d\n", args.A, args.B, reply.C) + return nil +} + +func (t *Arith) Add(ctx context.Context, args *Args, reply *Reply) error { + reply.C = args.A + args.B + fmt.Printf("call: %d + %d = %d\n", args.A, args.B, reply.C) + return nil +} + +func (t *Arith) Say(ctx context.Context, args *string, reply *string) error { + *reply = "hello " + *args + return nil +} diff --git a/lego/sys/rpcx/selector.go b/lego/sys/rpcx/selector.go new file mode 100644 index 000000000..83a5fa089 --- /dev/null +++ b/lego/sys/rpcx/selector.go @@ -0,0 +1,77 @@ +package rpcx + +import ( + "context" + "fmt" + "go_dreamfactory/lego/sys/log" + "strings" + + "github.com/smallnest/rpcx/share" +) + +func newSelector() *Selector { + return &Selector{ + servers: make(map[string]*ServiceNode), + serversType: make(map[string][]*ServiceNode), + i: make(map[string]int), + } +} + +type ServiceNode struct { + ServiceId string `json:"sid"` //服务id + ServiceType string `json:"stype"` //服务类型 + Version string `json:"version"` //服务版本 + ServiceAddr string `json:"addr"` //服务地址 +} + +type Selector struct { + servers map[string]*ServiceNode + serversType map[string][]*ServiceNode + i map[string]int +} + +///servicePath = [stype] or [stype/sid] +func (this *Selector) Select(ctx context.Context, servicePath, serviceMethod string, args interface{}) string { + fmt.Printf("Select servicePath:%v serviceMethod:%v ReqMetaData:%v \n", servicePath, serviceMethod, ctx.Value(share.ReqMetaDataKey)) + routrules := ctx.Value(share.ReqMetaDataKey).(map[string]string)[CallRoutRulesKey] + service := strings.Split(routrules, "/") + leng := len(service) + if leng == 1 { + if nodes, ok := this.serversType[service[0]]; ok { + i, ok := this.i[service[0]] + if !ok { + i = 0 + } + i = i % len(nodes) + this.i[service[0]] = i + 1 + return nodes[i].ServiceAddr + } + } else if leng == 2 { + if node, ok := this.servers[service[1]]; ok { + return node.ServiceAddr + } + } + return "" +} + +func (this *Selector) UpdateServer(servers map[string]string) { + ss := make(map[string]*ServiceNode) + sst := make(map[string][]*ServiceNode) + for _, v := range servers { + if node, err := smetaToServiceNode(v); err != nil { + log.Errorf("smetaToServiceNode:%s err:%v", v, err) + continue + } else { + ss[node.ServiceId] = node + if ssts, ok := sst[node.ServiceType]; !ok { + sst[node.ServiceType] = make([]*ServiceNode, 0) + sst[node.ServiceType] = append(sst[node.ServiceType], node) + } else { + ssts = append(ssts, node) + } + } + + } + this.servers = ss + this.serversType = sst +} diff --git a/lego/sys/rpcx/service.go b/lego/sys/rpcx/service.go index 86c2dc5bb..7a5e36589 100644 --- a/lego/sys/rpcx/service.go +++ b/lego/sys/rpcx/service.go @@ -1,26 +1,54 @@ package rpcx import ( - "fmt" + "context" + "go_dreamfactory/lego/sys/log" + "net" + "time" + "github.com/rcrowley/go-metrics" + "github.com/smallnest/rpcx/client" "github.com/smallnest/rpcx/server" + "github.com/smallnest/rpcx/serverplugin" ) -func newService(options Options) (s *Service) { +func newService(rpcx *RPCX) (s *Service, err error) { s = &Service{ - server: server.NewServer(), - options: options, + server: server.NewServer(), + rpcx: rpcx, + // clients: make(map[string]net.Conn), + // clientmeta: make(map[string]string), } + + r := &serverplugin.ConsulRegisterPlugin{ + ServiceAddress: "tcp@" + rpcx.options.ServiceAddr, + ConsulServers: []string{"10.0.0.9:8500"}, + BasePath: rpcx.options.ServiceTag, + Metrics: metrics.NewRegistry(), + UpdateInterval: time.Minute, + } + if err = r.Start(); err != nil { + return + } + s.server.Plugins.Add(r) return } type Service struct { - server *server.Server - options Options + rpcx *RPCX + server *server.Server + selector client.Selector + clients map[string]net.Conn + clientmeta map[string]string } func (this *Service) Start() (err error) { - go this.server.Serve("tcp", fmt.Sprintf(":%d", this.options.Port)) + + go func() { + if err = this.server.Serve("tcp", this.rpcx.options.ServiceAddr); err != nil { + log.Errorf("rpcx server exit!") + } + }() return } @@ -30,18 +58,80 @@ func (this *Service) Stop() (err error) { } func (this *Service) Register(rcvr interface{}) (err error) { - err = this.server.RegisterName(this.options.ServiceId, rcvr, "") + err = this.server.RegisterName(this.rpcx.options.ServiceType, rcvr, this.rpcx.metadata) return } + func (this *Service) RegisterFunction(fn interface{}) (err error) { - err = this.server.RegisterFunction(this.options.ServiceId, fn, "") + err = this.server.RegisterFunction(this.rpcx.options.ServiceType, fn, this.rpcx.metadata) return } func (this *Service) RegisterFunctionName(name string, fn interface{}) (err error) { - err = this.server.RegisterFunctionName(this.options.ServiceId, name, fn, "") + err = this.server.RegisterFunctionName(this.rpcx.options.ServiceType, name, fn, this.rpcx.metadata) return } func (this *Service) UnregisterAll() (err error) { err = this.server.UnregisterAll() return } + +//同步调用 +func (this *Service) Call(servicePath string, ctx context.Context, serviceMethod string, args interface{}, reply interface{}) (err error) { + // var ( + // spath string + // clientaddr string + // conn net.Conn + // ok bool + // ) + // if servicePath == "" { + // err = errors.New("servicePath no cant null") + // return + // } + // spath := strings.Split(servicePath, "/") + // ctx = context.WithValue(ctx, share.ReqMetaDataKey, map[string]string{ + // CallRoutRulesKey: servicePath, + // ServiceAddrKey: "tcp@" + this.options.ServiceAddr, + // ServiceMetaKey: this.metadata, + // }) + // if clientaddr = this.selector.Select(ctx, spath[0], serviceMethod, args); clientaddr == "" { + // err = fmt.Errorf("on found routRules:%s", routRules) + // return + // } + // if conn, ok = this.clients[clientaddr]; !ok { + // err = fmt.Errorf("on found clientaddr:%s", clientaddr) + // return + // } + // err := this.server.SendMessage(conn, spath[0], serviceMethod, nil, []byte("abcde")){ + + // } + return +} + +//异步调用 +func (this *Service) Go(routRules string, ctx context.Context, serviceMethod string, args interface{}, reply interface{}) (err error) { + return +} + +//发现服务 +func (this *Service) Discovery(addr string, conn net.Conn, meta string) { + this.clientmeta[addr] = meta + this.clients[addr] = conn + this.selector.UpdateServer(this.clientmeta) +} + +// //监听客户端链接到服务上 保存客户端的连接对象 +// func (this *Service) PreHandleRequest(ctx context.Context, r *protocol.Message) error { +// if smeta, ok := ctx.Value(share.ReqMetaDataKey).(map[string]string)[ServiceAddrKey]; ok { +// // log.Errorf("smeta:%s err:%v", smeta, ok) +// if node, err := smetaToServiceNode(smeta); err == nil { +// if _, ok = this.clientmeta[node.ServiceId]; !ok { +// this.clientmeta[node.ServiceId] = smeta +// } +// } +// } + +// // clientConn := ctx.Value(server.RemoteConnContextKey).(net.Conn) + +// // fmt.Printf("PreReadRequest RoutRules:%s RemoteAddr:%v \n", RoutRules, clientConn.RemoteAddr().String()) +// return nil +// } diff --git a/modules/friend/friend_comp.go b/modules/friend/friend_comp.go index f0e48dc2c..b12ca844f 100644 --- a/modules/friend/friend_comp.go +++ b/modules/friend/friend_comp.go @@ -8,12 +8,20 @@ import ( "go_dreamfactory/modules" "go_dreamfactory/pb" "go_dreamfactory/sys/cache" + "go_dreamfactory/sys/db" "go_dreamfactory/utils" ) const ( + Friend_SubType_List = "list" Friend_SubType_Apply = "apply" Friend_SubType_ApplyList = "applylist" + Friend_SubType_AddBlack = "addblack" + Friend_SubType_DelBlack = "delblack" + Friend_SubType_Blacklist = "blacklist" + Friend_SubType_Agree = "agree" + Friend_SubType_Refuse = "refuse" + Friend_SubType_Search = "search" ) type FriendComp struct { @@ -29,6 +37,27 @@ func (this *FriendComp) Init(service core.IService, module core.IModule, comp co //搜索 func (this *FriendComp) Search(ctx context.Context, session comm.IUserSession, req *pb.FriendSearchReq) error { + var ( + code pb.ErrorCode + rsp *pb.FriendSearchRsp + friend *pb.FriendBase + ) + defer func() { + if code == pb.ErrorCode_Success { + rsp = &pb.FriendSearchRsp{ + Friend: friend, + } + } + session.SendMsg(string(this.module.GetType()), Friend_SubType_Search, code, rsp) + }() + + user := db.Defsys.Frined_FindCond(req.NickName) + if user != nil { + friend = &pb.FriendBase{ + UserId: user.Uid, + NickName: user.Name, + } + } return nil } @@ -115,7 +144,7 @@ func (this *FriendComp) Apply(ctx context.Context, session comm.IUserSession, re //将自己加入到目标用户的申请列表中 target.ApplyIds = append(target.ApplyIds, self.UserId) - err = cache.Defsys.Friend_Apply(&pb.Cache_FriendData{ + err = cache.Defsys.Friend_Update(&pb.Cache_FriendData{ UserId: req.FriendId, ApplyIds: target.ApplyIds, }) @@ -138,12 +167,6 @@ func (this *FriendComp) ApplyList(ctx context.Context, session comm.IUserSession list []*pb.FriendBase ) - self, err = cache.Defsys.Friend_Get(session.GetUserId()) - if self == nil || err != nil { - code = pb.ErrorCode_FriendSelfNoData - return - } - defer func() { if code == pb.ErrorCode_Success { rsp = &pb.FriendApplyListRsp{ @@ -153,6 +176,12 @@ func (this *FriendComp) ApplyList(ctx context.Context, session comm.IUserSession session.SendMsg(string(this.module.GetType()), Friend_SubType_ApplyList, code, rsp) }() + self, err = cache.Defsys.Friend_Get(session.GetUserId()) + if self == nil || err != nil { + code = pb.ErrorCode_FriendSelfNoData + return + } + for _, userId := range self.ApplyIds { //TODO 组装FriendBase明细数据 list = append(list, &pb.FriendBase{ @@ -169,28 +198,142 @@ func (this *FriendComp) Del(ctx context.Context, session comm.IUserSession, req } //好友列表 -func (this *FriendComp) List(ctx context.Context, session comm.IUserSession, req *pb.FriendListReq) error { +func (this *FriendComp) List(ctx context.Context, session comm.IUserSession, req *pb.FriendListReq) (err error) { + var ( + code pb.ErrorCode + self *pb.Cache_FriendData + rsp *pb.FriendListRsp + list []*pb.FriendBase + ) + + defer func() { + if code == pb.ErrorCode_Success { + rsp = &pb.FriendListRsp{ + List: list, + } + } + session.SendMsg(string(this.module.GetType()), Friend_SubType_List, code, rsp) + }() + + self, err = cache.Defsys.Friend_Get(session.GetUserId()) + if self == nil || err != nil { + code = pb.ErrorCode_FriendSelfNoData + return + } + + for _, userId := range self.FriendIds { + list = append(list, &pb.FriendBase{ + UserId: userId, + }) + } + return nil } //单个/批量同意 -func (this *FriendComp) Agree(ctx context.Context, session comm.IUserSession, req *pb.FriendAgreeOrRefuseReq) error { +func (this *FriendComp) Agree(ctx context.Context, session comm.IUserSession, req *pb.FriendAgreeReq) (err error) { + var ( + code pb.ErrorCode + self *pb.Cache_FriendData + rsp *pb.FriendAgreeRsp + optNum int32 + ) + defer func() { + if code == pb.ErrorCode_Success { + rsp = &pb.FriendAgreeRsp{ + Num: optNum, + } + } + session.SendMsg(string(this.module.GetType()), Friend_SubType_Agree, code, rsp) + }() + + self, err = cache.Defsys.Friend_Get(session.GetUserId()) + if self == nil || err != nil { + code = pb.ErrorCode_FriendSelfNoData + return + } + + //将申请人加入到自己的好友列表中 + for _, userId := range req.FriendIds { + if _, ok := utils.Find(self.FriendIds, userId); !ok { + self.FriendIds = append(self.FriendIds, userId) + } + } + + //将自己加入到申请人的好友列表中 + for _, userId := range req.FriendIds { + target, err2 := cache.Defsys.Friend_Get(userId) + if target == nil || err2 != nil { + code = pb.ErrorCode_FriendTargetNoData + continue + } + if _, ok := utils.Find(target.FriendIds, self.UserId); !ok { + target.FriendIds = append(target.FriendIds, self.UserId) + } + err = cache.Defsys.Friend_Update(target) + if err != nil { + code = pb.ErrorCode_DBError + return + } + } + + //将申请人从申请列表中删除 + for _, userId := range req.FriendIds { + self.ApplyIds = utils.DeleteString(self.ApplyIds, userId) + optNum++ + } + + //更新 + err = cache.Defsys.Friend_Update(self) + if err != nil { + code = pb.ErrorCode_DBError + return + } return nil } //单个/批量拒绝 -func (this *FriendComp) Refuse(ctx context.Context, session comm.IUserSession, req *pb.FriendAgreeOrRefuseReq) error { +func (this *FriendComp) Refuse(ctx context.Context, session comm.IUserSession, req *pb.FriendRefuseReq) (err error) { + //将申请人从申请列表中删除 + var ( + code pb.ErrorCode + self *pb.Cache_FriendData + rsp *pb.FriendAgreeRsp + optNum int32 + ) + defer func() { + if code == pb.ErrorCode_Success { + rsp = &pb.FriendAgreeRsp{ + Num: optNum, + } + } + session.SendMsg(string(this.module.GetType()), Friend_SubType_Refuse, code, rsp) + }() + + self, err = cache.Defsys.Friend_Get(session.GetUserId()) + if self == nil || err != nil { + code = pb.ErrorCode_FriendSelfNoData + return + } + + //将申请人从申请列表中删除 + for _, userId := range req.FriendIds { + self.ApplyIds = utils.DeleteString(self.ApplyIds, userId) + optNum++ + } + + //更新 + err = cache.Defsys.Friend_Update(self) + if err != nil { + code = pb.ErrorCode_DBError + return + } return nil } //赠送或接收 -func (this *FriendComp) ReceSend(ctx context.Context, session comm.IUserSession, req *pb.FriendReceiveOrSendReq) error { - return nil -} - -//好友数量 -func (this *FriendComp) Total(ctx context.Context, session comm.IUserSession, req *pb.FriendTotalReq) error { +func (this *FriendComp) ReceSend(ctx context.Context, session comm.IUserSession, req *pb.FriendReceiveReq) error { return nil } @@ -200,11 +343,129 @@ func (this *FriendComp) Detail(ctx context.Context, session comm.IUserSession, r } //黑名单 -func (this *FriendComp) Blacklist(ctx context.Context, session comm.IUserSession, req *pb.FriendBlackListReq) error { +func (this *FriendComp) Blacklist(ctx context.Context, session comm.IUserSession, req *pb.FriendBlackListReq) (err error) { + var ( + code pb.ErrorCode + self *pb.Cache_FriendData + rsp *pb.FriendBlackListRsp + list []*pb.FriendBase + ) + + defer func() { + if code == pb.ErrorCode_Success { + rsp = &pb.FriendBlackListRsp{ + Friends: list, + } + } + session.SendMsg(string(this.module.GetType()), Friend_SubType_Blacklist, code, rsp) + }() + + self, err = cache.Defsys.Friend_Get(session.GetUserId()) + if self == nil || err != nil { + code = pb.ErrorCode_FriendSelfNoData + return + } + + for _, userId := range self.BlackIds { + //TODO 完善FriendBase信息 + list = append(list, &pb.FriendBase{ + UserId: userId, + }) + } + return nil } //加入黑名单 -func (this *FriendComp) Addblack(ctx context.Context, session comm.IUserSession, req *pb.FriendBlackAddReq) error { +func (this *FriendComp) Addblack(ctx context.Context, session comm.IUserSession, req *pb.FriendBlackAddReq) (err error) { + var ( + code pb.ErrorCode + self *pb.Cache_FriendData + target *pb.Cache_FriendData + rsp *pb.FriendBlackAddRsp + blackNumMax = 50 //TODO 从配置中读取 + ) + + defer func() { + if code == pb.ErrorCode_Success { + rsp = &pb.FriendBlackAddRsp{ + FriendId: req.FriendId, + UserId: session.GetUserId(), + } + } + session.SendMsg(string(this.module.GetType()), Friend_SubType_AddBlack, code, rsp) + }() + + self, err = cache.Defsys.Friend_Get(session.GetUserId()) + if self == nil || err != nil { + code = pb.ErrorCode_FriendSelfNoData + return + } + + target, err = cache.Defsys.Friend_Get(req.FriendId) + if target == nil || err != nil { + code = pb.ErrorCode_FriendTargetNoData + return + } + + //判断目标是否在好友列表里面 + if _, ok := utils.Find(self.FriendIds, req.FriendId); ok { + code = pb.ErrorCode_FriendSelfBlackYet + return + } + + // 判断自己是否在对方的黑名单中 + if _, ok := utils.Find(target.BlackIds, self.UserId); ok { + code = pb.ErrorCode_FriendTargetBlackYet + return + } + + // 判断是否黑名单人数已满 + if len(self.BlackIds) >= blackNumMax { + code = pb.ErrorCode_FriendBlackMax + return + } + + //将目标加入黑名单 + self.BlackIds = append(self.BlackIds, req.FriendId) + //更新黑名单 + err = cache.Defsys.Friend_Update(self) + if err != nil { + code = pb.ErrorCode_DBError + return + } + return nil +} + +//删除黑名单 +func (this *FriendComp) delblack(ctx context.Context, session comm.IUserSession, req *pb.FriendDelBlackReq) (err error) { + var ( + code pb.ErrorCode + self *pb.Cache_FriendData + rsp *pb.FriendDelBlackRsp + ) + defer func() { + if code == pb.ErrorCode_Success { + rsp = &pb.FriendDelBlackRsp{ + FriendId: req.FriendId, + UserId: session.GetUserId(), + } + } + session.SendMsg(string(this.module.GetType()), Friend_SubType_AddBlack, code, rsp) + }() + self, err = cache.Defsys.Friend_Get(session.GetUserId()) + if self == nil || err != nil { + code = pb.ErrorCode_FriendSelfNoData + return + } + + //从黑名单列表中删除目标 + self.BlackIds = utils.DeleteString(self.BlackIds, req.FriendId) + //更新黑名单 + err = cache.Defsys.Friend_Update(self) + if err != nil { + code = pb.ErrorCode_DBError + return + } return nil } diff --git a/modules/gate_comp.go b/modules/gate_comp.go index 097ff4dd7..c2cc0c4c7 100644 --- a/modules/gate_comp.go +++ b/modules/gate_comp.go @@ -27,16 +27,17 @@ var typeOfError = reflect.TypeOf((*error)(nil)).Elem() */ type MComp_GateComp struct { cbase.ModuleCompBase - service base.IRPCXService //rpc服务对象 - module core.IModule //当前业务模块 - comp core.IModuleComp //网关组件自己 + S base.IRPCXService //rpc服务对象 + M core.IModule //当前业务模块 + comp core.IModuleComp //网关组件自己 + scomp comm.ISC_GateRouteComp } //组件初始化接口 func (this *MComp_GateComp) Init(service core.IService, module core.IModule, comp core.IModuleComp, options core.IModuleOptions) (err error) { this.ModuleCompBase.Init(service, module, comp, options) - this.service = service.(base.IRPCXService) - this.module = module + this.S = service.(base.IRPCXService) + this.M = module this.comp = comp return } @@ -48,59 +49,57 @@ func (this *MComp_GateComp) Start() (err error) { } var comp core.IServiceComp //注册远程路由 - if comp, err = this.service.GetComp(comm.SC_ServiceGateRouteComp); err != nil { + if comp, err = this.S.GetComp(comm.SC_ServiceGateRouteComp); err != nil { return } - this.suitableMethods(comp.(comm.ISC_GateRouteComp), reflect.TypeOf(this.comp)) + this.scomp = comp.(comm.ISC_GateRouteComp) + this.suitableMethods(reflect.TypeOf(this.comp)) return } //反射注册相关接口道services/comp_gateroute.go 对象中 -func (this *MComp_GateComp) suitableMethods(scomp comm.ISC_GateRouteComp, typ reflect.Type) { +func (this *MComp_GateComp) suitableMethods(typ reflect.Type) { for m := 0; m < typ.NumMethod(); m++ { method := typ.Method(m) - mtype := method.Type - mname := method.Name - // Method must be exported. - if method.PkgPath != "" { - continue - } - // Method needs four ins: receiver, context.Context, *args, *reply. - if mtype.NumIn() != 4 { - continue - } - // First arg must be context.Context - ctxType := mtype.In(1) - if !ctxType.Implements(typeOfContext) { - continue - } - - // Second arg need not be a pointer. - argType := mtype.In(2) - if !argType.Implements(typeOfSession) { - continue - } - // Third arg must be a pointer. - replyType := mtype.In(3) - if replyType.Kind() != reflect.Ptr { - continue - } - // Reply type must be exported. - if !this.isExportedOrBuiltinType(replyType) { - continue - } - // Method needs one out. - if mtype.NumOut() != 1 { - continue - } - // The return type of the method must be error. - if returnType := mtype.Out(0); returnType != typeOfError { - continue - } - scomp.RegisterRoute(fmt.Sprintf("%s.%s", this.module.GetType(), strings.ToLower(mname)), reflect.ValueOf(this.comp), replyType, method) + this.reflectionRouteHandle(method) } } +//反射路由处理函数 +func (this *MComp_GateComp) reflectionRouteHandle(method reflect.Method) bool { + mtype := method.Type + mname := method.Name + if method.PkgPath != "" { + return false + } + if mtype.NumIn() != 4 { + return false + } + ctxType := mtype.In(1) + if !ctxType.Implements(typeOfContext) { + return false + } + argType := mtype.In(2) + if !argType.Implements(typeOfSession) { + return false + } + replyType := mtype.In(3) + if replyType.Kind() != reflect.Ptr { + return false + } + if !this.isExportedOrBuiltinType(replyType) { + return false + } + if mtype.NumOut() != 1 { + return false + } + if returnType := mtype.Out(0); returnType != typeOfError { + return false + } + this.scomp.RegisterRoute(fmt.Sprintf("%s.%s", this.M.GetType(), strings.ToLower(mname)), reflect.ValueOf(this.comp), replyType, method) + return true +} + func (this *MComp_GateComp) isExportedOrBuiltinType(t reflect.Type) bool { for t.Kind() == reflect.Ptr { t = t.Elem() diff --git a/modules/gateway/agent.go b/modules/gateway/agent.go index 2371e9ba5..ab2f39e10 100644 --- a/modules/gateway/agent.go +++ b/modules/gateway/agent.go @@ -62,6 +62,7 @@ locp: go this.Close() break locp } + if err = proto.Unmarshal(data, msg); err != nil { log.Errorf("agent:%s uId:%s Unmarshal err:%v", this.sessionId, this.uId, err) go this.Close() @@ -142,7 +143,7 @@ func (this *Agent) Close() { func (this *Agent) messageDistribution(msg *pb.UserMessage) { reply := &pb.RPCMessageReply{} log.Debugf("agent:%s uId:%s MessageDistribution msg:%s.%s", this.sessionId, this.uId, msg.MainType, msg.SubType) - if err := this.gateway.Service().RpcCallByType("worker", string(comm.Rpc_GatewayRoute), context.Background(), &pb.AgentMessage{ + if err := this.gateway.Service().RpcCall(context.Background(), comm.Service_Worker, string(comm.Rpc_GatewayRoute), &pb.AgentMessage{ Ip: this.IP(), UserSessionId: this.sessionId, UserId: this.uId, diff --git a/modules/modulebase.go b/modules/modulebase.go index 5d5a48e39..33d4c03c1 100644 --- a/modules/modulebase.go +++ b/modules/modulebase.go @@ -2,6 +2,7 @@ package modules import ( "context" + "fmt" "go_dreamfactory/comm" "go_dreamfactory/pb" @@ -10,7 +11,8 @@ import ( "go_dreamfactory/lego/core/cbase" "go_dreamfactory/lego/sys/log" - "google.golang.org/protobuf/proto" + "github.com/golang/protobuf/proto" + "github.com/golang/protobuf/ptypes" ) /* @@ -31,14 +33,14 @@ func (this *ModuleBase) Init(service core.IService, module core.IModule, options //向指定用户发送消息 func (this *ModuleBase) SendMsgToUser(mainType, subType string, msg proto.Message, user *pb.Cache_UserData) (err error) { reply := &pb.RPCMessageReply{} - data, _ := proto.Marshal(msg) - if _, err = this.service.RpcGoById(user.GatewayServiceId, string(comm.Rpc_GatewayAgentSendMsg), context.Background(), &pb.AgentSendMessageReq{ + data, _ := ptypes.MarshalAny(msg) + if _, err = this.service.RpcGo(context.Background(), fmt.Sprintf("%s/%s", comm.Service_Gateway, user.GatewayServiceId), string(comm.Rpc_GatewayAgentSendMsg), &pb.AgentSendMessageReq{ UserSessionId: user.SessionId, MainType: mainType, SubType: subType, Data: data, }, reply); err != nil { - log.Errorf("SendMsgToUser%d:%s [%s.%s] err:%v", user.UserData.UserId, user.SessionId, mainType, subType, err) + log.Errorf("SendMsgToUser%d:%s [%s.%s] err:%v", user.UserData.Uid, user.SessionId, mainType, subType, err) } return } @@ -58,9 +60,9 @@ func (this *ModuleBase) SendMsgToUsers(mainType, subType string, msg proto.Messa gateway = append(gateway, v.SessionId) } reply := &pb.RPCMessageReply{} - data, _ := proto.Marshal(msg) + data, _ := ptypes.MarshalAny(msg) for k, v := range gateways { - if _, err = this.service.RpcGoById(k, string(comm.Rpc_GatewayAgentSendMsg), context.Background(), &pb.BatchMessageReq{ + if _, err = this.service.RpcGo(context.Background(), fmt.Sprintf("%s/%s", comm.Service_Gateway, k), string(comm.Rpc_GatewayAgentSendMsg), &pb.BatchMessageReq{ UserSessionIds: v, MainType: mainType, SubType: subType, diff --git a/modules/pack/api_getlist.go b/modules/pack/api_getlist.go index 3dacc3af5..4d65750a2 100644 --- a/modules/pack/api_getlist.go +++ b/modules/pack/api_getlist.go @@ -6,20 +6,37 @@ import ( "go_dreamfactory/lego/sys/log" "go_dreamfactory/pb" "go_dreamfactory/sys/cache" + "time" ) +//参数校验 +func (this *Api_Comp) Getlist_Check(ctx context.Context, session comm.IUserSession, req *pb.GetlistReq) (code pb.ErrorCode) { + if !session.IsLogin() { + code = pb.ErrorCode_NoLogin + return + } + return +} + ///获取用户道具 func (this *Api_Comp) Getlist(ctx context.Context, session comm.IUserSession, req *pb.GetlistReq) (err error) { var ( - code pb.ErrorCode - pack *pb.DB_UserPackData - grids []*pb.DB_GridData + code pb.ErrorCode + pack *pb.DB_UserPackData + nt int64 + tempgrids []*pb.DB_GridData + grids []*pb.DB_GridData + modifys []*pb.DB_GridData ) defer func() { session.SendMsg(string(this.module.GetType()), GetlistResp, code, &pb.GetlistResp{Grids: grids}) + if code == pb.ErrorCode_Success { + go func() { //异步处理修改数据 + cache.Defsys.Pack_UpdateGridToUserPack(session.GetUserId(), modifys...) + }() + } }() - if !session.IsLogin() { - code = pb.ErrorCode_NoLogin + if code = this.Getlist_Check(ctx, session, req); code != pb.ErrorCode_Success { return } if pack, err = cache.Defsys.Pack_QueryUserPack(session.GetUserId()); err != nil { @@ -27,7 +44,21 @@ func (this *Api_Comp) Getlist(ctx context.Context, session comm.IUserSession, re code = pb.ErrorCode_CacheReadError return } else { - grids = this.module.configure_comp.GetPackItemByType(pack, req.IType) + tempgrids = this.module.configure_comp.GetPackItemByType(pack, req.IType) + modifys = make([]*pb.DB_GridData, 0, len(tempgrids)) + grids = make([]*pb.DB_GridData, 0, len(grids)) + nt = time.Now().Unix() + for _, v := range tempgrids { + if v.ETime > 0 && v.ETime < nt { //已经过期 + modifys = append(modifys, &pb.DB_GridData{GridId: v.GridId, IsEmpty: true}) + } else { + grids = append(grids, v) + if v.IsNewItem { + v.IsNewItem = false + modifys = append(modifys, v) + } + } + } } return } diff --git a/modules/pack/api_sellItem.go b/modules/pack/api_sellItem.go index 8b8baa602..da9a3f651 100644 --- a/modules/pack/api_sellItem.go +++ b/modules/pack/api_sellItem.go @@ -6,6 +6,15 @@ import ( "go_dreamfactory/pb" ) +//参数校验 +func (this *Api_Comp) SellItem_Check(ctx context.Context, session comm.IUserSession, req *pb.SellItemReq) (code pb.ErrorCode) { + if !session.IsLogin() { + code = pb.ErrorCode_NoLogin + return + } + return +} + //出售道具 func (this *Api_Comp) SellItem(ctx context.Context, session comm.IUserSession, req *pb.SellItemReq) (err error) { var ( @@ -14,8 +23,7 @@ func (this *Api_Comp) SellItem(ctx context.Context, session comm.IUserSession, r defer func() { session.SendMsg(string(this.module.GetType()), SellItemResp, code, &pb.SellItemResp{}) }() - if !session.IsLogin() { - code = pb.ErrorCode_NoLogin + if code = this.SellItem_Check(ctx, session, req); code != pb.ErrorCode_Success { return } return diff --git a/modules/pack/api_useItem.go b/modules/pack/api_useItem.go index 95292f01f..930296641 100644 --- a/modules/pack/api_useItem.go +++ b/modules/pack/api_useItem.go @@ -6,6 +6,15 @@ import ( "go_dreamfactory/pb" ) +//参数校验 +func (this *Api_Comp) Useitem_Check(ctx context.Context, session comm.IUserSession, req *pb.UseItemReq) (code pb.ErrorCode) { + if !session.IsLogin() { + code = pb.ErrorCode_NoLogin + return + } + return +} + //使用道具 func (this *Api_Comp) Useitem(ctx context.Context, session comm.IUserSession, req *pb.UseItemReq) (err error) { var ( @@ -14,8 +23,7 @@ func (this *Api_Comp) Useitem(ctx context.Context, session comm.IUserSession, re defer func() { session.SendMsg(string(this.module.GetType()), UseItemResp, code, &pb.UseItemResp{}) }() - if !session.IsLogin() { - code = pb.ErrorCode_NoLogin + if code = this.Useitem_Check(ctx, session, req); code != pb.ErrorCode_Success { return } return diff --git a/modules/pack/cache_comp.go b/modules/pack/cache_comp.go new file mode 100644 index 000000000..8aa8b5e03 --- /dev/null +++ b/modules/pack/cache_comp.go @@ -0,0 +1,288 @@ +package pack + +import ( + "fmt" + "go_dreamfactory/lego/core/cbase" + "go_dreamfactory/lego/sys/mgo" + "go_dreamfactory/lego/sys/redis" + "go_dreamfactory/pb" + "go_dreamfactory/sys/db" +) + +///背包缓存数据管理组件 +type Cache_Comp struct { + cbase.ModuleCompBase + redis redis.ISys +} + +///查询用户背包数据 +func (this *Cache_Comp) Pack_QueryUserPack(uId string) (pack *pb.DB_UserPackData, err error) { + pack = &pb.DB_UserPackData{ + UserId: uId, + } + if err = this.redis.Get(fmt.Sprintf(Redis_PackCache, uId), pack); err == nil { + return + } else if err == redis.RedisNil { + if pack, err = db.Defsys.Pack_QueryUserPack(uId); err == nil { + this.redis.Set(fmt.Sprintf(Redis_PackCache, uId), pack, Pack_Expiration) + } else if err == mgo.MongodbNil { + err = nil + } + } + return +} + +//查询用户背包物品数量 +func (this *Cache_Comp) Pack_QueryUserPackItemAmount(uId string, itemid int32) (amount uint32) { + var ( + pack *pb.DB_UserPackData + err error + ) + if pack, err = this.Pack_QueryUserPack(uId); err != nil { + return + } + for _, v := range pack.Pack { + if !v.IsEmpty && v.ItemId == itemid { + amount += v.Amount + } + } + return +} + +///添加或则减少物品到用户背包 +func (this *Cache_Comp) Pack_AddItemToUserPack(uId string, itemId int32, addnum int32) (err error) { + var ( + pack *pb.DB_UserPackData + modifys []*pb.DB_GridData + leftnum int64 + ) + if addnum == 0 { + return + } + if pack, err = this.Pack_QueryUserPack(uId); err != nil { + return + } + modifys, leftnum = this.pack_addItemToUserPack(pack, itemId, addnum) + if leftnum < 0 { + err = ItemNotEnoughError + return + } else if leftnum > 0 { + err = PackGridNumUpper + return + } + if pack, err = db.Defsys.Pack_UpdateGridToUserPack(uId, modifys...); err == nil { + this.redis.Set(fmt.Sprintf(Redis_PackCache, uId), pack, Pack_Expiration) + } + return +} + +///添加或则减少多个物品到用户背包 +func (this *Cache_Comp) Pack_AddItemsToUserPack(uId string, items map[int32]int32) (err error) { + var ( + pack *pb.DB_UserPackData + modifys []*pb.DB_GridData + tempmodifys []*pb.DB_GridData + leftnum int64 + iskeep bool + ) + if pack, err = this.Pack_QueryUserPack(uId); err != nil { + return + } + for k, v := range items { + tempmodifys, leftnum = this.pack_addItemToUserPack(pack, k, v) + if leftnum < 0 { + err = ItemNotEnoughError + return + } else if leftnum > 0 { + err = PackGridNumUpper + return + } + for _, v1 := range tempmodifys { + iskeep = false + for _, v2 := range modifys { + if v1.GridId == v2.GridId { + iskeep = true + } + } + if !iskeep { + modifys = append(modifys, v1) + } + } + } + + if pack, err = db.Defsys.Pack_UpdateGridToUserPack(uId, modifys...); err == nil { + this.redis.Set(fmt.Sprintf(Redis_PackCache, uId), pack, Pack_Expiration) + } + return +} + +///修改指定格子的物品数量 +func (this *Cache_Comp) Pack_AddItemToUserPackByGrid(uId string, gridid int32, itemId int32, addnum int32) (err error) { + var ( + pack *pb.DB_UserPackData + grid *pb.DB_GridData + num int64 + amount int64 + ) + if addnum == 0 { + return + } + if pack, err = this.Pack_QueryUserPack(uId); err != nil { + return + } + if int32(len(pack.Pack)) <= gridid { + err = NoFoundGirdError + return + } + grid = pack.Pack[gridid] + if grid == nil { + err = NoFoundGirdError + return + } + amount = int64(grid.Amount) + if grid.IsEmpty { + amount = 0 + } else if grid.ItemId != itemId { + err = fmt.Errorf("target grid itemid:%d no is %d ", grid.ItemId, itemId) + } + num = amount + int64(addnum) + if num < 0 { + err = ItemNotEnoughError + } else { + if num > GridCapMaxNum { + err = GirdAmountUpper + return + } else { + if pack, err = db.Defsys.Pack_UpdateGridToUserPack(uId, grid); err == nil { + this.redis.Set(fmt.Sprintf(Redis_PackCache, uId), pack, Pack_Expiration) + } + } + } + return +} + +///修改目标格子的新获取标识 +func (this *Cache_Comp) Pack_ModifyPackGridIsNewItem(uId string, grids []int32) (err error) { + var ( + pack *pb.DB_UserPackData + ) + if pack, err = db.Defsys.Pack_ModifyPackGridIsNewItem(uId, grids); err == nil { + err = this.redis.Set(fmt.Sprintf(Redis_PackCache, uId), pack, Pack_Expiration) + } + return +} + +///修改目标格子的新获取标识 +func (this *Cache_Comp) Pack_UpdateGridToUserPack(uId string, grids ...*pb.DB_GridData) (err error) { + var ( + pack *pb.DB_UserPackData + ) + if pack, err = db.Defsys.Pack_UpdateGridToUserPack(uId, grids...); err == nil { + err = this.redis.Set(fmt.Sprintf(Redis_PackCache, uId), pack, Pack_Expiration) + } + return +} + +///添加移除物品到用户背包 +func (this *Cache_Comp) pack_addItemToUserPack(pack *pb.DB_UserPackData, itemId int32, addnum int32) (modifys []*pb.DB_GridData, leftnum int64) { + var ( + num int64 + isNew bool + ) + if addnum == 0 { + return + } + isNew = true + leftnum = int64(addnum) + modifys = make([]*pb.DB_GridData, 0) + for _, v := range pack.Pack { + if !v.IsEmpty && v.ItemId == itemId { + isNew = false + num = int64(v.Amount) + int64(leftnum) + if num < 0 { + leftnum += int64(v.Amount) + v.Amount = 0 + v.IsEmpty = true + modifys = append(modifys, v) + } else if num > 0 && num < int64(v.Amount) { + leftnum = 0 + v.Amount = uint32(num) + modifys = append(modifys, v) + break + } else if num > 0 && num > int64(v.Amount) { + if num <= GridCapMaxNum { + leftnum = 0 + v.Amount = uint32(num) + modifys = append(modifys, v) + break + } else { + if v.Amount < GridCapMaxNum { + leftnum = int64(num - GridCapMaxNum) + v.Amount = uint32(GridCapMaxNum) + modifys = append(modifys, v) + } + } + } else if num == 0 { + leftnum = 0 + v.Amount = 0 + v.IsEmpty = true + modifys = append(modifys, v) + } + } + } + if leftnum < 0 { //背包物品不够 + return + } + if leftnum > 0 { //还没有放完 寻找空的格子填充 + for _, v := range pack.Pack { + if v.IsEmpty { + if leftnum <= GridCapMaxNum { + v.IsEmpty = false + v.ItemId = itemId + v.Amount = uint32(leftnum) + leftnum = 0 + modifys = append(modifys, v) + break + } else { + leftnum -= GridCapMaxNum + v.IsEmpty = false + v.ItemId = itemId + v.Amount = uint32(GridCapMaxNum) + modifys = append(modifys, v) + } + } + } + index := int32(len(pack.Pack)) + for leftnum > 0 { //需要补充格子 + if leftnum <= GridCapMaxNum { + grid := &pb.DB_GridData{ + GridId: index, + IsEmpty: false, + ItemId: itemId, + Amount: uint32(leftnum), + IsNewItem: isNew, + } + pack.Pack = append(pack.Pack, grid) + modifys = append(modifys, grid) + leftnum = 0 + break + } else { + leftnum -= GridCapMaxNum + grid := &pb.DB_GridData{ + GridId: index, + IsEmpty: false, + ItemId: itemId, + Amount: uint32(GridCapMaxNum), + IsNewItem: isNew, + } + pack.Pack = append(pack.Pack, grid) + modifys = append(modifys, grid) + index++ + } + if index > GridMaxNUm { //格子已达上限 + break + } + } + } + return +} diff --git a/modules/pack/configure_comp.go b/modules/pack/configure_comp.go index a82f56908..412297770 100644 --- a/modules/pack/configure_comp.go +++ b/modules/pack/configure_comp.go @@ -60,12 +60,14 @@ func (this *Configure_Comp) GetPackItemByType(pack *pb.DB_UserPackData, usetype } else { table = v.(*cfg.Game_item) for _, v := range pack.Pack { - if item, ok = table.GetDataMap()[id]; ok { - if item.Usetype == usetype { - result = append(result, v) + if !v.IsEmpty { + if item, ok = table.GetDataMap()[id]; ok { + if item.Usetype == usetype { + result = append(result, v) + } + } else { + log.Errorf("no found itemConfigure:%d", id) } - } else { - log.Errorf("no found itemConfigure:%d", id) } } } diff --git a/modules/pack/core.go b/modules/pack/core.go index 16d17a66b..9410b30e5 100644 --- a/modules/pack/core.go +++ b/modules/pack/core.go @@ -1,11 +1,24 @@ package pack -import "go_dreamfactory/modules" - -type ( - IPack interface { - modules.IModule - } - IConfigure_Comp interface { - } +import ( + "errors" + "go_dreamfactory/lego/core" +) + +const ( //Redis + Redis_PackCache string = "pack:%s" //背包缓存数据存放key + DB_PackTable core.SqlTable = "pack" //背包数据库定义表 +) + +const ( + GridCapMaxNum = 99 //单个格子的最大容量 + GridMaxNUm = 200 //背包格子数量上限 + Pack_Expiration = -1 //背包缓存数据过期时间 +) + +var ( + ItemNotEnoughError = errors.New("item not enough!") //物品不足 + NoFoundGirdError = errors.New("no found gvrid!") //未找到格子 + PackGridNumUpper = errors.New("grid amount upper!") //背包格子达到上限 + GirdAmountUpper = errors.New("grid amount upper!") //格子容量达到上限 ) diff --git a/modules/pack/db_comp.go b/modules/pack/db_comp.go new file mode 100644 index 000000000..1a5fc4c63 --- /dev/null +++ b/modules/pack/db_comp.go @@ -0,0 +1,73 @@ +package pack + +import ( + "fmt" + "go_dreamfactory/lego/core/cbase" + "go_dreamfactory/lego/sys/mgo" + "go_dreamfactory/pb" + + "go.mongodb.org/mongo-driver/bson" + "go.mongodb.org/mongo-driver/mongo/options" +) + +///背包数据库数据管理组件 +type DB_Comp struct { + cbase.ModuleCompBase + mgo mgo.ISys +} + +func (this *DB_Comp) Pack_InitUserPack(uId string) (pack *pb.DB_UserPackData, err error) { + pack = &pb.DB_UserPackData{UserId: uId, Pack: make([]*pb.DB_GridData, 0)} + _, err = this.mgo.InsertOne(DB_PackTable, pack) + return +} + +///查询用户背包数据 +func (this *DB_Comp) Pack_QueryUserPack(uId string) (pack *pb.DB_UserPackData, err error) { + pack = &pb.DB_UserPackData{} + err = this.mgo.FindOne(DB_PackTable, bson.M{"_id": uId}).Decode(pack) + return +} + +//更新背包格子数据 +func (this *DB_Comp) Pack_UpdateGridToUserPack(uId string, grids ...*pb.DB_GridData) (pack *pb.DB_UserPackData, err error) { + pack = &pb.DB_UserPackData{} + update := bson.M{} + for _, v := range grids { + update[fmt.Sprintf("pack.%d.gridid", v.GridId)] = v.GridId + update[fmt.Sprintf("pack.%d.isempty", v.GridId)] = v.IsEmpty + update[fmt.Sprintf("pack.%d.itemid", v.GridId)] = v.ItemId + update[fmt.Sprintf("pack.%d.amount", v.GridId)] = v.Amount + update[fmt.Sprintf("pack.%d.isnewitem", v.GridId)] = v.IsNewItem + } + + err = this.mgo.FindOneAndUpdate(DB_PackTable, + bson.M{"_id": uId}, + bson.M{"$set": update}, + options.FindOneAndUpdate().SetUpsert(true).SetReturnDocument(options.After)).Decode(pack) + return +} + +//更新背包格子物品的数据 +func (this *DB_Comp) Pack_AddGridAmountToUserPack(uId string, grid int32, amount int32) (pack *pb.DB_UserPackData, err error) { + pack = &pb.DB_UserPackData{} + err = this.mgo.FindOneAndUpdate(DB_PackTable, + bson.M{"_id": uId}, + bson.M{"$inc": bson.M{ + fmt.Sprintf("pack.%d.amount", grid): amount, + }}, + options.FindOneAndUpdate().SetUpsert(true).SetReturnDocument(options.After)).Decode(pack) + return +} + +//修改背包格子IsNew标识 +func (this *DB_Comp) Pack_ModifyPackGridIsNewItem(uId string, grids []int32) (pack *pb.DB_UserPackData, err error) { + pack = &pb.DB_UserPackData{} + identifier := []interface{}{bson.M{"item.gridid": bson.M{"$in": grids}}} + err = this.mgo.FindOneAndUpdate(DB_PackTable, + bson.M{"_id": uId}, + bson.M{"$set": bson.M{ + "pack.$[item].isNewitem": false, + }}, options.FindOneAndUpdate().SetArrayFilters(options.ArrayFilters{Filters: identifier}).SetReturnDocument(options.After)).Decode(pack) + return +} diff --git a/modules/pack/module.go b/modules/pack/module.go index d0a6c5d5a..e170f86c1 100644 --- a/modules/pack/module.go +++ b/modules/pack/module.go @@ -46,10 +46,28 @@ func (this *Pack) OnInstallComp() { this.configure_comp = this.RegisterComp(new(Configure_Comp)).(*Configure_Comp) } +//IPack------------------------------------------------------------------------------------------------------------------------------- +///查询用户背包物品数量 +func (this *Pack) QueryUserPackItemAmount(uId string, itemid int32) (amount uint32) { + defer log.Debugf("获取物品 uId:%s itemid:%d addnum:%d ", uId, itemid, amount) + amount = cache.Defsys.Pack_QueryUserPackItemAmount(uId, itemid) + return +} + +///添加单个物品到背包 (可以加物品和减物品) +func (this *Pack) AddItemToUserPack(uId string, itemid, addnum int32) (err error) { + defer log.Debugf("给用户添加物品 uId:%s itemid:%d addnum:%d issucc:%v", uId, itemid, addnum, err == nil) + if err = cache.Defsys.Pack_AddItemToUserPack(uId, itemid, addnum); err != nil { + log.Errorf("给用户添加物品 uId:%s itemid:%d addnum:%d err:%v", uId, itemid, addnum, err) + } + return +} + ///添加多个物品到背包 (可以加物品和减物品) func (this *Pack) AddItemsToUserPack(uId string, items map[int32]int32) (err error) { + defer log.Debugf("给用户添加物品 uId:%s items:%d items:%v", uId, items, err == nil) if err = cache.Defsys.Pack_AddItemsToUserPack(uId, items); err != nil { - log.Errorf("AddItemsToUserPack err:%v", err) + log.Errorf("给用户添加物品 uId:%s items:%d err:%v", uId, items, err) } return } diff --git a/modules/user/login_comp.go b/modules/user/login_comp.go index 47cb2a565..c984af2a0 100644 --- a/modules/user/login_comp.go +++ b/modules/user/login_comp.go @@ -38,8 +38,8 @@ func decodeUserData(base64Str string) *pb.DB_UserData { } account := jsonRet.Get("account").String() return &pb.DB_UserData{ - ServerId: int32(serverId), - Account: account, + Sid: int32(serverId), + Binduid: account, } } @@ -57,7 +57,7 @@ func (this *LoginComp) Login(ctx context.Context, session comm.IUserSession, req }, }) - event.TriggerEvent(comm.Event_UserLogin, db_user.UserId) + event.TriggerEvent(comm.Event_UserLogin, db_user.Uid) }() if !utils.ValidSecretKey(req.Sec) { @@ -81,9 +81,9 @@ func (this *LoginComp) Login(ctx context.Context, session comm.IUserSession, req log.Errorf("User_CreateUser err %v", err) return } - session.Build(user.UserId) + session.Bind(user.Uid, this.S.GetId()) } else { - session.Build(db_user.UserId) + session.Bind(db_user.Uid, this.S.GetId()) } cache_user := &pb.Cache_UserData{ diff --git a/modules/user/user_comp.go b/modules/user/user_comp.go index 4151fb5ea..81ae34e80 100644 --- a/modules/user/user_comp.go +++ b/modules/user/user_comp.go @@ -13,6 +13,10 @@ import ( "go_dreamfactory/lego/sys/log" ) +const ( + User_SubType_Create = "create" +) + type UserComp struct { modules.MComp_GateComp module *User @@ -26,11 +30,11 @@ func (this *UserComp) Init(service core.IService, module core.IModule, comp core //创角 func (this *UserComp) Create(ctx context.Context, session comm.IUserSession, req *pb.UserCreateReq) (err error) { - defer utils.TraceFunc(session.GetUserId(), "user", "create", req, nil) + defer utils.TraceFunc(session.GetUserId(), string(this.module.GetType()), User_SubType_Create, req, nil) user := cache.Defsys.Get(session.GetUserId()) var code pb.ErrorCode defer func() { - session.SendMsg("user", "create", code, &pb.UserCreateRsp{}) + session.SendMsg(string(this.module.GetType()), User_SubType_Create, code, &pb.UserCreateRsp{}) }() if user == nil { log.Errorf("user no exist") @@ -38,10 +42,12 @@ func (this *UserComp) Create(ctx context.Context, session comm.IUserSession, req return } - user.UserData.NiceName = req.NickName + user.UserData.Name = req.NickName err = cache.Defsys.Update(user) if err != nil { log.Errorf("cache update err") + code = pb.ErrorCode_DBError + return } event.RegisterGO(comm.Event_CreateUser, session.GetUserId()) return nil diff --git a/modules/web/api_comp.go b/modules/web/api_comp.go index f68b4adf5..c9019edaa 100644 --- a/modules/web/api_comp.go +++ b/modules/web/api_comp.go @@ -38,7 +38,7 @@ func (this *Api_Comp) Register(c *engine.Context) { err := c.BindJSON(&req) if err == nil { err := db.Defsys.User_Create(&pb.DB_UserData{ - Account: req.Account, + Binduid: req.Account, }) if err != nil { log.Errorf("create user err: %v", err) diff --git a/pb.bat b/pb.bat index 0e3355eaf..44f2fa5bc 100644 --- a/pb.bat +++ b/pb.bat @@ -8,6 +8,7 @@ set SRC=%PROJECT_ROOT%\pb\proto set TAR=%PROJECT_ROOT%\pb protoc --proto_path=%SRC% --go_out=%TAR% --go_opt=paths=import %SRC%\*.proto +protoc --proto_path=%SRC% --go_out=%TAR% --go_opt=paths=import %SRC%\user\*.proto protoc --proto_path=%SRC% --go_out=%TAR% --go_opt=paths=import %SRC%\friend\*.proto protoc --proto_path=%SRC% --go_out=%TAR% --go_opt=paths=import %SRC%\pack\*.proto protoc --proto_path=%SRC% --go_out=%TAR% --go_opt=paths=import %SRC%\mail\*.proto diff --git a/pb/comm.pb.go b/pb/comm.pb.go index d1ce2baff..c0e33ac47 100644 --- a/pb/comm.pb.go +++ b/pb/comm.pb.go @@ -9,6 +9,7 @@ package pb import ( protoreflect "google.golang.org/protobuf/reflect/protoreflect" protoimpl "google.golang.org/protobuf/runtime/protoimpl" + anypb "google.golang.org/protobuf/types/known/anypb" reflect "reflect" sync "sync" ) @@ -26,10 +27,10 @@ type UserMessage struct { sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - MainType string `protobuf:"bytes,1,opt,name=MainType,proto3" json:"MainType,omitempty"` - SubType string `protobuf:"bytes,2,opt,name=SubType,proto3" json:"SubType,omitempty"` - Code ErrorCode `protobuf:"varint,3,opt,name=Code,proto3,enum=ErrorCode" json:"Code,omitempty"` - Data []byte `protobuf:"bytes,4,opt,name=Data,proto3" json:"Data,omitempty"` + MainType string `protobuf:"bytes,1,opt,name=MainType,proto3" json:"MainType,omitempty"` + SubType string `protobuf:"bytes,2,opt,name=SubType,proto3" json:"SubType,omitempty"` + Code ErrorCode `protobuf:"varint,3,opt,name=Code,proto3,enum=ErrorCode" json:"Code,omitempty"` + Data *anypb.Any `protobuf:"bytes,4,opt,name=data,proto3" json:"data,omitempty"` } func (x *UserMessage) Reset() { @@ -85,7 +86,7 @@ func (x *UserMessage) GetCode() ErrorCode { return ErrorCode_Success } -func (x *UserMessage) GetData() []byte { +func (x *UserMessage) GetData() *anypb.Any { if x != nil { return x.Data } @@ -98,12 +99,12 @@ type AgentMessage struct { sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Ip string `protobuf:"bytes,1,opt,name=Ip,proto3" json:"Ip,omitempty"` - UserSessionId string `protobuf:"bytes,2,opt,name=UserSessionId,proto3" json:"UserSessionId,omitempty"` - UserId string `protobuf:"bytes,3,opt,name=UserId,proto3" json:"UserId,omitempty"` - GatewayServiceId string `protobuf:"bytes,4,opt,name=GatewayServiceId,proto3" json:"GatewayServiceId,omitempty"` - Method string `protobuf:"bytes,5,opt,name=Method,proto3" json:"Method,omitempty"` - Message []byte `protobuf:"bytes,6,opt,name=Message,proto3" json:"Message,omitempty"` + Ip string `protobuf:"bytes,1,opt,name=Ip,proto3" json:"Ip,omitempty"` + UserSessionId string `protobuf:"bytes,2,opt,name=UserSessionId,proto3" json:"UserSessionId,omitempty"` + UserId string `protobuf:"bytes,3,opt,name=UserId,proto3" json:"UserId,omitempty"` + GatewayServiceId string `protobuf:"bytes,4,opt,name=GatewayServiceId,proto3" json:"GatewayServiceId,omitempty"` + Method string `protobuf:"bytes,5,opt,name=Method,proto3" json:"Method,omitempty"` + Message *anypb.Any `protobuf:"bytes,6,opt,name=Message,proto3" json:"Message,omitempty"` } func (x *AgentMessage) Reset() { @@ -173,7 +174,7 @@ func (x *AgentMessage) GetMethod() string { return "" } -func (x *AgentMessage) GetMessage() []byte { +func (x *AgentMessage) GetMessage() *anypb.Any { if x != nil { return x.Message } @@ -346,11 +347,11 @@ type AgentSendMessageReq struct { sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - UserSessionId string `protobuf:"bytes,1,opt,name=UserSessionId,proto3" json:"UserSessionId,omitempty"` - MainType string `protobuf:"bytes,2,opt,name=MainType,proto3" json:"MainType,omitempty"` - SubType string `protobuf:"bytes,3,opt,name=SubType,proto3" json:"SubType,omitempty"` - Code ErrorCode `protobuf:"varint,4,opt,name=Code,proto3,enum=ErrorCode" json:"Code,omitempty"` - Data []byte `protobuf:"bytes,5,opt,name=Data,proto3" json:"Data,omitempty"` + UserSessionId string `protobuf:"bytes,1,opt,name=UserSessionId,proto3" json:"UserSessionId,omitempty"` + MainType string `protobuf:"bytes,2,opt,name=MainType,proto3" json:"MainType,omitempty"` + SubType string `protobuf:"bytes,3,opt,name=SubType,proto3" json:"SubType,omitempty"` + Code ErrorCode `protobuf:"varint,4,opt,name=Code,proto3,enum=ErrorCode" json:"Code,omitempty"` + Data *anypb.Any `protobuf:"bytes,5,opt,name=Data,proto3" json:"Data,omitempty"` } func (x *AgentSendMessageReq) Reset() { @@ -413,7 +414,7 @@ func (x *AgentSendMessageReq) GetCode() ErrorCode { return ErrorCode_Success } -func (x *AgentSendMessageReq) GetData() []byte { +func (x *AgentSendMessageReq) GetData() *anypb.Any { if x != nil { return x.Data } @@ -426,10 +427,10 @@ type BatchMessageReq struct { sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - UserSessionIds []string `protobuf:"bytes,1,rep,name=UserSessionIds,proto3" json:"UserSessionIds,omitempty"` - MainType string `protobuf:"bytes,2,opt,name=MainType,proto3" json:"MainType,omitempty"` - SubType string `protobuf:"bytes,3,opt,name=SubType,proto3" json:"SubType,omitempty"` - Data []byte `protobuf:"bytes,4,opt,name=Data,proto3" json:"Data,omitempty"` + UserSessionIds []string `protobuf:"bytes,1,rep,name=UserSessionIds,proto3" json:"UserSessionIds,omitempty"` + MainType string `protobuf:"bytes,2,opt,name=MainType,proto3" json:"MainType,omitempty"` + SubType string `protobuf:"bytes,3,opt,name=SubType,proto3" json:"SubType,omitempty"` + Data *anypb.Any `protobuf:"bytes,4,opt,name=Data,proto3" json:"Data,omitempty"` } func (x *BatchMessageReq) Reset() { @@ -485,7 +486,7 @@ func (x *BatchMessageReq) GetSubType() string { return "" } -func (x *BatchMessageReq) GetData() []byte { +func (x *BatchMessageReq) GetData() *anypb.Any { if x != nil { return x.Data } @@ -498,9 +499,9 @@ type BroadCastMessageReq struct { sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - MainType string `protobuf:"bytes,1,opt,name=MainType,proto3" json:"MainType,omitempty"` //服务名 - SubType string `protobuf:"bytes,2,opt,name=SubType,proto3" json:"SubType,omitempty"` - Data []byte `protobuf:"bytes,3,opt,name=Data,proto3" json:"Data,omitempty"` + MainType string `protobuf:"bytes,1,opt,name=MainType,proto3" json:"MainType,omitempty"` //服务名 + SubType string `protobuf:"bytes,2,opt,name=SubType,proto3" json:"SubType,omitempty"` + Data *anypb.Any `protobuf:"bytes,3,opt,name=Data,proto3" json:"Data,omitempty"` } func (x *BroadCastMessageReq) Reset() { @@ -549,7 +550,7 @@ func (x *BroadCastMessageReq) GetSubType() string { return "" } -func (x *BroadCastMessageReq) GetData() []byte { +func (x *BroadCastMessageReq) GetData() *anypb.Any { if x != nil { return x.Data } @@ -608,69 +609,78 @@ var File_comm_proto protoreflect.FileDescriptor var file_comm_proto_rawDesc = []byte{ 0x0a, 0x0a, 0x63, 0x6f, 0x6d, 0x6d, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x0f, 0x65, 0x72, - 0x72, 0x6f, 0x72, 0x63, 0x6f, 0x64, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0x77, 0x0a, - 0x0b, 0x55, 0x73, 0x65, 0x72, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x1a, 0x0a, 0x08, - 0x4d, 0x61, 0x69, 0x6e, 0x54, 0x79, 0x70, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, - 0x4d, 0x61, 0x69, 0x6e, 0x54, 0x79, 0x70, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x53, 0x75, 0x62, 0x54, - 0x79, 0x70, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x53, 0x75, 0x62, 0x54, 0x79, - 0x70, 0x65, 0x12, 0x1e, 0x0a, 0x04, 0x43, 0x6f, 0x64, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0e, - 0x32, 0x0a, 0x2e, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x43, 0x6f, 0x64, 0x65, 0x52, 0x04, 0x43, 0x6f, - 0x64, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x44, 0x61, 0x74, 0x61, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0c, - 0x52, 0x04, 0x44, 0x61, 0x74, 0x61, 0x22, 0xba, 0x01, 0x0a, 0x0c, 0x41, 0x67, 0x65, 0x6e, 0x74, - 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x49, 0x70, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x02, 0x49, 0x70, 0x12, 0x24, 0x0a, 0x0d, 0x55, 0x73, 0x65, 0x72, 0x53, - 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, - 0x55, 0x73, 0x65, 0x72, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x12, 0x16, 0x0a, - 0x06, 0x55, 0x73, 0x65, 0x72, 0x49, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x55, - 0x73, 0x65, 0x72, 0x49, 0x64, 0x12, 0x2a, 0x0a, 0x10, 0x47, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, - 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x49, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x10, 0x47, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x49, - 0x64, 0x12, 0x16, 0x0a, 0x06, 0x4d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x06, 0x4d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x12, 0x18, 0x0a, 0x07, 0x4d, 0x65, 0x73, - 0x73, 0x61, 0x67, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x07, 0x4d, 0x65, 0x73, 0x73, - 0x61, 0x67, 0x65, 0x22, 0x43, 0x0a, 0x0f, 0x52, 0x50, 0x43, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, - 0x65, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x1e, 0x0a, 0x04, 0x43, 0x6f, 0x64, 0x65, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x0e, 0x32, 0x0a, 0x2e, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x43, 0x6f, 0x64, 0x65, - 0x52, 0x04, 0x43, 0x6f, 0x64, 0x65, 0x12, 0x10, 0x0a, 0x03, 0x4d, 0x73, 0x67, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x03, 0x4d, 0x73, 0x67, 0x22, 0x4d, 0x0a, 0x0d, 0x41, 0x67, 0x65, 0x6e, - 0x74, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x52, 0x65, 0x71, 0x12, 0x24, 0x0a, 0x0d, 0x55, 0x73, 0x65, - 0x72, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x72, 0x6f, 0x72, 0x63, 0x6f, 0x64, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x19, 0x67, + 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x61, + 0x6e, 0x79, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0x8d, 0x01, 0x0a, 0x0b, 0x55, 0x73, 0x65, + 0x72, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x4d, 0x61, 0x69, 0x6e, + 0x54, 0x79, 0x70, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x4d, 0x61, 0x69, 0x6e, + 0x54, 0x79, 0x70, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x53, 0x75, 0x62, 0x54, 0x79, 0x70, 0x65, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x53, 0x75, 0x62, 0x54, 0x79, 0x70, 0x65, 0x12, 0x1e, + 0x0a, 0x04, 0x43, 0x6f, 0x64, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x0a, 0x2e, 0x45, + 0x72, 0x72, 0x6f, 0x72, 0x43, 0x6f, 0x64, 0x65, 0x52, 0x04, 0x43, 0x6f, 0x64, 0x65, 0x12, 0x28, + 0x0a, 0x04, 0x64, 0x61, 0x74, 0x61, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x67, + 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x41, + 0x6e, 0x79, 0x52, 0x04, 0x64, 0x61, 0x74, 0x61, 0x22, 0xd0, 0x01, 0x0a, 0x0c, 0x41, 0x67, 0x65, + 0x6e, 0x74, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x49, 0x70, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x49, 0x70, 0x12, 0x24, 0x0a, 0x0d, 0x55, 0x73, 0x65, + 0x72, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x55, 0x73, 0x65, 0x72, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x12, - 0x16, 0x0a, 0x06, 0x55, 0x73, 0x65, 0x72, 0x49, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x06, 0x55, 0x73, 0x65, 0x72, 0x49, 0x64, 0x22, 0x37, 0x0a, 0x0f, 0x41, 0x67, 0x65, 0x6e, 0x74, - 0x55, 0x6e, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x52, 0x65, 0x71, 0x12, 0x24, 0x0a, 0x0d, 0x55, 0x73, - 0x65, 0x72, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x0d, 0x55, 0x73, 0x65, 0x72, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x49, 0x64, - 0x22, 0xa5, 0x01, 0x0a, 0x13, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x53, 0x65, 0x6e, 0x64, 0x4d, 0x65, - 0x73, 0x73, 0x61, 0x67, 0x65, 0x52, 0x65, 0x71, 0x12, 0x24, 0x0a, 0x0d, 0x55, 0x73, 0x65, 0x72, - 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x0d, 0x55, 0x73, 0x65, 0x72, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x12, 0x1a, - 0x0a, 0x08, 0x4d, 0x61, 0x69, 0x6e, 0x54, 0x79, 0x70, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x08, 0x4d, 0x61, 0x69, 0x6e, 0x54, 0x79, 0x70, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x53, 0x75, - 0x62, 0x54, 0x79, 0x70, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x53, 0x75, 0x62, - 0x54, 0x79, 0x70, 0x65, 0x12, 0x1e, 0x0a, 0x04, 0x43, 0x6f, 0x64, 0x65, 0x18, 0x04, 0x20, 0x01, - 0x28, 0x0e, 0x32, 0x0a, 0x2e, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x43, 0x6f, 0x64, 0x65, 0x52, 0x04, - 0x43, 0x6f, 0x64, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x44, 0x61, 0x74, 0x61, 0x18, 0x05, 0x20, 0x01, - 0x28, 0x0c, 0x52, 0x04, 0x44, 0x61, 0x74, 0x61, 0x22, 0x83, 0x01, 0x0a, 0x0f, 0x42, 0x61, 0x74, - 0x63, 0x68, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x52, 0x65, 0x71, 0x12, 0x26, 0x0a, 0x0e, - 0x55, 0x73, 0x65, 0x72, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x73, 0x18, 0x01, - 0x20, 0x03, 0x28, 0x09, 0x52, 0x0e, 0x55, 0x73, 0x65, 0x72, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, - 0x6e, 0x49, 0x64, 0x73, 0x12, 0x1a, 0x0a, 0x08, 0x4d, 0x61, 0x69, 0x6e, 0x54, 0x79, 0x70, 0x65, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x4d, 0x61, 0x69, 0x6e, 0x54, 0x79, 0x70, 0x65, - 0x12, 0x18, 0x0a, 0x07, 0x53, 0x75, 0x62, 0x54, 0x79, 0x70, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x07, 0x53, 0x75, 0x62, 0x54, 0x79, 0x70, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x44, 0x61, - 0x74, 0x61, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x04, 0x44, 0x61, 0x74, 0x61, 0x22, 0x5f, - 0x0a, 0x13, 0x42, 0x72, 0x6f, 0x61, 0x64, 0x43, 0x61, 0x73, 0x74, 0x4d, 0x65, 0x73, 0x73, 0x61, - 0x67, 0x65, 0x52, 0x65, 0x71, 0x12, 0x1a, 0x0a, 0x08, 0x4d, 0x61, 0x69, 0x6e, 0x54, 0x79, 0x70, - 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x4d, 0x61, 0x69, 0x6e, 0x54, 0x79, 0x70, - 0x65, 0x12, 0x18, 0x0a, 0x07, 0x53, 0x75, 0x62, 0x54, 0x79, 0x70, 0x65, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x07, 0x53, 0x75, 0x62, 0x54, 0x79, 0x70, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x44, - 0x61, 0x74, 0x61, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x04, 0x44, 0x61, 0x74, 0x61, 0x22, - 0x36, 0x0a, 0x0e, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x43, 0x6c, 0x6f, 0x73, 0x65, 0x65, 0x52, 0x65, + 0x16, 0x0a, 0x06, 0x55, 0x73, 0x65, 0x72, 0x49, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x06, 0x55, 0x73, 0x65, 0x72, 0x49, 0x64, 0x12, 0x2a, 0x0a, 0x10, 0x47, 0x61, 0x74, 0x65, 0x77, + 0x61, 0x79, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x49, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x10, 0x47, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, + 0x65, 0x49, 0x64, 0x12, 0x16, 0x0a, 0x06, 0x4d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x18, 0x05, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x06, 0x4d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x12, 0x2e, 0x0a, 0x07, 0x4d, + 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x67, + 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x41, + 0x6e, 0x79, 0x52, 0x07, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x22, 0x43, 0x0a, 0x0f, 0x52, + 0x50, 0x43, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x1e, + 0x0a, 0x04, 0x43, 0x6f, 0x64, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x0a, 0x2e, 0x45, + 0x72, 0x72, 0x6f, 0x72, 0x43, 0x6f, 0x64, 0x65, 0x52, 0x04, 0x43, 0x6f, 0x64, 0x65, 0x12, 0x10, + 0x0a, 0x03, 0x4d, 0x73, 0x67, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x4d, 0x73, 0x67, + 0x22, 0x4d, 0x0a, 0x0d, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x52, 0x65, 0x71, 0x12, 0x24, 0x0a, 0x0d, 0x55, 0x73, 0x65, 0x72, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x55, 0x73, 0x65, 0x72, 0x53, 0x65, - 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x42, 0x06, 0x5a, 0x04, 0x2e, 0x3b, 0x70, 0x62, 0x62, - 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x12, 0x16, 0x0a, 0x06, 0x55, 0x73, 0x65, 0x72, 0x49, + 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x55, 0x73, 0x65, 0x72, 0x49, 0x64, 0x22, + 0x37, 0x0a, 0x0f, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x55, 0x6e, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x52, + 0x65, 0x71, 0x12, 0x24, 0x0a, 0x0d, 0x55, 0x73, 0x65, 0x72, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, + 0x6e, 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x55, 0x73, 0x65, 0x72, 0x53, + 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x22, 0xbb, 0x01, 0x0a, 0x13, 0x41, 0x67, 0x65, + 0x6e, 0x74, 0x53, 0x65, 0x6e, 0x64, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x52, 0x65, 0x71, + 0x12, 0x24, 0x0a, 0x0d, 0x55, 0x73, 0x65, 0x72, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x49, + 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x55, 0x73, 0x65, 0x72, 0x53, 0x65, 0x73, + 0x73, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x12, 0x1a, 0x0a, 0x08, 0x4d, 0x61, 0x69, 0x6e, 0x54, 0x79, + 0x70, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x4d, 0x61, 0x69, 0x6e, 0x54, 0x79, + 0x70, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x53, 0x75, 0x62, 0x54, 0x79, 0x70, 0x65, 0x18, 0x03, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x07, 0x53, 0x75, 0x62, 0x54, 0x79, 0x70, 0x65, 0x12, 0x1e, 0x0a, 0x04, + 0x43, 0x6f, 0x64, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x0a, 0x2e, 0x45, 0x72, 0x72, + 0x6f, 0x72, 0x43, 0x6f, 0x64, 0x65, 0x52, 0x04, 0x43, 0x6f, 0x64, 0x65, 0x12, 0x28, 0x0a, 0x04, + 0x44, 0x61, 0x74, 0x61, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x67, 0x6f, 0x6f, + 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x41, 0x6e, 0x79, + 0x52, 0x04, 0x44, 0x61, 0x74, 0x61, 0x22, 0x99, 0x01, 0x0a, 0x0f, 0x42, 0x61, 0x74, 0x63, 0x68, + 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x52, 0x65, 0x71, 0x12, 0x26, 0x0a, 0x0e, 0x55, 0x73, + 0x65, 0x72, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x73, 0x18, 0x01, 0x20, 0x03, + 0x28, 0x09, 0x52, 0x0e, 0x55, 0x73, 0x65, 0x72, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x49, + 0x64, 0x73, 0x12, 0x1a, 0x0a, 0x08, 0x4d, 0x61, 0x69, 0x6e, 0x54, 0x79, 0x70, 0x65, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x4d, 0x61, 0x69, 0x6e, 0x54, 0x79, 0x70, 0x65, 0x12, 0x18, + 0x0a, 0x07, 0x53, 0x75, 0x62, 0x54, 0x79, 0x70, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x07, 0x53, 0x75, 0x62, 0x54, 0x79, 0x70, 0x65, 0x12, 0x28, 0x0a, 0x04, 0x44, 0x61, 0x74, 0x61, + 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, + 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x41, 0x6e, 0x79, 0x52, 0x04, 0x44, 0x61, + 0x74, 0x61, 0x22, 0x75, 0x0a, 0x13, 0x42, 0x72, 0x6f, 0x61, 0x64, 0x43, 0x61, 0x73, 0x74, 0x4d, + 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x52, 0x65, 0x71, 0x12, 0x1a, 0x0a, 0x08, 0x4d, 0x61, 0x69, + 0x6e, 0x54, 0x79, 0x70, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x4d, 0x61, 0x69, + 0x6e, 0x54, 0x79, 0x70, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x53, 0x75, 0x62, 0x54, 0x79, 0x70, 0x65, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x53, 0x75, 0x62, 0x54, 0x79, 0x70, 0x65, 0x12, + 0x28, 0x0a, 0x04, 0x44, 0x61, 0x74, 0x61, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, + 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, + 0x41, 0x6e, 0x79, 0x52, 0x04, 0x44, 0x61, 0x74, 0x61, 0x22, 0x36, 0x0a, 0x0e, 0x41, 0x67, 0x65, + 0x6e, 0x74, 0x43, 0x6c, 0x6f, 0x73, 0x65, 0x65, 0x52, 0x65, 0x71, 0x12, 0x24, 0x0a, 0x0d, 0x55, + 0x73, 0x65, 0x72, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x0d, 0x55, 0x73, 0x65, 0x72, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x49, + 0x64, 0x42, 0x06, 0x5a, 0x04, 0x2e, 0x3b, 0x70, 0x62, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, + 0x33, } var ( @@ -697,16 +707,22 @@ var file_comm_proto_goTypes = []interface{}{ (*BroadCastMessageReq)(nil), // 7: BroadCastMessageReq (*AgentCloseeReq)(nil), // 8: AgentCloseeReq (ErrorCode)(0), // 9: ErrorCode + (*anypb.Any)(nil), // 10: google.protobuf.Any } var file_comm_proto_depIdxs = []int32{ - 9, // 0: UserMessage.Code:type_name -> ErrorCode - 9, // 1: RPCMessageReply.Code:type_name -> ErrorCode - 9, // 2: AgentSendMessageReq.Code:type_name -> ErrorCode - 3, // [3:3] is the sub-list for method output_type - 3, // [3:3] 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 + 9, // 0: UserMessage.Code:type_name -> ErrorCode + 10, // 1: UserMessage.data:type_name -> google.protobuf.Any + 10, // 2: AgentMessage.Message:type_name -> google.protobuf.Any + 9, // 3: RPCMessageReply.Code:type_name -> ErrorCode + 9, // 4: AgentSendMessageReq.Code:type_name -> ErrorCode + 10, // 5: AgentSendMessageReq.Data:type_name -> google.protobuf.Any + 10, // 6: BatchMessageReq.Data:type_name -> google.protobuf.Any + 10, // 7: BroadCastMessageReq.Data:type_name -> google.protobuf.Any + 8, // [8:8] is the sub-list for method output_type + 8, // [8:8] is the sub-list for method input_type + 8, // [8:8] is the sub-list for extension type_name + 8, // [8:8] is the sub-list for extension extendee + 0, // [0:8] is the sub-list for field type_name } func init() { file_comm_proto_init() } diff --git a/pb/errorcode.pb.go b/pb/errorcode.pb.go index 5bce39018..3a3ec720f 100644 --- a/pb/errorcode.pb.go +++ b/pb/errorcode.pb.go @@ -50,6 +50,7 @@ const ( ErrorCode_FriendSelfBlackYet ErrorCode = 1107 //已在自己黑名单中 ErrorCode_FriendTargetBlackYet ErrorCode = 1108 //已在对方的黑名单中 ErrorCode_FriendApplyError ErrorCode = 1109 //申请失败 + ErrorCode_FriendBlackMax ErrorCode = 1110 //黑名单最大数量 ) // Enum value maps for ErrorCode. @@ -80,6 +81,7 @@ var ( 1107: "FriendSelfBlackYet", 1108: "FriendTargetBlackYet", 1109: "FriendApplyError", + 1110: "FriendBlackMax", } ErrorCode_value = map[string]int32{ "Success": 0, @@ -107,6 +109,7 @@ var ( "FriendSelfBlackYet": 1107, "FriendTargetBlackYet": 1108, "FriendApplyError": 1109, + "FriendBlackMax": 1110, } ) @@ -141,7 +144,7 @@ var File_errorcode_proto protoreflect.FileDescriptor var file_errorcode_proto_rawDesc = []byte{ 0x0a, 0x0f, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x63, 0x6f, 0x64, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, - 0x6f, 0x2a, 0x88, 0x04, 0x0a, 0x09, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x43, 0x6f, 0x64, 0x65, 0x12, + 0x6f, 0x2a, 0x9d, 0x04, 0x0a, 0x09, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x43, 0x6f, 0x64, 0x65, 0x12, 0x0b, 0x0a, 0x07, 0x53, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x10, 0x00, 0x12, 0x11, 0x0a, 0x0d, 0x4e, 0x6f, 0x46, 0x69, 0x6e, 0x64, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x10, 0x0a, 0x12, 0x19, 0x0a, 0x15, 0x52, 0x70, 0x63, 0x46, 0x75, 0x6e, 0x63, 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, @@ -173,8 +176,10 @@ var file_errorcode_proto_rawDesc = []byte{ 0x6c, 0x61, 0x63, 0x6b, 0x59, 0x65, 0x74, 0x10, 0xd3, 0x08, 0x12, 0x19, 0x0a, 0x14, 0x46, 0x72, 0x69, 0x65, 0x6e, 0x64, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x42, 0x6c, 0x61, 0x63, 0x6b, 0x59, 0x65, 0x74, 0x10, 0xd4, 0x08, 0x12, 0x15, 0x0a, 0x10, 0x46, 0x72, 0x69, 0x65, 0x6e, 0x64, 0x41, - 0x70, 0x70, 0x6c, 0x79, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x10, 0xd5, 0x08, 0x42, 0x06, 0x5a, 0x04, - 0x2e, 0x3b, 0x70, 0x62, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x70, 0x70, 0x6c, 0x79, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x10, 0xd5, 0x08, 0x12, 0x13, 0x0a, 0x0e, + 0x46, 0x72, 0x69, 0x65, 0x6e, 0x64, 0x42, 0x6c, 0x61, 0x63, 0x6b, 0x4d, 0x61, 0x78, 0x10, 0xd6, + 0x08, 0x42, 0x06, 0x5a, 0x04, 0x2e, 0x3b, 0x70, 0x62, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, + 0x33, } var ( diff --git a/pb/friend_msg.pb.go b/pb/friend_msg.pb.go index a88fd3497..725a918e5 100644 --- a/pb/friend_msg.pb.go +++ b/pb/friend_msg.pb.go @@ -159,7 +159,7 @@ type FriendListRsp struct { sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - List []*Cache_FriendData `protobuf:"bytes,1,rep,name=list,proto3" json:"list,omitempty"` + List []*FriendBase `protobuf:"bytes,1,rep,name=list,proto3" json:"list,omitempty"` } func (x *FriendListRsp) Reset() { @@ -194,7 +194,7 @@ func (*FriendListRsp) Descriptor() ([]byte, []int) { return file_friend_friend_msg_proto_rawDescGZIP(), []int{2} } -func (x *FriendListRsp) GetList() []*Cache_FriendData { +func (x *FriendListRsp) GetList() []*FriendBase { if x != nil { return x.List } @@ -407,18 +407,17 @@ func (x *FriendDelRsp) GetUserId() string { return "" } -//同意或拒绝 -type FriendAgreeOrRefuseReq struct { +//同意 +type FriendAgreeReq struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - FriendId string `protobuf:"bytes,1,opt,name=friendId,proto3" json:"friendId,omitempty"` //被同意或拒绝的用户 - IsAgree bool `protobuf:"varint,2,opt,name=isAgree,proto3" json:"isAgree,omitempty"` + FriendIds []string `protobuf:"bytes,1,rep,name=friendIds,proto3" json:"friendIds,omitempty"` //被同意的用户 } -func (x *FriendAgreeOrRefuseReq) Reset() { - *x = FriendAgreeOrRefuseReq{} +func (x *FriendAgreeReq) Reset() { + *x = FriendAgreeReq{} if protoimpl.UnsafeEnabled { mi := &file_friend_friend_msg_proto_msgTypes[7] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) @@ -426,13 +425,13 @@ func (x *FriendAgreeOrRefuseReq) Reset() { } } -func (x *FriendAgreeOrRefuseReq) String() string { +func (x *FriendAgreeReq) String() string { return protoimpl.X.MessageStringOf(x) } -func (*FriendAgreeOrRefuseReq) ProtoMessage() {} +func (*FriendAgreeReq) ProtoMessage() {} -func (x *FriendAgreeOrRefuseReq) ProtoReflect() protoreflect.Message { +func (x *FriendAgreeReq) ProtoReflect() protoreflect.Message { mi := &file_friend_friend_msg_proto_msgTypes[7] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) @@ -444,36 +443,28 @@ func (x *FriendAgreeOrRefuseReq) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use FriendAgreeOrRefuseReq.ProtoReflect.Descriptor instead. -func (*FriendAgreeOrRefuseReq) Descriptor() ([]byte, []int) { +// Deprecated: Use FriendAgreeReq.ProtoReflect.Descriptor instead. +func (*FriendAgreeReq) Descriptor() ([]byte, []int) { return file_friend_friend_msg_proto_rawDescGZIP(), []int{7} } -func (x *FriendAgreeOrRefuseReq) GetFriendId() string { +func (x *FriendAgreeReq) GetFriendIds() []string { if x != nil { - return x.FriendId + return x.FriendIds } - return "" + return nil } -func (x *FriendAgreeOrRefuseReq) GetIsAgree() bool { - if x != nil { - return x.IsAgree - } - return false -} - -type FriendAgressOrRefuseRsp struct { +type FriendAgreeRsp struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Num int32 `protobuf:"varint,1,opt,name=Num,proto3" json:"Num,omitempty"` //操作的数量 - IsAgree bool `protobuf:"varint,2,opt,name=isAgree,proto3" json:"isAgree,omitempty"` + Num int32 `protobuf:"varint,1,opt,name=Num,proto3" json:"Num,omitempty"` //操作的数量 } -func (x *FriendAgressOrRefuseRsp) Reset() { - *x = FriendAgressOrRefuseRsp{} +func (x *FriendAgreeRsp) Reset() { + *x = FriendAgreeRsp{} if protoimpl.UnsafeEnabled { mi := &file_friend_friend_msg_proto_msgTypes[8] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) @@ -481,13 +472,13 @@ func (x *FriendAgressOrRefuseRsp) Reset() { } } -func (x *FriendAgressOrRefuseRsp) String() string { +func (x *FriendAgreeRsp) String() string { return protoimpl.X.MessageStringOf(x) } -func (*FriendAgressOrRefuseRsp) ProtoMessage() {} +func (*FriendAgreeRsp) ProtoMessage() {} -func (x *FriendAgressOrRefuseRsp) ProtoReflect() protoreflect.Message { +func (x *FriendAgreeRsp) ProtoReflect() protoreflect.Message { mi := &file_friend_friend_msg_proto_msgTypes[8] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) @@ -499,23 +490,111 @@ func (x *FriendAgressOrRefuseRsp) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use FriendAgressOrRefuseRsp.ProtoReflect.Descriptor instead. -func (*FriendAgressOrRefuseRsp) Descriptor() ([]byte, []int) { +// Deprecated: Use FriendAgreeRsp.ProtoReflect.Descriptor instead. +func (*FriendAgreeRsp) Descriptor() ([]byte, []int) { return file_friend_friend_msg_proto_rawDescGZIP(), []int{8} } -func (x *FriendAgressOrRefuseRsp) GetNum() int32 { +func (x *FriendAgreeRsp) GetNum() int32 { if x != nil { return x.Num } return 0 } -func (x *FriendAgressOrRefuseRsp) GetIsAgree() bool { - if x != nil { - return x.IsAgree +//拒绝 +type FriendRefuseReq struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + FriendIds []string `protobuf:"bytes,1,rep,name=friendIds,proto3" json:"friendIds,omitempty"` //被拒绝的用户 +} + +func (x *FriendRefuseReq) Reset() { + *x = FriendRefuseReq{} + if protoimpl.UnsafeEnabled { + mi := &file_friend_friend_msg_proto_msgTypes[9] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } - return false +} + +func (x *FriendRefuseReq) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*FriendRefuseReq) ProtoMessage() {} + +func (x *FriendRefuseReq) ProtoReflect() protoreflect.Message { + mi := &file_friend_friend_msg_proto_msgTypes[9] + 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 FriendRefuseReq.ProtoReflect.Descriptor instead. +func (*FriendRefuseReq) Descriptor() ([]byte, []int) { + return file_friend_friend_msg_proto_rawDescGZIP(), []int{9} +} + +func (x *FriendRefuseReq) GetFriendIds() []string { + if x != nil { + return x.FriendIds + } + return nil +} + +type FriendRefuseRsp struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Num int32 `protobuf:"varint,1,opt,name=Num,proto3" json:"Num,omitempty"` //操作的数量 +} + +func (x *FriendRefuseRsp) Reset() { + *x = FriendRefuseRsp{} + if protoimpl.UnsafeEnabled { + mi := &file_friend_friend_msg_proto_msgTypes[10] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *FriendRefuseRsp) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*FriendRefuseRsp) ProtoMessage() {} + +func (x *FriendRefuseRsp) ProtoReflect() protoreflect.Message { + mi := &file_friend_friend_msg_proto_msgTypes[10] + 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 FriendRefuseRsp.ProtoReflect.Descriptor instead. +func (*FriendRefuseRsp) Descriptor() ([]byte, []int) { + return file_friend_friend_msg_proto_rawDescGZIP(), []int{10} +} + +func (x *FriendRefuseRsp) GetNum() int32 { + if x != nil { + return x.Num + } + return 0 } //好友申请列表 @@ -528,7 +607,7 @@ type FriendApplyListReq struct { func (x *FriendApplyListReq) Reset() { *x = FriendApplyListReq{} if protoimpl.UnsafeEnabled { - mi := &file_friend_friend_msg_proto_msgTypes[9] + mi := &file_friend_friend_msg_proto_msgTypes[11] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -541,7 +620,7 @@ func (x *FriendApplyListReq) String() string { func (*FriendApplyListReq) ProtoMessage() {} func (x *FriendApplyListReq) ProtoReflect() protoreflect.Message { - mi := &file_friend_friend_msg_proto_msgTypes[9] + mi := &file_friend_friend_msg_proto_msgTypes[11] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -554,7 +633,7 @@ func (x *FriendApplyListReq) ProtoReflect() protoreflect.Message { // Deprecated: Use FriendApplyListReq.ProtoReflect.Descriptor instead. func (*FriendApplyListReq) Descriptor() ([]byte, []int) { - return file_friend_friend_msg_proto_rawDescGZIP(), []int{9} + return file_friend_friend_msg_proto_rawDescGZIP(), []int{11} } type FriendApplyListRsp struct { @@ -568,7 +647,7 @@ type FriendApplyListRsp struct { func (x *FriendApplyListRsp) Reset() { *x = FriendApplyListRsp{} if protoimpl.UnsafeEnabled { - mi := &file_friend_friend_msg_proto_msgTypes[10] + mi := &file_friend_friend_msg_proto_msgTypes[12] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -581,7 +660,7 @@ func (x *FriendApplyListRsp) String() string { func (*FriendApplyListRsp) ProtoMessage() {} func (x *FriendApplyListRsp) ProtoReflect() protoreflect.Message { - mi := &file_friend_friend_msg_proto_msgTypes[10] + mi := &file_friend_friend_msg_proto_msgTypes[12] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -594,7 +673,7 @@ func (x *FriendApplyListRsp) ProtoReflect() protoreflect.Message { // Deprecated: Use FriendApplyListRsp.ProtoReflect.Descriptor instead. func (*FriendApplyListRsp) Descriptor() ([]byte, []int) { - return file_friend_friend_msg_proto_rawDescGZIP(), []int{10} + return file_friend_friend_msg_proto_rawDescGZIP(), []int{12} } func (x *FriendApplyListRsp) GetList() []*FriendBase { @@ -610,14 +689,13 @@ type FriendSearchReq struct { sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - FriendId string `protobuf:"bytes,1,opt,name=friendId,proto3" json:"friendId,omitempty"` - NickName string `protobuf:"bytes,2,opt,name=nickName,proto3" json:"nickName,omitempty"` //好友昵称 + NickName string `protobuf:"bytes,1,opt,name=nickName,proto3" json:"nickName,omitempty"` //好友昵称 } func (x *FriendSearchReq) Reset() { *x = FriendSearchReq{} if protoimpl.UnsafeEnabled { - mi := &file_friend_friend_msg_proto_msgTypes[11] + mi := &file_friend_friend_msg_proto_msgTypes[13] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -630,7 +708,7 @@ func (x *FriendSearchReq) String() string { func (*FriendSearchReq) ProtoMessage() {} func (x *FriendSearchReq) ProtoReflect() protoreflect.Message { - mi := &file_friend_friend_msg_proto_msgTypes[11] + mi := &file_friend_friend_msg_proto_msgTypes[13] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -643,14 +721,7 @@ func (x *FriendSearchReq) ProtoReflect() protoreflect.Message { // Deprecated: Use FriendSearchReq.ProtoReflect.Descriptor instead. func (*FriendSearchReq) Descriptor() ([]byte, []int) { - return file_friend_friend_msg_proto_rawDescGZIP(), []int{11} -} - -func (x *FriendSearchReq) GetFriendId() string { - if x != nil { - return x.FriendId - } - return "" + return file_friend_friend_msg_proto_rawDescGZIP(), []int{13} } func (x *FriendSearchReq) GetNickName() string { @@ -665,13 +736,13 @@ type FriendSearchRsp struct { sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Friends []*FriendBase `protobuf:"bytes,1,rep,name=friends,proto3" json:"friends,omitempty"` + Friend *FriendBase `protobuf:"bytes,1,opt,name=friend,proto3" json:"friend,omitempty"` } func (x *FriendSearchRsp) Reset() { *x = FriendSearchRsp{} if protoimpl.UnsafeEnabled { - mi := &file_friend_friend_msg_proto_msgTypes[12] + mi := &file_friend_friend_msg_proto_msgTypes[14] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -684,7 +755,7 @@ func (x *FriendSearchRsp) String() string { func (*FriendSearchRsp) ProtoMessage() {} func (x *FriendSearchRsp) ProtoReflect() protoreflect.Message { - mi := &file_friend_friend_msg_proto_msgTypes[12] + mi := &file_friend_friend_msg_proto_msgTypes[14] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -697,12 +768,12 @@ func (x *FriendSearchRsp) ProtoReflect() protoreflect.Message { // Deprecated: Use FriendSearchRsp.ProtoReflect.Descriptor instead. func (*FriendSearchRsp) Descriptor() ([]byte, []int) { - return file_friend_friend_msg_proto_rawDescGZIP(), []int{12} + return file_friend_friend_msg_proto_rawDescGZIP(), []int{14} } -func (x *FriendSearchRsp) GetFriends() []*FriendBase { +func (x *FriendSearchRsp) GetFriend() *FriendBase { if x != nil { - return x.Friends + return x.Friend } return nil } @@ -717,7 +788,7 @@ type FriendBlackListReq struct { func (x *FriendBlackListReq) Reset() { *x = FriendBlackListReq{} if protoimpl.UnsafeEnabled { - mi := &file_friend_friend_msg_proto_msgTypes[13] + mi := &file_friend_friend_msg_proto_msgTypes[15] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -730,7 +801,7 @@ func (x *FriendBlackListReq) String() string { func (*FriendBlackListReq) ProtoMessage() {} func (x *FriendBlackListReq) ProtoReflect() protoreflect.Message { - mi := &file_friend_friend_msg_proto_msgTypes[13] + mi := &file_friend_friend_msg_proto_msgTypes[15] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -743,7 +814,7 @@ func (x *FriendBlackListReq) ProtoReflect() protoreflect.Message { // Deprecated: Use FriendBlackListReq.ProtoReflect.Descriptor instead. func (*FriendBlackListReq) Descriptor() ([]byte, []int) { - return file_friend_friend_msg_proto_rawDescGZIP(), []int{13} + return file_friend_friend_msg_proto_rawDescGZIP(), []int{15} } type FriendBlackListRsp struct { @@ -757,7 +828,7 @@ type FriendBlackListRsp struct { func (x *FriendBlackListRsp) Reset() { *x = FriendBlackListRsp{} if protoimpl.UnsafeEnabled { - mi := &file_friend_friend_msg_proto_msgTypes[14] + mi := &file_friend_friend_msg_proto_msgTypes[16] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -770,7 +841,7 @@ func (x *FriendBlackListRsp) String() string { func (*FriendBlackListRsp) ProtoMessage() {} func (x *FriendBlackListRsp) ProtoReflect() protoreflect.Message { - mi := &file_friend_friend_msg_proto_msgTypes[14] + mi := &file_friend_friend_msg_proto_msgTypes[16] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -783,7 +854,7 @@ func (x *FriendBlackListRsp) ProtoReflect() protoreflect.Message { // Deprecated: Use FriendBlackListRsp.ProtoReflect.Descriptor instead. func (*FriendBlackListRsp) Descriptor() ([]byte, []int) { - return file_friend_friend_msg_proto_rawDescGZIP(), []int{14} + return file_friend_friend_msg_proto_rawDescGZIP(), []int{16} } func (x *FriendBlackListRsp) GetFriends() []*FriendBase { @@ -805,7 +876,7 @@ type FriendBlackAddReq struct { func (x *FriendBlackAddReq) Reset() { *x = FriendBlackAddReq{} if protoimpl.UnsafeEnabled { - mi := &file_friend_friend_msg_proto_msgTypes[15] + mi := &file_friend_friend_msg_proto_msgTypes[17] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -818,7 +889,7 @@ func (x *FriendBlackAddReq) String() string { func (*FriendBlackAddReq) ProtoMessage() {} func (x *FriendBlackAddReq) ProtoReflect() protoreflect.Message { - mi := &file_friend_friend_msg_proto_msgTypes[15] + mi := &file_friend_friend_msg_proto_msgTypes[17] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -831,7 +902,7 @@ func (x *FriendBlackAddReq) ProtoReflect() protoreflect.Message { // Deprecated: Use FriendBlackAddReq.ProtoReflect.Descriptor instead. func (*FriendBlackAddReq) Descriptor() ([]byte, []int) { - return file_friend_friend_msg_proto_rawDescGZIP(), []int{15} + return file_friend_friend_msg_proto_rawDescGZIP(), []int{17} } func (x *FriendBlackAddReq) GetFriendId() string { @@ -853,7 +924,7 @@ type FriendBlackAddRsp struct { func (x *FriendBlackAddRsp) Reset() { *x = FriendBlackAddRsp{} if protoimpl.UnsafeEnabled { - mi := &file_friend_friend_msg_proto_msgTypes[16] + mi := &file_friend_friend_msg_proto_msgTypes[18] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -866,7 +937,7 @@ func (x *FriendBlackAddRsp) String() string { func (*FriendBlackAddRsp) ProtoMessage() {} func (x *FriendBlackAddRsp) ProtoReflect() protoreflect.Message { - mi := &file_friend_friend_msg_proto_msgTypes[16] + mi := &file_friend_friend_msg_proto_msgTypes[18] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -879,7 +950,7 @@ func (x *FriendBlackAddRsp) ProtoReflect() protoreflect.Message { // Deprecated: Use FriendBlackAddRsp.ProtoReflect.Descriptor instead. func (*FriendBlackAddRsp) Descriptor() ([]byte, []int) { - return file_friend_friend_msg_proto_rawDescGZIP(), []int{16} + return file_friend_friend_msg_proto_rawDescGZIP(), []int{18} } func (x *FriendBlackAddRsp) GetFriendId() string { @@ -896,33 +967,32 @@ func (x *FriendBlackAddRsp) GetUserId() string { return "" } -//赠送或接收 -type FriendReceiveOrSendReq struct { +//删除黑名单 +type FriendDelBlackReq struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - FriendId string `protobuf:"bytes,1,opt,name=friendId,proto3" json:"friendId,omitempty"` - IsReceive bool `protobuf:"varint,2,opt,name=isReceive,proto3" json:"isReceive,omitempty"` + FriendId string `protobuf:"bytes,1,opt,name=friendId,proto3" json:"friendId,omitempty"` } -func (x *FriendReceiveOrSendReq) Reset() { - *x = FriendReceiveOrSendReq{} +func (x *FriendDelBlackReq) Reset() { + *x = FriendDelBlackReq{} if protoimpl.UnsafeEnabled { - mi := &file_friend_friend_msg_proto_msgTypes[17] + mi := &file_friend_friend_msg_proto_msgTypes[19] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *FriendReceiveOrSendReq) String() string { +func (x *FriendDelBlackReq) String() string { return protoimpl.X.MessageStringOf(x) } -func (*FriendReceiveOrSendReq) ProtoMessage() {} +func (*FriendDelBlackReq) ProtoMessage() {} -func (x *FriendReceiveOrSendReq) ProtoReflect() protoreflect.Message { - mi := &file_friend_friend_msg_proto_msgTypes[17] +func (x *FriendDelBlackReq) ProtoReflect() protoreflect.Message { + mi := &file_friend_friend_msg_proto_msgTypes[19] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -933,52 +1003,44 @@ func (x *FriendReceiveOrSendReq) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use FriendReceiveOrSendReq.ProtoReflect.Descriptor instead. -func (*FriendReceiveOrSendReq) Descriptor() ([]byte, []int) { - return file_friend_friend_msg_proto_rawDescGZIP(), []int{17} +// Deprecated: Use FriendDelBlackReq.ProtoReflect.Descriptor instead. +func (*FriendDelBlackReq) Descriptor() ([]byte, []int) { + return file_friend_friend_msg_proto_rawDescGZIP(), []int{19} } -func (x *FriendReceiveOrSendReq) GetFriendId() string { +func (x *FriendDelBlackReq) GetFriendId() string { if x != nil { return x.FriendId } return "" } -func (x *FriendReceiveOrSendReq) GetIsReceive() bool { - if x != nil { - return x.IsReceive - } - return false -} - -type FriendReceiveOrSendRsp struct { +type FriendDelBlackRsp struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - FriendId string `protobuf:"bytes,1,opt,name=friendId,proto3" json:"friendId,omitempty"` - UserId string `protobuf:"bytes,2,opt,name=userId,proto3" json:"userId,omitempty"` - IsReceive bool `protobuf:"varint,3,opt,name=isReceive,proto3" json:"isReceive,omitempty"` + FriendId string `protobuf:"bytes,1,opt,name=friendId,proto3" json:"friendId,omitempty"` + UserId string `protobuf:"bytes,2,opt,name=userId,proto3" json:"userId,omitempty"` } -func (x *FriendReceiveOrSendRsp) Reset() { - *x = FriendReceiveOrSendRsp{} +func (x *FriendDelBlackRsp) Reset() { + *x = FriendDelBlackRsp{} if protoimpl.UnsafeEnabled { - mi := &file_friend_friend_msg_proto_msgTypes[18] + mi := &file_friend_friend_msg_proto_msgTypes[20] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *FriendReceiveOrSendRsp) String() string { +func (x *FriendDelBlackRsp) String() string { return protoimpl.X.MessageStringOf(x) } -func (*FriendReceiveOrSendRsp) ProtoMessage() {} +func (*FriendDelBlackRsp) ProtoMessage() {} -func (x *FriendReceiveOrSendRsp) ProtoReflect() protoreflect.Message { - mi := &file_friend_friend_msg_proto_msgTypes[18] +func (x *FriendDelBlackRsp) ProtoReflect() protoreflect.Message { + mi := &file_friend_friend_msg_proto_msgTypes[20] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -989,30 +1051,229 @@ func (x *FriendReceiveOrSendRsp) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use FriendReceiveOrSendRsp.ProtoReflect.Descriptor instead. -func (*FriendReceiveOrSendRsp) Descriptor() ([]byte, []int) { - return file_friend_friend_msg_proto_rawDescGZIP(), []int{18} +// Deprecated: Use FriendDelBlackRsp.ProtoReflect.Descriptor instead. +func (*FriendDelBlackRsp) Descriptor() ([]byte, []int) { + return file_friend_friend_msg_proto_rawDescGZIP(), []int{20} } -func (x *FriendReceiveOrSendRsp) GetFriendId() string { +func (x *FriendDelBlackRsp) GetFriendId() string { if x != nil { return x.FriendId } return "" } -func (x *FriendReceiveOrSendRsp) GetUserId() string { +func (x *FriendDelBlackRsp) GetUserId() string { if x != nil { return x.UserId } return "" } -func (x *FriendReceiveOrSendRsp) GetIsReceive() bool { - if x != nil { - return x.IsReceive +//接收 +type FriendReceiveReq struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + FriendId string `protobuf:"bytes,1,opt,name=friendId,proto3" json:"friendId,omitempty"` +} + +func (x *FriendReceiveReq) Reset() { + *x = FriendReceiveReq{} + if protoimpl.UnsafeEnabled { + mi := &file_friend_friend_msg_proto_msgTypes[21] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } - return false +} + +func (x *FriendReceiveReq) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*FriendReceiveReq) ProtoMessage() {} + +func (x *FriendReceiveReq) ProtoReflect() protoreflect.Message { + mi := &file_friend_friend_msg_proto_msgTypes[21] + 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 FriendReceiveReq.ProtoReflect.Descriptor instead. +func (*FriendReceiveReq) Descriptor() ([]byte, []int) { + return file_friend_friend_msg_proto_rawDescGZIP(), []int{21} +} + +func (x *FriendReceiveReq) GetFriendId() string { + if x != nil { + return x.FriendId + } + return "" +} + +type FriendReceiveRsp struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + FriendId string `protobuf:"bytes,1,opt,name=friendId,proto3" json:"friendId,omitempty"` + UserId string `protobuf:"bytes,2,opt,name=userId,proto3" json:"userId,omitempty"` +} + +func (x *FriendReceiveRsp) Reset() { + *x = FriendReceiveRsp{} + if protoimpl.UnsafeEnabled { + mi := &file_friend_friend_msg_proto_msgTypes[22] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *FriendReceiveRsp) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*FriendReceiveRsp) ProtoMessage() {} + +func (x *FriendReceiveRsp) ProtoReflect() protoreflect.Message { + mi := &file_friend_friend_msg_proto_msgTypes[22] + 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 FriendReceiveRsp.ProtoReflect.Descriptor instead. +func (*FriendReceiveRsp) Descriptor() ([]byte, []int) { + return file_friend_friend_msg_proto_rawDescGZIP(), []int{22} +} + +func (x *FriendReceiveRsp) GetFriendId() string { + if x != nil { + return x.FriendId + } + return "" +} + +func (x *FriendReceiveRsp) GetUserId() string { + if x != nil { + return x.UserId + } + return "" +} + +//赠送 +type FriendGiveReq struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + FriendId string `protobuf:"bytes,1,opt,name=friendId,proto3" json:"friendId,omitempty"` +} + +func (x *FriendGiveReq) Reset() { + *x = FriendGiveReq{} + if protoimpl.UnsafeEnabled { + mi := &file_friend_friend_msg_proto_msgTypes[23] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *FriendGiveReq) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*FriendGiveReq) ProtoMessage() {} + +func (x *FriendGiveReq) ProtoReflect() protoreflect.Message { + mi := &file_friend_friend_msg_proto_msgTypes[23] + 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 FriendGiveReq.ProtoReflect.Descriptor instead. +func (*FriendGiveReq) Descriptor() ([]byte, []int) { + return file_friend_friend_msg_proto_rawDescGZIP(), []int{23} +} + +func (x *FriendGiveReq) GetFriendId() string { + if x != nil { + return x.FriendId + } + return "" +} + +type FriendGiveRsp struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + FriendId string `protobuf:"bytes,1,opt,name=friendId,proto3" json:"friendId,omitempty"` + UserId string `protobuf:"bytes,2,opt,name=userId,proto3" json:"userId,omitempty"` +} + +func (x *FriendGiveRsp) Reset() { + *x = FriendGiveRsp{} + if protoimpl.UnsafeEnabled { + mi := &file_friend_friend_msg_proto_msgTypes[24] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *FriendGiveRsp) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*FriendGiveRsp) ProtoMessage() {} + +func (x *FriendGiveRsp) ProtoReflect() protoreflect.Message { + mi := &file_friend_friend_msg_proto_msgTypes[24] + 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 FriendGiveRsp.ProtoReflect.Descriptor instead. +func (*FriendGiveRsp) Descriptor() ([]byte, []int) { + return file_friend_friend_msg_proto_rawDescGZIP(), []int{24} +} + +func (x *FriendGiveRsp) GetFriendId() string { + if x != nil { + return x.FriendId + } + return "" +} + +func (x *FriendGiveRsp) GetUserId() string { + if x != nil { + return x.UserId + } + return "" } //好友数量 @@ -1027,7 +1288,7 @@ type FriendTotalReq struct { func (x *FriendTotalReq) Reset() { *x = FriendTotalReq{} if protoimpl.UnsafeEnabled { - mi := &file_friend_friend_msg_proto_msgTypes[19] + mi := &file_friend_friend_msg_proto_msgTypes[25] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1040,7 +1301,7 @@ func (x *FriendTotalReq) String() string { func (*FriendTotalReq) ProtoMessage() {} func (x *FriendTotalReq) ProtoReflect() protoreflect.Message { - mi := &file_friend_friend_msg_proto_msgTypes[19] + mi := &file_friend_friend_msg_proto_msgTypes[25] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1053,7 +1314,7 @@ func (x *FriendTotalReq) ProtoReflect() protoreflect.Message { // Deprecated: Use FriendTotalReq.ProtoReflect.Descriptor instead. func (*FriendTotalReq) Descriptor() ([]byte, []int) { - return file_friend_friend_msg_proto_rawDescGZIP(), []int{19} + return file_friend_friend_msg_proto_rawDescGZIP(), []int{25} } func (x *FriendTotalReq) GetFriendId() string { @@ -1075,7 +1336,7 @@ type FriendTotalRsp struct { func (x *FriendTotalRsp) Reset() { *x = FriendTotalRsp{} if protoimpl.UnsafeEnabled { - mi := &file_friend_friend_msg_proto_msgTypes[20] + mi := &file_friend_friend_msg_proto_msgTypes[26] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1088,7 +1349,7 @@ func (x *FriendTotalRsp) String() string { func (*FriendTotalRsp) ProtoMessage() {} func (x *FriendTotalRsp) ProtoReflect() protoreflect.Message { - mi := &file_friend_friend_msg_proto_msgTypes[20] + mi := &file_friend_friend_msg_proto_msgTypes[26] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1101,7 +1362,7 @@ func (x *FriendTotalRsp) ProtoReflect() protoreflect.Message { // Deprecated: Use FriendTotalRsp.ProtoReflect.Descriptor instead. func (*FriendTotalRsp) Descriptor() ([]byte, []int) { - return file_friend_friend_msg_proto_rawDescGZIP(), []int{20} + return file_friend_friend_msg_proto_rawDescGZIP(), []int{26} } func (x *FriendTotalRsp) GetFriendId() string { @@ -1122,96 +1383,103 @@ var File_friend_friend_msg_proto protoreflect.FileDescriptor var file_friend_friend_msg_proto_rawDesc = []byte{ 0x0a, 0x17, 0x66, 0x72, 0x69, 0x65, 0x6e, 0x64, 0x2f, 0x66, 0x72, 0x69, 0x65, 0x6e, 0x64, 0x5f, - 0x6d, 0x73, 0x67, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x16, 0x66, 0x72, 0x69, 0x65, 0x6e, - 0x64, 0x2f, 0x66, 0x72, 0x69, 0x65, 0x6e, 0x64, 0x5f, 0x64, 0x62, 0x2e, 0x70, 0x72, 0x6f, 0x74, - 0x6f, 0x22, 0xc8, 0x01, 0x0a, 0x0a, 0x46, 0x72, 0x69, 0x65, 0x6e, 0x64, 0x42, 0x61, 0x73, 0x65, - 0x12, 0x16, 0x0a, 0x06, 0x75, 0x73, 0x65, 0x72, 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x06, 0x75, 0x73, 0x65, 0x72, 0x49, 0x64, 0x12, 0x1a, 0x0a, 0x08, 0x4e, 0x69, 0x63, 0x6b, - 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x4e, 0x69, 0x63, 0x6b, - 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x6c, 0x65, 0x76, 0x65, 0x6c, 0x18, 0x03, 0x20, - 0x01, 0x28, 0x05, 0x52, 0x05, 0x6c, 0x65, 0x76, 0x65, 0x6c, 0x12, 0x16, 0x0a, 0x06, 0x61, 0x76, - 0x61, 0x74, 0x61, 0x72, 0x18, 0x04, 0x20, 0x01, 0x28, 0x05, 0x52, 0x06, 0x61, 0x76, 0x61, 0x74, - 0x61, 0x72, 0x12, 0x1a, 0x0a, 0x08, 0x73, 0x74, 0x72, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x18, 0x05, - 0x20, 0x01, 0x28, 0x03, 0x52, 0x08, 0x73, 0x74, 0x72, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x12, 0x1a, - 0x0a, 0x08, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x49, 0x64, 0x18, 0x06, 0x20, 0x01, 0x28, 0x05, - 0x52, 0x08, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x49, 0x64, 0x12, 0x20, 0x0a, 0x0b, 0x6f, 0x66, - 0x66, 0x6c, 0x69, 0x6e, 0x65, 0x54, 0x69, 0x6d, 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, 0x03, 0x52, - 0x0b, 0x6f, 0x66, 0x66, 0x6c, 0x69, 0x6e, 0x65, 0x54, 0x69, 0x6d, 0x65, 0x22, 0x0f, 0x0a, 0x0d, - 0x46, 0x72, 0x69, 0x65, 0x6e, 0x64, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x71, 0x22, 0x36, 0x0a, - 0x0d, 0x46, 0x72, 0x69, 0x65, 0x6e, 0x64, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x73, 0x70, 0x12, 0x25, - 0x0a, 0x04, 0x6c, 0x69, 0x73, 0x74, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x43, - 0x61, 0x63, 0x68, 0x65, 0x5f, 0x46, 0x72, 0x69, 0x65, 0x6e, 0x64, 0x44, 0x61, 0x74, 0x61, 0x52, - 0x04, 0x6c, 0x69, 0x73, 0x74, 0x22, 0x2c, 0x0a, 0x0e, 0x46, 0x72, 0x69, 0x65, 0x6e, 0x64, 0x41, - 0x70, 0x70, 0x6c, 0x79, 0x52, 0x65, 0x71, 0x12, 0x1a, 0x0a, 0x08, 0x66, 0x72, 0x69, 0x65, 0x6e, - 0x64, 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x66, 0x72, 0x69, 0x65, 0x6e, - 0x64, 0x49, 0x64, 0x22, 0x44, 0x0a, 0x0e, 0x46, 0x72, 0x69, 0x65, 0x6e, 0x64, 0x41, 0x70, 0x70, - 0x6c, 0x79, 0x52, 0x73, 0x70, 0x12, 0x16, 0x0a, 0x06, 0x75, 0x73, 0x65, 0x72, 0x49, 0x64, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x75, 0x73, 0x65, 0x72, 0x49, 0x64, 0x12, 0x1a, 0x0a, - 0x08, 0x66, 0x72, 0x69, 0x65, 0x6e, 0x64, 0x49, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x08, 0x66, 0x72, 0x69, 0x65, 0x6e, 0x64, 0x49, 0x64, 0x22, 0x2a, 0x0a, 0x0c, 0x46, 0x72, 0x69, - 0x65, 0x6e, 0x64, 0x44, 0x65, 0x6c, 0x52, 0x65, 0x71, 0x12, 0x1a, 0x0a, 0x08, 0x66, 0x72, 0x69, + 0x6d, 0x73, 0x67, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0xc8, 0x01, 0x0a, 0x0a, 0x46, 0x72, + 0x69, 0x65, 0x6e, 0x64, 0x42, 0x61, 0x73, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x75, 0x73, 0x65, 0x72, + 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x75, 0x73, 0x65, 0x72, 0x49, 0x64, + 0x12, 0x1a, 0x0a, 0x08, 0x4e, 0x69, 0x63, 0x6b, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x08, 0x4e, 0x69, 0x63, 0x6b, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x14, 0x0a, 0x05, + 0x6c, 0x65, 0x76, 0x65, 0x6c, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x6c, 0x65, 0x76, + 0x65, 0x6c, 0x12, 0x16, 0x0a, 0x06, 0x61, 0x76, 0x61, 0x74, 0x61, 0x72, 0x18, 0x04, 0x20, 0x01, + 0x28, 0x05, 0x52, 0x06, 0x61, 0x76, 0x61, 0x74, 0x61, 0x72, 0x12, 0x1a, 0x0a, 0x08, 0x73, 0x74, + 0x72, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x18, 0x05, 0x20, 0x01, 0x28, 0x03, 0x52, 0x08, 0x73, 0x74, + 0x72, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x12, 0x1a, 0x0a, 0x08, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, + 0x49, 0x64, 0x18, 0x06, 0x20, 0x01, 0x28, 0x05, 0x52, 0x08, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, + 0x49, 0x64, 0x12, 0x20, 0x0a, 0x0b, 0x6f, 0x66, 0x66, 0x6c, 0x69, 0x6e, 0x65, 0x54, 0x69, 0x6d, + 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0b, 0x6f, 0x66, 0x66, 0x6c, 0x69, 0x6e, 0x65, + 0x54, 0x69, 0x6d, 0x65, 0x22, 0x0f, 0x0a, 0x0d, 0x46, 0x72, 0x69, 0x65, 0x6e, 0x64, 0x4c, 0x69, + 0x73, 0x74, 0x52, 0x65, 0x71, 0x22, 0x30, 0x0a, 0x0d, 0x46, 0x72, 0x69, 0x65, 0x6e, 0x64, 0x4c, + 0x69, 0x73, 0x74, 0x52, 0x73, 0x70, 0x12, 0x1f, 0x0a, 0x04, 0x6c, 0x69, 0x73, 0x74, 0x18, 0x01, + 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0b, 0x2e, 0x46, 0x72, 0x69, 0x65, 0x6e, 0x64, 0x42, 0x61, 0x73, + 0x65, 0x52, 0x04, 0x6c, 0x69, 0x73, 0x74, 0x22, 0x2c, 0x0a, 0x0e, 0x46, 0x72, 0x69, 0x65, 0x6e, + 0x64, 0x41, 0x70, 0x70, 0x6c, 0x79, 0x52, 0x65, 0x71, 0x12, 0x1a, 0x0a, 0x08, 0x66, 0x72, 0x69, 0x65, 0x6e, 0x64, 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x66, 0x72, 0x69, - 0x65, 0x6e, 0x64, 0x49, 0x64, 0x22, 0x42, 0x0a, 0x0c, 0x46, 0x72, 0x69, 0x65, 0x6e, 0x64, 0x44, - 0x65, 0x6c, 0x52, 0x73, 0x70, 0x12, 0x1a, 0x0a, 0x08, 0x66, 0x72, 0x69, 0x65, 0x6e, 0x64, 0x49, - 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x66, 0x72, 0x69, 0x65, 0x6e, 0x64, 0x49, - 0x64, 0x12, 0x16, 0x0a, 0x06, 0x75, 0x73, 0x65, 0x72, 0x49, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x06, 0x75, 0x73, 0x65, 0x72, 0x49, 0x64, 0x22, 0x4e, 0x0a, 0x16, 0x46, 0x72, 0x69, - 0x65, 0x6e, 0x64, 0x41, 0x67, 0x72, 0x65, 0x65, 0x4f, 0x72, 0x52, 0x65, 0x66, 0x75, 0x73, 0x65, - 0x52, 0x65, 0x71, 0x12, 0x1a, 0x0a, 0x08, 0x66, 0x72, 0x69, 0x65, 0x6e, 0x64, 0x49, 0x64, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x66, 0x72, 0x69, 0x65, 0x6e, 0x64, 0x49, 0x64, 0x12, - 0x18, 0x0a, 0x07, 0x69, 0x73, 0x41, 0x67, 0x72, 0x65, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, - 0x52, 0x07, 0x69, 0x73, 0x41, 0x67, 0x72, 0x65, 0x65, 0x22, 0x45, 0x0a, 0x17, 0x46, 0x72, 0x69, - 0x65, 0x6e, 0x64, 0x41, 0x67, 0x72, 0x65, 0x73, 0x73, 0x4f, 0x72, 0x52, 0x65, 0x66, 0x75, 0x73, - 0x65, 0x52, 0x73, 0x70, 0x12, 0x10, 0x0a, 0x03, 0x4e, 0x75, 0x6d, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x05, 0x52, 0x03, 0x4e, 0x75, 0x6d, 0x12, 0x18, 0x0a, 0x07, 0x69, 0x73, 0x41, 0x67, 0x72, 0x65, - 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x69, 0x73, 0x41, 0x67, 0x72, 0x65, 0x65, - 0x22, 0x14, 0x0a, 0x12, 0x46, 0x72, 0x69, 0x65, 0x6e, 0x64, 0x41, 0x70, 0x70, 0x6c, 0x79, 0x4c, - 0x69, 0x73, 0x74, 0x52, 0x65, 0x71, 0x22, 0x35, 0x0a, 0x12, 0x46, 0x72, 0x69, 0x65, 0x6e, 0x64, - 0x41, 0x70, 0x70, 0x6c, 0x79, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x73, 0x70, 0x12, 0x1f, 0x0a, 0x04, - 0x6c, 0x69, 0x73, 0x74, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0b, 0x2e, 0x46, 0x72, 0x69, - 0x65, 0x6e, 0x64, 0x42, 0x61, 0x73, 0x65, 0x52, 0x04, 0x6c, 0x69, 0x73, 0x74, 0x22, 0x49, 0x0a, - 0x0f, 0x46, 0x72, 0x69, 0x65, 0x6e, 0x64, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x52, 0x65, 0x71, - 0x12, 0x1a, 0x0a, 0x08, 0x66, 0x72, 0x69, 0x65, 0x6e, 0x64, 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x08, 0x66, 0x72, 0x69, 0x65, 0x6e, 0x64, 0x49, 0x64, 0x12, 0x1a, 0x0a, 0x08, - 0x6e, 0x69, 0x63, 0x6b, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, - 0x6e, 0x69, 0x63, 0x6b, 0x4e, 0x61, 0x6d, 0x65, 0x22, 0x38, 0x0a, 0x0f, 0x46, 0x72, 0x69, 0x65, - 0x6e, 0x64, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x52, 0x73, 0x70, 0x12, 0x25, 0x0a, 0x07, 0x66, - 0x72, 0x69, 0x65, 0x6e, 0x64, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0b, 0x2e, 0x46, - 0x72, 0x69, 0x65, 0x6e, 0x64, 0x42, 0x61, 0x73, 0x65, 0x52, 0x07, 0x66, 0x72, 0x69, 0x65, 0x6e, - 0x64, 0x73, 0x22, 0x14, 0x0a, 0x12, 0x46, 0x72, 0x69, 0x65, 0x6e, 0x64, 0x42, 0x6c, 0x61, 0x63, - 0x6b, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x71, 0x22, 0x3b, 0x0a, 0x12, 0x46, 0x72, 0x69, 0x65, - 0x6e, 0x64, 0x42, 0x6c, 0x61, 0x63, 0x6b, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x73, 0x70, 0x12, 0x25, - 0x0a, 0x07, 0x66, 0x72, 0x69, 0x65, 0x6e, 0x64, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, - 0x0b, 0x2e, 0x46, 0x72, 0x69, 0x65, 0x6e, 0x64, 0x42, 0x61, 0x73, 0x65, 0x52, 0x07, 0x66, 0x72, - 0x69, 0x65, 0x6e, 0x64, 0x73, 0x22, 0x2f, 0x0a, 0x11, 0x46, 0x72, 0x69, 0x65, 0x6e, 0x64, 0x42, - 0x6c, 0x61, 0x63, 0x6b, 0x41, 0x64, 0x64, 0x52, 0x65, 0x71, 0x12, 0x1a, 0x0a, 0x08, 0x66, 0x72, - 0x69, 0x65, 0x6e, 0x64, 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x66, 0x72, - 0x69, 0x65, 0x6e, 0x64, 0x49, 0x64, 0x22, 0x47, 0x0a, 0x11, 0x46, 0x72, 0x69, 0x65, 0x6e, 0x64, - 0x42, 0x6c, 0x61, 0x63, 0x6b, 0x41, 0x64, 0x64, 0x52, 0x73, 0x70, 0x12, 0x1a, 0x0a, 0x08, 0x66, + 0x65, 0x6e, 0x64, 0x49, 0x64, 0x22, 0x44, 0x0a, 0x0e, 0x46, 0x72, 0x69, 0x65, 0x6e, 0x64, 0x41, + 0x70, 0x70, 0x6c, 0x79, 0x52, 0x73, 0x70, 0x12, 0x16, 0x0a, 0x06, 0x75, 0x73, 0x65, 0x72, 0x49, + 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x75, 0x73, 0x65, 0x72, 0x49, 0x64, 0x12, + 0x1a, 0x0a, 0x08, 0x66, 0x72, 0x69, 0x65, 0x6e, 0x64, 0x49, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x08, 0x66, 0x72, 0x69, 0x65, 0x6e, 0x64, 0x49, 0x64, 0x22, 0x2a, 0x0a, 0x0c, 0x46, + 0x72, 0x69, 0x65, 0x6e, 0x64, 0x44, 0x65, 0x6c, 0x52, 0x65, 0x71, 0x12, 0x1a, 0x0a, 0x08, 0x66, 0x72, 0x69, 0x65, 0x6e, 0x64, 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x66, - 0x72, 0x69, 0x65, 0x6e, 0x64, 0x49, 0x64, 0x12, 0x16, 0x0a, 0x06, 0x75, 0x73, 0x65, 0x72, 0x49, - 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x75, 0x73, 0x65, 0x72, 0x49, 0x64, 0x22, - 0x52, 0x0a, 0x16, 0x46, 0x72, 0x69, 0x65, 0x6e, 0x64, 0x52, 0x65, 0x63, 0x65, 0x69, 0x76, 0x65, - 0x4f, 0x72, 0x53, 0x65, 0x6e, 0x64, 0x52, 0x65, 0x71, 0x12, 0x1a, 0x0a, 0x08, 0x66, 0x72, 0x69, - 0x65, 0x6e, 0x64, 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x66, 0x72, 0x69, - 0x65, 0x6e, 0x64, 0x49, 0x64, 0x12, 0x1c, 0x0a, 0x09, 0x69, 0x73, 0x52, 0x65, 0x63, 0x65, 0x69, - 0x76, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, 0x69, 0x73, 0x52, 0x65, 0x63, 0x65, - 0x69, 0x76, 0x65, 0x22, 0x6a, 0x0a, 0x16, 0x46, 0x72, 0x69, 0x65, 0x6e, 0x64, 0x52, 0x65, 0x63, - 0x65, 0x69, 0x76, 0x65, 0x4f, 0x72, 0x53, 0x65, 0x6e, 0x64, 0x52, 0x73, 0x70, 0x12, 0x1a, 0x0a, - 0x08, 0x66, 0x72, 0x69, 0x65, 0x6e, 0x64, 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x08, 0x66, 0x72, 0x69, 0x65, 0x6e, 0x64, 0x49, 0x64, 0x12, 0x16, 0x0a, 0x06, 0x75, 0x73, 0x65, - 0x72, 0x49, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x75, 0x73, 0x65, 0x72, 0x49, - 0x64, 0x12, 0x1c, 0x0a, 0x09, 0x69, 0x73, 0x52, 0x65, 0x63, 0x65, 0x69, 0x76, 0x65, 0x18, 0x03, - 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, 0x69, 0x73, 0x52, 0x65, 0x63, 0x65, 0x69, 0x76, 0x65, 0x22, - 0x2c, 0x0a, 0x0e, 0x46, 0x72, 0x69, 0x65, 0x6e, 0x64, 0x54, 0x6f, 0x74, 0x61, 0x6c, 0x52, 0x65, + 0x72, 0x69, 0x65, 0x6e, 0x64, 0x49, 0x64, 0x22, 0x42, 0x0a, 0x0c, 0x46, 0x72, 0x69, 0x65, 0x6e, + 0x64, 0x44, 0x65, 0x6c, 0x52, 0x73, 0x70, 0x12, 0x1a, 0x0a, 0x08, 0x66, 0x72, 0x69, 0x65, 0x6e, + 0x64, 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x66, 0x72, 0x69, 0x65, 0x6e, + 0x64, 0x49, 0x64, 0x12, 0x16, 0x0a, 0x06, 0x75, 0x73, 0x65, 0x72, 0x49, 0x64, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x06, 0x75, 0x73, 0x65, 0x72, 0x49, 0x64, 0x22, 0x2e, 0x0a, 0x0e, 0x46, + 0x72, 0x69, 0x65, 0x6e, 0x64, 0x41, 0x67, 0x72, 0x65, 0x65, 0x52, 0x65, 0x71, 0x12, 0x1c, 0x0a, + 0x09, 0x66, 0x72, 0x69, 0x65, 0x6e, 0x64, 0x49, 0x64, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, + 0x52, 0x09, 0x66, 0x72, 0x69, 0x65, 0x6e, 0x64, 0x49, 0x64, 0x73, 0x22, 0x22, 0x0a, 0x0e, 0x46, + 0x72, 0x69, 0x65, 0x6e, 0x64, 0x41, 0x67, 0x72, 0x65, 0x65, 0x52, 0x73, 0x70, 0x12, 0x10, 0x0a, + 0x03, 0x4e, 0x75, 0x6d, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x03, 0x4e, 0x75, 0x6d, 0x22, + 0x2f, 0x0a, 0x0f, 0x46, 0x72, 0x69, 0x65, 0x6e, 0x64, 0x52, 0x65, 0x66, 0x75, 0x73, 0x65, 0x52, + 0x65, 0x71, 0x12, 0x1c, 0x0a, 0x09, 0x66, 0x72, 0x69, 0x65, 0x6e, 0x64, 0x49, 0x64, 0x73, 0x18, + 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x09, 0x66, 0x72, 0x69, 0x65, 0x6e, 0x64, 0x49, 0x64, 0x73, + 0x22, 0x23, 0x0a, 0x0f, 0x46, 0x72, 0x69, 0x65, 0x6e, 0x64, 0x52, 0x65, 0x66, 0x75, 0x73, 0x65, + 0x52, 0x73, 0x70, 0x12, 0x10, 0x0a, 0x03, 0x4e, 0x75, 0x6d, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, + 0x52, 0x03, 0x4e, 0x75, 0x6d, 0x22, 0x14, 0x0a, 0x12, 0x46, 0x72, 0x69, 0x65, 0x6e, 0x64, 0x41, + 0x70, 0x70, 0x6c, 0x79, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x71, 0x22, 0x35, 0x0a, 0x12, 0x46, + 0x72, 0x69, 0x65, 0x6e, 0x64, 0x41, 0x70, 0x70, 0x6c, 0x79, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x73, + 0x70, 0x12, 0x1f, 0x0a, 0x04, 0x6c, 0x69, 0x73, 0x74, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, + 0x0b, 0x2e, 0x46, 0x72, 0x69, 0x65, 0x6e, 0x64, 0x42, 0x61, 0x73, 0x65, 0x52, 0x04, 0x6c, 0x69, + 0x73, 0x74, 0x22, 0x2d, 0x0a, 0x0f, 0x46, 0x72, 0x69, 0x65, 0x6e, 0x64, 0x53, 0x65, 0x61, 0x72, + 0x63, 0x68, 0x52, 0x65, 0x71, 0x12, 0x1a, 0x0a, 0x08, 0x6e, 0x69, 0x63, 0x6b, 0x4e, 0x61, 0x6d, + 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6e, 0x69, 0x63, 0x6b, 0x4e, 0x61, 0x6d, + 0x65, 0x22, 0x36, 0x0a, 0x0f, 0x46, 0x72, 0x69, 0x65, 0x6e, 0x64, 0x53, 0x65, 0x61, 0x72, 0x63, + 0x68, 0x52, 0x73, 0x70, 0x12, 0x23, 0x0a, 0x06, 0x66, 0x72, 0x69, 0x65, 0x6e, 0x64, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0b, 0x2e, 0x46, 0x72, 0x69, 0x65, 0x6e, 0x64, 0x42, 0x61, 0x73, + 0x65, 0x52, 0x06, 0x66, 0x72, 0x69, 0x65, 0x6e, 0x64, 0x22, 0x14, 0x0a, 0x12, 0x46, 0x72, 0x69, + 0x65, 0x6e, 0x64, 0x42, 0x6c, 0x61, 0x63, 0x6b, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x71, 0x22, + 0x3b, 0x0a, 0x12, 0x46, 0x72, 0x69, 0x65, 0x6e, 0x64, 0x42, 0x6c, 0x61, 0x63, 0x6b, 0x4c, 0x69, + 0x73, 0x74, 0x52, 0x73, 0x70, 0x12, 0x25, 0x0a, 0x07, 0x66, 0x72, 0x69, 0x65, 0x6e, 0x64, 0x73, + 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0b, 0x2e, 0x46, 0x72, 0x69, 0x65, 0x6e, 0x64, 0x42, + 0x61, 0x73, 0x65, 0x52, 0x07, 0x66, 0x72, 0x69, 0x65, 0x6e, 0x64, 0x73, 0x22, 0x2f, 0x0a, 0x11, + 0x46, 0x72, 0x69, 0x65, 0x6e, 0x64, 0x42, 0x6c, 0x61, 0x63, 0x6b, 0x41, 0x64, 0x64, 0x52, 0x65, 0x71, 0x12, 0x1a, 0x0a, 0x08, 0x66, 0x72, 0x69, 0x65, 0x6e, 0x64, 0x49, 0x64, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x08, 0x66, 0x72, 0x69, 0x65, 0x6e, 0x64, 0x49, 0x64, 0x22, 0x42, 0x0a, - 0x0e, 0x46, 0x72, 0x69, 0x65, 0x6e, 0x64, 0x54, 0x6f, 0x74, 0x61, 0x6c, 0x52, 0x73, 0x70, 0x12, - 0x1a, 0x0a, 0x08, 0x66, 0x72, 0x69, 0x65, 0x6e, 0x64, 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x08, 0x66, 0x72, 0x69, 0x65, 0x6e, 0x64, 0x49, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x74, - 0x6f, 0x74, 0x61, 0x6c, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x74, 0x6f, 0x74, 0x61, - 0x6c, 0x42, 0x06, 0x5a, 0x04, 0x2e, 0x3b, 0x70, 0x62, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, - 0x33, + 0x01, 0x28, 0x09, 0x52, 0x08, 0x66, 0x72, 0x69, 0x65, 0x6e, 0x64, 0x49, 0x64, 0x22, 0x47, 0x0a, + 0x11, 0x46, 0x72, 0x69, 0x65, 0x6e, 0x64, 0x42, 0x6c, 0x61, 0x63, 0x6b, 0x41, 0x64, 0x64, 0x52, + 0x73, 0x70, 0x12, 0x1a, 0x0a, 0x08, 0x66, 0x72, 0x69, 0x65, 0x6e, 0x64, 0x49, 0x64, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x66, 0x72, 0x69, 0x65, 0x6e, 0x64, 0x49, 0x64, 0x12, 0x16, + 0x0a, 0x06, 0x75, 0x73, 0x65, 0x72, 0x49, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, + 0x75, 0x73, 0x65, 0x72, 0x49, 0x64, 0x22, 0x2f, 0x0a, 0x11, 0x46, 0x72, 0x69, 0x65, 0x6e, 0x64, + 0x44, 0x65, 0x6c, 0x42, 0x6c, 0x61, 0x63, 0x6b, 0x52, 0x65, 0x71, 0x12, 0x1a, 0x0a, 0x08, 0x66, + 0x72, 0x69, 0x65, 0x6e, 0x64, 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x66, + 0x72, 0x69, 0x65, 0x6e, 0x64, 0x49, 0x64, 0x22, 0x47, 0x0a, 0x11, 0x46, 0x72, 0x69, 0x65, 0x6e, + 0x64, 0x44, 0x65, 0x6c, 0x42, 0x6c, 0x61, 0x63, 0x6b, 0x52, 0x73, 0x70, 0x12, 0x1a, 0x0a, 0x08, + 0x66, 0x72, 0x69, 0x65, 0x6e, 0x64, 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, + 0x66, 0x72, 0x69, 0x65, 0x6e, 0x64, 0x49, 0x64, 0x12, 0x16, 0x0a, 0x06, 0x75, 0x73, 0x65, 0x72, + 0x49, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x75, 0x73, 0x65, 0x72, 0x49, 0x64, + 0x22, 0x2e, 0x0a, 0x10, 0x46, 0x72, 0x69, 0x65, 0x6e, 0x64, 0x52, 0x65, 0x63, 0x65, 0x69, 0x76, + 0x65, 0x52, 0x65, 0x71, 0x12, 0x1a, 0x0a, 0x08, 0x66, 0x72, 0x69, 0x65, 0x6e, 0x64, 0x49, 0x64, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x66, 0x72, 0x69, 0x65, 0x6e, 0x64, 0x49, 0x64, + 0x22, 0x46, 0x0a, 0x10, 0x46, 0x72, 0x69, 0x65, 0x6e, 0x64, 0x52, 0x65, 0x63, 0x65, 0x69, 0x76, + 0x65, 0x52, 0x73, 0x70, 0x12, 0x1a, 0x0a, 0x08, 0x66, 0x72, 0x69, 0x65, 0x6e, 0x64, 0x49, 0x64, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x66, 0x72, 0x69, 0x65, 0x6e, 0x64, 0x49, 0x64, + 0x12, 0x16, 0x0a, 0x06, 0x75, 0x73, 0x65, 0x72, 0x49, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x06, 0x75, 0x73, 0x65, 0x72, 0x49, 0x64, 0x22, 0x2b, 0x0a, 0x0d, 0x46, 0x72, 0x69, 0x65, + 0x6e, 0x64, 0x47, 0x69, 0x76, 0x65, 0x52, 0x65, 0x71, 0x12, 0x1a, 0x0a, 0x08, 0x66, 0x72, 0x69, + 0x65, 0x6e, 0x64, 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x66, 0x72, 0x69, + 0x65, 0x6e, 0x64, 0x49, 0x64, 0x22, 0x43, 0x0a, 0x0d, 0x46, 0x72, 0x69, 0x65, 0x6e, 0x64, 0x47, + 0x69, 0x76, 0x65, 0x52, 0x73, 0x70, 0x12, 0x1a, 0x0a, 0x08, 0x66, 0x72, 0x69, 0x65, 0x6e, 0x64, + 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x66, 0x72, 0x69, 0x65, 0x6e, 0x64, + 0x49, 0x64, 0x12, 0x16, 0x0a, 0x06, 0x75, 0x73, 0x65, 0x72, 0x49, 0x64, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x06, 0x75, 0x73, 0x65, 0x72, 0x49, 0x64, 0x22, 0x2c, 0x0a, 0x0e, 0x46, 0x72, + 0x69, 0x65, 0x6e, 0x64, 0x54, 0x6f, 0x74, 0x61, 0x6c, 0x52, 0x65, 0x71, 0x12, 0x1a, 0x0a, 0x08, + 0x66, 0x72, 0x69, 0x65, 0x6e, 0x64, 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, + 0x66, 0x72, 0x69, 0x65, 0x6e, 0x64, 0x49, 0x64, 0x22, 0x42, 0x0a, 0x0e, 0x46, 0x72, 0x69, 0x65, + 0x6e, 0x64, 0x54, 0x6f, 0x74, 0x61, 0x6c, 0x52, 0x73, 0x70, 0x12, 0x1a, 0x0a, 0x08, 0x66, 0x72, + 0x69, 0x65, 0x6e, 0x64, 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x66, 0x72, + 0x69, 0x65, 0x6e, 0x64, 0x49, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x42, 0x06, 0x5a, 0x04, + 0x2e, 0x3b, 0x70, 0x62, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( @@ -1226,41 +1494,46 @@ func file_friend_friend_msg_proto_rawDescGZIP() []byte { return file_friend_friend_msg_proto_rawDescData } -var file_friend_friend_msg_proto_msgTypes = make([]protoimpl.MessageInfo, 21) +var file_friend_friend_msg_proto_msgTypes = make([]protoimpl.MessageInfo, 27) var file_friend_friend_msg_proto_goTypes = []interface{}{ - (*FriendBase)(nil), // 0: FriendBase - (*FriendListReq)(nil), // 1: FriendListReq - (*FriendListRsp)(nil), // 2: FriendListRsp - (*FriendApplyReq)(nil), // 3: FriendApplyReq - (*FriendApplyRsp)(nil), // 4: FriendApplyRsp - (*FriendDelReq)(nil), // 5: FriendDelReq - (*FriendDelRsp)(nil), // 6: FriendDelRsp - (*FriendAgreeOrRefuseReq)(nil), // 7: FriendAgreeOrRefuseReq - (*FriendAgressOrRefuseRsp)(nil), // 8: FriendAgressOrRefuseRsp - (*FriendApplyListReq)(nil), // 9: FriendApplyListReq - (*FriendApplyListRsp)(nil), // 10: FriendApplyListRsp - (*FriendSearchReq)(nil), // 11: FriendSearchReq - (*FriendSearchRsp)(nil), // 12: FriendSearchRsp - (*FriendBlackListReq)(nil), // 13: FriendBlackListReq - (*FriendBlackListRsp)(nil), // 14: FriendBlackListRsp - (*FriendBlackAddReq)(nil), // 15: FriendBlackAddReq - (*FriendBlackAddRsp)(nil), // 16: FriendBlackAddRsp - (*FriendReceiveOrSendReq)(nil), // 17: FriendReceiveOrSendReq - (*FriendReceiveOrSendRsp)(nil), // 18: FriendReceiveOrSendRsp - (*FriendTotalReq)(nil), // 19: FriendTotalReq - (*FriendTotalRsp)(nil), // 20: FriendTotalRsp - (*Cache_FriendData)(nil), // 21: Cache_FriendData + (*FriendBase)(nil), // 0: FriendBase + (*FriendListReq)(nil), // 1: FriendListReq + (*FriendListRsp)(nil), // 2: FriendListRsp + (*FriendApplyReq)(nil), // 3: FriendApplyReq + (*FriendApplyRsp)(nil), // 4: FriendApplyRsp + (*FriendDelReq)(nil), // 5: FriendDelReq + (*FriendDelRsp)(nil), // 6: FriendDelRsp + (*FriendAgreeReq)(nil), // 7: FriendAgreeReq + (*FriendAgreeRsp)(nil), // 8: FriendAgreeRsp + (*FriendRefuseReq)(nil), // 9: FriendRefuseReq + (*FriendRefuseRsp)(nil), // 10: FriendRefuseRsp + (*FriendApplyListReq)(nil), // 11: FriendApplyListReq + (*FriendApplyListRsp)(nil), // 12: FriendApplyListRsp + (*FriendSearchReq)(nil), // 13: FriendSearchReq + (*FriendSearchRsp)(nil), // 14: FriendSearchRsp + (*FriendBlackListReq)(nil), // 15: FriendBlackListReq + (*FriendBlackListRsp)(nil), // 16: FriendBlackListRsp + (*FriendBlackAddReq)(nil), // 17: FriendBlackAddReq + (*FriendBlackAddRsp)(nil), // 18: FriendBlackAddRsp + (*FriendDelBlackReq)(nil), // 19: FriendDelBlackReq + (*FriendDelBlackRsp)(nil), // 20: FriendDelBlackRsp + (*FriendReceiveReq)(nil), // 21: FriendReceiveReq + (*FriendReceiveRsp)(nil), // 22: FriendReceiveRsp + (*FriendGiveReq)(nil), // 23: FriendGiveReq + (*FriendGiveRsp)(nil), // 24: FriendGiveRsp + (*FriendTotalReq)(nil), // 25: FriendTotalReq + (*FriendTotalRsp)(nil), // 26: FriendTotalRsp } var file_friend_friend_msg_proto_depIdxs = []int32{ - 21, // 0: FriendListRsp.list:type_name -> Cache_FriendData - 0, // 1: FriendApplyListRsp.list:type_name -> FriendBase - 0, // 2: FriendSearchRsp.friends:type_name -> FriendBase - 0, // 3: FriendBlackListRsp.friends:type_name -> FriendBase - 4, // [4:4] is the sub-list for method output_type - 4, // [4:4] is the sub-list for method input_type - 4, // [4:4] is the sub-list for extension type_name - 4, // [4:4] is the sub-list for extension extendee - 0, // [0:4] is the sub-list for field type_name + 0, // 0: FriendListRsp.list:type_name -> FriendBase + 0, // 1: FriendApplyListRsp.list:type_name -> FriendBase + 0, // 2: FriendSearchRsp.friend:type_name -> FriendBase + 0, // 3: FriendBlackListRsp.friends:type_name -> FriendBase + 4, // [4:4] is the sub-list for method output_type + 4, // [4:4] is the sub-list for method input_type + 4, // [4:4] is the sub-list for extension type_name + 4, // [4:4] is the sub-list for extension extendee + 0, // [0:4] is the sub-list for field type_name } func init() { file_friend_friend_msg_proto_init() } @@ -1268,7 +1541,6 @@ func file_friend_friend_msg_proto_init() { if File_friend_friend_msg_proto != nil { return } - file_friend_friend_db_proto_init() if !protoimpl.UnsafeEnabled { file_friend_friend_msg_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*FriendBase); i { @@ -1355,7 +1627,7 @@ func file_friend_friend_msg_proto_init() { } } file_friend_friend_msg_proto_msgTypes[7].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*FriendAgreeOrRefuseReq); i { + switch v := v.(*FriendAgreeReq); i { case 0: return &v.state case 1: @@ -1367,7 +1639,7 @@ func file_friend_friend_msg_proto_init() { } } file_friend_friend_msg_proto_msgTypes[8].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*FriendAgressOrRefuseRsp); i { + switch v := v.(*FriendAgreeRsp); i { case 0: return &v.state case 1: @@ -1379,7 +1651,7 @@ func file_friend_friend_msg_proto_init() { } } file_friend_friend_msg_proto_msgTypes[9].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*FriendApplyListReq); i { + switch v := v.(*FriendRefuseReq); i { case 0: return &v.state case 1: @@ -1391,7 +1663,7 @@ func file_friend_friend_msg_proto_init() { } } file_friend_friend_msg_proto_msgTypes[10].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*FriendApplyListRsp); i { + switch v := v.(*FriendRefuseRsp); i { case 0: return &v.state case 1: @@ -1403,7 +1675,7 @@ func file_friend_friend_msg_proto_init() { } } file_friend_friend_msg_proto_msgTypes[11].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*FriendSearchReq); i { + switch v := v.(*FriendApplyListReq); i { case 0: return &v.state case 1: @@ -1415,7 +1687,7 @@ func file_friend_friend_msg_proto_init() { } } file_friend_friend_msg_proto_msgTypes[12].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*FriendSearchRsp); i { + switch v := v.(*FriendApplyListRsp); i { case 0: return &v.state case 1: @@ -1427,7 +1699,7 @@ func file_friend_friend_msg_proto_init() { } } file_friend_friend_msg_proto_msgTypes[13].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*FriendBlackListReq); i { + switch v := v.(*FriendSearchReq); i { case 0: return &v.state case 1: @@ -1439,7 +1711,7 @@ func file_friend_friend_msg_proto_init() { } } file_friend_friend_msg_proto_msgTypes[14].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*FriendBlackListRsp); i { + switch v := v.(*FriendSearchRsp); i { case 0: return &v.state case 1: @@ -1451,7 +1723,7 @@ func file_friend_friend_msg_proto_init() { } } file_friend_friend_msg_proto_msgTypes[15].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*FriendBlackAddReq); i { + switch v := v.(*FriendBlackListReq); i { case 0: return &v.state case 1: @@ -1463,7 +1735,7 @@ func file_friend_friend_msg_proto_init() { } } file_friend_friend_msg_proto_msgTypes[16].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*FriendBlackAddRsp); i { + switch v := v.(*FriendBlackListRsp); i { case 0: return &v.state case 1: @@ -1475,7 +1747,7 @@ func file_friend_friend_msg_proto_init() { } } file_friend_friend_msg_proto_msgTypes[17].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*FriendReceiveOrSendReq); i { + switch v := v.(*FriendBlackAddReq); i { case 0: return &v.state case 1: @@ -1487,7 +1759,7 @@ func file_friend_friend_msg_proto_init() { } } file_friend_friend_msg_proto_msgTypes[18].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*FriendReceiveOrSendRsp); i { + switch v := v.(*FriendBlackAddRsp); i { case 0: return &v.state case 1: @@ -1499,7 +1771,7 @@ func file_friend_friend_msg_proto_init() { } } file_friend_friend_msg_proto_msgTypes[19].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*FriendTotalReq); i { + switch v := v.(*FriendDelBlackReq); i { case 0: return &v.state case 1: @@ -1511,6 +1783,78 @@ func file_friend_friend_msg_proto_init() { } } file_friend_friend_msg_proto_msgTypes[20].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*FriendDelBlackRsp); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_friend_friend_msg_proto_msgTypes[21].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*FriendReceiveReq); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_friend_friend_msg_proto_msgTypes[22].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*FriendReceiveRsp); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_friend_friend_msg_proto_msgTypes[23].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*FriendGiveReq); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_friend_friend_msg_proto_msgTypes[24].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*FriendGiveRsp); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_friend_friend_msg_proto_msgTypes[25].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*FriendTotalReq); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_friend_friend_msg_proto_msgTypes[26].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*FriendTotalRsp); i { case 0: return &v.state @@ -1529,7 +1873,7 @@ func file_friend_friend_msg_proto_init() { GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: file_friend_friend_msg_proto_rawDesc, NumEnums: 0, - NumMessages: 21, + NumMessages: 27, NumExtensions: 0, NumServices: 0, }, diff --git a/pb/pack_db.pb.go b/pb/pack_db.pb.go index c55ce43db..dce5c063f 100644 --- a/pb/pack_db.pb.go +++ b/pb/pack_db.pb.go @@ -30,7 +30,9 @@ type DB_GridData struct { IsEmpty bool `protobuf:"varint,2,opt,name=IsEmpty,proto3" json:"IsEmpty,omitempty"` //是否是空格子 ItemId int32 `protobuf:"varint,3,opt,name=ItemId,proto3" json:"ItemId,omitempty"` //存放物品的Id Amount uint32 `protobuf:"varint,4,opt,name=Amount,proto3" json:"Amount,omitempty"` //存放物品的数量 - IsNewItem bool `protobuf:"varint,5,opt,name=IsNewItem,proto3" json:"IsNewItem,omitempty"` //是否是新的 + CTime int64 `protobuf:"varint,5,opt,name=CTime,proto3" json:"CTime,omitempty"` //物品获取时间 + ETime int64 `protobuf:"varint,6,opt,name=ETime,proto3" json:"ETime,omitempty"` //物品过期时间 + IsNewItem bool `protobuf:"varint,7,opt,name=IsNewItem,proto3" json:"IsNewItem,omitempty"` //是否是新的 } func (x *DB_GridData) Reset() { @@ -93,6 +95,20 @@ func (x *DB_GridData) GetAmount() uint32 { return 0 } +func (x *DB_GridData) GetCTime() int64 { + if x != nil { + return x.CTime + } + return 0 +} + +func (x *DB_GridData) GetETime() int64 { + if x != nil { + return x.ETime + } + return 0 +} + func (x *DB_GridData) GetIsNewItem() bool { if x != nil { return x.IsNewItem @@ -160,22 +176,24 @@ var File_pack_pack_db_proto protoreflect.FileDescriptor var file_pack_pack_db_proto_rawDesc = []byte{ 0x0a, 0x12, 0x70, 0x61, 0x63, 0x6b, 0x2f, 0x70, 0x61, 0x63, 0x6b, 0x5f, 0x64, 0x62, 0x2e, 0x70, - 0x72, 0x6f, 0x74, 0x6f, 0x22, 0x8d, 0x01, 0x0a, 0x0b, 0x44, 0x42, 0x5f, 0x47, 0x72, 0x69, 0x64, + 0x72, 0x6f, 0x74, 0x6f, 0x22, 0xb9, 0x01, 0x0a, 0x0b, 0x44, 0x42, 0x5f, 0x47, 0x72, 0x69, 0x64, 0x44, 0x61, 0x74, 0x61, 0x12, 0x16, 0x0a, 0x06, 0x47, 0x72, 0x69, 0x64, 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x06, 0x47, 0x72, 0x69, 0x64, 0x49, 0x64, 0x12, 0x18, 0x0a, 0x07, 0x49, 0x73, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x49, 0x73, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x12, 0x16, 0x0a, 0x06, 0x49, 0x74, 0x65, 0x6d, 0x49, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x06, 0x49, 0x74, 0x65, 0x6d, 0x49, 0x64, 0x12, 0x16, 0x0a, 0x06, 0x41, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x06, - 0x41, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x1c, 0x0a, 0x09, 0x49, 0x73, 0x4e, 0x65, 0x77, 0x49, - 0x74, 0x65, 0x6d, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, 0x49, 0x73, 0x4e, 0x65, 0x77, - 0x49, 0x74, 0x65, 0x6d, 0x22, 0x4b, 0x0a, 0x0f, 0x44, 0x42, 0x5f, 0x55, 0x73, 0x65, 0x72, 0x50, - 0x61, 0x63, 0x6b, 0x44, 0x61, 0x74, 0x61, 0x12, 0x16, 0x0a, 0x06, 0x55, 0x73, 0x65, 0x72, 0x49, - 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x55, 0x73, 0x65, 0x72, 0x49, 0x64, 0x12, - 0x20, 0x0a, 0x04, 0x50, 0x61, 0x63, 0x6b, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0c, 0x2e, - 0x44, 0x42, 0x5f, 0x47, 0x72, 0x69, 0x64, 0x44, 0x61, 0x74, 0x61, 0x52, 0x04, 0x50, 0x61, 0x63, - 0x6b, 0x42, 0x06, 0x5a, 0x04, 0x2e, 0x3b, 0x70, 0x62, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, - 0x33, + 0x41, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x43, 0x54, 0x69, 0x6d, 0x65, 0x18, + 0x05, 0x20, 0x01, 0x28, 0x03, 0x52, 0x05, 0x43, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x14, 0x0a, 0x05, + 0x45, 0x54, 0x69, 0x6d, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x03, 0x52, 0x05, 0x45, 0x54, 0x69, + 0x6d, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x49, 0x73, 0x4e, 0x65, 0x77, 0x49, 0x74, 0x65, 0x6d, 0x18, + 0x07, 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, 0x49, 0x73, 0x4e, 0x65, 0x77, 0x49, 0x74, 0x65, 0x6d, + 0x22, 0x4b, 0x0a, 0x0f, 0x44, 0x42, 0x5f, 0x55, 0x73, 0x65, 0x72, 0x50, 0x61, 0x63, 0x6b, 0x44, + 0x61, 0x74, 0x61, 0x12, 0x16, 0x0a, 0x06, 0x55, 0x73, 0x65, 0x72, 0x49, 0x64, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x06, 0x55, 0x73, 0x65, 0x72, 0x49, 0x64, 0x12, 0x20, 0x0a, 0x04, 0x50, + 0x61, 0x63, 0x6b, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0c, 0x2e, 0x44, 0x42, 0x5f, 0x47, + 0x72, 0x69, 0x64, 0x44, 0x61, 0x74, 0x61, 0x52, 0x04, 0x50, 0x61, 0x63, 0x6b, 0x42, 0x06, 0x5a, + 0x04, 0x2e, 0x3b, 0x70, 0x62, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( diff --git a/pb/proto/comm.proto b/pb/proto/comm.proto index c32a58ad2..aee1926d4 100644 --- a/pb/proto/comm.proto +++ b/pb/proto/comm.proto @@ -1,13 +1,14 @@ syntax = "proto3"; option go_package = ".;pb"; import "errorcode.proto"; +import "google/protobuf/any.proto"; //用户消息流结构 message UserMessage { string MainType =1; string SubType = 2; ErrorCode Code = 3; - bytes Data = 4; + google.protobuf.Any data = 4; } //代理用户转发消息结构 @@ -17,7 +18,7 @@ message AgentMessage { string UserId = 3; string GatewayServiceId = 4; string Method = 5; - bytes Message = 6; + google.protobuf.Any Message = 6; } //RPC 服务固定回复结构 @@ -42,7 +43,7 @@ message AgentSendMessageReq { string MainType = 2; string SubType = 3; ErrorCode Code = 4; - bytes Data = 5; + google.protobuf.Any Data = 5; } //发送批量消息 @@ -50,14 +51,14 @@ message BatchMessageReq { repeated string UserSessionIds = 1; string MainType = 2; string SubType = 3; - bytes Data = 4; + google.protobuf.Any Data = 4; } //发送广播消息 message BroadCastMessageReq { string MainType = 1; //服务名 string SubType = 2; - bytes Data = 3; + google.protobuf.Any Data = 3; } //关闭用户代理 diff --git a/pb/proto/errorcode.proto b/pb/proto/errorcode.proto index aa9b1b11d..d095cd53d 100644 --- a/pb/proto/errorcode.proto +++ b/pb/proto/errorcode.proto @@ -32,4 +32,5 @@ enum ErrorCode { FriendSelfBlackYet = 1107;//已在自己黑名单中 FriendTargetBlackYet = 1108;//已在对方的黑名单中 FriendApplyError = 1109;//申请失败 + FriendBlackMax = 1110; //黑名单最大数量 } \ No newline at end of file diff --git a/pb/proto/friend/friend_msg.proto b/pb/proto/friend/friend_msg.proto index 67f9f70a8..924a40e3c 100644 --- a/pb/proto/friend/friend_msg.proto +++ b/pb/proto/friend/friend_msg.proto @@ -1,6 +1,5 @@ syntax = "proto3"; option go_package = ".;pb"; -import "friend/friend_db.proto"; message FriendBase { string userId = 1; //ID @@ -18,7 +17,7 @@ message FriendListReq{ } message FriendListRsp{ - repeated Cache_FriendData list = 1; + repeated FriendBase list = 1; } //申请好友 @@ -41,15 +40,20 @@ message FriendDelRsp{ string userId = 2; //用户ID } -//同意或拒绝 -message FriendAgreeOrRefuseReq{ - string friendId = 1; //被同意或拒绝的用户 - bool isAgree = 2; - +//同意 +message FriendAgreeReq{ + repeated string friendIds = 1; //被同意的用户 } -message FriendAgressOrRefuseRsp{ +message FriendAgreeRsp{ + int32 Num = 1;//操作的数量 +} + +//拒绝 +message FriendRefuseReq{ + repeated string friendIds = 1; //被拒绝的用户 +} +message FriendRefuseRsp{ int32 Num = 1;//操作的数量 - bool isAgree = 2; } @@ -63,12 +67,11 @@ message FriendApplyListRsp{ //好友搜索 message FriendSearchReq{ - string friendId = 1; - string nickName = 2; //好友昵称 + string nickName = 1; //好友昵称 } message FriendSearchRsp{ - repeated FriendBase friends = 1; + FriendBase friend = 1; } //黑名单 @@ -90,18 +93,37 @@ message FriendBlackAddRsp{ string userId = 2; } -//赠送或接收 -message FriendReceiveOrSendReq{ +//删除黑名单 +message FriendDelBlackReq{ string friendId = 1; - bool isReceive = 2; } -message FriendReceiveOrSendRsp{ +message FriendDelBlackRsp{ string friendId = 1; string userId = 2; - bool isReceive = 3; } +//接收 +message FriendReceiveReq{ + string friendId = 1; +} + +message FriendReceiveRsp{ + string friendId = 1; + string userId = 2; +} + +//赠送 +message FriendGiveReq{ + string friendId = 1; +} + +message FriendGiveRsp{ + string friendId = 1; + string userId = 2; +} + + //好友数量 message FriendTotalReq{ string friendId = 1; diff --git a/pb/proto/google/protobuf/any.proto b/pb/proto/google/protobuf/any.proto new file mode 100644 index 000000000..e2c2042fd --- /dev/null +++ b/pb/proto/google/protobuf/any.proto @@ -0,0 +1,158 @@ +// Protocol Buffers - Google's data interchange format +// Copyright 2008 Google Inc. All rights reserved. +// https://developers.google.com/protocol-buffers/ +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +syntax = "proto3"; + +package google.protobuf; + +option csharp_namespace = "Google.Protobuf.WellKnownTypes"; +option go_package = "google.golang.org/protobuf/types/known/anypb"; +option java_package = "com.google.protobuf"; +option java_outer_classname = "AnyProto"; +option java_multiple_files = true; +option objc_class_prefix = "GPB"; + +// `Any` contains an arbitrary serialized protocol buffer message along with a +// URL that describes the type of the serialized message. +// +// Protobuf library provides support to pack/unpack Any values in the form +// of utility functions or additional generated methods of the Any type. +// +// Example 1: Pack and unpack a message in C++. +// +// Foo foo = ...; +// Any any; +// any.PackFrom(foo); +// ... +// if (any.UnpackTo(&foo)) { +// ... +// } +// +// Example 2: Pack and unpack a message in Java. +// +// Foo foo = ...; +// Any any = Any.pack(foo); +// ... +// if (any.is(Foo.class)) { +// foo = any.unpack(Foo.class); +// } +// +// Example 3: Pack and unpack a message in Python. +// +// foo = Foo(...) +// any = Any() +// any.Pack(foo) +// ... +// if any.Is(Foo.DESCRIPTOR): +// any.Unpack(foo) +// ... +// +// Example 4: Pack and unpack a message in Go +// +// foo := &pb.Foo{...} +// any, err := anypb.New(foo) +// if err != nil { +// ... +// } +// ... +// foo := &pb.Foo{} +// if err := any.UnmarshalTo(foo); err != nil { +// ... +// } +// +// The pack methods provided by protobuf library will by default use +// 'type.googleapis.com/full.type.name' as the type URL and the unpack +// methods only use the fully qualified type name after the last '/' +// in the type URL, for example "foo.bar.com/x/y.z" will yield type +// name "y.z". +// +// +// JSON +// +// The JSON representation of an `Any` value uses the regular +// representation of the deserialized, embedded message, with an +// additional field `@type` which contains the type URL. Example: +// +// package google.profile; +// message Person { +// string first_name = 1; +// string last_name = 2; +// } +// +// { +// "@type": "type.googleapis.com/google.profile.Person", +// "firstName": , +// "lastName": +// } +// +// If the embedded message type is well-known and has a custom JSON +// representation, that representation will be embedded adding a field +// `value` which holds the custom JSON in addition to the `@type` +// field. Example (for message [google.protobuf.Duration][]): +// +// { +// "@type": "type.googleapis.com/google.protobuf.Duration", +// "value": "1.212s" +// } +// +message Any { + // A URL/resource name that uniquely identifies the type of the serialized + // protocol buffer message. This string must contain at least + // one "/" character. The last segment of the URL's path must represent + // the fully qualified name of the type (as in + // `path/google.protobuf.Duration`). The name should be in a canonical form + // (e.g., leading "." is not accepted). + // + // In practice, teams usually precompile into the binary all types that they + // expect it to use in the context of Any. However, for URLs which use the + // scheme `http`, `https`, or no scheme, one can optionally set up a type + // server that maps type URLs to message definitions as follows: + // + // * If no scheme is provided, `https` is assumed. + // * An HTTP GET on the URL must yield a [google.protobuf.Type][] + // value in binary format, or produce an error. + // * Applications are allowed to cache lookup results based on the + // URL, or have them precompiled into a binary to avoid any + // lookup. Therefore, binary compatibility needs to be preserved + // on changes to types. (Use versioned type names to manage + // breaking changes.) + // + // Note: this functionality is not currently available in the official + // protobuf release, and it is not used for type URLs beginning with + // type.googleapis.com. + // + // Schemes other than `http`, `https` (or the empty scheme) might be + // used with implementation specific semantics. + // + string type_url = 1; + + // Must be a valid serialized protocol buffer of the above specified type. + bytes value = 2; +} diff --git a/pb/proto/pack/pack_db.proto b/pb/proto/pack/pack_db.proto index a0e5ea47d..de63fa96a 100644 --- a/pb/proto/pack/pack_db.proto +++ b/pb/proto/pack/pack_db.proto @@ -8,7 +8,9 @@ message DB_GridData { bool IsEmpty = 2; //是否是空格子 int32 ItemId = 3; //存放物品的Id uint32 Amount = 4; //存放物品的数量 - bool IsNewItem = 5; //是否是新的 + int64 CTime = 5; //物品获取时间 + int64 ETime = 6; //物品过期时间 + bool IsNewItem = 7; //是否是新的 } //用户背包 diff --git a/pb/proto/pack/pack_msg.proto b/pb/proto/pack/pack_msg.proto index 5a255edd9..5bd1496b2 100644 --- a/pb/proto/pack/pack_msg.proto +++ b/pb/proto/pack/pack_msg.proto @@ -4,12 +4,12 @@ import "pack/pack_db.proto"; //查询用户背包请求 message GetlistReq { - int32 IType = 1; + int32 IType = 1; //道具类型 } //查询用户背包请求 回应 message GetlistResp { - repeated DB_GridData Grids = 1; + repeated DB_GridData Grids = 1; //用户背包列表 } //使用物品请求 diff --git a/pb/proto/user/user_db.proto b/pb/proto/user/user_db.proto index 8af1ddedd..e43ceefac 100644 --- a/pb/proto/user/user_db.proto +++ b/pb/proto/user/user_db.proto @@ -2,16 +2,22 @@ syntax = "proto3"; option go_package = ".;pb"; message Cache_UserData { - string SessionId = 2; - string GatewayServiceId = 3; - DB_UserData UserData = 4; + string SessionId = 2; + string GatewayServiceId = 3; + DB_UserData UserData = 4; } message DB_UserData { - string UserId = 1; //tags:{bson:"_id"}动态Id - string Account = 2; - string NiceName = 3; - int32 ServerId = 4; - int32 FriendPoint = 5;//友情点 - int32 avatar = 6;//头像 + string id = 1; // @go_tags(`bson:"_id"`) ID + string uid = 2; + string uuid = 3; //玩家唯一uuid + string binduid = 4; //玩家账号 + string name = 5; //玩家名 + int32 sid = 6; //区服id + string createip = 7; //创建账号时的ip + string lastloginip = 8; //最后一次登录时的ip + int64 ctime = 9; //玩家创号时间戳 + int64 logintime = 10; //最后一次登录时间 + int32 FriendPoint = 11; //友情点 + int32 avatar = 12; //头像 } \ No newline at end of file diff --git a/pb/user_db.pb.go b/pb/user_db.pb.go index 1ea0a64fc..6cfe560eb 100644 --- a/pb/user_db.pb.go +++ b/pb/user_db.pb.go @@ -88,12 +88,18 @@ type DB_UserData struct { sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - UserId string `protobuf:"bytes,1,opt,name=UserId,proto3" json:"UserId,omitempty"` //tags:{bson:"_id"}动态Id - Account string `protobuf:"bytes,2,opt,name=Account,proto3" json:"Account,omitempty"` - NiceName string `protobuf:"bytes,3,opt,name=NiceName,proto3" json:"NiceName,omitempty"` - ServerId int32 `protobuf:"varint,4,opt,name=ServerId,proto3" json:"ServerId,omitempty"` - FriendPoint int32 `protobuf:"varint,5,opt,name=FriendPoint,proto3" json:"FriendPoint,omitempty"` //友情点 - Avatar int32 `protobuf:"varint,6,opt,name=avatar,proto3" json:"avatar,omitempty"` //头像 + Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty" bson:"_id"` // ID + Uid string `protobuf:"bytes,2,opt,name=uid,proto3" json:"uid,omitempty"` + Uuid string `protobuf:"bytes,3,opt,name=uuid,proto3" json:"uuid,omitempty"` //玩家唯一uuid + Binduid string `protobuf:"bytes,4,opt,name=binduid,proto3" json:"binduid,omitempty"` //玩家账号 + Name string `protobuf:"bytes,5,opt,name=name,proto3" json:"name,omitempty"` //玩家名 + Sid int32 `protobuf:"varint,6,opt,name=sid,proto3" json:"sid,omitempty"` //区服id + Createip string `protobuf:"bytes,7,opt,name=createip,proto3" json:"createip,omitempty"` //创建账号时的ip + Lastloginip string `protobuf:"bytes,8,opt,name=lastloginip,proto3" json:"lastloginip,omitempty"` //最后一次登录时的ip + Ctime int64 `protobuf:"varint,9,opt,name=ctime,proto3" json:"ctime,omitempty"` //玩家创号时间戳 + Logintime int64 `protobuf:"varint,10,opt,name=logintime,proto3" json:"logintime,omitempty"` //最后一次登录时间 + FriendPoint int32 `protobuf:"varint,11,opt,name=FriendPoint,proto3" json:"FriendPoint,omitempty"` //友情点 + Avatar int32 `protobuf:"varint,12,opt,name=avatar,proto3" json:"avatar,omitempty"` //头像 } func (x *DB_UserData) Reset() { @@ -128,30 +134,72 @@ func (*DB_UserData) Descriptor() ([]byte, []int) { return file_user_user_db_proto_rawDescGZIP(), []int{1} } -func (x *DB_UserData) GetUserId() string { +func (x *DB_UserData) GetId() string { if x != nil { - return x.UserId + return x.Id } return "" } -func (x *DB_UserData) GetAccount() string { +func (x *DB_UserData) GetUid() string { if x != nil { - return x.Account + return x.Uid } return "" } -func (x *DB_UserData) GetNiceName() string { +func (x *DB_UserData) GetUuid() string { if x != nil { - return x.NiceName + return x.Uuid } return "" } -func (x *DB_UserData) GetServerId() int32 { +func (x *DB_UserData) GetBinduid() string { if x != nil { - return x.ServerId + return x.Binduid + } + return "" +} + +func (x *DB_UserData) GetName() string { + if x != nil { + return x.Name + } + return "" +} + +func (x *DB_UserData) GetSid() int32 { + if x != nil { + return x.Sid + } + return 0 +} + +func (x *DB_UserData) GetCreateip() string { + if x != nil { + return x.Createip + } + return "" +} + +func (x *DB_UserData) GetLastloginip() string { + if x != nil { + return x.Lastloginip + } + return "" +} + +func (x *DB_UserData) GetCtime() int64 { + if x != nil { + return x.Ctime + } + return 0 +} + +func (x *DB_UserData) GetLogintime() int64 { + if x != nil { + return x.Logintime } return 0 } @@ -182,19 +230,27 @@ var file_user_user_db_proto_rawDesc = []byte{ 0x10, 0x47, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x49, 0x64, 0x12, 0x28, 0x0a, 0x08, 0x55, 0x73, 0x65, 0x72, 0x44, 0x61, 0x74, 0x61, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0c, 0x2e, 0x44, 0x42, 0x5f, 0x55, 0x73, 0x65, 0x72, 0x44, 0x61, 0x74, - 0x61, 0x52, 0x08, 0x55, 0x73, 0x65, 0x72, 0x44, 0x61, 0x74, 0x61, 0x22, 0xb1, 0x01, 0x0a, 0x0b, - 0x44, 0x42, 0x5f, 0x55, 0x73, 0x65, 0x72, 0x44, 0x61, 0x74, 0x61, 0x12, 0x16, 0x0a, 0x06, 0x55, - 0x73, 0x65, 0x72, 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x55, 0x73, 0x65, - 0x72, 0x49, 0x64, 0x12, 0x18, 0x0a, 0x07, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x1a, 0x0a, - 0x08, 0x4e, 0x69, 0x63, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x08, 0x4e, 0x69, 0x63, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x53, 0x65, 0x72, - 0x76, 0x65, 0x72, 0x49, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x05, 0x52, 0x08, 0x53, 0x65, 0x72, - 0x76, 0x65, 0x72, 0x49, 0x64, 0x12, 0x20, 0x0a, 0x0b, 0x46, 0x72, 0x69, 0x65, 0x6e, 0x64, 0x50, - 0x6f, 0x69, 0x6e, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0b, 0x46, 0x72, 0x69, 0x65, - 0x6e, 0x64, 0x50, 0x6f, 0x69, 0x6e, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x61, 0x76, 0x61, 0x74, 0x61, - 0x72, 0x18, 0x06, 0x20, 0x01, 0x28, 0x05, 0x52, 0x06, 0x61, 0x76, 0x61, 0x74, 0x61, 0x72, 0x42, - 0x06, 0x5a, 0x04, 0x2e, 0x3b, 0x70, 0x62, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x61, 0x52, 0x08, 0x55, 0x73, 0x65, 0x72, 0x44, 0x61, 0x74, 0x61, 0x22, 0xaf, 0x02, 0x0a, 0x0b, + 0x44, 0x42, 0x5f, 0x55, 0x73, 0x65, 0x72, 0x44, 0x61, 0x74, 0x61, 0x12, 0x0e, 0x0a, 0x02, 0x69, + 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x10, 0x0a, 0x03, 0x75, + 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x75, 0x69, 0x64, 0x12, 0x12, 0x0a, + 0x04, 0x75, 0x75, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x75, 0x75, 0x69, + 0x64, 0x12, 0x18, 0x0a, 0x07, 0x62, 0x69, 0x6e, 0x64, 0x75, 0x69, 0x64, 0x18, 0x04, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x07, 0x62, 0x69, 0x6e, 0x64, 0x75, 0x69, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x6e, + 0x61, 0x6d, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, + 0x10, 0x0a, 0x03, 0x73, 0x69, 0x64, 0x18, 0x06, 0x20, 0x01, 0x28, 0x05, 0x52, 0x03, 0x73, 0x69, + 0x64, 0x12, 0x1a, 0x0a, 0x08, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x69, 0x70, 0x18, 0x07, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x08, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x69, 0x70, 0x12, 0x20, 0x0a, + 0x0b, 0x6c, 0x61, 0x73, 0x74, 0x6c, 0x6f, 0x67, 0x69, 0x6e, 0x69, 0x70, 0x18, 0x08, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x0b, 0x6c, 0x61, 0x73, 0x74, 0x6c, 0x6f, 0x67, 0x69, 0x6e, 0x69, 0x70, 0x12, + 0x14, 0x0a, 0x05, 0x63, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x09, 0x20, 0x01, 0x28, 0x03, 0x52, 0x05, + 0x63, 0x74, 0x69, 0x6d, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x6c, 0x6f, 0x67, 0x69, 0x6e, 0x74, 0x69, + 0x6d, 0x65, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x6c, 0x6f, 0x67, 0x69, 0x6e, 0x74, + 0x69, 0x6d, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x46, 0x72, 0x69, 0x65, 0x6e, 0x64, 0x50, 0x6f, 0x69, + 0x6e, 0x74, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0b, 0x46, 0x72, 0x69, 0x65, 0x6e, 0x64, + 0x50, 0x6f, 0x69, 0x6e, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x61, 0x76, 0x61, 0x74, 0x61, 0x72, 0x18, + 0x0c, 0x20, 0x01, 0x28, 0x05, 0x52, 0x06, 0x61, 0x76, 0x61, 0x74, 0x61, 0x72, 0x42, 0x06, 0x5a, + 0x04, 0x2e, 0x3b, 0x70, 0x62, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( diff --git a/services/comp_gateroute.go b/services/comp_gateroute.go index eee7a21b9..a44c50692 100644 --- a/services/comp_gateroute.go +++ b/services/comp_gateroute.go @@ -2,6 +2,7 @@ package services import ( "context" + "fmt" "go_dreamfactory/comm" "go_dreamfactory/pb" "reflect" @@ -12,7 +13,8 @@ import ( "go_dreamfactory/lego/core/cbase" "go_dreamfactory/lego/sys/log" - "google.golang.org/protobuf/proto" + "github.com/golang/protobuf/proto" + "github.com/golang/protobuf/ptypes" ) /* @@ -36,6 +38,7 @@ type SComp_GateRouteComp struct { cbase.ServiceCompBase service base.IRPCXService //rpc服务对象 通过这个对象可以发布服务和调用其他服务的接口 mrlock sync.RWMutex //msghandles 对象的锁 + msgcheck map[string]*msghandle //处理函数的校验接口 msghandles map[string]*msghandle //处理函数的管理对象 } @@ -56,6 +59,15 @@ func (this *SComp_GateRouteComp) Init(service core.IService, comp core.IServiceC func (this *SComp_GateRouteComp) Start() (err error) { this.service.RegisterFunctionName(string(comm.Rpc_GatewayRoute), this.ReceiveMsg) //注册网关路由接收接口 err = this.ServiceCompBase.Start() + for k, v := range this.msghandles { + if v1, ok := this.msgcheck[k]; !ok { + err = fmt.Errorf("注册用户消息处理函数:%s 没有实现参数校验接口", k) + return + } else if v.msgType != v1.msgType { + err = fmt.Errorf("注册用户消息处理函数:%s 实现参数校验接口不一致 请检查代码!", k) + return + } + } return } @@ -78,19 +90,40 @@ func (this *SComp_GateRouteComp) RegisterRoute(methodName string, comp reflect.V this.mrlock.Unlock() } +//业务模块注册用户消息处理路由 +func (this *SComp_GateRouteComp) RegisterRouteCheck(methodName string, comp reflect.Value, msg reflect.Type, fn reflect.Method) { + log.Debugf("注册用户路由校验[%s]", methodName) + this.mrlock.RLock() + _, ok := this.msgcheck[methodName] + this.mrlock.RUnlock() + if ok { + log.Errorf("重复 注册用户路由校验[%s]", methodName) + return + } + this.mrlock.Lock() + this.msgcheck[methodName] = &msghandle{ + rcvr: comp, + msgType: msg, + fn: fn, + } + this.mrlock.Unlock() +} + //Rpc_GatewayRoute服务接口的接收函数 func (this *SComp_GateRouteComp) ReceiveMsg(ctx context.Context, args *pb.AgentMessage, reply *pb.RPCMessageReply) error { log.Debugf("SComp_GateRouteComp ReceiveMsg agent:%s uId:%s MessageDistribution msg:%s", args.UserSessionId, args.UserId, args.Method) this.mrlock.RLock() msghandle, ok := this.msghandles[args.Method] + msgcheck := this.msghandles[args.Method] this.mrlock.RUnlock() if ok { session := comm.NewUserSession(this.service, args.Ip, args.UserSessionId, args.GatewayServiceId, args.UserId) msg := reflect.New(msghandle.msgType.Elem()).Interface() - if err := proto.Unmarshal(args.Message, msg.(proto.Message)); err != nil { + if err := ptypes.UnmarshalAny(args.Message, msg.(proto.Message)); err != nil { log.Errorf("UserMessage:%s Unmarshal err:%v", args.Method, err) return err } + msghandle.fn.Func.Call([]reflect.Value{msgcheck.rcvr, reflect.ValueOf(ctx), reflect.ValueOf(session), reflect.ValueOf(msg)}) msghandle.fn.Func.Call([]reflect.Value{msghandle.rcvr, reflect.ValueOf(ctx), reflect.ValueOf(session), reflect.ValueOf(msg)}) } else { reply.Code = pb.ErrorCode_ReqParameterError diff --git a/sys/cache/friend.go b/sys/cache/friend.go index c21d472bd..628096486 100644 --- a/sys/cache/friend.go +++ b/sys/cache/friend.go @@ -17,14 +17,15 @@ func getRdsFriendKey(userId string) string { } type IFriend interface { - Friend_Apply(data *pb.Cache_FriendData) (err error) + Friend_Update(data *pb.Cache_FriendData) (err error) Friend_Total(userId string) int32 Friend_Get(userId string) (*pb.Cache_FriendData, error) } -//好友申请 -func (this *Cache) Friend_Apply(data *pb.Cache_FriendData) (err error) { - if err = db.Defsys.Friend_Apply(data); err == nil { +//更新 +func (this *Cache) Friend_Update(data *pb.Cache_FriendData) (err error) { + if err = db.Defsys.Friend_SaveOrUpdate(data); err == nil { + //更新缓存 err = this.redis.Set(getRdsFriendKey(data.UserId), data, 0) } return @@ -47,7 +48,7 @@ func (this *Cache) Friend_Get(userId string) (*pb.Cache_FriendData, error) { if err != nil { if err.Error() == string(redis.RedisNil) { d = &pb.Cache_FriendData{UserId: userId} - err = this.Friend_Apply(d) + err = this.Friend_Update(d) if err != nil { return d, nil } diff --git a/sys/cache/friend_test.go b/sys/cache/friend_test.go index 59e673dd9..cdf51022b 100644 --- a/sys/cache/friend_test.go +++ b/sys/cache/friend_test.go @@ -10,7 +10,7 @@ import ( ) func TestFriendApply(t *testing.T) { - err := cache.Defsys.Friend_Apply(&pb.Cache_FriendData{ + err := cache.Defsys.Friend_Update(&pb.Cache_FriendData{ UserId: "629f159310d6970846f7ef26", FriendIds: []string{"629f147e3d276120561bfa18"}, ApplyIds: []string{"629eb3f4132dc4bb26139659"}, diff --git a/sys/cache/pack.go b/sys/cache/pack.go index 4c6c04177..b7a4e0a94 100644 --- a/sys/cache/pack.go +++ b/sys/cache/pack.go @@ -15,8 +15,9 @@ const ( //Redis ) const ( - GridCapMaxNum = 99 //单个格子的最大容量 - GridMaxNUm = 200 //背包格子数量上限 + GridCapMaxNum = 99 //单个格子的最大容量 + GridMaxNUm = 200 //背包格子数量上限 + Pack_Expiration = -1 //背包缓存数据过期时间 ) var ( @@ -29,12 +30,16 @@ var ( type IPack interface { ///查询用户背包 Pack_QueryUserPack(uId string) (pack *pb.DB_UserPackData, err error) + //查询用户背包物品数量 + Pack_QueryUserPackItemAmount(uId string, itemid int32) (amount uint32) ///添加物品到背包 (可以加物品和减物品) Pack_AddItemToUserPack(uId string, itemId int32, addnum int32) (err error) ///添加多个物品到背包 (可以加物品和减物品) Pack_AddItemsToUserPack(uId string, items map[int32]int32) (err error) //修改用户背包格子的标识 Pack_ModifyPackGridIsNewItem(uId string, grids []int32) (err error) + //更新用户背包格子信息 + Pack_UpdateGridToUserPack(uId string, grids ...*pb.DB_GridData) (err error) } ///查询用户背包数据 @@ -46,7 +51,7 @@ func (this *Cache) Pack_QueryUserPack(uId string) (pack *pb.DB_UserPackData, err return } else if err == redis.RedisNil { if pack, err = db.Defsys.Pack_QueryUserPack(uId); err == nil { - this.redis.Set(fmt.Sprintf(Redis_PackCache, uId), pack, -1) + this.redis.Set(fmt.Sprintf(Redis_PackCache, uId), pack, Pack_Expiration) } else if err == mgo.MongodbNil { err = nil } @@ -54,6 +59,23 @@ func (this *Cache) Pack_QueryUserPack(uId string) (pack *pb.DB_UserPackData, err return } +//查询用户背包物品数量 +func (this *Cache) Pack_QueryUserPackItemAmount(uId string, itemid int32) (amount uint32) { + var ( + pack *pb.DB_UserPackData + err error + ) + if pack, err = this.Pack_QueryUserPack(uId); err != nil { + return + } + for _, v := range pack.Pack { + if !v.IsEmpty && v.ItemId == itemid { + amount += v.Amount + } + } + return +} + ///添加或则减少物品到用户背包 func (this *Cache) Pack_AddItemToUserPack(uId string, itemId int32, addnum int32) (err error) { var ( @@ -76,7 +98,7 @@ func (this *Cache) Pack_AddItemToUserPack(uId string, itemId int32, addnum int32 return } if pack, err = db.Defsys.Pack_UpdateGridToUserPack(uId, modifys...); err == nil { - this.redis.Set(fmt.Sprintf(Redis_PackCache, uId), pack, -1) + this.redis.Set(fmt.Sprintf(Redis_PackCache, uId), pack, Pack_Expiration) } return } @@ -116,7 +138,7 @@ func (this *Cache) Pack_AddItemsToUserPack(uId string, items map[int32]int32) (e } if pack, err = db.Defsys.Pack_UpdateGridToUserPack(uId, modifys...); err == nil { - this.redis.Set(fmt.Sprintf(Redis_PackCache, uId), pack, -1) + this.redis.Set(fmt.Sprintf(Redis_PackCache, uId), pack, Pack_Expiration) } return } @@ -159,7 +181,7 @@ func (this *Cache) Pack_AddItemToUserPackByGrid(uId string, gridid int32, itemId return } else { if pack, err = db.Defsys.Pack_UpdateGridToUserPack(uId, grid); err == nil { - this.redis.Set(fmt.Sprintf(Redis_PackCache, uId), pack, -1) + this.redis.Set(fmt.Sprintf(Redis_PackCache, uId), pack, Pack_Expiration) } } } @@ -172,7 +194,18 @@ func (this *Cache) Pack_ModifyPackGridIsNewItem(uId string, grids []int32) (err pack *pb.DB_UserPackData ) if pack, err = db.Defsys.Pack_ModifyPackGridIsNewItem(uId, grids); err == nil { - err = this.redis.Set(fmt.Sprintf(Redis_PackCache, uId), pack, -1) + err = this.redis.Set(fmt.Sprintf(Redis_PackCache, uId), pack, Pack_Expiration) + } + return +} + +///修改目标格子的新获取标识 +func (this *Cache) Pack_UpdateGridToUserPack(uId string, grids ...*pb.DB_GridData) (err error) { + var ( + pack *pb.DB_UserPackData + ) + if pack, err = db.Defsys.Pack_UpdateGridToUserPack(uId, grids...); err == nil { + err = this.redis.Set(fmt.Sprintf(Redis_PackCache, uId), pack, Pack_Expiration) } return } diff --git a/sys/cache/user.go b/sys/cache/user.go index 38e5e0c81..7dc2e9e6f 100644 --- a/sys/cache/user.go +++ b/sys/cache/user.go @@ -3,6 +3,7 @@ package cache import ( "fmt" "go_dreamfactory/pb" + "go_dreamfactory/sys/db" "go_dreamfactory/lego/sys/log" ) @@ -17,7 +18,10 @@ type IUser interface { } func (this *Cache) Update(data *pb.Cache_UserData) (err error) { - err = this.redis.Set(fmt.Sprintf(Redis_UserCache, data.UserData.UserId), data, -1) + err = db.Defsys.User_Update(data.UserData) + if err == nil { + err = this.redis.Set(fmt.Sprintf(Redis_UserCache, data.UserData.Uid), data, -1) + } return } diff --git a/sys/cache/user_test.go b/sys/cache/user_test.go index b5454eb9f..17ccf30e0 100644 --- a/sys/cache/user_test.go +++ b/sys/cache/user_test.go @@ -15,8 +15,8 @@ func TestUpdateUser(t *testing.T) { SessionId: "1", GatewayServiceId: "work", UserData: &pb.DB_UserData{ - UserId: primitive.NewObjectID().Hex(), - Account: "aaa", + Uid: primitive.NewObjectID().Hex(), + Name: "aaa", }, } err := cache.Defsys.Update(user) diff --git a/sys/db/friend.go b/sys/db/friend.go index ba0924330..48336a8b9 100644 --- a/sys/db/friend.go +++ b/sys/db/friend.go @@ -2,6 +2,7 @@ package db import ( "go_dreamfactory/lego/core" + "go_dreamfactory/lego/sys/log" "go_dreamfactory/pb" "go.mongodb.org/mongo-driver/bson" @@ -14,11 +15,12 @@ const ( ) type IFriend interface { - Friend_Apply(data *pb.Cache_FriendData) (err error) + Friend_SaveOrUpdate(data *pb.Cache_FriendData) (err error) + Frined_FindCond(nickName string) *pb.DB_UserData } -//好友申请 -func (this *DB) Friend_Apply(data *pb.Cache_FriendData) (err error) { +//好友 +func (this *DB) Friend_SaveOrUpdate(data *pb.Cache_FriendData) (err error) { err = this.mgo.FindOneAndUpdate(DB_FriendTable, bson.M{"_id": data.UserId}, bson.M{"$set": bson.M{ @@ -32,3 +34,15 @@ func (this *DB) Friend_Apply(data *pb.Cache_FriendData) (err error) { } return } + +func (this *DB) Frined_FindCond(nickName string) *pb.DB_UserData { + var user *pb.DB_UserData + err := this.mgo.FindOne(DB_UserTable, bson.M{ + "nicename": nickName, + }).Decode(&user) + if err != nil { + log.Errorf("findCond err:%v", err) + return nil + } + return user +} diff --git a/sys/db/friend_test.go b/sys/db/friend_test.go index b86c09c46..9d8b10f0c 100644 --- a/sys/db/friend_test.go +++ b/sys/db/friend_test.go @@ -1,6 +1,7 @@ package db import ( + "fmt" "go_dreamfactory/pb" "testing" @@ -8,7 +9,7 @@ import ( ) func TestFriendAdd(t *testing.T) { - err := db.Friend_Apply(&pb.Cache_FriendData{ + err := db.Friend_SaveOrUpdate(&pb.Cache_FriendData{ UserId: "629f159310d6970846f7ef26", FriendIds: []string{ "629f147e3d276120561bfa18", @@ -17,3 +18,10 @@ func TestFriendAdd(t *testing.T) { require.Nil(t, err, nil) } + +func TestFriendFindCond(t *testing.T) { + user := db.Frined_FindCond("乐谷5") + require.NotNil(t, user, nil) + + fmt.Printf("%v", user) +} diff --git a/sys/db/user.go b/sys/db/user.go index 3f897dae0..9250b704b 100644 --- a/sys/db/user.go +++ b/sys/db/user.go @@ -1,10 +1,13 @@ package db import ( + "fmt" "go_dreamfactory/pb" + "time" "go_dreamfactory/lego/core" + uuid "github.com/satori/go.uuid" "go.mongodb.org/mongo-driver/bson" "go.mongodb.org/mongo-driver/bson/primitive" "go.mongodb.org/mongo-driver/mongo/options" @@ -24,8 +27,8 @@ type IUser interface { // func (this *DB) User_FindByAccount(user *pb.DB_UserData) (*pb.DB_UserData, error) { filter := bson.M{ - "serverid": user.ServerId, - "account": user.Account, + "sid": user.Sid, + "binduid": user.Binduid, } sr := this.mgo.FindOne(DB_UserTable, filter) var nd *pb.DB_UserData @@ -35,7 +38,7 @@ func (this *DB) User_FindByAccount(user *pb.DB_UserData) (*pb.DB_UserData, error func (this *DB) User_FindById(id string) (*pb.DB_UserData, error) { filter := bson.M{ - "_id": id, + "userid": id, } sr := this.mgo.FindOne(DB_UserTable, filter) user := &pb.DB_UserData{} @@ -44,7 +47,11 @@ func (this *DB) User_FindById(id string) (*pb.DB_UserData, error) { } func (this *DB) User_Create(user *pb.DB_UserData) (err error) { - user.UserId = primitive.NewObjectID().Hex() + _id := primitive.NewObjectID().Hex() + user.Id = _id + user.Uid = fmt.Sprintf("%d_%s", user.Sid, _id) + user.Uuid = uuid.NewV4().String() + user.Ctime = time.Now().Unix() _, err = this.mgo.InsertOne(DB_UserTable, user) return err } @@ -53,11 +60,11 @@ func (this *DB) User_Create(user *pb.DB_UserData) (err error) { func (this *DB) User_Update(data *pb.DB_UserData) (err error) { err = this.mgo.FindOneAndUpdate( DB_UserTable, - bson.M{"_id": data.UserId}, + bson.M{"uid": data.Uid}, bson.M{"$set": bson.M{ - "niceName": data.NiceName, + "name": data.Name, }}, - options.FindOneAndUpdate().SetUpsert(false).SetReturnDocument(options.After), - ).Decode(data) + options.FindOneAndUpdate().SetUpsert(true), + ).Err() return err } diff --git a/sys/db/user_test.go b/sys/db/user_test.go index 3d26c2b7b..2b07fea2e 100644 --- a/sys/db/user_test.go +++ b/sys/db/user_test.go @@ -11,9 +11,9 @@ import ( func TestCreate(t *testing.T) { user := &pb.DB_UserData{ - Account: "legu3", - NiceName: "乐谷3", - ServerId: 1, + Binduid: "legu131", + Name: "legu131", + Sid: 1, } err := db.User_Create(user) @@ -23,18 +23,18 @@ func TestCreate(t *testing.T) { func TestFindOne(t *testing.T) { user, err := db.User_FindById("629eb3f4132dc4bb26139659") require.Nil(t, err) - assert.Equal(t, "legu3", user.Account) + assert.Equal(t, "legu3", user.Binduid) // user.ServerId = 2 user2, err := db.User_FindByAccount(user) require.Nil(t, err) - assert.Equal(t, "legu3", user2.Account) - assert.Equal(t, int32(1), user2.ServerId) + assert.Equal(t, "legu3", user2.Binduid) + assert.Equal(t, int32(1), user2.Sid) } func TestUpdate(t *testing.T) { user := &pb.DB_UserData{ - UserId: primitive.NewObjectID().Hex(), + Uuid: primitive.NewObjectID().Hex(), } err := db.User_Update(user) require.Nil(t, err) diff --git a/utils/strings.go b/utils/strings.go index 82dcea71e..c153704d4 100644 --- a/utils/strings.go +++ b/utils/strings.go @@ -16,12 +16,21 @@ func ParseP(p string) (string, string, bool) { return s[0], s[1], true } - func Find(slice []string, val string) (int, bool) { - for i, item := range slice { - if item == val { - return i, true - } - } - return -1, false -} \ No newline at end of file + for i, item := range slice { + if item == val { + return i, true + } + } + return -1, false +} + +func DeleteString(list []string, ele string) []string { + result := make([]string, 0) + for _, v := range list { + if v != ele { + result = append(result, v) + } + } + return result +}