推荐优化

This commit is contained in:
hahwu 2026-02-09 10:41:19 +08:00
parent 30f32e1da0
commit 4e832972fa
4 changed files with 40 additions and 86 deletions

View File

@ -432,3 +432,13 @@ func SearchPlayer(key string) ([]*ResPlayerBaseInfo, error) {
err := SqlDb.Select(data, sql, "%"+key+"%") err := SqlDb.Select(data, sql, "%"+key+"%")
return *data, err return *data, err
} }
func GetCommendPlayerFromDb(uid, login int64, level int) ([]int, error) {
sqlStr := "SELECT dwUin FROM t_player_baseinfo WHERE dwUin != ? AND logout_time > ? AND level >= ? ORDER BY logout_time DESC LIMIT 1000"
var res []int
if err := SqlDb.Select(&res, sqlStr, uid, login, level); err != nil {
log.Debug("table: %s, sql :%s, exec failed, err:%v\n", "PlayerBaseInfo", sqlStr, err)
return nil, err
}
return res, nil
}

View File

@ -68,7 +68,7 @@ func (p *Player) GetVisitorPlayer() int {
if ps == nil { if ps == nil {
continue continue
} }
if GoUtil.Now()-ps.Loginout > 86400 { // 24小时内登录过 if Now-ps.Loginout > 86400 { // 24小时内登录过
continue continue
} }
if ps.Loginout > recentLoginTime { if ps.Loginout > recentLoginTime {
@ -79,17 +79,20 @@ func (p *Player) GetVisitorPlayer() int {
if recentFriendUid != 0 { if recentFriendUid != 0 {
return recentFriendUid return recentFriendUid
} }
PlayerList3 := G_GameLogicPtr.RankMgr.getAllRank(RANK_TYPE_USER) uids, err := db.GetCommendPlayerFromDb(p.M_DwUin, GoUtil.Now()-86400, 15)
if err != nil {
return 0
}
PlayerList4 := make([]int, 0) PlayerList4 := make([]int, 0)
for _, v := range PlayerList3 { for _, Uid := range uids {
if v.Uid == int(p.M_DwUin) { if Uid == int(p.M_DwUin) {
continue continue
} }
PlayerSimpleData := G_GameLogicPtr.GetSimplePlayerByUid(v.Uid) PlayerSimpleData := G_GameLogicPtr.GetSimplePlayerByUid(Uid)
if PlayerSimpleData.Level < 15 { if PlayerSimpleData == nil {
continue continue
} }
PlayerList4 = append(PlayerList4, v.Uid) PlayerList4 = append(PlayerList4, Uid)
} }
L := GoUtil.RandSliceNum(PlayerList4, 1) L := GoUtil.RandSliceNum(PlayerList4, 1)
if len(L) == 0 { if len(L) == 0 {
@ -99,34 +102,34 @@ func (p *Player) GetVisitorPlayer() int {
} }
func GetRecommendPlayer(p *Player, Num int) []int { func GetRecommendPlayer(p *Player, Num int) []int {
PlayerList := G_GameLogicPtr.RankMgr.getAllRank(RANK_TYPE_USER) uids, err := db.GetCommendPlayerFromDb(p.M_DwUin, GoUtil.Now()-259200, 4)
if err != nil {
return nil
}
PlayerList1 := make([]int, 0) PlayerList1 := make([]int, 0)
FriendMod := p.PlayMod.getFriendMod() FriendMod := p.PlayMod.getFriendMod()
for _, v := range PlayerList { for _, Uid := range uids {
if v.Uid == int(p.M_DwUin) { if Uid == int(p.M_DwUin) {
continue continue
} }
if FriendMod.CheckSendApply(v.Uid) { if FriendMod.CheckSendApply(Uid) {
continue continue
} }
if FriendMod.CheckFriend(v.Uid) { if FriendMod.CheckFriend(Uid) {
continue continue
} }
PlayerSimpleData := G_GameLogicPtr.GetSimplePlayerByUid(v.Uid) PlayerSimpleData := G_GameLogicPtr.GetSimplePlayerByUid(Uid)
if GoUtil.Now()-PlayerSimpleData.Loginout > 86400 { if PlayerSimpleData == nil {
continue continue
} }
if PlayerSimpleData.Level < 4 { PlayerList1 = append(PlayerList1, Uid)
continue
}
PlayerList1 = append(PlayerList1, v.Uid)
} }
if len(PlayerList1) == 0 { if len(PlayerList1) == 0 {
for _, v := range PlayerList { for _, Uid := range uids {
if v.Uid == int(p.M_DwUin) { if Uid == int(p.M_DwUin) {
continue continue
} }
PlayerList1 = append(PlayerList1, v.Uid) PlayerList1 = append(PlayerList1, Uid)
} }
} }
return GoUtil.RandSliceNum(PlayerList1, Num) return GoUtil.RandSliceNum(PlayerList1, Num)

View File

@ -273,9 +273,6 @@ func ReqGmCommand_(player *Player, Command string) error {
HandleType: MsgMod.HANDLE_MDO_CHAMPSHIP_INRANK, HandleType: MsgMod.HANDLE_MDO_CHAMPSHIP_INRANK,
} }
SendMsgToCenterAsync(m) SendMsgToCenterAsync(m)
case "clearRank":
num, _ := strconv.Atoi(arg[1])
G_GameLogicPtr.RankMgr.ClearRank(num)
case "resetUserInfo": case "resetUserInfo":
Rank := G_GameLogicPtr.RankMgr.getRank(RANK_TYPE_USER) Rank := G_GameLogicPtr.RankMgr.getRank(RANK_TYPE_USER)
for _, v := range Rank { for _, v := range Rank {

View File

@ -8,6 +8,7 @@ import (
GoUtil "server/game_util" GoUtil "server/game_util"
"sort" "sort"
"strconv" "strconv"
"sync"
) )
const ( const (
@ -18,6 +19,8 @@ type RankMgr struct {
*ServerMod *ServerMod
} }
var mu sync.Mutex
type RankData struct { type RankData struct {
List map[int][]*Rank // 玩家排行榜 List map[int][]*Rank // 玩家排行榜
Champship map[int][]*Rank // 锦标赛排行榜 Champship map[int][]*Rank // 锦标赛排行榜
@ -98,29 +101,6 @@ func (r *RankMgr) getRank(RankType int) []*Rank {
return []*Rank{} return []*Rank{}
} }
func (r *RankMgr) getAllRank(RankType int) []*Rank {
if v, ok := r.getData().List[RankType]; ok {
return v
}
return []*Rank{}
}
func (r *RankMgr) getMyRank(Uid, RankType int) (int, float64) {
if d, ok := r.getData().List[RankType]; ok {
for k, v := range d {
if v.Uid == Uid {
return k + 1, v.Score
}
}
}
return 0, 0.0
}
// 设置榜单数据
func (r *RankMgr) setRank(RankType int, data []*Rank) {
r.getData().List[RankType] = data
}
// 获取排行榜信息 // 获取排行榜信息
func (r *RankMgr) getRankInfo(m *msg.Msg) (interface{}, error) { func (r *RankMgr) getRankInfo(m *msg.Msg) (interface{}, error) {
data := m.Extra.(RankMsg) data := m.Extra.(RankMsg)
@ -132,12 +112,10 @@ func (r *RankMgr) getRankInfo(m *msg.Msg) (interface{}, error) {
if data.RankType == RANK_TYPE_USER { if data.RankType == RANK_TYPE_USER {
return r.getRedisCountryRankInfo(m) return r.getRedisCountryRankInfo(m)
} }
rankList := r.getRank(data.RankType)
MyRank, MyScore := r.getMyRank(m.From, data.RankType)
return &RankInfo{ return &RankInfo{
List: rankList, List: []*Rank{},
MyRank: MyRank, MyRank: 0,
MyScore: MyScore, MyScore: 0,
}, nil }, nil
} }
@ -193,32 +171,6 @@ func (r *RankMgr) getRedisRankInfo(m *msg.Msg) (interface{}, error) {
// 进入排行榜 // 进入排行榜
func (r *RankMgr) inRank(m *msg.Msg) (interface{}, error) { func (r *RankMgr) inRank(m *msg.Msg) (interface{}, error) {
data := m.Extra.(RankMsg) data := m.Extra.(RankMsg)
rankList := r.getRank(data.RankType)
inRank := false
for _, v := range rankList {
if v.Uid == data.Uid {
if v.Score < data.Score {
v.Score = data.Score
v.Time = m.SendT
inRank = true
break
}
return nil, nil
}
}
if !inRank {
rankList = append(rankList, &Rank{Uid: data.Uid, Score: data.Score, Time: m.SendT})
}
sort.Slice(rankList, func(i, j int) bool { // 排序 从大到小 数值相等按时间排序
if rankList[i].Score > rankList[j].Score {
return true
} else if rankList[i].Score == rankList[j].Score {
return rankList[i].Time < rankList[j].Time
}
return false
})
r.setRank(data.RankType, rankList)
if data.RankType == RANK_TYPE_USER { if data.RankType == RANK_TYPE_USER {
// 全球玩家排行榜 // 全球玩家排行榜
Uid := strconv.Itoa(data.Uid) Uid := strconv.Itoa(data.Uid)
@ -234,11 +186,3 @@ func (r *RankMgr) inRank(m *msg.Msg) (interface{}, error) {
r.update = true r.update = true
return nil, nil return nil, nil
} }
func (r *RankMgr) ClearRank(RankType int) {
// if RankType == RANK_TYPE_GLOBAL {
// db.RedisDel(RANK_USER)
// return
// }
r.setRank(RankType, []*Rank{})
}