package roomrank import ( "apigame/service-common/svconst" "apigame/service-common/svmysql" "apigame/util/util-lx/lxalilog" "apigame/util/util-lx/lxtime" "encoding/json" "fmt" "github.com/samber/lo" ) // Room 房间排行持久数据 type Room struct { Id int64 `gorm:"column:id;primaryKey;comment:房间唯一ID"` ActivityId int64 `gorm:"comment:活动ID"` ConfigId int `gorm:"comment:房间配置ID"` Details *RoomDetails `gorm:"-"` // 详情 DetailsText string `gorm:"comment:详情封装"` Closed bool `gorm:"comment:房间已关闭"` CreateTime int64 `gorm:"comment:创建时间戳"` UpdateTime int64 `gorm:"comment:修改时间戳"` } func (d *Room) MysqlInfo(suffix string) *svmysql.MysqlInfo { tableName := svconst.MYSQL_TABLE_S_ROOMRANK_ROOM return &svmysql.MysqlInfo{ DbMysql: svconst.DbCommon, TableName: fmt.Sprintf("%s_%s_%d", tableName, suffix, d.ActivityId), } } // RoomPlayer 房间玩家 type RoomPlayer struct { Uid int64 // 玩家唯一ID Score int64 // 玩家排行分数 JoinTime int64 // 加入时间 UserType int // 用户类型 RobotConfigId int // 0=玩家 } func NewRoomRobot(robotConfigId int, userType int) *RoomPlayer { d := &RoomPlayer{ Uid: 0, Score: 0, JoinTime: lxtime.NowUninx(), UserType: userType, RobotConfigId: robotConfigId, } return d } func NewRoomPlayer(player *Player) *RoomPlayer { d := &RoomPlayer{ Uid: player.Uid, Score: 0, JoinTime: lxtime.NowUninx(), UserType: player.UserType, RobotConfigId: 0, } return d } // RoomDetails 详情 type RoomDetails struct { Players []*RoomPlayer // 房间玩家列表 } // Encode 打包数据 func (d *Room) Encode() { details, err := json.Marshal(d.Details) if err != nil { lxalilog.Errors(err, "Player Encode Error", d.Id, d.ActivityId) return } d.DetailsText = string(details) } // Decode 分包数据 func (d *Room) Decode() { d.Details = &RoomDetails{ Players: make([]*RoomPlayer, 0), } err := json.Unmarshal([]byte(d.DetailsText), d.Details) if err != nil { lxalilog.Errors(err, "Player Decode Error", d.Id, d.ActivityId) return } } // FindPlayer 找到玩家排名 -1=没找到 func (d *Room) FindPlayer(playerUid int64) int { count := len(d.Details.Players) if count > 0 { for i := 0; i < count; i++ { p := d.Details.Players[i] if p.Uid == playerUid { return i } } } return -1 } func (d *Room) GetPlayerTypeCount(userType int) int { return lo.CountBy(d.Details.Players, func(p *RoomPlayer) bool { return p.UserType == userType }) }