Merge branch 'dev' of http://git.legu.cc/liwei_3d/go_dreamfactory into meixiongfeng
This commit is contained in:
commit
0416ce5b17
@ -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)
|
||||
}
|
||||
|
@ -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)
|
||||
|
@ -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)
|
||||
}
|
||||
|
@ -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)
|
||||
|
16
comm/core.go
16
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
|
||||
|
@ -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)
|
||||
}
|
||||
|
@ -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
|
||||
}
|
||||
|
4
go.mod
4
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
|
||||
|
3
go.sum
3
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=
|
||||
|
@ -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)
|
||||
}
|
||||
|
@ -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)
|
||||
}
|
||||
|
@ -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)
|
||||
}
|
@ -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)
|
||||
}
|
||||
|
@ -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
|
||||
}
|
||||
|
@ -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
|
||||
}
|
||||
|
@ -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...)
|
||||
}
|
||||
}
|
||||
|
178
lego/sys/rpcx/rpcx_test.go
Normal file
178
lego/sys/rpcx/rpcx_test.go
Normal file
@ -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
|
||||
}
|
77
lego/sys/rpcx/selector.go
Normal file
77
lego/sys/rpcx/selector.go
Normal file
@ -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
|
||||
}
|
@ -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
|
||||
// }
|
||||
|
@ -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
|
||||
}
|
||||
|
@ -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()
|
||||
|
@ -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,
|
||||
|
@ -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,
|
||||
|
@ -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
|
||||
}
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
|
288
modules/pack/cache_comp.go
Normal file
288
modules/pack/cache_comp.go
Normal file
@ -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
|
||||
}
|
@ -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)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -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!") //格子容量达到上限
|
||||
)
|
||||
|
73
modules/pack/db_comp.go
Normal file
73
modules/pack/db_comp.go
Normal file
@ -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
|
||||
}
|
@ -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
|
||||
}
|
||||
|
@ -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{
|
||||
|
@ -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
|
||||
|
@ -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)
|
||||
|
1
pb.bat
1
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
|
||||
|
206
pb/comm.pb.go
206
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() }
|
||||
|
@ -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 (
|
||||
|
File diff suppressed because it is too large
Load Diff
@ -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 (
|
||||
|
@ -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;
|
||||
}
|
||||
|
||||
//关闭用户代理
|
||||
|
@ -32,4 +32,5 @@ enum ErrorCode {
|
||||
FriendSelfBlackYet = 1107;//已在自己黑名单中
|
||||
FriendTargetBlackYet = 1108;//已在对方的黑名单中
|
||||
FriendApplyError = 1109;//申请失败
|
||||
FriendBlackMax = 1110; //黑名单最大数量
|
||||
}
|
@ -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;
|
||||
|
158
pb/proto/google/protobuf/any.proto
Normal file
158
pb/proto/google/protobuf/any.proto
Normal file
@ -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": <string>,
|
||||
// "lastName": <string>
|
||||
// }
|
||||
//
|
||||
// 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;
|
||||
}
|
@ -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; //是否是新的
|
||||
}
|
||||
|
||||
//用户背包
|
||||
|
@ -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; //用户背包列表
|
||||
}
|
||||
|
||||
//使用物品请求
|
||||
|
@ -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; //头像
|
||||
}
|
110
pb/user_db.pb.go
110
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 (
|
||||
|
@ -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
|
||||
|
11
sys/cache/friend.go
vendored
11
sys/cache/friend.go
vendored
@ -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
|
||||
}
|
||||
|
2
sys/cache/friend_test.go
vendored
2
sys/cache/friend_test.go
vendored
@ -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"},
|
||||
|
47
sys/cache/pack.go
vendored
47
sys/cache/pack.go
vendored
@ -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
|
||||
}
|
||||
|
6
sys/cache/user.go
vendored
6
sys/cache/user.go
vendored
@ -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
|
||||
}
|
||||
|
||||
|
4
sys/cache/user_test.go
vendored
4
sys/cache/user_test.go
vendored
@ -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)
|
||||
|
@ -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
|
||||
}
|
||||
|
@ -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)
|
||||
}
|
||||
|
@ -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
|
||||
}
|
||||
|
@ -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)
|
||||
|
@ -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
|
||||
}
|
||||
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
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user