game_sync/worldsrv/action_login.go

661 lines
23 KiB
Go
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

package main
import (
"crypto/md5"
"encoding/hex"
"fmt"
"io"
"strconv"
"time"
"github.com/globalsign/mgo/bson"
"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"
"mongo.games.com/game/proto"
login_proto "mongo.games.com/game/protocol/login"
"mongo.games.com/game/srvdata"
)
/*
登录功能:
记录账号登录状态和连接状态(一个玩家可能多客户端登录,会有多个连接,实现顶号)
连接有两种状态,登录中,登录完成
登录流程:
1.判断连接是否已经存在(存在说明已经登录过了),存在则不用处理,这是单连接重复登录
2.判断账号是否有正在登录的连接,有的话则断开当前连接,从账号登录的角度讲只能一个客户端在登录中
3.判断是否有已经登录完成并且正在游戏中的连接,如果有则断开当前连接(游戏中的连接不会被断开)
4.判断是否有已经登录完成的连接但是没有在游戏中则当前连接可以登录因为登录是异步的登录完成后可以再判断一下3记录账号信息和连接状态登录完成断开其它连接顶号
5.没有其他连接,正常登录
*/
type CSLoginPacketFactory struct {
}
type CSLoginHandler struct {
}
func (this *CSLoginPacketFactory) CreatePacket() interface{} {
pack := &login_proto.CSLogin{}
return pack
}
func (this *CSLoginHandler) Process(s *netlib.Session, packetid int, data interface{}, sid int64) error {
logger.Logger.Trace("CSLoginHandler Process recv ", data)
csl, ok := data.(*login_proto.CSLogin)
if !ok {
return nil
}
sendSCLogin := func(code login_proto.OpResultCode, str ...string) {
sclogin := &login_proto.SCLogin{
OpRetCode: code,
}
if len(str) == 2 {
sclogin.ApkUrl = str[0]
sclogin.IpaUrl = str[1]
}
proto.SetDefaults(sclogin)
common.SendToGate(sid, int(login_proto.LoginPacketID_PACKET_SC_LOGIN), sclogin, s)
}
sendSCDisconnect := func(code int32) {
ssDis := &login_proto.SSDisconnect{
SessionId: proto.Int64(sid),
Type: proto.Int32(code),
}
proto.SetDefaults(ssDis)
s.Send(int(login_proto.GatePacketID_PACKET_SS_DICONNECT), ssDis)
}
if csl.GetUsername() == "" || csl.GetPassword() == "" {
sendSCLogin(login_proto.OpResultCode_OPRC_Error)
sendSCDisconnect(common.KickReason_Freeze)
return nil
}
// 根据PlatformTag包标识获取平台信息
// 机器人没有包标识根据csl.GetPlatform()判断
platform, _, promoter, _, tagkey := PlatformMgrSingleton.GetPlatformByPackageTag(csl.GetPlatformTag())
if platform == 0 && csl.GetPlatform() != common.Platform_Rob {
sendSCLogin(login_proto.OpResultCode_OPRC_Error)
sendSCDisconnect(common.KickReason_Freeze)
return nil
}
// 替换为后台拿到的配置数据,不再使用客户端的发送数据
backupPromoter := ""
if csl.GetChannel() != common.Channel_Rob {
// platform
if platform != 0 {
csl.Platform = proto.String(strconv.Itoa(int(platform)))
} else {
csl.Platform = proto.String(DefaultPlatform)
platform = DefaultPlatformInt
}
// channel
//if channel != 0 {
// csl.Channel = proto.String(strconv.Itoa(int(channel)))
//} else {
// csl.Channel = proto.String("")
//}
// promoter
if len(csl.GetPromoter()) <= 0 {
if promoter != 0 {
csl.Promoter = proto.String(strconv.Itoa(int(promoter)))
} else {
csl.Promoter = proto.String("")
}
} else {
backupPromoter = csl.GetPromoter()
}
//InviterId 和 PromoterTree客户端是从剪贴板上读取出来的所以不以包上的为准
}
logger.Logger.Tracef("CSLoginHandler %v", csl.String())
// 数据校验
raw := fmt.Sprintf("%v%v%v%v%v", csl.GetUsername(), csl.GetPassword(), csl.GetTimeStamp(), csl.GetParams(), common.GetAppId())
h := md5.New()
io.WriteString(h, raw)
hashsum := hex.EncodeToString(h.Sum(nil))
if hashsum != csl.GetSign() {
logger.Logger.Tracef("ClientSessionAttribute_State hashsum not fit!!! get:%v expect:%v rawstr:%v", csl.GetSign(), hashsum, raw)
sendSCLogin(login_proto.OpResultCode_OPRC_Error)
sendSCDisconnect(common.KickReason_CheckCodeErr)
return nil
}
// 平台维护
pt := PlatformMgrSingleton.GetPlatform(strconv.Itoa(int(platform)))
if pt == nil || pt.Disable {
sendSCLogin(login_proto.OpResultCode_OPRC_SceneServerMaintain)
sendSCDisconnect(common.KickReason_Freeze)
return nil
}
// 是否正在维护
if model.GameParamData.SrvMaintain && common.SrvIsMaintaining {
inWhiteList := false
for i := 0; i < len(model.GMACData.WhiteList); i++ {
if model.GMACData.WhiteList[i] == csl.GetUsername() {
inWhiteList = true
break
}
}
//排除白名单里的玩家
if !inWhiteList {
sendSCLogin(login_proto.OpResultCode_OPRC_SceneServerMaintain)
sendSCDisconnect(common.KickReason_Freeze)
return nil
}
}
// 检查版本号
if model.GameParamData.VerifyClientVersion {
deviceOs := csl.GetDeviceOs()
packVers := srvdata.GetPackVers(csl.GetPlatformTag())
if deviceOs != "" && packVers != nil {
if cvers, ok := packVers[deviceOs]; ok {
if csl.GetApkVer() < cvers.MinApkVer {
appInfo := PlatformMgrSingleton.GetPackageTag(csl.PlatformTag)
sendSCLogin(login_proto.OpResultCode_OPRC_YourAppVerIsLow, appInfo.ApkUrl, appInfo.IpaUrl)
sendSCDisconnect(common.KickReason_AppLow)
return nil
}
if csl.GetResVer() < cvers.MinResVer {
appInfo := PlatformMgrSingleton.GetPackageTag(csl.PlatformTag)
sendSCLogin(login_proto.OpResultCode_OPRC_YourResVerIsLow, appInfo.ApkUrl, appInfo.IpaUrl)
sendSCDisconnect(common.KickReason_ResLow)
return nil
}
}
}
}
// 手机验证码登录,验证码是否正确
var codeValid bool
if csl.GetLoginType() == common.LoginTypeTelCode {
if csl.GetCode() != "" {
code := CacheMemory.Get(common.GetTelLoginCodeKey(csl.GetPlatform(), csl.GetUsername()))
// 验证码错误
if code != csl.GetCode() {
sendSCLogin(login_proto.OpResultCode_OPRC_TelCodeError)
sendSCDisconnect(common.KickReason_Freeze)
return nil
}
codeValid = true
}
}
// 连接正在登录
state := LoginStateMgrSington.GetLoginStateBySid(sid)
if state != nil {
logger.Logger.Warnf("CSLoginHandler relogining (%v) repeated (%v) ", csl.GetUsername(), sid)
return nil
}
// 玩家是否有在登录的连接
if LoginStateMgrSington.IsLogining(csl.GetUsername(), csl.GetPlatform(), tagkey) {
logger.Logger.Warnf("CSLoginHandler logining (%v) disconnect current(%v) ", csl.GetUsername(), sid)
sendSCDisconnect(common.KickReason_Logining) // 登录中重复登录会被断开连接
return nil
}
// 玩家已经登录完成并且在游戏中,断开当前连接
ls := LoginStateMgrSington.GetLoginStateByName(UserKey(csl.GetUsername(), csl.GetPlatform(), tagkey))
if ls != nil && ls.acc != nil {
// lss 其它连接
lss := LoginStateMgrSington.LoginFinish(csl.GetUsername(), csl.GetPlatform(), sid, ls.acc, tagkey)
player := PlayerMgrSington.GetPlayerBySnId(ls.acc.SnId)
waitMatch := false
if player != nil {
waitMatch, _ = TournamentMgr.IsMatchWaiting(player.Platform, player.SnId)
}
if len(lss) > 0 && (player != nil && (player.scene != nil || player.thrscene != 0 || waitMatch || TournamentMgr.IsGaming(player.SnId))) {
sendSCLogin(login_proto.OpResultCode_OPRC_LoginOtherPlace)
sendSCDisconnect(common.KickReason_Logining)
return nil
}
}
clog := &model.ClientLoginInfo{
LoginType: csl.GetLoginType(),
ApkVer: csl.GetApkVer(),
ResVer: csl.GetResVer(),
InviterId: csl.GetInviterId(),
PromoterTree: csl.GetPromoterTree(),
UserName: csl.GetUsername(),
PlatformTag: csl.GetPlatformTag(),
Promoter: csl.GetPromoter(),
Sid: sid,
HeadUrl: csl.GetHeadUrl(),
DeviceOS: csl.GetDeviceOs(),
}
// 玩家开始登录
if LoginStateMgrSington.StartLogin(csl.GetUsername(), csl.GetPlatform(), sid, s, clog, tagkey) {
tl := &TaskLogin{CSLogin: csl, Session: s, Sid: sid, BackupPromoter: backupPromoter, tagkey: tagkey, codeValid: codeValid}
t := task.New(nil, tl, tl, "TaskLogin")
if b := t.StartByExecutor(csl.GetUsername()); !b {
logger.Logger.Trace("login task launch failed")
sendSCDisconnect(common.KickReason_TaskErr)
}
return nil
}
// 用缓存信息做登录有account
// 根据StartLogin代码这里ls.acc一定不为nil
ls = LoginStateMgrSington.GetLoginStateByName(UserKey(csl.GetUsername(), csl.GetPlatform(), tagkey))
if ls != nil {
acc := ls.acc
// 账号冻结
if acc.State > time.Now().Unix() {
sendSCLogin(login_proto.OpResultCode_OPRC_AccountBeFreeze)
sendSCDisconnect(common.KickReason_Freeze)
//清理登录状态
LoginStateMgrSington.LogoutBySid(sid)
return nil
}
pwdIsErr := true
switch csl.GetLoginType() {
case common.LoginTypeGuest: //游客登录
if acc.UserName == csl.GetUsername() && acc.Platform == csl.GetPlatform() && acc.TagKey == tagkey {
raw := fmt.Sprintf("%v%v%v", acc.PassWord, common.GetAppId(), csl.GetTimeStamp())
h := md5.New()
io.WriteString(h, raw)
pwd := hex.EncodeToString(h.Sum(nil))
if pwd != csl.GetPassword() {
pwdIsErr = true
} else {
pwdIsErr = false
}
}
case common.LoginTypeAccount: //帐号登录
if acc.UserName == csl.GetUsername() && acc.Platform == csl.GetPlatform() && acc.TagKey == tagkey {
// 用户密码
userPwd := common.GetRawPassword(acc.TelPassWord, csl.GetTimeStamp())
if userPwd != csl.GetPassword() {
// 管理员密码
adminPwd := common.GetRawPassword(common.GetRawPassword(model.GameParamData.AdminPassword), csl.GetTimeStamp())
if !model.GameParamData.UseAdminPassword || csl.GetPassword() != adminPwd {
pwdIsErr = true
} else {
pwdIsErr = false
}
} else {
pwdIsErr = false
}
}
case common.LoginTypeTelCode: // 手机验证码登录
if acc.Tel == csl.GetUsername() && acc.Platform == csl.GetPlatform() && acc.TagKey == tagkey {
if codeValid {
// 更新密码
raw := fmt.Sprintf("%v%v", bson.NewObjectId().Hex(), common.GetAppId())
h := md5.New()
io.WriteString(h, raw)
pwd := hex.EncodeToString(h.Sum(nil))
acc.TelPassWord = pwd
acc.TelPassWordExpire = time.Now().AddDate(0, 0, common.TelLoginValidDays).Unix()
pwdIsErr = false
var err error
task.New(nil, task.CallableWrapper(func(o *basic.Object) interface{} {
err = model.UpdateAccount(acc)
return nil
}), task.CompleteNotifyWrapper(func(i interface{}, t task.Task) {
if err != nil {
logger.Logger.Errorf("UpdateAccount error:%v", err)
}
}), "UpdateAccount").Start()
} else {
raw := fmt.Sprintf("%v%v%v", acc.TelPassWord, common.GetAppId(), csl.GetTimeStamp())
ht := md5.New()
io.WriteString(ht, raw)
pwd := hex.EncodeToString(ht.Sum(nil))
if pwd != csl.GetPassword() {
pwdIsErr = true
} else {
pwdIsErr = false
}
}
}
}
//密码错误
if pwdIsErr {
// 缓存登录失败再从数据库查询一次
if csl.GetChannel() != common.Channel_Rob {
//try from db login
tl := &TaskLogin{CSLogin: csl, Session: s, Sid: sid}
t := task.New(nil, tl, tl, "TaskLogin")
if b := t.StartByExecutor(csl.GetUsername()); !b {
logger.Logger.Trace("login task launch failed")
sendSCDisconnect(common.KickReason_DBLoadAcc)
}
return nil
}
sendSCLogin(login_proto.OpResultCode_OPRC_LoginPassError)
//清理登录状态
LoginStateMgrSington.LogoutBySid(sid)
return nil
}
SCLogin(s, sid, csl, acc, login_proto.OpResultCode_OPRC_Sucess, false)
// 标记当前玩家登录成功,断开其它连接
lss := LoginStateMgrSington.LoginFinish(csl.GetUsername(), csl.GetPlatform(), sid, acc, tagkey)
if len(lss) != 0 {
for k, ls := range lss {
ssDis := &login_proto.SSDisconnect{
SessionId: proto.Int64(k),
Type: proto.Int32(common.KickReason_OtherLogin),
}
proto.SetDefaults(ssDis)
s.Send(int(login_proto.GatePacketID_PACKET_SS_DICONNECT), ssDis)
LoginStateMgrSington.Logout(ls)
logger.Logger.Warnf("==========顶号 oldsid:%v newsid:%v", k, sid)
}
}
}
return nil
}
type CSPlatFormPacketFactory struct {
}
type CSPlatFormHandler struct {
}
func (this *CSPlatFormPacketFactory) CreatePacket() interface{} {
pack := &login_proto.CSPlatFormConfig{}
return pack
}
func (this *CSPlatFormHandler) Process(s *netlib.Session, packetid int, data interface{}, sid int64) error {
logger.Logger.Trace("CSPlatFormHandler Process recv ", data)
if _, ok := data.(*login_proto.CSPlatFormConfig); ok {
p := PlayerMgrSington.GetOnlinePlayer(sid)
if p == nil {
logger.Logger.Warn("CSPlatFormHandler p == nil")
return nil
}
//platformId, _, _ := PlatformMgrSingleton.GetPlatformByPackageTag(msg.GetPlatformTag())
platform := PlatformMgrSingleton.GetPlatform(p.Platform)
if platform == nil {
scPlatForm := &login_proto.SCPlatFormConfig{
OpRetCode: login_proto.OpResultCode_OPRC_Error,
}
proto.SetDefaults(scPlatForm)
p.SendToClient(int(login_proto.LoginPacketID_PACKET_SC_PLATFORMCFG), scPlatForm)
return nil
}
scPlatForm := &login_proto.SCPlatFormConfig{
Platform: proto.String(p.Platform),
OpRetCode: login_proto.OpResultCode_OPRC_Sucess,
UpgradeAccountGiveCoin: proto.Int32(p.GetUpdateAccPrize()),
VipRange: platform.VipRange,
ExchangeMin: proto.Int32(platform.ExchangeMin),
ExchangeLimit: proto.Int32(platform.ExchangeLimit),
OtherParams: proto.String(platform.OtherParams),
SpreadConfig: proto.Int32(platform.SpreadConfig),
ExchangeTax: proto.Int32(platform.ExchangeTax),
ExchangeFlow: proto.Int32(GetExchangeFlow(p.PlayerData)),
ExchangeBankMax: proto.Int32(platform.ExchangeBankMax),
ExchangeAlipayMax: proto.Int32(platform.ExchangeAlipayMax),
ExchangeMultiple: proto.Int32(platform.ExchangeMultiple),
}
//rebateTask := RebateInfoMgrSington.rebateTask[p.Platform]
//if rebateTask != nil {
// scPlatForm.Rebate = &login_proto.RebateCfg{
// RebateSwitch: proto.Bool(rebateTask.RebateSwitch),
// ReceiveMode: proto.Int32(int32(rebateTask.ReceiveMode)),
// NotGiveOverdue: proto.Int32(int32(rebateTask.NotGiveOverdue)),
// }
//}
if platform.ClubConfig != nil { //俱乐部配置
scPlatForm.Club = &login_proto.ClubCfg{
IsOpenClub: proto.Bool(platform.ClubConfig.IsOpenClub),
CreationCoin: proto.Int64(platform.ClubConfig.CreationCoin),
IncreaseCoin: proto.Int64(platform.ClubConfig.IncreaseCoin),
ClubInitPlayerNum: proto.Int32(platform.ClubConfig.ClubInitPlayerNum),
CreateClubCheckByManual: proto.Bool(platform.ClubConfig.CreateClubCheckByManual),
EditClubNoticeByManual: proto.Bool(platform.ClubConfig.EditClubNoticeByManual),
CreateRoomAmount: proto.Int64(platform.ClubConfig.CreateRoomAmount),
GiveCoinRate: platform.ClubConfig.GiveCoinRate,
}
}
proto.SetDefaults(scPlatForm)
p.SendToClient(int(login_proto.LoginPacketID_PACKET_SC_PLATFORMCFG), scPlatForm)
}
return nil
}
//
//// 公告信息
//type CSBulletionInfoPacketFactory struct {
//}
//
//type CSBulletionInfoHandler struct {
//}
//
//func (this *CSBulletionInfoPacketFactory) CreatePacket() interface{} {
// pack := &login_proto.CSBulletionInfo{}
// return pack
//}
//func (this *CSBulletionInfoHandler) Process(s *netlib.Session, packetid int, data interface{}, sid int64) error {
// logger.Logger.Trace("CSBulletionInfoHandler Process recv ", data)
// if msg, ok := data.(*login_proto.CSBulletionInfo); ok {
// p := PlayerMgrSington.GetOnlinePlayer(sid)
// if p == nil {
// logger.Logger.Trace("CSBulletionInfoHandler p == nil ")
// return nil
// }
// pf, _, _, _, _ := PlatformMgrSingleton.GetPlatformByPackageTag(msg.GetPlatformTag())
// platform := strconv.Itoa(int(pf))
// i := 0
// var bulletList []*login_proto.Bulletion
// for _, v := range BulletMgrSington.BulletMsgList {
// if v != nil && platform == v.Platform && v.State == 1 {
// bulletList = append(bulletList, &login_proto.Bulletion{})
// bulletList[i].Id = proto.Int32(v.Id)
// bulletList[i].NoticeTitle = proto.String(v.NoticeTitle)
// bulletList[i].NoticeContent = proto.String(v.NoticeContent)
// bulletList[i].UpdateTime = proto.String(v.UpdateTime)
// bulletList[i].Sort = proto.Int32(v.Sort)
//
// i++
// }
// }
//
// var rawpack = &login_proto.SCBulletionInfo{
// Id: proto.Int(0),
// BulletionList: bulletList,
// }
// proto.SetDefaults(rawpack)
// p.SendToClient(int(login_proto.LoginPacketID_PACKET_SC_BULLETIONINFO), rawpack)
//
// }
// return nil
//}
//
//// 招商信息 CSCustomerInfoList
//type CSCustomerInfoListPacketFactory struct {
//}
//
//type CSCustomerInfoListHandler struct {
//}
//
//func (this *CSCustomerInfoListPacketFactory) CreatePacket() interface{} {
// pack := &login_proto.CSCustomerInfoList{}
// return pack
//}
//func (this *CSCustomerInfoListHandler) Process(s *netlib.Session, packetid int, data interface{}, sid int64) error {
// logger.Logger.Trace("CSCustomerInfoListHandler Process recv ", data)
// if _, ok := data.(*login_proto.CSCustomerInfoList); ok {
// p := PlayerMgrSington.GetOnlinePlayer(sid)
// if p == nil {
// logger.Logger.Trace("CSBulletionInfoHandler p == nil ")
// return nil
// }
// var customerList []*login_proto.Customer
// i := 0
// for _, v := range CustomerMgrSington.CustomerMsgList {
// if v != nil && v.Platform == p.Platform && v.Status == 1 {
// customerList = append(customerList, &login_proto.Customer{})
// customerList[i].Id = proto.Int32(v.Id)
// customerList[i].Nickname = proto.String(v.Nickname)
// customerList[i].Headurl = proto.String(v.Headurl)
// customerList[i].Ext = proto.String(v.Ext)
// customerList[i].WeixinAccount = proto.String(v.Weixin_account)
// customerList[i].QqAccount = proto.String(v.Qq_account)
// i++
// }
// }
// var rawpack = &login_proto.SCCustomerInfoList{
// CustomerList: customerList,
// }
// proto.SetDefaults(rawpack)
// p.SendToClient(int(login_proto.LoginPacketID_PACKET_SC_CUSTOMERINFOLIST), rawpack)
//
// }
// return nil
//}
type CSVerifyTypePacketFactory struct {
}
type CSVerifyTypeHandler struct {
}
func (this *CSVerifyTypePacketFactory) CreatePacket() interface{} {
pack := &login_proto.CSVerifyType{}
return pack
}
func (this *CSVerifyTypeHandler) Process(s *netlib.Session, packetid int, data interface{}, sid int64) error {
logger.Logger.Trace("CSVerifyTypeHandler Process recv ", data)
if msg, ok := data.(*login_proto.CSVerifyType); ok {
pf, _, _, _, _ := PlatformMgrSingleton.GetPlatformByPackageTag(msg.GetPlatformTag())
platform := PlatformMgrSingleton.GetPlatform(strconv.Itoa(int(pf)))
pack := &login_proto.SCVerifyType{}
if platform == nil {
pack.OpRetCode = login_proto.OpResultCode_OPRC_Error
} else {
pack.VerifyType = proto.Int32(platform.VerifyCodeType)
pack.OpRetCode = login_proto.OpResultCode_OPRC_Sucess
if platform.VerifyCodeType != common.CodeTypeNo && !reTelRule.MatchString(msg.GetTel()) {
pack := &login_proto.SCVerifyType{
OpRetCode: login_proto.OpResultCode_OPRC_TelError,
}
common.SendToGate(sid, int(login_proto.LoginPacketID_PACKET_SC_VERIFYTYPE), pack, s)
return nil
}
}
common.SendToGate(sid, int(login_proto.LoginPacketID_PACKET_SC_VERIFYTYPE), pack, s)
}
return nil
}
type CSRegisterVerifyTypePacketFactory struct {
}
type CSRegisterVerifyTypeHandler struct {
}
func (this *CSRegisterVerifyTypePacketFactory) CreatePacket() interface{} {
pack := &login_proto.CSRegisterVerifyType{}
return pack
}
func (this *CSRegisterVerifyTypeHandler) Process(s *netlib.Session, packetid int, data interface{}, sid int64) error {
logger.Logger.Trace("CSRegisterVerifyTypeHandler Process recv ", data)
if msg, ok := data.(*login_proto.CSRegisterVerifyType); ok {
pf, _, _, _, _ := PlatformMgrSingleton.GetPlatformByPackageTag(msg.GetPlatformTag())
platform := PlatformMgrSingleton.GetPlatform(strconv.Itoa(int(pf)))
pack := &login_proto.SCRegisterVerifyType{}
if platform == nil {
pack.OpRetCode = login_proto.OpResultCode_OPRC_Error
} else {
if platform.RegisterVerifyCodeSwitch {
pack.VerifyType = proto.Int32(common.CodeTypeNo)
} else {
pack.VerifyType = proto.Int32(platform.VerifyCodeType)
}
pack.OpRetCode = login_proto.OpResultCode_OPRC_Sucess
}
common.SendToGate(sid, int(login_proto.LoginPacketID_PACKET_SC_REGISTERVERIFYTYPE), pack, s)
}
return nil
}
// 获取三方游戏配置
type CSGetThrGameCfgPacketFactory struct {
}
type CSGetThrGameCfgHandler struct {
}
func (this *CSGetThrGameCfgPacketFactory) CreatePacket() interface{} {
pack := &login_proto.CSGetThrGameCfg{}
return pack
}
func (this *CSGetThrGameCfgHandler) Process(s *netlib.Session, packetid int, data interface{}, sid int64) error {
logger.Logger.Trace("CSGetThrGameCfgHandler Process recv ", data)
if msg, ok := data.(*login_proto.CSGetThrGameCfg); ok {
p := PlayerMgrSington.GetOnlinePlayer(sid)
if p == nil {
logger.Logger.Warn("CSGetThrGameCfgHandler p == nil")
return nil
}
pack := &login_proto.SCGetThrGameCfg{}
plf := msg.GetPlatform()
//加载配置
gps := PlatformMgrSingleton.GetGameFrees(plf)
for _, v := range gps {
if v.Status {
if v.DbGameFree.GetGameRule() == 0 {
pack.ThrGameCfg = append(pack.ThrGameCfg, &login_proto.LoginThrGameConfig{
LogicId: proto.Int32(v.DbGameFree.Id),
LimitCoin: proto.Int64(v.DbGameFree.GetLimitCoin()),
})
}
}
}
p.SendToClient(int(login_proto.LoginPacketID_PACKET_SC_GETTHRGAMECFG), pack)
}
return nil
}
func init() {
//登录
common.RegisterHandler(int(login_proto.LoginPacketID_PACKET_CS_LOGIN), &CSLoginHandler{})
netlib.RegisterFactory(int(login_proto.LoginPacketID_PACKET_CS_LOGIN), &CSLoginPacketFactory{})
//平台配置信息
common.RegisterHandler(int(login_proto.LoginPacketID_PACKET_CS_PLATFORMCFG), &CSPlatFormHandler{})
netlib.RegisterFactory(int(login_proto.LoginPacketID_PACKET_CS_PLATFORMCFG), &CSPlatFormPacketFactory{})
////公告信息
//common.RegisterHandler(int(login_proto.LoginPacketID_PACKET_CS_BULLETIONINFO), &CSBulletionInfoHandler{})
//netlib.RegisterFactory(int(login_proto.LoginPacketID_PACKET_CS_BULLETIONINFO), &CSBulletionInfoPacketFactory{})
////招商信息
//common.RegisterHandler(int(login_proto.LoginPacketID_PACKET_CS_CUSTOMERINFOLIST), &CSCustomerInfoListHandler{})
//netlib.RegisterFactory(int(login_proto.LoginPacketID_PACKET_CS_CUSTOMERINFOLIST), &CSCustomerInfoListPacketFactory{})
// 获取验证码配置
common.RegisterHandler(int(login_proto.LoginPacketID_PACKET_CS_VERIFYTYPE), &CSVerifyTypeHandler{})
netlib.RegisterFactory(int(login_proto.LoginPacketID_PACKET_CS_VERIFYTYPE), &CSVerifyTypePacketFactory{})
// 获取登录验证码类型
common.RegisterHandler(int(login_proto.LoginPacketID_PACKET_CS_REGISTERVERIFYTYPE), &CSRegisterVerifyTypeHandler{})
netlib.RegisterFactory(int(login_proto.LoginPacketID_PACKET_CS_REGISTERVERIFYTYPE), &CSRegisterVerifyTypePacketFactory{})
//获取三方游戏配置
common.RegisterHandler(int(login_proto.LoginPacketID_PACKET_CS_GETTHRGAMECFG), &CSGetThrGameCfgHandler{})
netlib.RegisterFactory(int(login_proto.LoginPacketID_PACKET_CS_GETTHRGAMECFG), &CSGetThrGameCfgPacketFactory{})
}