game_sync/worldsrv/action_player.go

3276 lines
103 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/base64"
"encoding/hex"
"encoding/json"
"fmt"
"io"
"math/rand"
"net/url"
"regexp"
"strconv"
"strings"
"time"
"unicode/utf8"
"mongo.games.com/goserver/core/basic"
"mongo.games.com/goserver/core/i18n"
"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"
player_proto "mongo.games.com/game/protocol/player"
webapi_proto "mongo.games.com/game/protocol/webapi"
"mongo.games.com/game/webapi"
)
var reTelRule, _ = regexp.Compile(`^(1[3|4|5|6|7|8|9][0-9]\d{4,8})$`)
// 获取邀请码奖励
type CSInviteCodePlayerPacketFactory struct {
}
type CSInviteCodePlayerHandler struct {
}
func (this *CSInviteCodePlayerPacketFactory) CreatePacket() interface{} {
pack := &player_proto.CSPlayerInviteCode{}
return pack
}
func (this *CSInviteCodePlayerHandler) Process(s *netlib.Session, packetid int, data interface{}, sid int64) error {
logger.Logger.Trace("CSInviteCodePlayerHandler Process recv ", data)
if msg, ok := data.(*player_proto.CSPlayerInviteCode); ok {
p := PlayerMgrSington.GetPlayer(sid)
if p == nil {
logger.Logger.Warn("CSInviteCodePlayerHandler p == nil")
return nil
}
inviteCode := msg.GetCode()
task.New(nil, task.CallableWrapper(func(o *basic.Object) interface{} {
var ret webapi.RequestBody
var err error
data := make(url.Values)
data["MemberId"] = []string{strconv.Itoa(int(p.SnId))}
data["Key"] = []string{inviteCode}
ret, err = webapi.API_OP("/api/ExchangeCode/MemberExchangeCode", data)
logger.Logger.Trace("webapi返回数据: ", ret)
if err != nil {
return nil
}
if ret == nil {
return nil
}
state, _ := ret.GetInt("State")
if state == 0 {
return nil
}
ret_data, _ := ret.GetRequestBody("Data")
if ret_data == nil {
return nil
}
coin, _ := ret_data.GetInt64("Price")
if coin <= 0 {
return nil
}
//发送邮件
var otherParams []int32
newMsg := model.NewMessage("", p.SnId, "", p.SnId, model.MSGTYPE_INVITECODE, p.Name, inviteCode, coin, 0,
model.MSGSTATE_UNREAD, time.Now().Unix(), 0, "", otherParams, p.Platform, model.HallAll, nil)
err = model.InsertMessage(p.Platform, newMsg)
if err == nil {
//执行成功后通知后端
data := make(url.Values)
data["Snid"] = []string{strconv.Itoa(int(p.SnId))}
data["Code"] = []string{inviteCode}
data["State"] = []string{strconv.Itoa(1)}
_, err_res := webapi.API_OP("/api/ExchangeCode/MemberExchangeCodeSuccess", data)
if err_res != nil {
logger.Logger.Error("/api/ExchangeCode/MemberExchangeCodeSuccess err ", err_res)
}
return newMsg
} else {
//执行失败后通知后端
data := make(url.Values)
data["Snid"] = []string{strconv.Itoa(int(p.SnId))}
data["Code"] = []string{inviteCode}
data["State"] = []string{strconv.Itoa(0)}
_, err_res := webapi.API_OP("/api/ExchangeCode/MemberExchangeCodeSuccess", data)
if err_res != nil {
logger.Logger.Error("/api/ExchangeCode/MemberExchangeCodeSuccess err ", err_res)
}
return nil
}
}), task.CompleteNotifyWrapper(func(data interface{}, t task.Task) {
retCode := player_proto.OpResultCode_OPRC_Sucess
if newMsg, OK := data.(*model.Message); OK {
p.AddMessage(newMsg)
} else {
retCode = player_proto.OpResultCode_OPRC_Error
}
//错误提示
pack := &player_proto.SCPlayerInviteCode{
OpRetCode: retCode,
}
proto.SetDefaults(pack)
p.SendToClient(int(player_proto.PlayerPacketID_PACKET_SC_INVITECODE), pack)
}), "InviteCode").Start()
}
return nil
}
// 修改昵称
type CSPlayerChangeNickPacketFactory struct {
}
type CSPlayerChangeNickHandler struct {
}
func (this *CSPlayerChangeNickPacketFactory) CreatePacket() interface{} {
pack := &player_proto.CSChangeNick{}
return pack
}
func (this *CSPlayerChangeNickHandler) Process(s *netlib.Session, packetid int, data interface{}, sid int64) error {
//logger.Logger.Trace("CSPlayerChangeNickHandler Process recv ", data)
//if msg, ok := data.(*player_proto.CSChangeNick); ok {
// //logger.Logger.Trace("修改昵称获得IP",s.RemoteAddr())
// p := PlayerMgrSington.GetPlayer(sid)
// if p == nil {
// logger.Logger.Warn("CSPlayerChangeNickHandler p == nil")
// return nil
// }
//
// sendPack := func(code *player_proto.OpResultCode) {
// pack := &player_proto.SCChangeNick{
// OpRetCode: code,
// Nick: msg.Nick,
// }
// proto.SetDefaults(pack)
// p.SendToClient(int(player_proto.PlayerPacketID_PACKET_SC_CHANGENICK), pack)
// }
//
// nick := msg.GetNick()
// //昵称不能为空
// if nick == "" {
// sendPack(player_proto.OpResultCode_OPRC_NickIsNull)
// return nil
// }
//
// if !utf8.ValidString(nick) {
// sendPack(player_proto.OpResultCode_OPRC_NickIsIllegal)
// return nil
// }
// //昵称已占用,昵称允许重复
// //if model.GetPlayerNickIsExist(nick) {
// // sendPack(player_proto.OpResultCode_OPRC_NickIsExist)
// // return nil
// //}
//
// //昵称超出长度限制
// if len(nick) > 21 {
// sendPack(player_proto.OpResultCode_OPRC_NickIsTooLen)
// return nil
// }
//
// if p.IsStopRename == 1 {
// sendPack(player_proto.OpResultCode_OPRC_NickIsCantRename)
// return nil
// }
//
// //TODO 校验昵称的合法性
// //var agentName, agentKey, thirdPlf = model.GetDgConfigByPlatform(p.Platform)
// var agentDgName, agentDgKey, thirdDgPlf = model.OnlyGetDgConfigByPlatform(p.Platform)
// var agentHboName, agentHboKey, thirdHboPlf = model.OnlyGetHboConfigByPlatform(p.Platform)
// //为了兼容以前的数据
// var hboGame, hboPass, dgGame, dgPass string
// if len(p.StoreHboGame) > 0 {
// hboGame = p.StoreHboGame
// hboPass = p.StoreHboPass
// }
// if len(p.StoreDgGame) > 0 {
// dgGame = p.StoreDgGame
// dgPass = p.StoreDgPass
// }
// if len(p.DgGame) > 0 && strings.Contains(p.DgGame, "dg") {
// dgGame = p.DgGame
// dgPass = p.DgPass
// }
// if len(p.DgGame) > 0 && strings.Contains(p.DgGame, "hbo") {
// hboGame = p.DgGame
// hboPass = p.DgPass
// }
// task.New(nil, task.CallableWrapper(func(o *basic.Object) interface{} {
// code := model.UpdatePlayerNick(p.AccountId, msg.GetNick())
// if code == 0 {
//
// if len(hboGame) > 0 && len(agentHboName) > 0 {
// err, codeid, _, _ := webapi.API_DgUpdate(thirdHboPlf, common.GetAppId(),
// hboGame, hboPass, nick, agentHboName, agentHboKey)
// if err != nil {
// logger.Logger.Error("Update hbo name error:", err)
// }
// if codeid != 0 {
// logger.Logger.Error("Update hbo code:", codeid)
// }
// }
//
// if len(dgGame) > 0 && len(agentDgName) > 0 {
// err, codeid, _, _ := webapi.API_DgUpdate(thirdDgPlf, common.GetAppId(),
// dgGame, dgPass, nick, agentDgName, agentDgKey)
// if err != nil {
// logger.Logger.Error("Update dg name error:", err)
// }
// if codeid != 0 {
// logger.Logger.Error("Update dg code:", codeid)
// }
// }
//
// }
// return code
// }), task.CompleteNotifyWrapper(func(data interface{}, t *task.Task) {
// if i, ok := data.(int); ok {
// if i == 0 {
// PlayerSubjectSign.UpdateName(p.SnId, nick)
// sendPack(player_proto.OpResultCode_OPRC_Sucess)
// } else {
// sendPack(player_proto.OpResultCode_OPRC_Error)
// }
// }
// }), "UpdatePlayerNick").Start()
//}
return nil
}
// 修改头像
type CSPlayerChangeIconPacketFactory struct {
}
type CSPlayerChangeIconHandler struct {
}
func (this *CSPlayerChangeIconPacketFactory) CreatePacket() interface{} {
pack := &player_proto.CSPlayerChangeIcon{}
return pack
}
func (this *CSPlayerChangeIconHandler) Process(s *netlib.Session, packetid int, data interface{}, sid int64) error {
logger.Logger.Trace("CSPlayerChangeIconHandler Process recv ", data)
if msg, ok := data.(*player_proto.CSPlayerChangeIcon); ok {
p := PlayerMgrSington.GetPlayer(sid)
if p == nil {
logger.Logger.Warn("CSPlayerChangeIconHandler p == nil")
return nil
}
sendPack := func(code player_proto.OpResultCode) {
pack := &player_proto.SCPlayerChangeIcon{
OpRetCode: code,
Icon: msg.Icon,
}
proto.SetDefaults(pack)
p.SendToClient(int(player_proto.PlayerPacketID_PACKET_SC_CHANGEICON), pack)
}
if int32(time.Now().Sub(p.changeIconTime)/time.Second) > 30 {
PlayerSubjectSign.UpdateHead(p.SnId, msg.GetIcon())
sendPack(player_proto.OpResultCode_OPRC_Sucess)
} else {
sendPack(player_proto.OpResultCode_OPRC_Frequently)
}
}
return nil
}
// 修改头像框
type CSPlayerChangeHeadOutLinePacketFactory struct {
}
type CSPlayerChangeHeadOutLineHandler struct {
}
func (this *CSPlayerChangeHeadOutLinePacketFactory) CreatePacket() interface{} {
pack := &player_proto.CSPlayerChangeHeadOutLine{}
return pack
}
func (this *CSPlayerChangeHeadOutLineHandler) Process(s *netlib.Session, packetid int, data interface{}, sid int64) error {
logger.Logger.Trace("CSPlayerChangeHeadOutLineHandler Process recv ", data)
if msg, ok := data.(*player_proto.CSPlayerChangeHeadOutLine); ok {
p := PlayerMgrSington.GetPlayer(sid)
if p == nil {
logger.Logger.Warn("CSPlayerChangeHeadOutLineHandler p == nil")
return nil
}
sendPack := func(code player_proto.OpResultCode) {
pack := &player_proto.SCPlayerChangeHeadOutLine{
OpRetCode: code,
HeadOutLine: msg.HeadOutLine,
}
proto.SetDefaults(pack)
p.SendToClient(int(player_proto.PlayerPacketID_PACKET_SC_HEADOUTLINE), pack)
}
headOutline := msg.GetHeadOutLine()
can := false
for vip := int32(0); vip <= p.VIP; vip++ {
dbVip := VipMgrSington.GetVIPLevelCfg(p.Platform, vip)
if dbVip != nil {
if common.InSliceInt32(dbVip.GetRewardOutlineID(), headOutline) {
can = true
break
}
}
}
if !can {
sendPack(player_proto.OpResultCode_OPRC_IconError)
return nil
}
if msg.GetHeadOutLine() != 0 {
PlayerSubjectSign.UpdateHeadOutline(p.SnId, headOutline)
sendPack(player_proto.OpResultCode_OPRC_Sucess)
} else {
sendPack(player_proto.OpResultCode_OPRC_Frequently)
}
}
return nil
}
// 修改性别
type CSPlayerChangeSexPacketFactory struct {
}
type CSPlayerChangeSexHandler struct {
}
func (this *CSPlayerChangeSexPacketFactory) CreatePacket() interface{} {
pack := &player_proto.CSPlayerChangeSex{}
return pack
}
func (this *CSPlayerChangeSexHandler) Process(s *netlib.Session, packetid int, data interface{}, sid int64) error {
logger.Logger.Trace("CSPlayerChangeSexHandler Process recv ", data)
if msg, ok := data.(*player_proto.CSPlayerChangeSex); ok {
p := PlayerMgrSington.GetPlayer(sid)
if p == nil {
logger.Logger.Warn("CSPlayerChangeSexHandler p == nil")
return nil
}
sendPack := func(code player_proto.OpResultCode) {
pack := &player_proto.SCPlayerChangeSex{
OpRetCode: code,
Sex: msg.Sex,
}
proto.SetDefaults(pack)
p.SendToClient(int(player_proto.PlayerPacketID_PACKET_SC_CHANGESEX), pack)
}
if msg.GetSex() < 0 || msg.GetSex() > 2 {
sendPack(player_proto.OpResultCode_OPRC_SexError)
return nil
}
p.Sex = msg.GetSex()
p.dirty = true
sendPack(player_proto.OpResultCode_OPRC_Sucess)
}
return nil
}
//// 帐号绑定,帐号密码找回,保险箱密码找回
//type CSUpgradeAccountPacketFactory struct {
//}
//type CSUpgradeAccountHandler struct {
//}
//
//func (this *CSUpgradeAccountPacketFactory) CreatePacket() interface{} {
// pack := &player_proto.CSUpgradeAccount{}
// return pack
//}
//
//func (this *CSUpgradeAccountHandler) Process(s *netlib.Session, packetid int, data interface{}, sid int64) error {
// logger.Logger.Trace("CSUpgradeAccountHandler Process recv ", data)
// if msg, ok := data.(*player_proto.CSUpgradeAccount); ok {
// p := PlayerMgrSington.GetPlayer(sid)
//
// sendPack := func(code player_proto.OpResultCode) {
// pack := &player_proto.SCUpgradeAccount{
// OpRetCode: code,
// Tel: msg.Tel,
// ChangeType: msg.ChangeType,
// }
// proto.SetDefaults(pack)
// //p.SendToClient(int(player_proto.PlayerPacketID_PACKET_SC_UPGRADEACCOUNT), pack)
// common.SendToGate(sid, int(player_proto.PlayerPacketID_PACKET_SC_UPGRADEACCOUNT), pack, s)
// }
//
// //验证手机号
// tel := msg.GetTel()
// if !reTelRule.MatchString(tel) {
// sendPack(player_proto.OpResultCode_OPRC_TelError)
// return nil
// }
// platformId, _, _, _, tagkey := PlatformMgrSingleton.GetPlatformByPackageTag(msg.GetPlatformTag())
// platformID := strconv.Itoa(int(platformId))
// platform := PlatformMgrSingleton.GetPlatform(platformID)
// if msg.GetChangeType() == 0 {
// if !platform.RegisterVerifyCodeSwitch {
// code := CacheMemory.Get(fmt.Sprintf("%v_%v", tel, tagkey))
// if code == nil {
// sendPack(player_proto.OpResultCode_OPRC_VerificationCodeError)
// return nil
// }
// if verifyCode, ok := code.(string); ok && verifyCode != "" {
// if verifyCode != msg.GetVerificationCode() {
// sendPack(player_proto.OpResultCode_OPRC_VerificationCodeError)
// return nil
// }
// }
// }
// } else {
// if platform.VerifyCodeType != common.CodeTypeNo {
// code := CacheMemory.Get(fmt.Sprintf("%v_%v", tel, tagkey))
// if code == nil {
// sendPack(player_proto.OpResultCode_OPRC_VerificationCodeError)
// return nil
// }
// if verifyCode, ok := code.(string); ok && verifyCode != "" {
// if verifyCode != msg.GetVerificationCode() {
// sendPack(player_proto.OpResultCode_OPRC_VerificationCodeError)
// return nil
// }
// }
// }
// }
//
// //验证密码
// if msg.GetPassword() == "" || len(msg.GetPassword()) < 32 {
// sendPack(player_proto.OpResultCode_OPRC_UpgradeAccount_PasswordIllegal)
// return nil
// }
//
// var upgradeaccountcount int32
// //升级账号
// task.New(nil, task.CallableWrapper(func(o *basic.Object) interface{} {
// //绑定手机
// if msg.GetChangeType() == 0 {
// if p != nil {
// //手机号是否已经注册
// if model.PlayerTelIsExist(msg.GetTel(), platformID, tagkey) {
// sendPack(player_proto.OpResultCode_OPRC_TelIsExist)
// return errors.New("TelIsExist is Error")
// }
// //帐号绑定
// //更新Account数据
// err := model.UpgradeAccount(p.AccountId, msg.GetTel(), msg.GetPassword(), platformID, tagkey)
// if err != nil {
// return err
// }
//
// //当前IP和日期已经赠送的金币总额
// upgradeaccountcount = model.GetUpgradeAccountCoinLogsByIPAndDate(p.RegIp, p.Platform, time.Now())
// //更新玩家信息表
// return model.UpdatePlayerTel(p.Platform, p.SnId, msg.GetTel())
// } else {
// //账号密码找回
// return model.GetBackPlayerPassword(msg.GetTel(), msg.GetPassword(), platformID, tagkey)
// }
// }
// //设置保险箱密码
// /*if msg.GetChangeType() == 1 {
// raw := fmt.Sprintf("111111%v", common.GetAppId())
// h := md5.New()
// io.WriteString(h, raw)
// pwd := hex.EncodeToString(h.Sum(nil))
// return model.UpdateSafeBoxPassword(p.AccountId, pwd, msg.GetPassword())
// }*/
// //帐号密码找回
// if msg.GetChangeType() == 2 {
// //账号密码找回
// return model.GetBackPlayerPassword(msg.GetTel(), msg.GetPassword(), platformID, tagkey)
// }
// //保险箱密码找回
// if msg.GetChangeType() == 3 {
// if p != nil {
// p.SafeBoxPassword = msg.GetPassword()
// }
// return model.GetBackSafeBoxPassword(msg.GetTel(), msg.GetPassword(), platformID, tagkey)
// }
// return fmt.Errorf("GetChangeType is Error:%v", msg.GetChangeType())
// }), task.CompleteNotifyWrapper(func(data interface{}, t task.Task) {
// if data == nil {
// if msg.GetChangeType() == 0 || msg.GetChangeType() == 2 {
// als := LoginStateMgrSington.GetLoginStateByTelAndPlatform(msg.GetTel(), platformID)
// if als != nil && als.acc != nil {
// als.acc.Tel = msg.GetTel()
// als.acc.TelPassWord = msg.GetPassword()
// }
// }
// if p != nil {
// oldTel := p.Tel
// p.Tel = msg.GetTel()
// if msg.GetChangeType() == 0 {
// if !p.IsRob {
// //用户绑定事件
// if oldTel == "" { //首次绑定账号
// p.UpgradeTime = time.Now()
// p.ReportBindPhoneEvent()
// //p.ReportWebEvent(model.WEBEVENT_UPGRADEACC, 0, 0, 1)
//
// //升级账号赠送
// upgradeAccountGiveCoin := p.GetUpdateAccPrize()
// if upgradeAccountGiveCoin > 0 && !p.layered[common.ActId_UpgradeAccount] {
// if model.GameParamData.UpgradeAccountGiveCoinLimit != 0 && upgradeaccountcount < model.GameParamData.UpgradeAccountGiveCoinLimit {
// p.AddCoin(int64(upgradeAccountGiveCoin), common.GainWay_UpgradeAccount, "", "")
// //增加泥码
// p.AddDirtyCoin(0, int64(upgradeAccountGiveCoin))
// p.AddPayCoinLog(int64(upgradeAccountGiveCoin), model.PayCoinLogType_Coin, "system")
// p.ReportSystemGiveEvent(upgradeAccountGiveCoin, common.GainWay_UpgradeAccount, true)
// } else {
// upgradeAccountGiveCoin = 0
// sendPack(player_proto.OpResultCode_OPRC_Account_IP_TooManyReg)
// }
// }
//
// //记录赠送日志
// task.New(nil, task.CallableWrapper(func(o *basic.Object) interface{} {
// model.InsertUpgradeAccountCoinLog(p.RegIp, time.Now(), upgradeAccountGiveCoin, p.SnId, p.Channel, p.Platform, p.BeUnderAgentCode, p.PackageID, p.City, p.InviterId)
// return nil
// }), nil, "InsertUpgradeAccountCoinLog").StartByFixExecutor("InsertUpgradeAccountCoinLog")
// //正式用户的登录红包
// //actRandCoinMgr.OnRandOnlineCoin(p)
// }
// }
// }
// }
// sendPack(player_proto.OpResultCode_OPRC_Sucess)
// } else {
// logger.Logger.Warnf("UpgradeAccount err:%v", data)
// sendPack(player_proto.OpResultCode_OPRC_Error)
// }
// }), "UpgradeAccount").StartByExecutor(msg.GetTel())
// }
//
// return nil
//}
// 绑定支付宝
type CSBindAlipayPacketFactory struct {
}
type CSBindAlipayHandler struct {
}
func (this *CSBindAlipayPacketFactory) CreatePacket() interface{} {
pack := &player_proto.CSBindAlipay{}
return pack
}
func (this *CSBindAlipayHandler) Process(s *netlib.Session, packetid int, data interface{}, sid int64) error {
logger.Logger.Trace("CSBindAlipayHandler Process recv ", data)
if msg, ok := data.(*player_proto.CSBindAlipay); ok {
p := PlayerMgrSington.GetPlayer(sid)
if p == nil {
logger.Logger.Warn("CSBindAlipayHandler p == nil")
return nil
}
sendPack := func(code player_proto.OpResultCode) {
pack := &player_proto.SCBindAlipay{
OpRetCode: code,
AlipayAccount: msg.AlipayAccount,
AlipayAccName: msg.AlipayAccName,
}
proto.SetDefaults(pack)
p.SendToClient(int(player_proto.PlayerPacketID_PACKET_SC_BINDALIPAY), pack)
}
platform := PlatformMgrSingleton.GetPlatform(p.Platform)
if platform != nil {
if !platform.IsMarkFlag(int32(BindAlipay)) {
sendPack(player_proto.OpResultCode_OPRC_BindAlipay_PlatformError)
return nil
}
}
alipayAccount := msg.GetAlipayAccount()
if alipayAccount == "" {
sendPack(player_proto.OpResultCode_OPRC_BindAlipay_AccountEmpty)
return nil
}
if !utf8.ValidString(alipayAccount) {
sendPack(player_proto.OpResultCode_OPRC_BindAlipay_AccountIllegal)
return nil
}
alipayAccName := msg.GetAlipayAccName()
if alipayAccName == "" {
sendPack(player_proto.OpResultCode_OPRC_BindAlipay_AccNameEmpty)
return nil
}
if !utf8.ValidString(alipayAccName) {
sendPack(player_proto.OpResultCode_OPRC_BindAlipay_AccNameIllegal)
return nil
}
if platform.NeedSameName {
if p.BankAccName != "" {
if p.BankAccName != alipayAccName {
sendPack(player_proto.OpResultCode_OPRC_BankAndAli_NotSame)
return nil
}
}
}
if msg.GetPassword() == "" || len(msg.GetPassword()) < 32 {
sendPack(player_proto.OpResultCode_OPRC_Safebox_PasswordIllegal)
return nil
}
raw := fmt.Sprintf("%v%v%v", p.SafeBoxPassword, common.GetAppId(), msg.GetTimeStamp())
h := md5.New()
io.WriteString(h, raw)
hashsum := hex.EncodeToString(h.Sum(nil))
if hashsum != msg.GetPassword() {
sendPack(player_proto.OpResultCode_OPRC_Safebox_PasswordIllegal)
return nil
}
var limitCount int32
if platform != nil && platform.PerBankNoLimitAccount != 0 {
limitCount = platform.PerBankNoLimitAccount
}
var prohibit bool
var isLimitNum bool
//绑定支付宝账号
task.New(nil, task.CallableWrapper(func(o *basic.Object) interface{} {
cnt := model.CountAlipayAccountCount(p.Platform, msg.GetAlipayAccount())
if limitCount > 0 && cnt >= int(limitCount) { //没有事务,存在容差,认为可以容忍
prohibit = true
return nil
}
if platform.PerBankNoLimitName > 0 {
cnt := model.CountBankAlipayNameCount(p.Platform, alipayAccName, p.SnId)
if cnt >= int(platform.PerBankNoLimitName) {
isLimitNum = true
return nil
}
}
err := model.UpdatePlayerAlipay(p.Platform, p.SnId, alipayAccount, alipayAccName)
if err == nil {
model.NewBankBindLog(p.SnId, p.Platform, model.BankBindLogType_Ali, msg.GetAlipayAccName(),
msg.GetAlipayAccount(), 1)
}
return err
}), task.CompleteNotifyWrapper(func(data interface{}, t task.Task) {
if data == nil {
if prohibit {
sendPack(player_proto.OpResultCode_OPRC_BindAlipay_CountLimit)
} else if isLimitNum {
sendPack(player_proto.OpResultCode_OPRC_BindBankAlipay_NameCountLimit)
} else {
p.AlipayAccount = msg.GetAlipayAccount()
p.AlipayAccName = msg.GetAlipayAccName()
//用户绑定支付宝事件
p.ReportBindAlipayEvent()
sendPack(player_proto.OpResultCode_OPRC_Sucess)
}
} else {
sendPack(player_proto.OpResultCode_OPRC_Error)
}
}), "UpdatePlayerAlipay").StartByExecutor(strconv.Itoa(int(p.SnId)))
}
return nil
}
// 绑定银行卡
type CSBindBankPacketFactory struct {
}
type CSBindBankHandler struct {
}
func (this *CSBindBankPacketFactory) CreatePacket() interface{} {
pack := &player_proto.CSBindBank{}
return pack
}
func (this *CSBindBankHandler) Process(s *netlib.Session, packetid int, data interface{}, sid int64) error {
logger.Logger.Trace("CSBindBankHandler Process recv ", data)
if msg, ok := data.(*player_proto.CSBindBank); ok {
p := PlayerMgrSington.GetPlayer(sid)
if p == nil {
logger.Logger.Warn("CSBindBankHandler p == nil")
return nil
}
sendPack := func(code player_proto.OpResultCode) {
pack := &player_proto.SCBindBank{
OpRetCode: code,
Bank: msg.Bank,
BankAccount: msg.BankAccount,
BankAccName: msg.BankAccName,
}
proto.SetDefaults(pack)
p.SendToClient(int(player_proto.PlayerPacketID_PACKET_SC_BINDBANK), pack)
}
platform := PlatformMgrSingleton.GetPlatform(p.Platform)
if platform != nil {
if !platform.IsMarkFlag(int32(BindBackCard)) {
sendPack(player_proto.OpResultCode_OPRC_BindBank_PlatformError)
return nil
}
}
bank := msg.GetBank()
if bank == "" {
sendPack(player_proto.OpResultCode_OPRC_BindBank_NameEmpty)
return nil
}
if !utf8.ValidString(bank) {
sendPack(player_proto.OpResultCode_OPRC_BindBank_NameIllegal)
return nil
}
bankAccount := msg.GetBankAccount()
if bankAccount == "" {
sendPack(player_proto.OpResultCode_OPRC_BindBank_AccountEmpty)
return nil
}
if !utf8.ValidString(bankAccount) {
sendPack(player_proto.OpResultCode_OPRC_BindBank_AccountIllegal)
return nil
}
bankAccName := msg.GetBankAccName()
if bankAccName == "" {
sendPack(player_proto.OpResultCode_OPRC_BindBank_AccNameEmpty)
return nil
}
if !utf8.ValidString(bankAccName) {
sendPack(player_proto.OpResultCode_OPRC_BindBank_AccNameIllegal)
return nil
}
if platform.NeedSameName {
if p.AlipayAccName != "" {
if p.AlipayAccName != bankAccName {
sendPack(player_proto.OpResultCode_OPRC_BankAndAli_NotSame)
return nil
}
}
}
if msg.GetPassword() == "" || len(msg.GetPassword()) < 32 {
sendPack(player_proto.OpResultCode_OPRC_Safebox_PasswordIllegal)
return nil
}
raw := fmt.Sprintf("%v%v%v", p.SafeBoxPassword, common.GetAppId(), msg.GetTimeStamp())
h := md5.New()
io.WriteString(h, raw)
hashsum := hex.EncodeToString(h.Sum(nil))
if hashsum != msg.GetPassword() {
sendPack(player_proto.OpResultCode_OPRC_Safebox_PasswordIllegal)
return nil
}
if p.BankAccount != "" {
logger.Logger.Errorf("player had bank,now modify:%v", p.SnId)
}
var limitCount int32
if platform != nil && platform.PerBankNoLimitAccount != 0 {
limitCount = platform.PerBankNoLimitAccount
}
var prohibit bool
var isLimitNum bool
//绑定银行账号
task.New(nil, task.CallableWrapper(func(o *basic.Object) interface{} {
cnt := model.CountBankAccountCount(p.Platform, bankAccount)
if limitCount > 0 && cnt >= int(limitCount) { //没有事务,存在容差,认为可以容忍
prohibit = true
return nil
}
if platform.PerBankNoLimitName > 0 {
cnt := model.CountBankAlipayNameCount(p.Platform, bankAccName, p.SnId)
if cnt >= int(platform.PerBankNoLimitName) {
isLimitNum = true
return nil
}
}
err := model.UpdatePlayerBank(p.Platform, p.SnId, bank, bankAccount, bankAccName)
if err == nil {
model.NewBankBindLog(p.SnId, p.Platform, model.BankBindLogType_Bank, bankAccName, bankAccount, 1)
}
return err
}), task.CompleteNotifyWrapper(func(data interface{}, t task.Task) {
if data == nil {
if prohibit {
sendPack(player_proto.OpResultCode_OPRC_BindBank_CountLimit)
} else if isLimitNum {
sendPack(player_proto.OpResultCode_OPRC_BindBankAlipay_NameCountLimit)
} else {
p.Bank = bank
p.BankAccount = bankAccount
p.BankAccName = bankAccName
sendPack(player_proto.OpResultCode_OPRC_Sucess)
}
} else {
sendPack(player_proto.OpResultCode_OPRC_Error)
}
}), "UpdatePlayerBank").StartByExecutor(strconv.Itoa(int(p.SnId)))
}
return nil
}
// 修改密码
type CSChangePasswordPacketFactory struct {
}
type CSChangePasswordHandler struct {
}
func (this *CSChangePasswordPacketFactory) CreatePacket() interface{} {
pack := &player_proto.CSChangePassword{}
return pack
}
func (this *CSChangePasswordHandler) Process(s *netlib.Session, packetid int, data interface{}, sid int64) error {
logger.Logger.Trace("CSChangePasswordHandler Process recv ", data)
if msg, ok := data.(*player_proto.CSChangePassword); ok {
p := PlayerMgrSington.GetPlayer(sid)
if p == nil {
logger.Logger.Warn("CSChangePasswordHandler p == nil")
return nil
}
sendPack := func(code player_proto.OpResultCode) {
pack := &player_proto.SCChangePassword{
OpRetCode: code,
ChangeType: msg.ChangeType,
}
proto.SetDefaults(pack)
p.SendToClient(int(player_proto.PlayerPacketID_PACKET_SC_CHANGEPASSWORD), pack)
}
//修改类型不匹配
if msg.GetChangeType() < 0 || msg.GetChangeType() > 2 {
sendPack(player_proto.OpResultCode_OPRC_Error)
return nil
}
//旧密码
if msg.GetOldPassword() == "" || len(msg.GetOldPassword()) < 32 {
if msg.GetChangeType() == 0 {
sendPack(player_proto.OpResultCode_OPRC_UpgradeAccount_PasswordIllegal)
} else {
sendPack(player_proto.OpResultCode_OPRC_Safebox_PasswordIllegal)
}
return nil
}
//新密码
if msg.GetNewPassword() == "" || len(msg.GetNewPassword()) < 32 {
if msg.GetChangeType() == 0 {
sendPack(player_proto.OpResultCode_OPRC_UpgradeAccount_PasswordIllegal)
} else {
sendPack(player_proto.OpResultCode_OPRC_Safebox_PasswordIllegal)
}
return nil
}
if msg.GetNewPassword() == msg.GetOldPassword() && msg.GetChangeType() != 2 {
sendPack(player_proto.OpResultCode_OPRC_PasswordEqual)
return nil
}
switch msg.GetChangeType() { //0帐号密码 1保险箱密码 2设置保险箱密码
case 0:
//修改帐号密码
task.New(nil, task.CallableWrapper(func(o *basic.Object) interface{} {
return model.UpdatePlayerPassword(p.Platform, p.AccountId, msg.GetOldPassword(), msg.GetNewPassword())
}), task.CompleteNotifyWrapper(func(data interface{}, t task.Task) {
if data == nil {
als := LoginStateMgrSington.GetLoginStateByAccId(p.AccountId)
if als != nil && als.acc != nil {
als.acc.TelPassWord = msg.GetNewPassword()
}
sendPack(player_proto.OpResultCode_OPRC_Sucess)
} else {
sendPack(player_proto.OpResultCode_OPRC_Error)
}
}), "UpdatePlayerPassword").StartByExecutor(strconv.Itoa(int(p.SnId)))
case 1:
//验证保险箱密码
if p.SafeBoxPassword != msg.GetOldPassword() {
sendPack(player_proto.OpResultCode_OPRC_Safebox_PasswordIllegal)
return nil
}
//修改帐号密码
task.New(nil, task.CallableWrapper(func(o *basic.Object) interface{} {
return model.UpdateSafeBoxPassword(p.Platform, p.AccountId, msg.GetOldPassword(), msg.GetNewPassword())
}), task.CompleteNotifyWrapper(func(data interface{}, t task.Task) {
if i, ok := data.(int); ok {
if i == 0 {
p.SafeBoxPassword = msg.GetNewPassword()
sendPack(player_proto.OpResultCode_OPRC_Sucess)
} else {
sendPack(player_proto.OpResultCode_OPRC_Error)
}
}
}), "UpdatePlayerPassword").StartByExecutor(strconv.Itoa(int(p.SnId)))
case 2:
//验证保险箱密码
/*raw := fmt.Sprintf("%v%v%v", p.SafeBoxPassword, common.GetAppId(), msg.GetTimeStamp())
h := md5.New()
io.WriteString(h, raw)
hashsum := hex.EncodeToString(h.Sum(nil))
if hashsum != msg.GetOldPassword() {
sendPack(player_proto.OpResultCode_OPRC_Safebox_PasswordIllegal)
return nil
}*/
raw := fmt.Sprintf("%v%v", model.DEFAULT_PLAYER_SAFEBOX_PWD, common.GetAppId())
h := md5.New()
io.WriteString(h, raw)
pwd := hex.EncodeToString(h.Sum(nil))
//修改帐号密码
task.New(nil, task.CallableWrapper(func(o *basic.Object) interface{} {
return model.UpdateSafeBoxPassword(p.Platform, p.AccountId, pwd, msg.GetNewPassword())
}), task.CompleteNotifyWrapper(func(data interface{}, t task.Task) {
if i, ok := data.(int); ok {
if i == 0 {
p.SafeBoxPassword = msg.GetNewPassword()
sendPack(player_proto.OpResultCode_OPRC_Sucess)
} else {
sendPack(player_proto.OpResultCode_OPRC_Error)
}
}
}), "UpdatePlayerPassword").StartByExecutor(strconv.Itoa(int(p.SnId)))
}
//sendPack(player_proto.OpResultCode_OPRC_Sucess)
}
return nil
}
// 操作保险箱
type CSPlayerSafeBoxPacketFactory struct {
}
type CSPlayerSafeBoxHandler struct {
}
func (this *CSPlayerSafeBoxPacketFactory) CreatePacket() interface{} {
pack := &player_proto.CSPlayerOpCoin{}
return pack
}
func (this *CSPlayerSafeBoxHandler) Process(s *netlib.Session, packetid int, data interface{}, sid int64) error {
logger.Logger.Trace("CSPlayerSafeBoxHandler Process recv ", data)
if msg, ok := data.(*player_proto.CSPlayerOpCoin); ok {
p := PlayerMgrSington.GetPlayer(sid)
if p == nil {
logger.Logger.Warn("CSPlayerSafeBoxHandler p == nil")
return nil
}
if p.scene != nil {
logger.Logger.Warn("CSPlayerSafeBoxHandler p.scene != nil")
return nil
}
sendPack := func(code player_proto.OpResultCode) {
pack := &player_proto.SCPlayerOpCoin{
OpRetCode: code,
Op: msg.Op,
Coin: proto.Int64(p.Coin),
SafeBoxCoin: proto.Int64(p.SafeBoxCoin),
}
proto.SetDefaults(pack)
p.SendToClient(int(player_proto.PlayerPacketID_PACKET_SC_PLAYEROPCOIN), pack)
}
if msg.GetCoin() <= 0 {
sendPack(player_proto.OpResultCode_OPRC_Error)
return nil
}
snid := p.SnId
beforeCoin := p.Coin
beforeBank := p.SafeBoxCoin
afterCoin := p.Coin
afterBank := p.SafeBoxCoin
if msg.GetOp() == model.SafeBoxLogType_Save {
//验证金币
if p.Coin < msg.GetCoin() {
sendPack(player_proto.OpResultCode_OPRC_CoinNotEnough)
return nil
}
//计算日志数据
afterCoin = p.Coin - msg.GetCoin()
afterBank = p.SafeBoxCoin + msg.GetCoin()
//操作数据
p.SafeBoxCoin += msg.GetCoin()
p.AddCoin(-msg.GetCoin(), 0, common.GainWay_SafeBoxSave, "system", "保险箱存入")
p.dirty = true
} else if msg.GetOp() == model.SafeBoxLogType_TakeOut {
//验证金币
if p.SafeBoxCoin < msg.GetCoin() {
sendPack(player_proto.OpResultCode_OPRC_CoinNotEnough)
return nil
}
//验证密码
if msg.GetPassword() == "" || len(msg.GetPassword()) < 32 {
sendPack(player_proto.OpResultCode_OPRC_Safebox_PasswordIllegal)
return nil
}
hashsum := common.MakeMd5String(p.SafeBoxPassword, common.GetAppId(), strconv.Itoa(int(msg.GetTimeStamp())))
if hashsum != msg.GetPassword() {
sendPack(player_proto.OpResultCode_OPRC_SafeBoxPasswordError)
return nil
}
//计算日志数据
afterCoin = p.Coin + msg.GetCoin()
afterBank = p.SafeBoxCoin - msg.GetCoin()
//操作数据
p.SafeBoxCoin -= msg.GetCoin()
p.AddCoin(msg.GetCoin(), 0, common.GainWay_SafeBoxTakeOut, "system", "保险箱取出")
p.dirty = true
}
p.SendDiffData()
sendPack(player_proto.OpResultCode_OPRC_Sucess)
var oper string
var logs []*model.PayCoinLog
var coinPayts int64
var safePayts int64
billNo := time.Now().UnixNano()
if msg.GetOp() == model.SafeBoxLogType_Save {
log := model.NewPayCoinLog(billNo, p.SnId, msg.GetCoin(), 0, "system", model.PayCoinLogType_SafeBoxCoin, 0)
if log != nil {
safePayts = log.TimeStamp
logs = append(logs, log)
}
billNo += 1
log = model.NewPayCoinLog(billNo, p.SnId, -msg.GetCoin(), 0, "system", model.PayCoinLogType_Coin, 0)
if log != nil {
coinPayts = log.TimeStamp
logs = append(logs, log)
}
oper = "保险箱存入"
} else if msg.GetOp() == model.SafeBoxLogType_TakeOut {
log := model.NewPayCoinLog(billNo, p.SnId, -msg.GetCoin(), 0, "system", model.PayCoinLogType_SafeBoxCoin, 0)
if log != nil {
safePayts = log.TimeStamp
logs = append(logs, log)
}
billNo += 1
log = model.NewPayCoinLog(billNo, p.SnId, msg.GetCoin(), 0, "system", model.PayCoinLogType_Coin, 0)
if log != nil {
coinPayts = log.TimeStamp
logs = append(logs, log)
}
oper = "保险箱取出"
}
isNeedRollBack := true
task.New(nil, task.CallableWrapper(func(o *basic.Object) interface{} {
err := model.InsertPayCoinLogs(p.Platform, logs...)
if err != nil {
logger.Logger.Trace("InsertPayCoinLogs err:", err)
return err
}
err, _ = model.InsertSafeBox(p.SnId, msg.GetCoin(), beforeBank, afterBank, beforeCoin, afterCoin,
msg.GetOp(), time.Now(), p.Ip, oper, p.Platform, p.Channel, p.BeUnderAgentCode)
if err != nil {
isNeedRollBack = false
}
return err
}), task.CompleteNotifyWrapper(func(data interface{}, t task.Task) {
if data != nil && isNeedRollBack {
//如果保存失败,并不会回滚玩家的数据,主要原因时无法回滚,如果回滚就需要先扣后补,因为只是在玩家身上流转,
//所以可以可以不考虑回滚问题
logger.Logger.Errorf("Player %v box coin op log error.", snid)
} else {
p.SetPayTs(coinPayts)
p.SetSafeBoxPayTs(safePayts)
p.dirty = true
}
}), oper).StartByExecutor(strconv.Itoa(int(p.SnId)))
}
return nil
}
// 读取保险箱记录
type CSPlayerSafeBoxCoinLogPacketFactory struct {
}
type CSPlayerSafeBoxCoinLogHandler struct {
}
func (this *CSPlayerSafeBoxCoinLogPacketFactory) CreatePacket() interface{} {
pack := &player_proto.CSGetSafeBoxCoinLog{}
return pack
}
func (this *CSPlayerSafeBoxCoinLogHandler) Process(s *netlib.Session, packetid int, data interface{}, sid int64) error {
logger.Logger.Trace("GetSafeBoxCoinLog Process recv ", data)
if _, ok := data.(*player_proto.CSGetSafeBoxCoinLog); ok {
p := PlayerMgrSington.GetPlayer(sid)
if p == nil {
logger.Logger.Warn("GetSafeBoxCoinLog p == nil")
return nil
}
pack := &player_proto.SCGetSafeBoxCoinLog{}
sendPack := func(code player_proto.OpResultCode) {
pack.OpRetCode = code
proto.SetDefaults(pack)
p.SendToClient(int(player_proto.PlayerPacketID_PACKET_SC_GETSAFEBOXCOINLOG), pack)
}
task.New(nil, task.CallableWrapper(func(o *basic.Object) interface{} {
if sblist, err := model.GetSafeBoxs(p.Platform, p.SnId); err == nil {
return sblist
} else {
sendPack(player_proto.OpResultCode_OPRC_Error)
return nil
}
}), task.CompleteNotifyWrapper(func(data interface{}, t task.Task) {
if safeboxrec, ok := data.([]model.SafeBoxRec); ok {
for i := 0; i < len(safeboxrec); i++ {
safeBoxInfo := &player_proto.SafeBoxCoinLog{
LogType: proto.Int32(safeboxrec[i].LogType),
OPCoin: proto.Int64(safeboxrec[i].Count),
OPCoinFront: proto.Int64(safeboxrec[i].BeforeSafeBox),
OPCoinLast: proto.Int64(safeboxrec[i].AfterSafeBox),
Ts: proto.Int64(safeboxrec[i].Time.Unix()),
}
pack.Logs = append(pack.Logs, safeBoxInfo)
}
sendPack(player_proto.OpResultCode_OPRC_Sucess)
} else {
sendPack(player_proto.OpResultCode_OPRC_Error)
}
}), "GetSafeBoxCoinLog").StartByExecutor(strconv.Itoa(int(p.SnId)))
}
return nil
}
//
////读取游戏记录
//type CSPlayerGameCoinLogPacketFactory struct {
//}
//type CSPlayerGameCoinLogHandler struct {
//}
//
//func (this *CSPlayerGameCoinLogPacketFactory) CreatePacket() interface{} {
// pack := &player_proto.CSGetGameCoinLog{}
// return pack
//}
//
//func (this *CSPlayerGameCoinLogHandler) Process(s *netlib.Session, packetid int, data interface{}, sid int64) error {
// logger.Logger.Trace("CSPlayerGameCoinLogHandler Process recv ", data)
// if _, ok := data.(*player_proto.CSGetGameCoinLog); ok {
// p := PlayerMgrSington.GetPlayer(sid)
// if p == nil {
// logger.Logger.Warn("CSPlayerGameCoinLogHandler p == nil")
// return nil
// }
// //model.InsertGameRecList(p.SnId, 0, 20, p.entercoin, p.Coin, p.enterts, time.Now())
// pack := &player_proto.SCGetGameCoinLog{}
// sendPack := func(code player_proto.OpResultCode) {
// pack.OpRetCode = code
// proto.SetDefaults(pack)
// p.SendToClient(int(player_proto.PlayerPacketID_PACKET_SC_GETGAMECOINLOG), pack)
// }
// task.New(nil, task.CallableWrapper(func(o *basic.Object) interface{} {
// if glist, err := model.GetGameRecLogs(p.SnId); err == nil {
// return glist
// } else {
// sendPack(player_proto.OpResultCode_OPRC_Error)
// return nil
// }
// }), task.CompleteNotifyWrapper(func(data interface{}, t *task.Task) {
// if gamelist, ok := data.([]model.GameRecLog); ok {
// for i := 0; i < len(gamelist); i++ {
// gameInfo := &player_proto.GameCoinLog{
// GameId: proto.Int32(gamelist[i].GameId),
// EnterCount: proto.Int64(gamelist[i].EnterCount),
// LeaveCount: proto.Int64(gamelist[i].LeaveCount),
// EnterTs: proto.Int64(gamelist[i].EnterTs.Unix()),
// LeaveTs: proto.Int64(gamelist[i].LeaveTs.Unix()),
// }
// pack.Logs = append(pack.Logs, gameInfo)
// }
// sendPack(player_proto.OpResultCode_OPRC_Sucess)
// } else {
// sendPack(player_proto.OpResultCode_OPRC_Error)
// }
// }), "GetSafeBoxCoinLog").StartByExecutor(p.AccountId)
// }
// return nil
//}
// 注册帐号
type CSPlayerRegisterPacketFactory struct {
}
type CSPlayerRegisterHandler struct {
}
func (this *CSPlayerRegisterPacketFactory) CreatePacket() interface{} {
pack := &player_proto.CSRegister{}
return pack
}
func (this *CSPlayerRegisterHandler) Process(s *netlib.Session, packetid int, data interface{}, sid int64) error {
logger.Logger.Trace("CSPlayerRegisterHandler Process recv ", data)
if t, ok := data.(*player_proto.CSRegister); ok {
sendPack := func(code player_proto.OpResultCode) {
pack := &player_proto.SCRegister{
OpRetCode: code,
}
proto.SetDefaults(pack)
common.SendToGate(sid, int(player_proto.PlayerPacketID_PACKET_SC_REGISTER), pack, s)
}
//替换为后台拿到的配置数据,不再使用客户端的发送数据,
platformID, _, promoter, _, tagkey := PlatformMgrSingleton.GetPlatformByPackageTag(t.GetPlatformTag())
if platformID == 0 {
sendPack(player_proto.OpResultCode_OPRC_Error)
return nil
}
var loginType int32
//手机号注册,验证参数
if t.GetRegistType() == 0 {
loginType = common.RegisterTypeTel
//检验手机号合法
tel := t.GetTel()
if !reTelRule.MatchString(tel) {
sendPack(player_proto.OpResultCode_OPRC_TelError)
return nil
}
//验证验证码
platform := PlatformMgrSingleton.GetPlatform(strconv.Itoa(int(platformID)))
if !platform.RegisterVerifyCodeSwitch {
if platform.VerifyCodeType != common.CodeTypeNo { // 不使用验证码注册
code := CacheMemory.Get(fmt.Sprintf("%v_%v", tel, tagkey))
if code == nil {
sendPack(player_proto.OpResultCode_OPRC_VerificationCodeError)
return nil
}
if verifyCode, ok := code.(string); ok && verifyCode != "" {
if verifyCode != t.GetVerificationCode() {
sendPack(player_proto.OpResultCode_OPRC_VerificationCodeError)
return nil
}
}
}
}
//验证密码
if t.GetTelPassword() == "" || len(t.GetTelPassword()) < 32 {
sendPack(player_proto.OpResultCode_OPRC_UpgradeAccount_PasswordIllegal)
return nil
}
if t.GetPassword() == "" || len(t.GetPassword()) < 32 {
sendPack(player_proto.OpResultCode_OPRC_UpgradeAccount_PasswordIllegal)
return nil
}
} else {
// username,telpassword
loginType = common.RegisterTypeName
if t.GetUsername() == "" {
sendPack(player_proto.OpResultCode_OPRC_UserNameError)
return nil
}
//验证密码
if t.GetTelPassword() == "" || len(t.GetTelPassword()) < 32 {
sendPack(player_proto.OpResultCode_OPRC_UpgradeAccount_PasswordIllegal)
return nil
}
}
//backupPromoter := ""
strPlatform := strconv.Itoa(int(platformID))
if t.GetChannel() != common.Channel_Rob {
t.Platform = proto.String(strPlatform)
//因为后台需要,修改此方法,修改为客户端传递的数据
if len(t.GetPromoter()) <= 0 {
t.Promoter = proto.String(strconv.Itoa(int(promoter)))
} else {
//backupPromoter = t.GetPromoter()
}
}
amount := int32(0)
plt := PlatformMgrSingleton.GetPlatform(strPlatform)
//if plt != nil {
// amount += plt.NewAccountGiveCoin
// amount += plt.UpgradeAccountGiveCoin
//}
var temp []byte
var ee error
di := t.GetDeviceInfo()
if plt.NeedDeviceInfo && di == "" { //maybe res ver is low
sendPack(player_proto.OpResultCode_OPRC_YourResVerIsLow)
return nil
}
if di != "" {
var e common.Encryptor
e.Init(common.GetAppId(), t.GetPlatformTag(), int32(t.GetTimeStamp()))
temp, ee = base64.StdEncoding.DecodeString(di)
if ee != nil {
sendPack(player_proto.OpResultCode_OPRC_YourResVerIsLow)
return nil
}
e.Encrypt(temp, len(temp))
if model.GameParamData.ValidDeviceInfo && !json.Valid(temp) {
sendPack(player_proto.OpResultCode_OPRC_YourResVerIsLow)
return nil
}
}
deviceInfo := string(temp)
if bi, ok := BlackListMgrSington.CheckDeviceInBlack(deviceInfo, BlackState_Login, t.GetPlatform()); ok {
sendPack(player_proto.OpResultCode_OPRC_InBlackList)
if bi != nil {
common.SendToGate(sid, int(player_proto.PlayerPacketID_PACKET_SC_SRVMSG), common.CreateSrvMsg(common.SRVMSG_CODE_DEFAULT, i18n.Tr("languages", "BlackListLimit1Args", bi.Id, bi.Id, bi.Id, bi.Id)), s)
}
return nil
}
var pi *model.PlayerData
var acc *model.Account
//var promoterCfg *PromoterConfig
//var invitePromoterID string
var tf bool
task.New(nil, task.CallableWrapper(func(o *basic.Object) interface{} {
_, code := model.AccountIsExist(t.GetUsername(), t.GetTel(), t.GetPassword(), t.GetPlatform(), t.GetTimeStamp(),
loginType, tagkey, false, false)
if code == common.LoginTelExist {
//手机号已经注册
return player_proto.OpResultCode_OPRC_TelIsRegister
}
if code == common.RegisterExist {
//账号密码已经注册
return player_proto.OpResultCode_OPRC_Login_CreateFailed
}
if code == common.RegisterNotExist {
//新帐号,游客
raw := fmt.Sprintf("%v%v", t.GetUsername(), common.GetAppId())
h := md5.New()
io.WriteString(h, raw)
pwd := hex.EncodeToString(h.Sum(nil))
acc = &model.Account{}
//可以帐号密码登录,也可以游客登录
acc, code = model.InsertTelAccount(t.GetUsername(), pwd, t.GetPlatform(), t.GetChannel(), t.GetPromoter(), t.GetParams(), t.GetInviterId(),
t.GetPromoterTree(), t.GetTel(), t.GetTelPassword(), t.GetPlatformTag(), t.GetPackage(),
deviceInfo, tagkey, 0, "", t.GetChannelID())
if code != common.InsertAccountOk {
return player_proto.OpResultCode_OPRC_Error
}
//生成玩家数据
pi, tf = model.CreatePlayerDataOnRegister(acc.Platform, acc.AccountId.Hex(), amount, "", niceIdMgr.GetRobHeadUrlIdx())
if pi == nil || tf == false {
return player_proto.OpResultCode_OPRC_Error
}
} else {
logger.Logger.Tracef("CSPlayerRegister Player code:%v", code)
return player_proto.OpResultCode_OPRC_Error
}
if pi != nil && pi.InviterId != 0 {
invitePd := model.GetPlayerBaseInfo(pi.Platform, pi.InviterId)
if invitePd != nil {
//invitePromoterID = invitePd.BeUnderAgentCode
}
}
//新号赠送初始金额
err2 := model.UpdatePlayerCoin(pi.Platform, pi.SnId, pi.Coin+int64(model.GameParamData.NewPlayerCoin), 0, 0, time.Now().Unix(), time.Now().Unix(), 0, pi.ShopID)
if err2 == nil {
if !pi.IsRob {
LogChannelSingleton.WriteMQData(model.GenerateSystemFreeGive(pi.SnId, pi.Name, pi.Platform, pi.Channel, model.SystemFreeGive_GiveType_NewPlayer, model.SystemFreeGive_CoinType_Coin, int64(model.GameParamData.NewPlayerCoin)))
}
log := model.NewCoinLogEx(&model.CoinLogParam{
Platform: pi.Platform,
SnID: pi.SnId,
Channel: pi.Channel,
ChangeType: common.BillTypeCoin,
ChangeNum: int64(model.GameParamData.NewPlayerCoin),
RemainNum: pi.Coin + int64(model.GameParamData.NewPlayerCoin),
Add: 0,
LogType: common.GainWay_NewPlayer,
GameID: 0,
GameFreeID: 0,
BaseCoin: 0,
Operator: "",
Remark: "",
})
if log != nil {
LogChannelSingleton.WriteLog(log)
}
}
return player_proto.OpResultCode_OPRC_Sucess
}), task.CompleteNotifyWrapper(func(data interface{}, tt task.Task) {
if code, ok := data.(player_proto.OpResultCode); ok {
if code != player_proto.OpResultCode_OPRC_Sucess {
sendPack(code)
return
}
}
//清理掉cache中的无效id
PlayerCacheMgrSingleton.UnCacheInvalidPlayerId(pi.SnId)
sendPack(player_proto.OpResultCode_OPRC_Sucess)
}), "PlayerRegister").StartByExecutor(t.GetUsername())
}
return nil
}
type CSCustomerNewMsgAckPacketFactory struct {
}
type CSCustomerNewMsgAckHandler struct {
}
func (this *CSCustomerNewMsgAckPacketFactory) CreatePacket() interface{} {
pack := &player_proto.CSCustomerNewMsgAck{}
return pack
}
func (this *CSCustomerNewMsgAckHandler) Process(s *netlib.Session, packetid int, data interface{}, sid int64) error {
logger.Logger.Trace("CSCustomerNewMsgAckHandler Process recv ", data)
//if msg, ok := data.(*player_proto.CSCustomerNewMsgAck); ok {
// p := PlayerMgrSington.GetPlayer(sid)
// if p == nil {
// logger.Logger.Warn("CSCustomerNewMsgAckHandler p == nil")
// return nil
// }
//
// CustomerOfflineMsgMgrSington.OnOfflineMsgAck(p.SnId, msg.GetMsgIds())
//}
return nil
}
type CSIosInstallStablePacketFactory struct {
}
type CSIosInstallStableHandler struct {
}
func (this *CSIosInstallStablePacketFactory) CreatePacket() interface{} {
pack := &player_proto.CSIosInstallStable{}
return pack
}
func (this *CSIosInstallStableHandler) Process(s *netlib.Session, packetid int, data interface{}, sid int64) error {
logger.Logger.Trace("CSIosInstallStableHandler Process recv ", data)
//if _, ok := data.(*player_proto.CSIosInstallStable); ok {
// p := PlayerMgrSington.GetPlayer(sid)
// if p == nil {
// logger.Logger.Warn("CSIosInstallStableHandler p == nil")
// return nil
// }
//
// if p.CoinPayTotal < int64(model.GameParamData.IosStablePrizeMinRecharge) { //不满足最低充值需求
// return nil
// }
// if p.DeviceOS != "ios" { //不是苹果系统,直接忽略
// return nil
// }
// if p.IosStableState != model.IOSSTABLESTATE_NIL { //未标注过才行
// return nil
// }
//
// p.IosStableState = model.IOSSTABLESTATE_MARK
// p.dirty = true
//}
return nil
}
// 查询中奖
type CSFishJackpotPacketFactory struct {
}
type CSFishJackpotHandler struct {
}
func (this *CSFishJackpotPacketFactory) CreatePacket() interface{} {
pack := &player_proto.CSJackpotList{}
return pack
}
func (this *CSFishJackpotHandler) Process(s *netlib.Session, packetid int, data interface{}, sid int64) error {
logger.Logger.Trace("CSFishJackpotHandler Process recv ", data)
if _, ok := data.(*player_proto.CSJackpotList); ok {
player := PlayerMgrSington.GetPlayer(sid)
if player == nil {
logger.Logger.Warn("CSFishJackpotHandler p == nil")
return nil
}
pack := &player_proto.SCJackpotList{}
datas := FishJackListMgr.GetJackInfo(player.Platform)
for _, v := range datas {
info := &player_proto.FishJackpotInfo{
Name: proto.String(v.Name),
Coin: proto.Int64(v.JackpotCoin),
Type: proto.Int32(v.JackpotType),
Ts: proto.Int64(v.Ts),
}
pack.JackpotList = append(pack.JackpotList, info)
}
logger.Logger.Trace("CSFishJackpotHandler Pb ", pack)
player.SendToClient(int(player_proto.PlayerPacketID_PACKET_SC_FISHJACKPOTCOIN), pack)
return nil
}
return nil
}
// 查询奖池金额
type CSFishJackpotCoinPacketFactory struct {
}
type CSFishJackpotCoinHandler struct {
}
func (this *CSFishJackpotCoinPacketFactory) CreatePacket() interface{} {
pack := &player_proto.CSFishJackpotCoin{}
return pack
}
func (this *CSFishJackpotCoinHandler) Process(s *netlib.Session, packetid int, data interface{}, sid int64) error {
logger.Logger.Trace("CSFishJackpotCoinHandler Process recv ", data)
if _, ok := data.(*player_proto.CSFishJackpotCoin); ok {
player := PlayerMgrSington.GetPlayer(sid)
if player == nil {
logger.Logger.Warn("CSFishJackpotCoinHandler p == nil")
return nil
}
pack := &player_proto.SCFishJackpotCoin{}
if datas, exist := FishJackpotCoinMgr.Jackpot[player.Platform]; exist {
pack.Coin = proto.Int64(datas + 234982125)
//pack.Coin = proto.Int64(datas)
} else {
pack.Coin = proto.Int64(234982125) // 假数据
//pack.Coin = proto.Int64(0) // 假数据
}
logger.Logger.Trace("CSFishJackpotCoinHandler Pb ", pack)
player.SendToClient(int(player_proto.PlayerPacketID_PACKET_SC_FISHJACKPOTDATA), pack)
return nil
}
return nil
}
// 全民是否打开
type CSGetSpreadIsOpenPacketFactory struct {
}
type CSGetSpreadIsOpenHandler struct {
}
func (this *CSGetSpreadIsOpenPacketFactory) CreatePacket() interface{} {
pack := &player_proto.CSGetSpreadLWIsOpen{}
return pack
}
func (this *CSGetSpreadIsOpenHandler) Process(s *netlib.Session, packetid int, data interface{}, sid int64) error {
logger.Logger.Trace("CSGetSpreadIsOpenHandler Process recv ", data)
if _, ok := data.(*player_proto.CSGetSpreadLWIsOpen); ok {
p := PlayerMgrSington.GetPlayer(sid)
if p == nil {
logger.Logger.Warn("CSGetSpreadIsOpenHandler p == nil")
return nil
}
plt := PlatformMgrSingleton.GetPlatform(p.Platform)
if plt == nil {
return nil
}
pack := &player_proto.SCGetSpreadLWIsOpen{}
if plt.SpreadWinLose {
pack.IsOpen = proto.Int32(1)
} else {
pack.IsOpen = proto.Int32(0)
}
proto.SetDefaults(pack)
p.SendToClient(int(player_proto.PlayerPacketID_PACKET_SC_GetSpreadLWIsOpen), pack)
//sendPack(player_proto.OpResultCode_OPRC_Sucess)
}
return nil
}
// 玩家设置 音乐音效客户端修改 目前功能只有兑换码
type CSPlayerSettingPacketFactory struct {
}
type CSPlayerSettingHandler struct {
}
func (this *CSPlayerSettingPacketFactory) CreatePacket() interface{} {
pack := &player_proto.CSPlayerSetting{}
return pack
}
func (this *CSPlayerSettingHandler) Process(s *netlib.Session, packetid int, data interface{}, sid int64) error {
logger.Logger.Trace("CSPlayerSettingHandler Process recv ", data)
if msg, ok := data.(*player_proto.CSPlayerSetting); ok {
p := PlayerMgrSington.GetPlayer(sid)
if p == nil {
logger.Logger.Warn("CSPlayerSettingHandler p == nil")
return nil
}
//p.SCVIPInfo()
//p.SCVIPBuy(int64(10))
//p.VIPDraw(3)
pack := &player_proto.SCPlayerSetting{
OpRetCode: player_proto.OpResultCode_OPRC_Jyb_CodeErr,
}
if msg.PackageCode != "" {
args := &model.VerifyUpJybInfoArgs{
UseCode: msg.PackageCode,
Plt: p.Platform,
SnId: p.SnId,
}
if len(msg.PackageCode) < 12 { // 通用
args.CodeType = 1
} else {
key, err := model.Code2Id(msg.PackageCode)
if err != nil || key < uint64(model.Keystart) {
pack.OpRetCode = player_proto.OpResultCode_OPRC_Jyb_CodeErr
proto.SetDefaults(pack)
p.SendToClient(int(player_proto.PlayerPacketID_PACKET_ALL_SETTING), pack)
return nil
}
start := uint64(model.Keystart)
args.CodeStart = int64(key / start * start) // 过滤
args.CodeType = 2
}
BagMgrSingleton.VerifyUpJybInfo(p, args)
} else {
proto.SetDefaults(pack)
p.SendToClient(int(player_proto.PlayerPacketID_PACKET_ALL_SETTING), pack)
}
}
return nil
}
// 充值VIP 后续要删掉
type CSPlayerVIPBuyPacketFactory struct {
}
type CSPlayerVIPBuyHandler struct {
}
func (this *CSPlayerVIPBuyPacketFactory) CreatePacket() interface{} {
pack := &player_proto.CSVIPBuy{}
return pack
}
func (this *CSPlayerVIPBuyHandler) Process(s *netlib.Session, packetid int, data interface{}, sid int64) error {
logger.Logger.Trace("CSVIPBuy Process recv ", data)
//if msg, ok := data.(*player_proto.CSVIPBuy); ok {
// p := PlayerMgrSington.GetPlayer(sid)
// if p == nil {
// logger.Logger.Warn("CSPlayerVIPBuyHandler p == nil")
// return nil
// }
//
// p.SCVIPBuy(int64(msg.GetMoney()))
//}
return nil
}
// VIP信息
type CSPlayerVIPInfoPacketFactory struct {
}
type CSPlayerVIPInfoHandler struct {
}
func (this *CSPlayerVIPInfoPacketFactory) CreatePacket() interface{} {
pack := &player_proto.CSVIPInfo{}
return pack
}
func (this *CSPlayerVIPInfoHandler) Process(s *netlib.Session, packetid int, data interface{}, sid int64) error {
logger.Logger.Trace("CSVIPInfo Process recv ", data)
if _, ok := data.(*player_proto.CSVIPInfo); ok {
p := PlayerMgrSington.GetPlayer(sid)
if p == nil {
logger.Logger.Warn("CSPlayerVIPInfoHandler p == nil")
return nil
}
p.GetVIPLevel()
}
return nil
}
// 玩家领取VIP礼包
type CSPlayerVIPDrawPacketFactory struct {
}
type CSPlayerVIPDrawHandler struct {
}
func (this *CSPlayerVIPDrawPacketFactory) CreatePacket() interface{} {
pack := &player_proto.CSVIPDraw{}
return pack
}
func (this *CSPlayerVIPDrawHandler) Process(s *netlib.Session, packetid int, data interface{}, sid int64) error {
logger.Logger.Trace("CSVIPDraw Process recv ", data)
if msg, ok := data.(*player_proto.CSVIPDraw); ok {
p := PlayerMgrSington.GetPlayer(sid)
if p == nil {
logger.Logger.Warn("CSPlayerVIPDrawHandler p == nil")
return nil
}
p.VIPDraw(msg.GetId(), msg.GetVip())
}
return nil
}
// 玩家领取VIP礼包
type CSVIPPrivilegeInfoPacketFactory struct {
}
type CSVIPPrivilegeInfoHandler struct {
}
func (this *CSVIPPrivilegeInfoPacketFactory) CreatePacket() interface{} {
pack := &player_proto.CSVIPPrivilegeInfo{}
return pack
}
func (this *CSVIPPrivilegeInfoHandler) Process(s *netlib.Session, packetid int, data interface{}, sid int64) error {
logger.Logger.Trace("CSVIPPrivilegeInfoHandler Process recv ", data)
if msg, ok := data.(*player_proto.CSVIPPrivilegeInfo); ok {
p := PlayerMgrSington.GetPlayer(sid)
if p == nil {
logger.Logger.Warn("CSVIPPrivilegeInfoHandler p == nil")
return nil
}
code := msg.GetCode()
pack := &player_proto.SCVIPPrivilegeInfo{
Code: proto.Int32(code),
Vip: proto.Int32(p.VIP),
}
switch code {
case 1: //1.VIP比赛场免费次数
pack.Value = p.GetMatchFreeTimes() + p.GetSkillAdd(common.SkillIdVipTimes)
pack.NowValue = p.VipMatchTimes
}
p.SendToClient(int(player_proto.PlayerPacketID_PACKET_SC_VIPPrivilegeInfo), pack)
}
return nil
}
func init() {
//修改昵称信息
common.RegisterHandler(int(player_proto.PlayerPacketID_PACKET_CS_CHANGENICK), &CSPlayerChangeNickHandler{})
netlib.RegisterFactory(int(player_proto.PlayerPacketID_PACKET_CS_CHANGENICK), &CSPlayerChangeNickPacketFactory{})
//修改头像信息
common.RegisterHandler(int(player_proto.PlayerPacketID_PACKET_CS_CHANGEICON), &CSPlayerChangeIconHandler{})
netlib.RegisterFactory(int(player_proto.PlayerPacketID_PACKET_CS_CHANGEICON), &CSPlayerChangeIconPacketFactory{})
//修改头像框信息
common.RegisterHandler(int(player_proto.PlayerPacketID_PACKET_CS_HEADOUTLINE), &CSPlayerChangeHeadOutLineHandler{})
netlib.RegisterFactory(int(player_proto.PlayerPacketID_PACKET_CS_HEADOUTLINE), &CSPlayerChangeHeadOutLinePacketFactory{})
//修改性别信息
common.RegisterHandler(int(player_proto.PlayerPacketID_PACKET_CS_CHANGESEX), &CSPlayerChangeSexHandler{})
netlib.RegisterFactory(int(player_proto.PlayerPacketID_PACKET_CS_CHANGESEX), &CSPlayerChangeSexPacketFactory{})
//绑定支付宝账号
common.RegisterHandler(int(player_proto.PlayerPacketID_PACKET_CS_BINDALIPAY), &CSBindAlipayHandler{})
netlib.RegisterFactory(int(player_proto.PlayerPacketID_PACKET_CS_BINDALIPAY), &CSBindAlipayPacketFactory{})
//绑定银行卡账号
common.RegisterHandler(int(player_proto.PlayerPacketID_PACKET_CS_BINDBANK), &CSBindBankHandler{})
netlib.RegisterFactory(int(player_proto.PlayerPacketID_PACKET_CS_BINDBANK), &CSBindBankPacketFactory{})
//更改密码
common.RegisterHandler(int(player_proto.PlayerPacketID_PACKET_CS_CHANGEPASSWORD), &CSChangePasswordHandler{})
netlib.RegisterFactory(int(player_proto.PlayerPacketID_PACKET_CS_CHANGEPASSWORD), &CSChangePasswordPacketFactory{})
//保险箱存取
common.RegisterHandler(int(player_proto.PlayerPacketID_PACKET_CS_PLAYEROPCOIN), &CSPlayerSafeBoxHandler{})
netlib.RegisterFactory(int(player_proto.PlayerPacketID_PACKET_CS_PLAYEROPCOIN), &CSPlayerSafeBoxPacketFactory{})
//读取保险箱记录
common.RegisterHandler(int(player_proto.PlayerPacketID_PACKET_CS_GETSAFEBOXCOINLOG), &CSPlayerSafeBoxCoinLogHandler{})
netlib.RegisterFactory(int(player_proto.PlayerPacketID_PACKET_CS_GETSAFEBOXCOINLOG), &CSPlayerSafeBoxCoinLogPacketFactory{})
//注册帐号
common.RegisterHandler(int(player_proto.PlayerPacketID_PACKET_CS_REGISTER), &CSPlayerRegisterHandler{})
netlib.RegisterFactory(int(player_proto.PlayerPacketID_PACKET_CS_REGISTER), &CSPlayerRegisterPacketFactory{})
//获取邀请码
common.RegisterHandler(int(player_proto.PlayerPacketID_PACKET_CS_INVITECODE), &CSInviteCodePlayerHandler{})
netlib.RegisterFactory(int(player_proto.PlayerPacketID_PACKET_CS_INVITECODE), &CSInviteCodePlayerPacketFactory{})
//客服离线消息接收ack
common.RegisterHandler(int(player_proto.PlayerPacketID_PACKET_CS_CUSTOMNEWMSGACK), &CSCustomerNewMsgAckHandler{})
netlib.RegisterFactory(int(player_proto.PlayerPacketID_PACKET_CS_CUSTOMNEWMSGACK), &CSCustomerNewMsgAckPacketFactory{})
//ios稳定版升级标注
common.RegisterHandler(int(player_proto.PlayerPacketID_PACKET_CS_IOSINSTALLSTABLE), &CSIosInstallStableHandler{})
netlib.RegisterFactory(int(player_proto.PlayerPacketID_PACKET_CS_IOSINSTALLSTABLE), &CSIosInstallStablePacketFactory{})
//查询中奖
common.RegisterHandler(int(player_proto.PlayerPacketID_PACKET_CS_FISHJACKPOTCOIN), &CSFishJackpotHandler{})
netlib.RegisterFactory(int(player_proto.PlayerPacketID_PACKET_CS_FISHJACKPOTCOIN), &CSFishJackpotPacketFactory{})
//查询奖池金额
common.RegisterHandler(int(player_proto.PlayerPacketID_PACKET_CS_FISHJACKPOTDATA), &CSFishJackpotCoinHandler{})
netlib.RegisterFactory(int(player_proto.PlayerPacketID_PACKET_CS_FISHJACKPOTDATA), &CSFishJackpotCoinPacketFactory{})
//查询客损是否打开
common.RegisterHandler(int(player_proto.PlayerPacketID_PACKET_CS_GetSpreadLWIsOpen), &CSGetSpreadIsOpenHandler{})
netlib.RegisterFactory(int(player_proto.PlayerPacketID_PACKET_CS_GetSpreadLWIsOpen), &CSGetSpreadIsOpenPacketFactory{})
//玩家设置
common.RegisterHandler(int(player_proto.PlayerPacketID_PACKET_ALL_SETTING), &CSPlayerSettingHandler{})
netlib.RegisterFactory(int(player_proto.PlayerPacketID_PACKET_ALL_SETTING), &CSPlayerSettingPacketFactory{})
//充值VIP
common.RegisterHandler(int(player_proto.PlayerPacketID_PACKET_CS_VIPBUY), &CSPlayerVIPBuyHandler{})
netlib.RegisterFactory(int(player_proto.PlayerPacketID_PACKET_CS_VIPBUY), &CSPlayerVIPBuyPacketFactory{})
//VIP信息
common.RegisterHandler(int(player_proto.PlayerPacketID_PACKET_CS_VIPINFO), &CSPlayerVIPInfoHandler{})
netlib.RegisterFactory(int(player_proto.PlayerPacketID_PACKET_CS_VIPINFO), &CSPlayerVIPInfoPacketFactory{})
//玩家领取VIP礼包
common.RegisterHandler(int(player_proto.PlayerPacketID_PACKET_CS_DRAWVIPGIFT), &CSPlayerVIPDrawHandler{})
netlib.RegisterFactory(int(player_proto.PlayerPacketID_PACKET_CS_DRAWVIPGIFT), &CSPlayerVIPDrawPacketFactory{})
//VIP特权
common.RegisterHandler(int(player_proto.PlayerPacketID_PACKET_CS_VIPPrivilegeInfo), &CSVIPPrivilegeInfoHandler{})
netlib.RegisterFactory(int(player_proto.PlayerPacketID_PACKET_CS_VIPPrivilegeInfo), &CSVIPPrivilegeInfoPacketFactory{})
}
func CSExchangeChannel(s *netlib.Session, packetid int, data interface{}, sid int64) error {
logger.Logger.Trace("CSExchangeChannel Process recv ", data)
msg, ok := data.(*player_proto.CSExchangeChannel)
if !ok {
return nil
}
p := PlayerMgrSington.GetPlayer(sid)
if p == nil {
logger.Logger.Warn("CSExchangeChannel p == nil")
return nil
}
pack := &player_proto.SCExchangeChannel{}
if msg.Tp == 0 {
for _, v := range PlatformMgrSingleton.GetConfig(p.Platform).ChannelSwitch {
if v == nil {
continue
}
pack.Datas = append(pack.Datas, &player_proto.ChannelSwitch{
OnChannelName: v.OnChannelName,
Tp: v.Tp,
})
}
} else {
v := PlatformMgrSingleton.GetConfig(p.Platform).ChannelSwitch[msg.GetTp()]
if v != nil {
pack.Datas = append(pack.Datas, &player_proto.ChannelSwitch{
OnChannelName: v.OnChannelName,
Tp: v.Tp,
})
}
}
p.SendToClient(int(player_proto.PlayerPacketID_PACKET_SCExchangeChannel), pack)
logger.Logger.Tracef("SCExchangeChannel %v", pack)
return nil
}
func CSPlayerData(s *netlib.Session, packetid int, data interface{}, sid int64) error {
logger.Logger.Trace("CSPlayerDataHandler Process recv ", data)
cspl, ok := data.(*player_proto.CSPlayerData)
if !ok {
return nil
}
ls := LoginStateMgrSington.GetLoginStateBySid(sid)
if ls == nil {
logger.Logger.Warnf("CSPlayerDataHandler sid:%v not login 1!!!", sid)
return nil
}
if ls.als == nil {
logger.Logger.Warnf("CSPlayerDataHandler sid:%v not login 2!!!", sid)
return nil
}
if ls.als.acc == nil {
logger.Logger.Warnf("CSPlayerDataHandler sid:%v not login 3!!!", sid)
return nil
}
if cspl.GetAccId() != ls.als.acc.AccountId.Hex() {
cspl.AccId = proto.String(ls.als.acc.AccountId.Hex())
logger.Logger.Warnf("CSPlayerDataHandler player(%v) try to hit db!!!", cspl.GetAccId())
}
// 公共方法
playerFunc := func(p *Player, msg *player_proto.CSPlayerData) {
p.dirty = true
if p.GMLevel > 2 {
//伪造IP地址
p.Ip = fmt.Sprintf("%v.%v.%v.%v", 1+rand.Int31n(255), 1+rand.Int31n(255), 1+rand.Int31n(255), 1+rand.Int31n(255))
}
p.params = p.UpdateParams(msg.GetParams())
//player.DeviceInfo = deviceInfo
p.DeviceId = msg.GetDeviceId()
p.DeviceName = msg.GetDeviceName()
p.PackageName = msg.GetPackageName()
p.AppVersion = msg.GetAppVersion()
p.BuildVersion = msg.GetBuildVersion()
p.AppChannel = msg.GetAppChannel()
p.LastChannel = p.AppChannel
if (p.Channel == "" || p.Channel == "0") && p.Channel != msg.AppChannel {
p.Channel = msg.AppChannel
}
if ls.als.acc.ChannelId != "" && p.ChannelId == "" {
p.ChannelId = ls.als.acc.ChannelId
}
if ls.clog != nil {
PlayerSubjectSign.UpdateHeadUrl(p.SnId, ls.clog.HeadUrl)
}
// 重置对战场统计数据重置
v, ok := p.GDatas[common.GetKeyGameType(2)]
if ok && v != nil {
if int(v.Statics.Version) < model.GameParamData.GameStaticsFightVersion {
v.Statics.Version = int32(model.GameParamData.GameStaticsFightVersion)
v.Statics.TotalIn = 0
v.Statics.TotalOut = 0
v.Statics.Tax = 0
v.Statics.MaxSysOut = 0
// 个人水池
p.TotalIn = 0
p.TotalOut = 0
p.PlayerTax = 0
p.dirty = true
}
}
}
// 有缓存数据
player := PlayerMgrSington.GetPlayerByAccount(cspl.GetAccId())
if player != nil {
// 当前玩家登录,踢掉其它客户端连接
if player.IsOnLine() {
if player.sid != 0 && player.sid != sid {
//Kick the exist player disconnect
player.Kickout(common.KickReason_OtherLogin)
}
}
var temp []byte
var err error
di := cspl.GetDeviceInfo()
// 获取不到平台信息,登录失败
pt := PlatformMgrSingleton.GetPlatform(player.Platform)
if !player.IsRob && pt == nil {
scPlayerData := &player_proto.SCPlayerData{
OpRetCode: player_proto.OpResultCode_OPRC_Error,
}
logger.Logger.Trace("player no platform:", player.Platform, player.SnId)
proto.SetDefaults(scPlayerData)
player.SendRawToClientIncOffLine(sid, s, int(player_proto.PlayerPacketID_PACKET_SC_PLAYERDATA), scPlayerData)
//Kick the exist player disconnect
player.Kickout(common.KickReason_Freeze)
return nil
}
// 没有设备信息,登录失败
if !player.IsRob && pt.NeedDeviceInfo && di == "" { //maybe res ver is low
scPlayerData := &player_proto.SCPlayerData{
OpRetCode: player_proto.OpResultCode_OPRC_LoginFailed,
}
logger.Logger.Trace("player no deviceinfo:", player.SnId)
proto.SetDefaults(scPlayerData)
player.SendRawToClientIncOffLine(sid, s, int(player_proto.PlayerPacketID_PACKET_SC_PLAYERDATA), scPlayerData)
//Kick the exist player disconnect
player.Kickout(common.KickReason_Freeze)
return nil
}
// 设备验证失败,登录失败
if !player.IsRob && di != "" && cspl.GetPlatformTag() != "" {
var e common.Encryptor
e.Init(common.GetAppId(), cspl.GetPlatformTag(), int32(cspl.GetTimeStamp()))
temp, err = base64.StdEncoding.DecodeString(di)
if err == nil {
e.Encrypt(temp, len(temp))
} else {
scPlayerData := &player_proto.SCPlayerData{
OpRetCode: player_proto.OpResultCode_OPRC_NotLogin,
}
logger.Logger.Trace("player no decode deviceinfo:", player.SnId)
proto.SetDefaults(scPlayerData)
player.SendRawToClientIncOffLine(sid, s, int(player_proto.PlayerPacketID_PACKET_SC_PLAYERDATA), scPlayerData)
//Kick the exist player disconnect
player.Kickout(common.KickReason_Freeze)
return nil
}
if !player.IsRob && model.GameParamData.ValidDeviceInfo && !json.Valid(temp) {
scPlayerData := &player_proto.SCPlayerData{
OpRetCode: player_proto.OpResultCode_OPRC_NotLogin,
}
logger.Logger.Trace("player no json deviceinfo:", player.SnId, temp)
proto.SetDefaults(scPlayerData)
player.SendRawToClientIncOffLine(sid, s, int(player_proto.PlayerPacketID_PACKET_SC_PLAYERDATA), scPlayerData)
//Kick the exist player disconnect
player.Kickout(common.KickReason_Freeze)
return nil
}
}
if !player.IsRob {
if _, ok := BlackListMgrSington.CheckLogin(player.PlayerData); !ok {
//var msg string
//if bi != nil {
// msg = i18n.Tr("languages", "BlackListLimit2Args", player.SnId, bi.Id, player.SnId, bi.Id, player.SnId, bi.Id, player.SnId, bi.Id)
//} else {
// msg = i18n.Tr("languages", "BlackListLimit1Args", player.SnId, player.SnId, player.SnId, player.SnId)
//}
//common.SendSrvMsg(player, common.SRVMSG_CODE_DEFAULT, msg)
//scPlayerData := &player_proto.SCPlayerData{
// OpRetCode: player_proto.OpResultCode_OPRC_InBlackList,
//}
//proto.SetDefaults(scPlayerData)
//player.SendToClient(int(player_proto.PlayerPacketID_PACKET_SC_PLAYERDATA), scPlayerData)
//Kick the exist player disconnect
player.Kickout(common.KickReason_Freeze)
return nil
}
}
// 给玩家发送三方余额状态
//statePack := &gamehall_proto.SCThridGameBalanceUpdateState{}
//if player.thridBalanceReqIsSucces {
// statePack.OpRetCode = gamehall_proto.OpResultCode_Game_OPRC_Sucess_Game
//} else {
// statePack.OpRetCode = gamehall_proto.OpResultCode_Game_OPRC_Error_Game
//}
//player.SendRawToClientIncOffLine(sid, s, int(gamehall_proto.GameHallPacketID_PACKET_SC_THRIDGAMEBALANCEUPDATESTATE), statePack)
//抽奖次数兼容老玩家
if !player.IsRob && !player.InitLotteryStatus && WelfareMgrSington.GetPhoneLotteryStatus(player.Platform) == model.WelfareOpen {
player.addLotteryCount(20)
player.InitLotteryStatus = true
player.dirty = true
LogChannelSingleton.WriteMQData(model.GeneratePhoneLottery(player.SnId, player.Platform, "", 3, 20, 5, 0))
}
// rehold player
playerFunc(player, cspl)
PlayerMgrSington.ReholdPlayer(player, sid, s)
player.OnRehold()
player.SendPlayerInfo()
return nil
}
// 没有缓存数据
if PlayerMgrSington.StartLoading(cspl.GetAccId(), sid) {
return nil
}
PlayerCacheMgrSingleton.UnCacheInvalidPlayerId(ls.als.acc.SnId)
PlayerCacheMgrSingleton.Get(ls.als.acc.Platform, ls.als.acc.SnId, func(pd *PlayerCacheItem, async, isnew bool) {
send := func(code player_proto.OpResultCode) {
scPlayerData := &player_proto.SCPlayerData{
OpRetCode: code,
}
proto.SetDefaults(scPlayerData)
common.SendToGate(sid, int(player_proto.PlayerPacketID_PACKET_SC_PLAYERDATA), scPlayerData, s)
logger.Logger.Tracef("SC_PLAYERDATA %v", scPlayerData)
}
sid := PlayerMgrSington.EndPlayerLoading(cspl.GetAccId())
if pd == nil {
send(player_proto.OpResultCode_OPRC_Login_CreateFailed)
return
}
var promoterID string
var promoterCfg *PromoterConfig
f := func() {
PlayerMgrSington.AddPlayer(sid, pd.PlayerData, s)
player := PlayerMgrSington.GetPlayer(sid)
if player == nil {
return
}
if !player.IsRob {
if _, ok := BlackListMgrSington.CheckLogin(pd.PlayerData); !ok {
//黑名单用户也需要调用一下onlogin,否则会导致数据无法刷新
player.OnLogined()
player.Kickout(common.KickReason_Freeze)
return
}
}
if promoterID != "" {
key, err := GetPromoterKey(0, promoterID, "")
if err == nil {
promoterCfg = PromoterMgrSington.GetConfig(key)
if promoterCfg != nil && promoterCfg.IsInviteRoot > 0 {
player.BeUnderAgentCode = promoterID
}
}
}
var temp []byte
var ee error
di := cspl.GetDeviceInfo()
if di != "" {
var e common.Encryptor
e.Init(common.GetAppId(), player.PackageID, int32(cspl.GetTimeStamp()))
temp, ee = base64.StdEncoding.DecodeString(di)
if ee == nil {
e.Encrypt(temp, len(temp))
}
}
if isnew { //新用户赠送金币
//首次创建账号事件
//isBind := 0
//if pd.Tel != "" {
// isBind = 1
//}
//LogChannelSingleton.WriteMQData(model.GeneratePlayerEvent(model.WEBEVENT_LOGIN, pd.Platform, pd.PackageID, pd.SnId, pd.Channel, pd.BeUnderAgentCode, pd.PromoterTree, 1, 1, isBind, common.GetAppId()))
//newbieCoin := player.GetRegisterPrize()
//if newbieCoin > 0 {
// player.AddCoin(int64(newbieCoin), common.GainWay_NewPlayer, "system", "")
// //增加泥码
// player.AddDirtyCoin(0, int64(newbieCoin))
// player.ReportSystemGiveEvent(newbieCoin, common.GainWay_NewPlayer, true)
// player.AddPayCoinLog(int64(newbieCoin), model.PayCoinLogType_Coin, "NewPlayer")
// LogChannelSingleton.WriteMQData(model.GenerateSystemFreeGive(pd.SnId, pd.Name, pd.Platform, model.SystemFreeGive_GiveType_NewPlayer, model.SystemFreeGive_CoinType_Coin, int64(newbieCoin)))
//}
//if player.InviterId > 0 {
// //actRandCoinMgr.OnPlayerInvite(player.Platform, player.InviterId)
//}
}
//测试代码
playerFunc(player, cspl)
player.OnLogined()
player.SendPlayerInfo()
return
}
if pd.InviterId != 0 {
// 获取推广人
PlayerCacheMgrSingleton.UnCacheInvalidPlayerId(pd.InviterId)
PlayerCacheMgrSingleton.Get(pd.Platform, pd.InviterId, func(inviter *PlayerCacheItem, async, isnew bool) {
if inviter != nil {
promoterID = inviter.BeUnderAgentCode
}
f()
}, false)
} else {
f()
}
}, true)
return nil
}
func CSQueryPlayer(s *netlib.Session, packetid int, data interface{}, sid int64) error {
logger.Logger.Trace("CSQueryPlayerHandler Process recv ", data)
if msg, ok := data.(*player_proto.CSQueryPlayer); ok {
p := PlayerMgrSington.GetPlayer(sid)
if p == nil {
logger.Logger.Warn("CSQueryPlayerHandler p == nil")
return nil
}
destSnId := msg.GetSnId()
send := func(f *model.Friend) {
pack := &player_proto.SCQueryPlayer{
SnId: f.SnId,
Name: f.Name,
Head: f.Head,
Sex: f.Sex,
Coin: f.Coin,
Diamond: f.Diamond,
VCard: f.VCard,
HeadUrl: f.HeadUrl,
Signature: f.Signature,
Age: f.Age,
GameID: f.GameID,
}
//IsFriend
pack.IsFriend = FriendMgrSington.IsFriend(p.Platform, p.SnId, f.SnId)
//IsShield
pack.IsShield = FriendMgrSington.IsShield(p.Platform, p.SnId, f.SnId)
//Role
roleInfo := f.Roles
if roleInfo != nil {
for id, level := range roleInfo {
role := &player_proto.RoleOrPet{
Id: id,
Level: level,
}
roleData := PetMgrSington.GetIntroductionByModId(id)
if roleData != nil {
role.Name = roleData.Name
}
pack.Roles = append(pack.Roles, role)
}
}
//Pet
petInfo := f.Pets
if petInfo != nil {
for id, level := range petInfo {
pet := &player_proto.RoleOrPet{
Id: id,
Level: level,
}
petData := PetMgrSington.GetIntroductionByModId(id)
if petData != nil {
pet.Name = petData.Name
}
pack.Pets = append(pack.Pets, pet)
}
}
ok := p.SendToClient(int(player_proto.PlayerPacketID_PACKET_SC_QUERYPLAYER), pack)
logger.Logger.Trace("SCQueryPlayerHandler ok: ", ok, " pack: ", pack)
}
player := PlayerMgrSington.GetPlayerBySnId(destSnId)
if player != nil && player.IsRob {
pack := &player_proto.SCQueryPlayer{
SnId: player.SnId,
Name: player.Name,
Head: player.Head,
Sex: player.Sex,
Coin: player.Coin,
Diamond: player.Diamond,
HeadUrl: player.HeadUrl,
Signature: player.Signature,
Age: player.Age,
GameID: player.GameID,
}
proto.SetDefaults(pack)
p.SendToClient(int(player_proto.PlayerPacketID_PACKET_SC_QUERYPLAYER), pack)
logger.Logger.Trace("SCQueryPlayerHandler ok: ", ok, " pack: ", pack)
} else { // 真人去friend取信息
friend := FriendMgrSington.GetPlayer(p.Platform, destSnId)
if friend != nil {
send(friend)
} else {
task.New(nil, task.CallableWrapper(func(o *basic.Object) interface{} {
ret, err := model.QueryFriendBySnid(p.Platform, destSnId)
if err != nil {
return nil
}
return ret
}), task.CompleteNotifyWrapper(func(data interface{}, tt task.Task) {
if ret, ok := data.(*model.Friend); ok && ret != nil {
send(ret)
}
})).Start()
}
}
}
return nil
}
func CSSavePlayerInfo(s *netlib.Session, packetid int, data interface{}, sid int64) error {
logger.Logger.Tracef("CSSavePlayerInfo %v", data)
msg, ok := data.(*player_proto.CSSavePlayerInfo)
if !ok {
return nil
}
p := PlayerMgrSington.GetPlayer(sid)
if p == nil {
return nil
}
if msg.GetName() != "" && msg.GetName() != p.Name {
PlayerSubjectSign.UpdateName(p.SnId, msg.GetName())
}
if msg.GetHead() != 0 && msg.GetHeadUrl() != p.HeadUrl {
PlayerSubjectSign.UpdateHead(p.SnId, msg.GetHead())
}
if msg.GetHeadUrl() != "" && msg.GetHeadUrl() != p.HeadUrl {
PlayerSubjectSign.UpdateHeadUrl(p.SnId, msg.GetHeadUrl())
}
if msg.GetSex() != 0 && msg.GetSex() != p.Sex {
p.Sex = msg.GetSex()
}
if msg.GetAge() > 0 && msg.GetAge() != p.Age {
p.Age = msg.GetAge()
}
if msg.GetSignature() != "" && msg.GetSignature() != p.Signature && len([]rune(msg.GetSignature())) < 100 {
p.Signature = msg.GetSignature()
}
if msg.GetRoleID() > 0 && msg.GetRoleID() != p.Roles.ModId {
if _, ok := p.Roles.ModUnlock[msg.GetRoleID()]; ok {
p.Roles.ModId = msg.GetRoleID()
}
}
if msg.GetPetID() > 0 {
if _, ok := p.Pets.ModUnlock[msg.GetPetID()]; ok {
if msg.GetPetID() == p.Pets.ModId {
p.Pets.ModId = 0
} else {
p.Pets.ModId = msg.GetPetID()
}
}
}
p.SendToClient(int(player_proto.PlayerPacketID_PACKET_SCSavePlayerInfo), &player_proto.SCSavePlayerInfo{
OpRetCode: player_proto.OpResultCode_OPRC_Sucess,
})
return nil
}
func CSHeadUrl(s *netlib.Session, packetId int, data interface{}, sid int64) error {
logger.Logger.Trace("CSHeadUrl Process recv ", data)
msg, ok := data.(*player_proto.CSHeadUrl)
if !ok {
return nil
}
p := PlayerMgrSington.GetPlayer(sid)
if p == nil {
logger.Logger.Warn("CSHeadUrl p == nil")
return nil
}
if len(msg.GetUrl()) >= 500 {
logger.Logger.Warn("CSHeadUrl msg.GetUrl() >= 500")
return nil
}
PlayerSubjectSign.UpdateHeadUrl(p.SnId, msg.GetUrl())
pack := &player_proto.SCHeadUrl{
OpRetCode: player_proto.OpResultCode_OPRC_Sucess,
Url: p.HeadUrl,
}
p.SendToClient(int(player_proto.PlayerPacketID_PACKET_SC_HeadUrl), pack)
return nil
}
func CSBindTelInfo(s *netlib.Session, packetId int, data interface{}, sid int64) error {
logger.Logger.Trace("CSBindTelInfo Process ", data)
_, ok := data.(*player_proto.CSBindTelInfo)
if !ok {
return nil
}
p := PlayerMgrSington.GetPlayer(sid)
if p == nil {
logger.Logger.Error("CSBindTelInfo p == nil", sid)
return nil
}
plt := PlatformMgrSingleton.GetPlatform(p.Platform)
if plt == nil {
logger.Logger.Error("CSBindTelInfo platform is nil", sid)
return nil
}
pack := &player_proto.SCBindTelInfo{
BindTelReward: make(map[int32]int64),
}
for k, v := range plt.BindTelReward {
pack.BindTelReward[common.ToItemId(k)] = v
}
p.SendToClient(int(player_proto.PlayerPacketID_PACKET_SCBindTelInfo), pack)
return nil
}
var telRule, _ = regexp.Compile(`^(\d{2,15})$`)
func CSPlayerSMSCode(s *netlib.Session, packetId int, data interface{}, sid int64) error {
logger.Logger.Trace("CSPlayerSMSCode Process ", data)
msg, ok := data.(*player_proto.CSPlayerSMSCode)
if !ok {
return nil
}
p := PlayerMgrSington.GetPlayer(sid)
sendPack := func(code player_proto.OpResultCode) {
pack := &player_proto.SCPlayerSMSCode{
Code: code,
}
proto.SetDefaults(pack)
common.SendToGate(sid, int(player_proto.PlayerPacketID_PACKET_SCPlayerSMSCode), pack, s)
logger.Logger.Trace("SCPlayerSMSCode send pack ", code)
}
if msg.GetTel() == "" || msg.GetAreaCode() == "" {
sendPack(player_proto.OpResultCode_OPRC_TelError)
return nil
}
msg.Tel = strings.TrimPrefix(msg.GetTel(), "0")
tel := fmt.Sprint(msg.GetAreaCode(), msg.GetTel())
// tel
if !telRule.MatchString(tel) {
sendPack(player_proto.OpResultCode_OPRC_TelError)
return nil
}
// 验证图片验证码
imageCodeKey := common.GetImageCodeKey(strconv.FormatInt(sid, 10))
imageCode := CacheMemory.Get(imageCodeKey)
if imageCode != nil {
if imageCode != msg.GetImageCode() {
sendPack(player_proto.OpResultCode_OPRC_ImageVerifyCodeFailed)
return nil
}
CacheMemory.Delete(imageCodeKey)
}
var telKey string
var snid int32
if p != nil {
msg.Platform = p.Platform
snid = p.SnId
}
var validTime time.Duration
switch msg.GetTypeID() {
case 0, common.SMSCodeTelBind:
msg.TypeID = common.SMSCodeTelBind // 旧接口是0
telKey = common.GetBindTelCodeKey(msg.GetPlatform(), tel)
validTime = common.SMSCodeValidTimeTelBind
case common.SMSCodeTelLogin:
telKey = common.GetTelLoginCodeKey(msg.GetPlatform(), tel)
validTime = common.SMSCodeValidTimeTelLogin
default:
logger.Logger.Errorf("CSPlayerSMSCode typeID error %d", msg.GetTypeID())
sendPack(player_proto.OpResultCode_OPRC_Error)
return nil
}
key := fmt.Sprintf("key%s", telKey)
code := CacheMemory.Get(key) // 频率限制
if code != nil {
sendPack(player_proto.OpResultCode_OPRC_Frequently)
return nil
}
if model.GameParamData.FakeVerifyCode != "" {
CacheMemory.Put(telKey, model.GameParamData.FakeVerifyCode, int64(validTime))
CacheMemory.Put(key, model.GameParamData.FakeVerifyCode, common.SMSCodeValidTime)
sendPack(player_proto.OpResultCode_OPRC_Sucess)
return nil
}
//先设置注册码,防止多次注册
smsCode := common.RandSmsCode()
CacheMemory.Put(telKey, smsCode, int64(validTime))
CacheMemory.Put(key, smsCode, common.SMSCodeValidTime)
logger.Logger.Trace("CSPlayerSMSCode smsCode ", smsCode)
var res []byte
var err error
task.New(nil, task.CallableWrapper(func(o *basic.Object) interface{} {
param := &webapi_proto.ASSendSms{
Snid: snid,
Phone: tel,
Code: smsCode,
Platform: msg.GetPlatform(),
TypeID: msg.GetTypeID(),
}
res, err = webapi.ApiSendSMS(common.GetAppId(), param)
return nil
}), task.CompleteNotifyWrapper(func(data interface{}, t task.Task) {
if err != nil || res == nil {
logger.Logger.Errorf("API_SendSms err %v", err)
sendPack(player_proto.OpResultCode_OPRC_Error)
return
}
var info webapi_proto.SASendSms
proto.Unmarshal(res, &info)
if info.Tag == webapi_proto.TagCode_SUCCESS {
CacheMemory.Put(telKey, smsCode, int64(validTime))
sendPack(player_proto.OpResultCode_OPRC_Sucess)
} else {
if info.Tag == webapi_proto.TagCode_Limit {
logger.Logger.Warnf("API_SendSms Limit tel:%s", tel)
sendPack(player_proto.OpResultCode_OPRC_SMSCodeLimit)
return
}
logger.Logger.Errorf("API_SendSms err %v", err)
sendPack(player_proto.OpResultCode_OPRC_Error)
}
}), "API_SendSms").Start()
return nil
}
func CSBindTel(s *netlib.Session, packetId int, data interface{}, sid int64) error {
logger.Logger.Trace("CSBindTel Process ", data)
msg, ok := data.(*player_proto.CSBindTel)
if !ok {
return nil
}
p := PlayerMgrSington.GetPlayer(sid)
if p == nil {
logger.Logger.Error("CSBindTel p == nil", sid)
return nil
}
//test
//if model.GameParamData.FakeVerifyCode != "" && msg.GetTel() == "0" {
// CacheMemory.Delete(fmt.Sprintf("%v-%v", p.Tel, p.Platform))
// a := PlayerMgrSington.GetPlayerByAccount(p.AccountId)
// if a != nil {
// a.Tel = ""
// }
// p.Tel = ""
// return nil
//}
//test
sendPack := func(code player_proto.OpResultCode) {
pack := &player_proto.SCBindTel{
Code: code,
}
proto.SetDefaults(pack)
p.SendToClient(int(player_proto.PlayerPacketID_PACKET_SCBindTel), pack)
logger.Logger.Tracef("SCBindTel send pack %v", pack)
}
if p.Tel != "" {
sendPack(player_proto.OpResultCode_OPRC_TelIsExist)
return nil
}
if msg.GetTel() == "" || msg.GetAreaCode() == "" {
sendPack(player_proto.OpResultCode_OPRC_TelError)
return nil
}
//验证手机号
//tel := msg.GetTel()
//if !reTelRule.MatchString(tel) {
// sendPack(player_proto.OpResultCode_OPRC_TelError.Enum())
// return nil
//}
msg.Tel = strings.TrimPrefix(msg.GetTel(), "0")
tel := fmt.Sprint(msg.GetAreaCode(), msg.GetTel())
telKey := common.GetBindTelCodeKey(p.Platform, tel)
//验证验证码
code := CacheMemory.Get(telKey)
if code == nil {
sendPack(player_proto.OpResultCode_OPRC_VerificationCodeError)
return nil
}
if msg.GetCode() == "" {
sendPack(player_proto.OpResultCode_OPRC_VerificationCodeError)
return nil
}
verifyCode, ok := code.(string)
if !ok || verifyCode == "" {
sendPack(player_proto.OpResultCode_OPRC_VerificationCodeError)
return nil
}
if verifyCode != msg.GetCode() {
sendPack(player_proto.OpResultCode_OPRC_VerificationCodeError)
return nil
}
var snid int32
var err error
task.New(nil, task.CallableWrapper(func(o *basic.Object) interface{} {
//if model.GameParamData.FakeVerifyCode == "" {
// 手机号是否已经被绑定
snid, _ = model.GetPlayerTel(tel, p.Platform, 0) // tagKey没用了给0就行
if snid != 0 {
return nil
}
// 绑定手机号
if err = model.BindTelAccount(p.AccountId, tel, p.Platform); err != nil {
logger.Logger.Errorf("BindTelAccount err: %v", err)
return nil
}
if err = model.UpdatePlayerTel(p.Platform, p.SnId, tel); err != nil {
logger.Logger.Errorf("UpdatePlayerTel err: %v", err)
return nil
}
//}
return nil
}), task.CompleteNotifyWrapper(func(i interface{}, t task.Task) {
if err != nil {
sendPack(player_proto.OpResultCode_OPRC_VerificationCodeError)
return
}
if snid != 0 {
sendPack(player_proto.OpResultCode_OPRC_TelIsExist)
return
}
if p.Tel == "" {
// 首次绑定赠送奖励
a := PlayerMgrSington.GetPlayerByAccount(p.AccountId)
if a != nil {
a.Tel = tel
}
p.Tel = tel
p.BindTelReward()
// 邀请人绑定手机号
if p.PSnId > 0 {
cfg := PlatformMgrSingleton.GetConfig(p.Platform).ActInviteConfig
SaveInviteScore(&model.InviteScore{
Platform: p.Platform,
SnId: p.SnId,
InviteSnId: p.PSnId,
Tp: common.InviteScoreTypeBindTel,
Score: cfg.GetBindTelScore(),
Ts: time.Now().Unix(),
Money: 0,
})
}
}
// 删除验证码
//CacheMemory.Delete(telKey)
sendPack(player_proto.OpResultCode_OPRC_Sucess)
})).StartByFixExecutor(fmt.Sprintf("Platform%v", p.Platform))
return nil
}
func CSGetImageVerifyCode(s *netlib.Session, packetId int, data interface{}, sid int64) error {
logger.Logger.Tracef("CSGetImageVerifyCode ", data)
if _, ok := data.(*player_proto.CSGetImageVerifyCode); ok {
sendPack := func(code player_proto.OpResultCode, data string) {
pack := &player_proto.SCGetImageVerifyCode{
OpRetCode: code,
ImageData: proto.String(data),
}
proto.SetDefaults(pack)
common.SendToGate(sid, int(player_proto.PlayerPacketID_PACKET_SC_GETIMAGEVERIFYCODE), pack, s)
logger.Logger.Tracef("SCGetImageVerifyCode ", pack)
}
var err error
var b []byte
imgVerifyMsg := &webapi_proto.SAGetImgVerify{}
task.New(nil, task.CallableWrapper(func(o *basic.Object) interface{} {
param := &webapi_proto.ASGetImgVerify{
//Tel: msg.GetTel(),
}
b, err = webapi.ApiGetImageVerify(common.GetAppId(), param)
return err
}), task.CompleteNotifyWrapper(func(data interface{}, t task.Task) {
if err != nil || len(b) == 0 {
sendPack(player_proto.OpResultCode_OPRC_Error, "")
return
}
err = proto.Unmarshal(b, imgVerifyMsg)
if err != nil || imgVerifyMsg.GetTag() != webapi_proto.TagCode_SUCCESS ||
imgVerifyMsg.GetImageData() == "" || imgVerifyMsg.GetCode() == "" {
sendPack(player_proto.OpResultCode_OPRC_Error, "")
return
}
key := common.GetImageCodeKey(strconv.FormatInt(sid, 10))
CacheMemory.Put(key, imgVerifyMsg.Code, 600)
logger.Logger.Infof("@CacheMemory.Put(key:%v, val:%v)", key, imgVerifyMsg.Code)
sendPack(player_proto.OpResultCode_OPRC_Sucess, imgVerifyMsg.ImageData)
}), "API_GetImgVerify").Start()
}
return nil
}
func CSGetImageVerifyCodeLocal(s *netlib.Session, packetId int, data interface{}, sid int64) error {
logger.Logger.Tracef("CSGetImageVerifyCode ", data)
if _, ok := data.(*player_proto.CSGetImageVerifyCode); ok {
sendPack := func(code player_proto.OpResultCode, data string) {
pack := &player_proto.SCGetImageVerifyCode{
OpRetCode: code,
ImageData: proto.String(data),
}
proto.SetDefaults(pack)
common.SendToGate(sid, int(player_proto.PlayerPacketID_PACKET_SC_GETIMAGEVERIFYCODE), pack, s)
logger.Logger.Tracef("SCGetImageVerifyCode ", pack)
}
var err error
var b64, answer string
task.New(nil, task.CallableWrapper(func(o *basic.Object) interface{} {
b64, answer, err = common.ImageCode()
return nil
}), task.CompleteNotifyWrapper(func(data interface{}, t task.Task) {
if err != nil {
sendPack(player_proto.OpResultCode_OPRC_Error, "")
return
}
key := common.GetImageCodeKey(strconv.FormatInt(sid, 10))
CacheMemory.Put(key, answer, 600)
logger.Logger.Infof("@CacheMemory.Put(key:%v, val:%v)", key, answer)
sendPack(player_proto.OpResultCode_OPRC_Sucess, b64)
}), "API_GetImgVerify").Start()
}
return nil
}
func CSImageVerifyCode(s *netlib.Session, packetId int, data interface{}, sid int64) error {
logger.Logger.Trace("CSImageVerifyCode Process ", data)
msg, ok := data.(*player_proto.CSImageVerifyCode)
if !ok {
return nil
}
sendPack := func(code player_proto.OpResultCode) {
pack := &player_proto.SCImageVerifyCode{
OpRetCode: code,
}
proto.SetDefaults(pack)
common.SendToGate(sid, int(player_proto.PlayerPacketID_PACKET_SC_ImageVerifyCode), pack, s)
logger.Logger.Trace("SCImageVerifyCode send pack ", code)
}
imageCodeKey := common.GetImageCodeKey(strconv.FormatInt(sid, 10))
imageCode := CacheMemory.Get(imageCodeKey)
if imageCode != nil {
if imageCode != msg.GetCode() {
sendPack(player_proto.OpResultCode_OPRC_ImageVerifyCodeFailed)
return nil
}
CacheMemory.Delete(imageCodeKey)
}
sendPack(player_proto.OpResultCode_OPRC_Sucess)
return nil
}
func CSBillList(s *netlib.Session, packetId int, data interface{}, sid int64) error {
logger.Logger.Tracef("CSBillList Process %v", data)
msg, ok := data.(*player_proto.CSBillList)
if !ok {
return nil
}
p := PlayerMgrSington.GetPlayer(sid)
if p == nil {
return nil
}
ret := &player_proto.SCBillList{}
if msg.GetTs() <= 0 {
msg.Ts = time.Now().Unix()
}
startTs := msg.GetTs() - 24*60*60
if startTs <= 0 {
return nil
}
endTs := msg.GetTs()
if msg.GetPageNo() < 0 {
msg.PageNo = 0
}
if msg.GetPageSize() > 100 {
msg.PageSize = 100
}
if msg.GetPageSize() <= 0 {
msg.PageSize = 10
}
fromIndex := msg.GetPageNo() * msg.GetPageSize()
toIndex := fromIndex + msg.GetPageSize()
var err error
var logs []model.CoinLog
task.New(nil, task.CallableWrapper(func(o *basic.Object) interface{} {
logs, _, err = model.GetCoinLogGame(p.Platform, p.SnId, common.BillTypeCoin, startTs, endTs, int(fromIndex), int(toIndex))
return nil
}), task.CompleteNotifyWrapper(func(i interface{}, t task.Task) {
if err != nil {
logger.Logger.Errorf("GetCoinLogGame err:%v", err)
p.SendToClient(int(player_proto.PlayerPacketID_PACKET_SCBillList), ret)
return
}
for _, v := range logs {
ret.Items = append(ret.Items, &player_proto.BillItem{
Ts: v.Ts,
Id: v.LogId.Hex(),
BillType: int64(v.LogType),
Amount: v.Count,
Balance: v.RestCount,
GameID: int64(v.InGame),
GameFreeID: v.GameFreeId,
BaseCoin: v.BaseCoin,
})
}
p.SendToClient(int(player_proto.PlayerPacketID_PACKET_SCBillList), ret)
logger.Logger.Tracef("SCBillList pageNo:%d, pageSize:%d %v", msg.GetPageNo(), msg.GetPageSize(), ret)
}), "GetCoinLogGame").Start()
return nil
}
func CSADV(s *netlib.Session, packetId int, data interface{}, sid int64) error {
logger.Logger.Tracef("CSADV Process %v", data)
msg, ok := data.(*player_proto.CSADV)
if !ok {
return nil
}
p := PlayerMgrSington.GetPlayer(sid)
if p == nil {
return nil
}
TaskSubjectSingleton.Touch(common.TaskTypeAdv, &TaskData{
SnId: p.SnId,
Num: 1,
})
ret := &player_proto.SCADV{
Param: msg.GetParam(),
}
p.SendToClient(int(player_proto.PlayerPacketID_PACKET_SCADV), ret)
logger.Logger.Tracef("SCADV %v", ret)
return nil
}
// 获取运营商配置
func CSSMSConfig(s *netlib.Session, packetId int, data interface{}, sid int64) error {
logger.Logger.Tracef("CSSMSConfig Process %v", data)
p := PlayerMgrSington.GetPlayer(sid)
if p == nil {
return nil
}
var res []byte
var err error
task.New(nil, task.CallableWrapper(func(o *basic.Object) interface{} {
param := &webapi_proto.ASSMSConfig{
SnId: p.SnId,
Platform: p.Platform,
}
res, err = webapi.ApiSMSConfig(common.GetAppId(), param)
return nil
}), task.CompleteNotifyWrapper(func(data interface{}, t task.Task) {
if err != nil || res == nil {
logger.Logger.Errorf("API_SmsConfig err %v", err)
return
}
var info webapi_proto.SASMSConfig
proto.Unmarshal(res, &info)
if info.Tag == webapi_proto.TagCode_SUCCESS {
ret := &player_proto.SCSMSConfig{}
for _, smsInfo := range info.Info {
infoData := &player_proto.SMSInfo{}
infoData.Id = smsInfo.Id
infoData.SmsName = smsInfo.SmsName
ret.Info = append(ret.Info, infoData)
}
p.SendToClient(int(player_proto.PlayerPacketID_PACKET_SCSMSConfig), ret)
} else {
logger.Logger.Errorf("API_SmsConfig err %v", info.Msg)
}
}), "API_SmsConfig").Start()
return nil
}
// 获取获奖记录
func CSAwardLog(s *netlib.Session, packetId int, data interface{}, sid int64) error {
logger.Logger.Tracef("CSAwardLog Process %v", data)
p := PlayerMgrSington.GetPlayer(sid)
if p == nil {
return nil
}
msg, ok := data.(*player_proto.CS_AwardLog)
if !ok {
return nil
}
awardLogConfig := PlatformMgrSingleton.GetConfig(p.Platform).AwardLogConfig
AwardLog := AwardLogMgr.GetAwardLog(p.Platform, msg.TypeId)
ret := &player_proto.SCAwardLog{}
awardData := &player_proto.AwardLogData{}
ret.TypeId = msg.TypeId
for itemId, num := range AwardLog {
itemNum := int64(num)
infoData := &player_proto.AwardLogInfo{}
infoData.ItemId = itemId
infoData.Num = itemNum
awardData.AwardLog = append(awardData.AwardLog, infoData)
}
//处理后台数据
if awardLogConfig != nil {
for _, awardLog := range awardLogConfig.AwardLog {
if awardLog.TypeId == msg.TypeId {
for _, log := range awardLog.AwardLog {
status := false
for _, info := range awardData.AwardLog {
if log.ItemId == info.ItemId {
status = true
info.Order = log.Order
info.Url = log.Url
if log.Num > info.Num {
info.Num = log.Num
}
break
}
}
if !status {
infoData := &player_proto.AwardLogInfo{}
infoData.ItemId = log.ItemId
infoData.Num = log.Num
infoData.Order = log.Order
infoData.Url = log.Url
awardData.AwardLog = append(awardData.AwardLog, infoData)
}
}
awardData.SortId = awardLog.SortId
}
}
}
ret.AwardLog = awardData
//实时播报数据
AnnouncerLog := AwardLogMgr.GetAnnouncerLog(p.Platform, msg.TypeId)
for _, logInfo := range AnnouncerLog {
infoData := &player_proto.AnnouncerLogInfo{}
//infoData.Snid = logInfo.Snid
infoData.Name = logInfo.Name
str := ""
if len(logInfo.Phone) > 4 {
str = logInfo.Phone[:4]
}
infoData.Phone = str
infoData.ItemId = logInfo.ItemId
infoData.TypeId = logInfo.TypeId
ret.AnnouncerLog = append(ret.AnnouncerLog, infoData)
}
//处理实时播报数据
if len(ret.AnnouncerLog) < 100 {
//后台数据
if awardLogConfig != nil {
for _, info := range awardLogConfig.AnnouncerLog {
if info.TypeId == msg.TypeId {
infoData := &player_proto.AnnouncerLogInfo{}
//infoData.Snid = info.Snid
infoData.Name = info.Name
str := ""
if len(info.Phone) > 4 {
str = info.Phone[:4]
}
infoData.Phone = str
infoData.ItemId = info.ItemId
infoData.TypeId = info.TypeId
ret.AnnouncerLog = append(ret.AnnouncerLog, infoData)
if len(ret.AnnouncerLog) >= 100 {
break
}
}
}
}
}
p.SendToClient(int(player_proto.PlayerPacketID_PACKET_SCAwardLog), ret)
logger.Logger.Tracef("SCAwardLog:%v", ret)
return nil
}
func CSPopUpWindowsConfig(s *netlib.Session, packetId int, data interface{}, sid int64) error {
p := PlayerMgrSington.GetPlayer(sid)
if p == nil {
return nil
}
var res []byte
var err error
task.New(nil, task.CallableWrapper(func(o *basic.Object) interface{} {
param := &webapi_proto.ASPopUpWindowsConfig{
SnId: p.SnId,
Platform: p.Platform,
}
res, err = webapi.ApiPopupWindowsConfig(common.GetAppId(), param)
return nil
}), task.CompleteNotifyWrapper(func(data interface{}, t task.Task) {
if err != nil || res == nil {
logger.Logger.Errorf("API_SmsConfig err %v", err)
return
}
var info webapi_proto.SAPopUpWindowsConfig
proto.Unmarshal(res, &info)
if info.Tag == webapi_proto.TagCode_SUCCESS {
ret := &player_proto.SCPopUpWindowsConfig{}
for _, config := range info.Info {
infoData := &player_proto.WindowsInfo{}
infoData.ItemName = config.ItemName
infoData.Url = config.Url
infoData.Sort = config.Sort
infoData.PartNum = config.PartNum
infoData.GainNum = config.GainNum
ret.Info = append(ret.Info, infoData)
}
p.SendToClient(int(player_proto.PlayerPacketID_PACKET_SCPopUpWindowsConfig), ret)
} else {
logger.Logger.Errorf("ApiPopupWindowsConfig err %v", info.Msg)
}
}), "Api_PopupWindowsConfig").Start()
return nil
}
func CSUpdateAttribute(s *netlib.Session, packetId int, data interface{}, sid int64) error {
logger.Logger.Tracef("CSUpdateAttribute %v", data)
p := PlayerMgrSington.GetPlayer(sid)
if p == nil {
return nil
}
msg, ok := data.(*player_proto.CSUpdateAttribute)
if !ok {
return nil
}
stepId := p.GuideStep + 1
pack := &player_proto.SCUpdateAttribute{
OpRetCode: player_proto.OpResultCode_OPRC_Error,
Tp: msg.GetTp(),
Param: msg.GetParam(),
}
send := func() {
p.SendToClient(int(player_proto.PlayerPacketID_PACKET_SCUpdateAttribute), pack)
logger.Logger.Tracef("SCUpdateAttribute %v", pack)
// 日志
if pack.OpRetCode == player_proto.OpResultCode_OPRC_Sucess {
switch msg.GetTp() {
case common.AttributeGuideStep, common.AttributeGuideSkip:
d := model.CustomData{
Event: "guide",
Platform: p.Platform,
GuideTp: msg.GetTp(),
N: int64(stepId),
}
b, _ := json.Marshal(d)
LogChannelSingleton.WriteLog(&model.ClientLogMysql{
Data: string(b),
Platform: p.Platform,
Snid: p.SnId,
Ts: time.Now().Unix(),
CreateTs: p.CreateTime.Unix(),
})
}
}
}
switch msg.GetTp() {
case common.AttributeGuideStep:
if len(msg.GetParam()) == 0 || msg.GetParam()[0] == 0 || p.GuideStep < 0 {
return nil
}
if PlatformMgrSingleton.GetConfig(p.Platform).GuideConfig.GetOn() != common.On {
pack.OpRetCode = player_proto.OpResultCode_OPRC_Guide_Close
send()
return nil
}
if p.GuideStep >= model.GameParamData.GuideStepMaxNum {
pack.OpRetCode = player_proto.OpResultCode_OPRC_GuideStep_End
send()
return nil
}
if int64(p.GuideStep) >= msg.GetParam()[0] {
pack.OpRetCode = player_proto.OpResultCode_OPRC_GuideStep_Finish
send()
return nil
}
if int64(p.GuideStep)+1 < msg.GetParam()[0] {
pack.OpRetCode = player_proto.OpResultCode_OPRC_GuideStep_Front
send()
return nil
}
p.GuideStep = int32(msg.GetParam()[0])
stepId = p.GuideStep
pack.OpRetCode = player_proto.OpResultCode_OPRC_Sucess
send()
// 获得10v卡
if p.GuideStep == 2 {
BagMgrSingleton.AddItems(&model.AddItemParam{
Platform: p.Platform,
SnId: p.SnId,
Change: []*model.Item{
{
ItemId: common.ItemIDVCard,
ItemNum: 10,
},
},
GainWay: common.GainWayGuide,
Operator: "system",
Remark: "新手引导奖励",
})
}
return nil
case common.AttributeGuideSkip:
if PlatformMgrSingleton.GetConfig(p.Platform).GuideConfig.GetSkip() != common.On {
pack.OpRetCode = player_proto.OpResultCode_OPRC_Guide_SkipClose
send()
return nil
}
if p.GuideStep >= 0 && p.GuideStep < model.GameParamData.GuideStepMaxNum {
p.GuideStep = -1 // 跳过引导为 -1
pack.OpRetCode = player_proto.OpResultCode_OPRC_Sucess
send()
return nil
}
case common.AttributeGuideTest:
if !common.Config.IsDevMode {
return nil
}
p.GuideStep = int32(msg.GetParam()[0])
pack.OpRetCode = player_proto.OpResultCode_OPRC_Sucess
send()
return nil
}
return nil
}
// 获取获奖记录
func CSClawdollItemLog(s *netlib.Session, packetId int, data interface{}, sid int64) error {
logger.Logger.Tracef("CSClawdollItemLog Process %v", data)
p := PlayerMgrSington.GetPlayer(sid)
if p == nil {
return nil
}
msg, ok := data.(*player_proto.CSClawdollItemLog)
if !ok {
return nil
}
ret := &player_proto.SCClawdollItemLog{}
ret.TypeId = msg.TypeId
var err error
var ItemUseLogs []model.ItemLog
//娃娃机道具使用日志
task.New(nil, task.CallableWrapper(func(o *basic.Object) interface{} {
ItemUseLogs, err = model.GetClawdollItemLog(p.Platform, p.SnId)
return err
}), task.CompleteNotifyWrapper(func(data interface{}, t task.Task) {
for _, logInfo := range ItemUseLogs {
infoData := &player_proto.ClawdollItemLogData{}
infoData.ItemId = logInfo.ItemId
infoData.Time = logInfo.CreateTs
infoData.Num = logInfo.Count
infoData.TypeId = logInfo.TypeId
infoData.LogType = logInfo.LogType
ret.ItemLogs = append(ret.ItemLogs, infoData)
}
p.SendToClient(int(player_proto.PlayerPacketID_PACKET_SCClawdollItemLog), ret)
logger.Logger.Tracef("SCClawdollItemLog:%v", ret)
}), "GetClawdollItemLog").Start()
return nil
}
func CSCLAWDOLLConfig(s *netlib.Session, packetId int, data interface{}, sid int64) error {
logger.Logger.Tracef("CSDollConfigHandler")
if _, ok := data.(*player_proto.CSCLAWDOLLConfig); ok {
p := PlayerMgrSington.GetPlayer(sid)
if p == nil {
logger.Logger.Warn("CSDollConfigHandler p == nil")
return nil
}
machineInfo := PlatformMgrSingleton.GetConfig(p.Platform).MachineConfig
if machineInfo == nil {
return nil
}
pack := &player_proto.SCCLAWDOLLConfig{}
for _, value := range machineInfo.Info {
info := &player_proto.MachineInfo{
IconAddr: value.IconAddr,
CostItemNum: value.CostItemNum,
ItemId: value.ItemId,
ItemNum: value.ItemNum,
MachineId: value.MachineId,
Name: value.Name,
}
pack.Info = append(pack.Info, info)
}
p.SendToClient(int(player_proto.PlayerPacketID_PACKET_SCDollConfig), pack)
}
return nil
}
func init() {
// 用户信息
common.Register(int(player_proto.PlayerPacketID_PACKET_CS_PLAYERDATA), player_proto.CSPlayerData{}, CSPlayerData)
// 查看别人信息
common.Register(int(player_proto.PlayerPacketID_PACKET_CS_QUERYPLAYER), player_proto.CSQueryPlayer{}, CSQueryPlayer)
// 修改个人信息
common.Register(int(player_proto.PlayerPacketID_PACKET_CSSavePlayerInfo), player_proto.CSSavePlayerInfo{}, CSSavePlayerInfo)
// 修改头像url
common.Register(int(player_proto.PlayerPacketID_PACKET_CS_HeadUrl), player_proto.CSHeadUrl{}, CSHeadUrl)
// 获取绑定手机号奖励
common.Register(int(player_proto.PlayerPacketID_PACKET_CSBindTelInfo), player_proto.CSBindTelInfo{}, CSBindTelInfo)
// 获取短信验证码
common.Register(int(player_proto.PlayerPacketID_PACKET_CSPlayerSMSCode), player_proto.CSPlayerSMSCode{}, CSPlayerSMSCode)
// 绑定手机号
common.Register(int(player_proto.PlayerPacketID_PACKET_CSBindTel), player_proto.CSBindTel{}, CSBindTel)
// 获取图片验证码
common.Register(int(player_proto.PlayerPacketID_PACKET_CS_GETIMAGEVERIFYCODE), player_proto.CSGetImageVerifyCode{}, CSGetImageVerifyCodeLocal)
// 验证图片验证码
common.Register(int(player_proto.PlayerPacketID_PACKET_CS_ImageVerifyCode), player_proto.CSImageVerifyCode{}, CSImageVerifyCode)
// 查询游戏账变记录
common.Register(int(player_proto.PlayerPacketID_PACKET_CSBillList), player_proto.CSBillList{}, CSBillList)
// 看广告一次
common.Register(int(player_proto.PlayerPacketID_PACKET_CSADV), player_proto.CSADV{}, CSADV)
// 渠道开关
common.Register(int(player_proto.PlayerPacketID_PACKET_CSExchangeChannel), player_proto.CSExchangeChannel{}, CSExchangeChannel)
//获取运营商配置
common.Register(int(player_proto.PlayerPacketID_PACKET_CSSMSConfig), player_proto.CSSMSConfig{}, CSSMSConfig)
//获奖记录
common.Register(int(player_proto.PlayerPacketID_PACKET_CSAwardLog), player_proto.CS_AwardLog{}, CSAwardLog)
//弹窗配置
common.Register(int(player_proto.PlayerPacketID_PACKET_CSPopUpWindowsConfig), player_proto.CSPopUpWindowsConfig{}, CSPopUpWindowsConfig)
// 更新属性;新手引导阶段
common.Register(int(player_proto.PlayerPacketID_PACKET_CSUpdateAttribute), player_proto.CSUpdateAttribute{}, CSUpdateAttribute)
//娃娃卡道具记录
common.Register(int(player_proto.PlayerPacketID_PACKET_CSClawdollItemLog), player_proto.CSClawdollItemLog{}, CSClawdollItemLog)
//客户端请求配置信息
common.Register(int(player_proto.PlayerPacketID_PACKET_CSDollConfig), player_proto.CSCLAWDOLLConfig{}, CSCLAWDOLLConfig)
}