package comm import ( "context" "crypto/rand" "fmt" "go_dreamfactory/lego/base" "go_dreamfactory/lego/core" "go_dreamfactory/lego/utils/container/id" "go_dreamfactory/pb" cfg "go_dreamfactory/sys/configure/structs" "math/big" "reflect" "strings" "google.golang.org/protobuf/proto" "google.golang.org/protobuf/types/known/anypb" ) // 服务网关组件接口定义 type ISC_GateRouteComp interface { core.IServiceComp ReceiveMsg(ctx context.Context, args *pb.AgentMessage, reply *pb.RPCMessageReply) error RegisterRoute(methodName string, comp reflect.Value, msg reflect.Type, handle reflect.Method) GetUserSession(udata *pb.CacheUser) (session IUserSession) PutUserSession(session IUserSession) } // 服务匹配组件 type ISC_MatchComp interface { core.IServiceComp RegisterMatchPool(poolName string, handle func(agrs map[string]interface{}) (err error)) } // 游戏类资源类型 const ( AttrType = "attr" //用户属性资源 例如货币 经验 之类的 PerType = "per" //用户皮肤,动作,背景 相关资源 ItemType = "item" //道具物品资源 HeroType = "hero" //卡片资源 例如英雄卡,检验卡 EquipmentType = "equi" //武器资源 VipType = "vip" //vip AtlasType = "atlas" //铁匠铺资源 PandaType = "panda" //熊猫武馆资源 MountsType = "mts" //捕羊大赛坐骑资源 TitleType = "title" //称号资源 XxlType = "xxl" //三消卡片资源 XxlSkill = "xxlskill" //三消技能资源 ExclusiveType = "exw" //专属武器 ) type Autogenerated struct { ID string `json:"ID,omitempty" bson:"_id"` UID string `json:"uid"` Act string `json:"act"` // insert update delete D []interface{} } // Api Check 错误返回结构 type ErrorCode struct { Code pb.ErrorCode Data interface{} } type IService interface { base.IRPCXService GetUserSession() (session IUserSession) PutUserSession(session IUserSession) } // 用户会话 type IUserSession interface { SetSession(ip, sessionId, stag, sid, uid string, group int32) GetSessionId() string GetUserId() string GetGroup() int32 GetIP() string GetServiecTag() string GetGatewayServiceId() string IsLogin() bool IsOnline() bool Bind(uid string, wokerId string) (err error) UnBind() (err error) SendMsg(mainType, subType string, msg proto.Message) (err error) Polls() []*pb.UserMessage Push() (err error) //警告 api传递过来的会话禁用此接口 SyncPush() (err error) //警告 api传递过来的会话禁用此接口 同步 Close() (err error) Reset() Clone() (session IUserSession) //克隆 SetMate(name string, value interface{}) GetMate(name string) (ok bool, value interface{}) ToString() string } // 对protobuf格式的数据进行反序列化 func ProtoUnmarshal(msg *pb.UserMessage, req proto.Message) (ok bool) { err := msg.Data.UnmarshalTo(req) if err != nil { fmt.Printf("UnmarshalTo %s.%s %v\n", msg.MainType, msg.SubType, err) return } return true } // 对protobuf格式的数据进行序列化 func ProtoMarshal(rsp proto.Message, msg *pb.UserMessage) (ok bool) { any, err := anypb.New(rsp) if err != nil { fmt.Printf("Any New %s.%s %v", msg.MainType, msg.SubType, err) return } msg.Data = any return true } //参数 权重数组 返回值 数组下标 func GetRandW(sz []int32) int32 { if len(sz) > 0 { var _totalW int64 // 总权重 var _tmpW int64 // 临时权重 for _, v := range sz { _totalW += int64(v) } // 随机权重 n, _ := rand.Int(rand.Reader, big.NewInt(_totalW)) for i, v := range sz { _tmpW += int64(v) if n.Int64() < _tmpW { return int32(i) } } } return 0 } // / 参数 权重数组 返回值 数组下标 func GetRandWs(sz []int32, num int32) []int { results := make([]int, 0) if len(sz) > 0 { var _totalW int64 // 总权重 var _tmpW int64 // 临时权重 for _, v := range sz { _totalW += int64(v) } if int(num) > len(sz) { num = int32(len(sz)) } for i := 0; i < int(num); i++ { // 随机权重 _tmpW = 0 n, _ := rand.Int(rand.Reader, big.NewInt(_totalW)) for i, v := range sz { jump := false for _, v1 := range results { if i == v1 { jump = true break } } if !jump { _tmpW += int64(v) if n.Int64() < _tmpW { results = append(results, i) _totalW -= int64(v) break } } } } } return results } func RandShuffle(leng int) []int { if leng < 0 { return make([]int, 0) } slist := make([]int, leng) for i, _ := range slist { slist[i] = i } for i := leng - 1; i > 0; i-- { j, _ := rand.Int(rand.Reader, big.NewInt(int64(i+1))) slist[i], slist[j.Int64()] = slist[j.Int64()], slist[i] } return slist } func GetRandNum(min, max int32) int32 { if max < min { return 0 } if max == min { return min } n, _ := rand.Int(rand.Reader, big.NewInt(int64(max-min+1))) //+1 是因为 rand方法范围是[0, max) return int32(n.Int64()) + min } // /通过uid获取用户所在区服 func UidToSTag(uid string) (stag string, err error) { s := strings.SplitN(uid, "_", 2) if len(s) < 2 { err = fmt.Errorf("uid 格式异常:%v", uid) return } stag = s[0] return } func GetUserBaseInfo(user *pb.DBUser) *pb.BaseUserInfo { info := &pb.BaseUserInfo{ Uid: user.Uid, Sid: user.Sid, Name: user.Name, Gender: user.Gender, Skin: user.CurSkin, Aframe: user.Curaframe, Title: user.Curtitle, Lv: user.Lv, Group: user.Group, } return info } func GetRobotBaseInfo(robot *cfg.GameRobotData) *pb.BaseUserInfo { info := &pb.BaseUserInfo{ Uid: fmt.Sprintf("ai_%s", id.NewXId()), Name: robot.Name, Gender: robot.Sex, Skin: robot.Showid, Lv: robot.Lvshow, } return info }