推荐优化

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

View File

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

View File

@ -8,6 +8,7 @@ import (
GoUtil "server/game_util"
"sort"
"strconv"
"sync"
)
const (
@ -18,6 +19,8 @@ type RankMgr struct {
*ServerMod
}
var mu sync.Mutex
type RankData struct {
List map[int][]*Rank // 玩家排行榜
Champship map[int][]*Rank // 锦标赛排行榜
@ -98,29 +101,6 @@ func (r *RankMgr) getRank(RankType int) []*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) {
data := m.Extra.(RankMsg)
@ -132,12 +112,10 @@ func (r *RankMgr) getRankInfo(m *msg.Msg) (interface{}, error) {
if data.RankType == RANK_TYPE_USER {
return r.getRedisCountryRankInfo(m)
}
rankList := r.getRank(data.RankType)
MyRank, MyScore := r.getMyRank(m.From, data.RankType)
return &RankInfo{
List: rankList,
MyRank: MyRank,
MyScore: MyScore,
List: []*Rank{},
MyRank: 0,
MyScore: 0,
}, nil
}
@ -193,32 +171,6 @@ func (r *RankMgr) getRedisRankInfo(m *msg.Msg) (interface{}, error) {
// 进入排行榜
func (r *RankMgr) inRank(m *msg.Msg) (interface{}, error) {
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 {
// 全球玩家排行榜
Uid := strconv.Itoa(data.Uid)
@ -234,11 +186,3 @@ func (r *RankMgr) inRank(m *msg.Msg) (interface{}, error) {
r.update = true
return nil, nil
}
func (r *RankMgr) ClearRank(RankType int) {
// if RankType == RANK_TYPE_GLOBAL {
// db.RedisDel(RANK_USER)
// return
// }
r.setRank(RankType, []*Rank{})
}