450 lines
10 KiB
Go
450 lines
10 KiB
Go
package main
|
|
|
|
import (
|
|
"mongo.games.com/goserver/core/basic"
|
|
"mongo.games.com/goserver/core/logger"
|
|
"mongo.games.com/goserver/core/netlib"
|
|
"mongo.games.com/goserver/core/task"
|
|
|
|
"mongo.games.com/game/common"
|
|
"mongo.games.com/game/model"
|
|
rankproto "mongo.games.com/game/protocol/rank"
|
|
"mongo.games.com/game/ranksrv/com"
|
|
"mongo.games.com/game/ranksrv/rank"
|
|
)
|
|
|
|
func init() {
|
|
// 排位赛排行榜
|
|
com.Register(int(rankproto.Rank_PACKET_RANK_CSRankMatch), rankproto.CSRankMatch{}, CSRankMatch)
|
|
// 金币榜
|
|
com.Register(int(rankproto.Rank_PACKET_RANK_CSCoin), rankproto.CSCoin{}, CSCoin)
|
|
// 邀请积分排行榜
|
|
com.Register(int(rankproto.Rank_PACKET_RANK_CSInvite), rankproto.CSInvite{}, CSInvite)
|
|
// 邀请记录
|
|
com.Register(int(rankproto.Rank_PACKET_CSInviteLog), rankproto.CSInviteLog{}, CSInviteLog)
|
|
// 收入榜
|
|
com.Register(int(rankproto.Rank_PACKET_RANK_CSWinCoin), rankproto.CSWinCoin{}, CSWinCoin)
|
|
//等级榜
|
|
com.Register(int(rankproto.Rank_PACKET_RANK_CSLevel), rankproto.CSPlayerLevelRank{}, CSPlayerLevelRank)
|
|
}
|
|
|
|
func CSRankMatch(s *netlib.Session, d *rankproto.GateTransmit, packetId int, data interface{}, sid int64) error {
|
|
logger.Logger.Trace("CSRankMatch data:", data)
|
|
msg, ok := data.(*rankproto.CSRankMatch)
|
|
if !ok {
|
|
return nil
|
|
}
|
|
|
|
rank.RankLevelMgrInstance.Take(d.Platform, msg.GetId(), func(list []*model.PlayerRankScore, err error) {
|
|
if err != nil {
|
|
logger.Logger.Errorf("CSRankMatch error: %v", err)
|
|
return
|
|
}
|
|
|
|
page := msg.GetPage()
|
|
if page < 0 {
|
|
page = 0
|
|
}
|
|
pageSize := msg.GetPageSize()
|
|
if pageSize < 1 {
|
|
pageSize = 10
|
|
}
|
|
|
|
start := page * pageSize
|
|
end := start + pageSize
|
|
if end >= int32(len(list)) {
|
|
end = int32(len(list))
|
|
}
|
|
|
|
var i int32
|
|
var ranks []*rankproto.SeasonRank
|
|
if end > start && int(start) < len(list) {
|
|
for _, v := range list[start:end] {
|
|
r := &rankproto.SeasonRank{
|
|
Snid: v.SnId,
|
|
Name: v.Name,
|
|
Lv: v.Lv,
|
|
Rank: start + i,
|
|
Sex: v.Sex,
|
|
HeadUrl: v.HeadUrl,
|
|
Coin: v.Coin,
|
|
Score: v.Score,
|
|
ModId: v.ModId,
|
|
}
|
|
ranks = append(ranks, r)
|
|
i++
|
|
}
|
|
}
|
|
|
|
var me *rankproto.SeasonRank
|
|
for k, v := range list {
|
|
if v.SnId == d.Snid {
|
|
me = &rankproto.SeasonRank{
|
|
Snid: v.SnId,
|
|
Name: v.Name,
|
|
Lv: v.Lv,
|
|
Rank: int32(k),
|
|
Sex: v.Sex,
|
|
HeadUrl: v.HeadUrl,
|
|
Coin: v.Coin,
|
|
Score: v.Score,
|
|
ModId: v.ModId,
|
|
}
|
|
break
|
|
}
|
|
}
|
|
|
|
pack := &rankproto.SCRankMatch{
|
|
Ranks: ranks,
|
|
Me: me,
|
|
Page: page,
|
|
PageSize: pageSize,
|
|
Total: int32(len(list)),
|
|
}
|
|
|
|
common.SendToGate(sid, int(rankproto.Rank_PACKET_RANK_SCRankMatch), pack, s)
|
|
logger.Logger.Tracef("SCRankMatch: %v", pack)
|
|
})
|
|
return nil
|
|
}
|
|
|
|
func CSCoin(s *netlib.Session, d *rankproto.GateTransmit, packetId int, data interface{}, sid int64) error {
|
|
logger.Logger.Trace("CSCoin data:", data)
|
|
msg, ok := data.(*rankproto.CSCoin)
|
|
if !ok {
|
|
return nil
|
|
}
|
|
|
|
rank.PlayerCoinMgrInstance.Take(d.Platform, 0, func(list []*model.RankPlayerCoin, err error) {
|
|
if err != nil {
|
|
logger.Logger.Errorf("CSCoin error: %v", err)
|
|
return
|
|
}
|
|
|
|
page := msg.GetPage()
|
|
if page < 0 {
|
|
page = 0
|
|
}
|
|
pageSize := msg.GetPageSize()
|
|
if pageSize < 1 {
|
|
pageSize = 10
|
|
}
|
|
|
|
start := page * pageSize
|
|
end := start + pageSize
|
|
if end >= int32(len(list)) {
|
|
end = int32(len(list))
|
|
}
|
|
|
|
var i int32
|
|
var ranks []*rankproto.PlayerCoin
|
|
if end > start && int(start) < len(list) {
|
|
for _, v := range list[start:end] {
|
|
r := &rankproto.PlayerCoin{
|
|
Snid: v.SnId,
|
|
Name: v.Name,
|
|
Sex: v.Sex,
|
|
HeadUrl: v.HeadUrl,
|
|
Coin: v.Coin,
|
|
Rank: start + i,
|
|
ModId: v.ModId,
|
|
}
|
|
ranks = append(ranks, r)
|
|
i++
|
|
}
|
|
}
|
|
|
|
var me *rankproto.PlayerCoin
|
|
for k, v := range list {
|
|
if v.SnId == d.Snid {
|
|
me = &rankproto.PlayerCoin{
|
|
Snid: v.SnId,
|
|
Name: v.Name,
|
|
Sex: v.Sex,
|
|
HeadUrl: v.HeadUrl,
|
|
Coin: v.Coin,
|
|
Rank: int32(k),
|
|
ModId: v.ModId,
|
|
}
|
|
break
|
|
}
|
|
}
|
|
|
|
pack := &rankproto.SCCoin{
|
|
Ranks: ranks,
|
|
Me: me,
|
|
Page: page,
|
|
PageSize: pageSize,
|
|
Total: int32(len(list)),
|
|
}
|
|
|
|
common.SendToGate(sid, int(rankproto.Rank_PACKET_RANK_SCCoin), pack, s)
|
|
logger.Logger.Tracef("SCCoin: %v", pack)
|
|
})
|
|
return nil
|
|
}
|
|
|
|
func CSInvite(s *netlib.Session, d *rankproto.GateTransmit, packetId int, data interface{}, sid int64) error {
|
|
logger.Logger.Trace("CSInvite data:", data)
|
|
msg, ok := data.(*rankproto.CSInvite)
|
|
if !ok {
|
|
return nil
|
|
}
|
|
|
|
rank.RankInviteMgrInstance.Take(d.Platform, msg.GetId(), func(list []*model.PlayerRankInvite, err error) {
|
|
if err != nil {
|
|
logger.Logger.Errorf("CSInvite error: %v", err)
|
|
return
|
|
}
|
|
|
|
start, end := com.SkipLimitToStartEnd(msg.GetSkip(), msg.GetLimit(), len(list))
|
|
|
|
IsEndNum := false
|
|
if end == int32(len(list)) {
|
|
IsEndNum = true
|
|
}
|
|
|
|
var i int32
|
|
var ranks []*rankproto.InviteRank
|
|
if end > start && int(start) < len(list) {
|
|
for _, v := range list[start:end] {
|
|
r := &rankproto.InviteRank{
|
|
Snid: v.SnId,
|
|
Name: v.Name,
|
|
Rank: start + i,
|
|
Score: v.Score,
|
|
InviteNum: v.InviteNum,
|
|
ModId: v.ModId,
|
|
}
|
|
ranks = append(ranks, r)
|
|
i++
|
|
}
|
|
}
|
|
|
|
var me *rankproto.InviteRank
|
|
for k, v := range list {
|
|
if v.SnId == d.Snid {
|
|
me = &rankproto.InviteRank{
|
|
Snid: v.SnId,
|
|
Name: v.Name,
|
|
Score: v.Score,
|
|
Rank: int32(k),
|
|
InviteNum: v.InviteNum,
|
|
ModId: v.ModId,
|
|
}
|
|
break
|
|
}
|
|
}
|
|
|
|
pack := &rankproto.SCInvite{
|
|
Id: msg.GetId(),
|
|
Ranks: ranks,
|
|
Me: me,
|
|
Skip: msg.GetSkip(),
|
|
IsEndNum: IsEndNum,
|
|
RankMaxNum: model.GameParamData.RankInviteMaxNum,
|
|
}
|
|
|
|
common.SendToGate(sid, int(rankproto.Rank_PACKET_RANK_SCInvite), pack, s)
|
|
logger.Logger.Tracef("SCInvite: %v", pack)
|
|
})
|
|
return nil
|
|
}
|
|
|
|
func CSInviteLog(s *netlib.Session, d *rankproto.GateTransmit, packetId int, data interface{}, sid int64) error {
|
|
logger.Logger.Trace("CSInviteLog data:", data)
|
|
msg, ok := data.(*rankproto.CSInviteLog)
|
|
if !ok {
|
|
return nil
|
|
}
|
|
|
|
rank.InviteLogMgrInstance.Take(d.Platform, d.Snid, func(list []*model.InviteInfo, err error) {
|
|
if err != nil {
|
|
logger.Logger.Errorf("CSInviteLog error: %v", err)
|
|
return
|
|
}
|
|
|
|
start, end := com.SkipLimitToStartEnd(msg.GetSkip(), msg.GetLimit(), len(list))
|
|
|
|
var ranks []*rankproto.InviteInfo
|
|
for _, v := range list[start:end] {
|
|
r := &rankproto.InviteInfo{
|
|
Name: v.Name,
|
|
SnId: v.SnId,
|
|
CreateTs: v.CreateTs,
|
|
Score: v.Score,
|
|
ModId: v.ModId,
|
|
}
|
|
ranks = append(ranks, r)
|
|
}
|
|
|
|
pack := &rankproto.SCInviteLog{
|
|
Skip: start,
|
|
Limit: msg.GetLimit(),
|
|
List: ranks,
|
|
}
|
|
|
|
common.SendToGate(sid, int(rankproto.Rank_PACKET_SCInviteLog), pack, s)
|
|
logger.Logger.Tracef("SCInviteLog: %v", pack)
|
|
})
|
|
|
|
return nil
|
|
}
|
|
|
|
func CSWinCoin(s *netlib.Session, d *rankproto.GateTransmit, packetId int, data interface{}, sid int64) error {
|
|
logger.Logger.Trace("CSWinCoin data:", data)
|
|
msg, ok := data.(*rankproto.CSWinCoin)
|
|
if !ok {
|
|
return nil
|
|
}
|
|
|
|
ret := &rankproto.SCWinCoin{}
|
|
var ranks []*rankproto.WinCoinInfo
|
|
var me *rankproto.WinCoinInfo
|
|
|
|
send := func() {
|
|
ret.Ranks = ranks
|
|
ret.Me = me
|
|
common.SendToGate(sid, int(rankproto.Rank_PACKET_RANK_SCWinCoin), ret, s)
|
|
logger.Logger.Tracef("SCWinCoin: %v", ret)
|
|
}
|
|
|
|
rank.WinCoinMgrInstance.Get(d.Platform, 0, func(list []*model.WinCoinInfo, err error) {
|
|
if err != nil {
|
|
logger.Logger.Errorf("CSWinCoin error: %v", err)
|
|
return
|
|
}
|
|
|
|
start, end := com.SkipLimitToStartEnd(msg.GetSkip(), msg.GetLimit(), len(list))
|
|
ret.Skip = start
|
|
ret.Limit = msg.GetLimit()
|
|
|
|
var i int32
|
|
for _, v := range list[start:end] {
|
|
r := &rankproto.WinCoinInfo{
|
|
SnId: v.SnId,
|
|
Name: v.Name,
|
|
Rank: start + i,
|
|
Coin: v.Coin,
|
|
ModId: v.ModId,
|
|
}
|
|
ranks = append(ranks, r)
|
|
i++
|
|
if v.SnId == d.Snid {
|
|
me = r
|
|
}
|
|
}
|
|
|
|
if len(list) > 0 && me == nil {
|
|
for k, v := range list {
|
|
if v.SnId == d.Snid {
|
|
me = &rankproto.WinCoinInfo{
|
|
SnId: v.SnId,
|
|
Name: v.Name,
|
|
Rank: int32(k),
|
|
Coin: v.Coin,
|
|
ModId: v.ModId,
|
|
}
|
|
break
|
|
}
|
|
}
|
|
}
|
|
|
|
if me == nil {
|
|
var err error
|
|
var ret *model.FindWinCoinReply
|
|
task.New(nil, task.CallableWrapper(func(o *basic.Object) interface{} {
|
|
startTs, endTs := rank.StartEndTs()
|
|
ret, err = model.FindWinCoinTienlen(&model.FindWinCoinArgs{
|
|
Platform: d.Platform,
|
|
StartTs: startTs,
|
|
EndTs: endTs,
|
|
SnId: d.Snid,
|
|
})
|
|
if err != nil {
|
|
logger.Logger.Errorf("FindWinCoinTienlen error: %v", err)
|
|
}
|
|
return nil
|
|
}), task.CompleteNotifyWrapper(func(i interface{}, t task.Task) {
|
|
if err == nil && ret.List != nil {
|
|
me = &rankproto.WinCoinInfo{
|
|
SnId: ret.List.SnId,
|
|
Name: ret.List.Name,
|
|
Rank: -1,
|
|
Coin: ret.List.Coin,
|
|
ModId: ret.List.ModId,
|
|
}
|
|
}
|
|
send()
|
|
})).Start()
|
|
} else {
|
|
send()
|
|
}
|
|
})
|
|
return nil
|
|
}
|
|
|
|
// 玩家等级榜
|
|
func CSPlayerLevelRank(s *netlib.Session, d *rankproto.GateTransmit, packetId int, data interface{}, sid int64) error {
|
|
logger.Logger.Trace("CSPlayerLevelRank data:", data)
|
|
msg, ok := data.(*rankproto.CSPlayerLevelRank)
|
|
if !ok {
|
|
return nil
|
|
}
|
|
|
|
ret := &rankproto.SCPlayerLevelRank{}
|
|
var ranks []*rankproto.PlayerLevelRankInfo
|
|
var me *rankproto.PlayerLevelRankInfo
|
|
|
|
send := func() {
|
|
ret.Ranks = ranks
|
|
ret.Me = me
|
|
common.SendToGate(sid, int(rankproto.Rank_PACKET_RANK_SCLevel), ret, s)
|
|
logger.Logger.Tracef("SCWinCoin: %v", ret)
|
|
}
|
|
|
|
rank.PlayerLevelMgrInstance.Take(d.Platform, 0, func(list []*model.PlayerLevelInfo, err error) {
|
|
if err != nil {
|
|
logger.Logger.Errorf("CSPlayerLevelRank error: %v", err)
|
|
return
|
|
}
|
|
|
|
start, end := com.SkipLimitToStartEnd(msg.GetSkip(), msg.GetLimit(), len(list))
|
|
ret.Skip = start
|
|
ret.Limit = msg.GetLimit()
|
|
|
|
var i int32
|
|
for _, v := range list[start:end] {
|
|
r := &rankproto.PlayerLevelRankInfo{
|
|
SnId: v.SnId,
|
|
Name: v.Name,
|
|
Level: v.Level,
|
|
ModId: v.ModId,
|
|
Rank: i + start,
|
|
}
|
|
ranks = append(ranks, r)
|
|
i++
|
|
if v.SnId == d.Snid {
|
|
me = r
|
|
}
|
|
}
|
|
|
|
if len(list) > 0 && me == nil {
|
|
for k, v := range list {
|
|
if v.SnId == d.Snid {
|
|
me = &rankproto.PlayerLevelRankInfo{
|
|
SnId: v.SnId,
|
|
Name: v.Name,
|
|
Level: v.Level,
|
|
Rank: int32(k),
|
|
ModId: v.ModId,
|
|
}
|
|
break
|
|
}
|
|
}
|
|
}
|
|
send()
|
|
})
|
|
return nil
|
|
}
|