157 lines
4.2 KiB
Go
157 lines
4.2 KiB
Go
package game
|
||
|
||
import (
|
||
"server/GoUtil"
|
||
"server/db"
|
||
"server/game/mod/msg"
|
||
"server/pkg/github.com/name5566/leaf/log"
|
||
"sort"
|
||
)
|
||
|
||
func GetVisitorPlayer(p *Player) int {
|
||
PlayroomMod := p.PlayMod.getPlayroomMod()
|
||
VisitorList := PlayroomMod.GetVisitor() // 到访用户
|
||
TodayVisitedUsers := PlayroomMod.GetTodayVisitedUsers() // 今日已互动用户
|
||
FriendMod := p.PlayMod.getFriendMod()
|
||
type sortData struct {
|
||
Uid int
|
||
Time int64
|
||
}
|
||
PlayerList := make([]sortData, 0)
|
||
PlayerList2 := make([]sortData, 0)
|
||
Now := GoUtil.Now()
|
||
/**
|
||
排除当日玩家已对其发起过交互的用户
|
||
优先选择24小时内曾经与玩家进行过宠物交互的好友
|
||
若存在复数对象的情况下,优先选择交互发生时间与当前时间最近的好友
|
||
若不存在符合条件的用户,则选择24小时内曾经与玩家进行过宠物交互的陌生用户
|
||
若存在复数对象的情况下,优先选择交互发生时间与当前时间最近的用户
|
||
若不存在符合条件的用户,则选择24小时内登入过游戏且上次登入时间与当前时间最近的好友
|
||
若不存在符合条件的用户,则依据以上用户推荐算法,选择一位随机推荐用户,并且在下次触发式订单完成时,不再排除已发起过交互的用户
|
||
*/
|
||
for k, v := range VisitorList {
|
||
if GoUtil.InArray(k, TodayVisitedUsers) {
|
||
continue
|
||
}
|
||
if v.Time < Now-86400 {
|
||
continue
|
||
}
|
||
if FriendMod.CheckFriend(k) {
|
||
PlayerList = append(PlayerList, sortData{k, v.Time})
|
||
} else {
|
||
PlayerList2 = append(PlayerList, sortData{k, v.Time})
|
||
}
|
||
}
|
||
if len(PlayerList) != 0 {
|
||
sort.Slice(PlayerList, func(i, j int) bool {
|
||
return PlayerList[i].Time < PlayerList[j].Time
|
||
})
|
||
return PlayerList[0].Uid
|
||
}
|
||
if len(PlayerList2) != 0 {
|
||
sort.Slice(PlayerList2, func(i, j int) bool {
|
||
return PlayerList2[i].Time < PlayerList2[j].Time
|
||
})
|
||
return PlayerList2[0].Uid
|
||
}
|
||
// 若不存在符合条件的用户,则选择24小时内登入过游戏且上次登入时间与当前时间最近的好友
|
||
var recentFriendUid int
|
||
var recentLoginTime int64 = 0
|
||
for uid := range FriendMod.GetFriendList() {
|
||
if uid == int(p.M_DwUin) {
|
||
continue
|
||
}
|
||
if GoUtil.InArray(uid, TodayVisitedUsers) {
|
||
continue
|
||
}
|
||
ps := G_GameLogicPtr.GetSimplePlayerByUid(uid)
|
||
if ps == nil {
|
||
continue
|
||
}
|
||
if GoUtil.Now()-ps.Loginout > 86400 { // 24小时内登录过
|
||
continue
|
||
}
|
||
if ps.Loginout > recentLoginTime {
|
||
recentLoginTime = ps.Loginout
|
||
recentFriendUid = uid
|
||
}
|
||
}
|
||
if recentFriendUid != 0 {
|
||
return recentFriendUid
|
||
}
|
||
PlayerList3 := G_GameLogicPtr.RankMgr.getAllRank(RANK_TYPE_USER)
|
||
PlayerList4 := make([]int, 0)
|
||
for _, v := range PlayerList3 {
|
||
if v.Uid == int(p.M_DwUin) {
|
||
continue
|
||
}
|
||
PlayerSimpleData := G_GameLogicPtr.GetSimplePlayerByUid(v.Uid)
|
||
if PlayerSimpleData.Level < 15 {
|
||
continue
|
||
}
|
||
PlayerList4 = append(PlayerList4, v.Uid)
|
||
}
|
||
L := GoUtil.RandSliceNum(PlayerList4, 1)
|
||
if len(L) == 0 {
|
||
return 0
|
||
}
|
||
return L[0]
|
||
}
|
||
|
||
func GetRecommendPlayer(p *Player, Num int) []int {
|
||
PlayerList := G_GameLogicPtr.RankMgr.getAllRank(RANK_TYPE_USER)
|
||
PlayerList1 := make([]int, 0)
|
||
FriendMod := p.PlayMod.getFriendMod()
|
||
for _, v := range PlayerList {
|
||
if v.Uid == int(p.M_DwUin) {
|
||
continue
|
||
}
|
||
if FriendMod.CheckSendApply(v.Uid) {
|
||
continue
|
||
}
|
||
if FriendMod.CheckFriend(v.Uid) {
|
||
continue
|
||
}
|
||
PlayerSimpleData := G_GameLogicPtr.GetSimplePlayerByUid(v.Uid)
|
||
if GoUtil.Now()-PlayerSimpleData.Loginout > 86400 {
|
||
continue
|
||
}
|
||
if PlayerSimpleData.Level < 4 {
|
||
continue
|
||
}
|
||
PlayerList1 = append(PlayerList1, v.Uid)
|
||
}
|
||
if len(PlayerList1) == 0 {
|
||
for _, v := range PlayerList {
|
||
if v.Uid == int(p.M_DwUin) {
|
||
continue
|
||
}
|
||
PlayerList1 = append(PlayerList1, v.Uid)
|
||
}
|
||
}
|
||
return GoUtil.RandSliceNum(PlayerList1, Num)
|
||
}
|
||
|
||
func GetUidByFaceBook(Fb string) (int, error) {
|
||
sqlStr := "SELECT dwUin FROM t_player_baseinfo WHERE FaceBookId = ?"
|
||
type Result struct {
|
||
Uid int `db:"dwUin"`
|
||
}
|
||
R := Result{}
|
||
err := db.SqlDb.Get(&R, sqlStr, Fb)
|
||
log.Debug("Fb :%s;Uid :%d", Fb, R.Uid)
|
||
return R.Uid, err
|
||
}
|
||
|
||
func NotifyAllFriend(p *Player, m1 *msg.Msg) {
|
||
m := m1.Clone()
|
||
FriendMod := p.PlayMod.getFriendMod()
|
||
for k := range FriendMod.GetFriendList() {
|
||
if k == int(p.M_DwUin) {
|
||
continue
|
||
}
|
||
m.To = k
|
||
FriendMgrSend(m)
|
||
}
|
||
}
|