package main import ( "mongo.games.com/game/common" "mongo.games.com/game/model" "mongo.games.com/game/proto" "mongo.games.com/game/protocol/server" "mongo.games.com/goserver/core/basic" "mongo.games.com/goserver/core/logger" "mongo.games.com/goserver/core/netlib" "mongo.games.com/goserver/core/task" "mongo.games.com/goserver/srvlib" "strconv" "time" ) type DWThirdRebateMessagePacketFactory struct { } type DWThirdRebateMessageHandler struct { } func (this *DWThirdRebateMessagePacketFactory) CreatePacket() interface{} { pack := &server.DWThirdRebateMessage{} return pack } func (this *DWThirdRebateMessageHandler) Process(s *netlib.Session, packetid int, data interface{}) error { logger.Logger.Trace("DWThirdRebateMessageHandler Process recv ", data) if msg, ok := data.(*server.DWThirdRebateMessage); ok { //TODO SendAckToDataSrv(msg.GetTag(), 2) if msg.GetAvailableBet() <= 0 { logger.Logger.Warn("DWThirdRebateMessageHandler is error: AvailableBet= ", msg.GetAvailableBet()) return nil } //p := PlayerMgrSington.GetPlayerBySnId(msg.GetSnid()) //if p != nil { // p.dirty = true // //actRandCoinMgr.OnPlayerLiuShui(p, msg.GetAvailableBet()) //} // //thirdId := strconv.Itoa(int(ThirdPltGameMappingConfig.FindThirdIdByThird(msg.GetThird()))) //rebateTask := RebateInfoMgrSington.rebateTask[strconv.Itoa(int(msg.GetPlt()))] //if rebateTask != nil { // Third := rebateTask.RebateGameThirdCfg[thirdId] // if Third != nil { // p := PlayerMgrSington.GetPlayerBySnId(msg.GetSnid()) // if p == nil { // logger.Logger.Trace("DWThirdRebateMessageHandler p == nil ", msg.GetSnid()) // OfflinePlayerMgrSington.GetOfflinePlayer(msg.GetSnid(), func(op *OfflinePlayer, asyn bool) { // if op == nil { // return // } // if op.IsRob { // return // } // // if data, ok := op.RebateData[thirdId]; ok { // data.ValidBetTotal += msg.GetAvailableBet() // } else { // op.RebateData[thirdId] = &model.RebateData{ // ValidBetTotal: msg.GetAvailableBet(), // } // } // task.New(nil, task.CallableWrapper(func(o *basic.Object) interface{} { // //注意流控,防止该任务过渡占用登陆队列,可以在datasrv上配置心跳和maxdone来控制 // return model.SavePlayerRebate(op.PlayerData, thirdId) // }), task.CompleteNotifyWrapper(func(data interface{}, tt *task.Task) { // if data != nil { // logger.Logger.Errorf("SavePlayerRebate error:%v snid:%v platform:%v AvailableBet:%v", data, msg.GetSnid(), msg.GetThird(), msg.GetAvailableBet()) // } else { // p = PlayerMgrSington.GetPlayerBySnId(msg.GetSnid()) //说明更新任务排在了玩家登陆的后面(造成了脏读,重新应用下该次下注) // if p != nil { // if data, ok := p.RebateData[thirdId]; ok { // data.ValidBetTotal += msg.GetAvailableBet() // } else { // p.RebateData[thirdId] = &model.RebateData{ // ValidBetTotal: msg.GetAvailableBet(), // } // } // p.dirty = true // } // } // }), "SavePlayerRebate").StartByExecutor(op.AccountId) //保证和玩家存取在一条线程内(避免脏读或者脏写) // }, false) // return nil // } // if p.IsRob { // logger.Logger.Trace("DWThirdRebateMessageHandler p is rob ", msg.GetSnid()) // return nil // } // if data, ok := p.RebateData[thirdId]; ok { // data.ValidBetTotal += msg.GetAvailableBet() // } else { // p.RebateData[thirdId] = &model.RebateData{ // ValidBetTotal: msg.GetAvailableBet(), // } // } // // p.dirty = true // //p.CountRebate(thirdId, 1) // } else { // logger.Logger.Trace("DWThirdRebateMessageHandler Third is nil. ", msg.GetPlt(), msg.GetThird()) // } //} else { // logger.Logger.Trace("DWThirdRebateMessageHandler rebateTask is nil. ", msg.GetPlt(), msg.GetThird()) //} } return nil } type DWThirdRoundMessagePacketFactory struct { } type DWThirdRoundMessageHandler struct { } func (this *DWThirdRoundMessagePacketFactory) CreatePacket() interface{} { pack := &server.DWThirdRoundMessage{} return pack } func (this *DWThirdRoundMessageHandler) Process(s *netlib.Session, packetid int, data interface{}) error { logger.Logger.Trace("DWThirdRoundMessageHandler Process recv ", data) if msg, ok := data.(*server.DWThirdRoundMessage); ok { //todo //获取到对应的gamefreeid,三方的特殊处理了,只寻找对应大类的第一个gamefreeid,因为这个游戏都在不停的变,很多都不一致 if thirdID := ThirdPltGameMappingConfig.FindThirdIdByThird(msg.GetThird()); thirdID != 0 { var dbGamefreeInfo *server.DB_GameFree platform := msg.GetPlatform() if platform != 0 { pltGameInfo := PlatformMgrSingleton.GetGameFree(strconv.Itoa(int(platform)), thirdID) if pltGameInfo != nil { dbGamefreeInfo = pltGameInfo.DbGameFree } } player := PlayerMgrSington.GetPlayerBySnId(msg.GetSnid()) if player != nil { str := strconv.Itoa(int(thirdID)) //处理三方全民流水问题 totalOut := int32(0) totalIn := int32(0) if dbGamefreeInfo != nil { isBind := int32(0) if player.Tel != "" { isBind = 1 } if msg.GetProfitCoinInTime() < 0 { totalIn = msg.GetBetCoinInTime() } else { totalOut = msg.GetBetCoinInTime() } isQuMin := false //pt := PlatformMgrSingleton.GetPackageTag(player.PackageID) //if pt != nil && pt.SpreadTag == 1 { // isQuMin = true //} if isQuMin || !model.GameParamData.QMOptimization { QMFlowMgr.AddPlayerStatement(player.SnId, isBind, totalOut, totalIn, thirdID, player.Platform, player.PackageID, dbGamefreeInfo) } availableBet := int64(totalOut + totalIn) availableBet = availableBet * int64(dbGamefreeInfo.GetBetWaterRate()) / 100 if availableBet > 0 { player.TotalConvertibleFlow += availableBet player.TotalFlow += availableBet player.dirty = true //今日流水增加 player.TodayGameData.TodayConvertibleFlow += availableBet } } if gd, ok := player.GDatas[str]; ok { gd.Statics.GameTimes += int64(msg.GetAccRoundsInTime()) gd.Statics.TotalOut += int64(totalOut) gd.Statics.TotalIn += int64(totalIn) if gd.Statics.MaxSysOut < int64(msg.GetOneroundMaxwin()) { gd.Statics.MaxSysOut = int64(msg.GetOneroundMaxwin()) } } else { gs := model.NewPlayerGameStatics() gs.GameTimes = int64(msg.GetAccRoundsInTime()) gs.MaxSysOut = int64(msg.GetOneroundMaxwin()) gs.TotalOut = int64(totalOut) gs.TotalIn = int64(totalIn) player.GDatas[str] = &model.PlayerGameInfo{ FirstTime: time.Now(), Statics: *gs, } } if player.TotalGameData == nil { player.TotalGameData = make(map[int][]*model.PlayerGameTotal) } showId := 9 if len(player.TotalGameData[showId]) == 0 { player.TotalGameData[showId] = []*model.PlayerGameTotal{new(model.PlayerGameTotal)} } cnt := len(player.TotalGameData[showId]) if cnt > 0 { td := player.TotalGameData[showId][cnt-1] if td == nil { td = &model.PlayerGameTotal{} player.TotalGameData[showId][cnt-1] = td } if td != nil { td.ProfitCoin += int64(msg.GetProfitCoinInTime()) td.BetCoin += int64(msg.GetBetCoinInTime()) td.FlowCoin += int64(msg.GetFlowCoinInTime()) } } //洗码 //三方游戏,通过进出场的营收差洗码 washingCoin := msg.GetProfitCoinInTime() if washingCoin < 0 { washingCoin = -washingCoin } washedCoin := player.WashingCoin(int64(washingCoin)) if washedCoin > 0 { logger.Logger.Tracef("三方游戏洗码:snid=%v,washingCoin=%v,gamefreeid=%v", player.SnId, washedCoin, thirdID) } //五福红包游戏局数检测 //actRandCoinMgr.OnPlayerGameTimes(player, int64(msg.GetAccRoundsInTime())) } else { if dbGamefreeInfo != nil { totalOut := int32(0) totalIn := int32(0) if msg.GetProfitCoinInTime() < 0 { totalIn = msg.GetBetCoinInTime() } else { totalOut = msg.GetBetCoinInTime() } QMFlowMgr.AddOffPlayerStatement(msg.GetSnid(), totalOut, totalIn, thirdID, dbGamefreeInfo) availableBet := int64(totalOut + totalIn) availableBet = availableBet * int64(dbGamefreeInfo.GetBetWaterRate()) / 100 if availableBet > 0 { PlayerCacheMgrSingleton.Get(strconv.Itoa(int(msg.GetPlatform())), msg.GetSnid(), func(op *PlayerCacheItem, asyn, isnew bool) { if op == nil { return } if op.IsRob { return } //总流水累加 op.TotalConvertibleFlow += availableBet op.TotalFlow += availableBet //今日流水增加,todo 这个地方没有考虑彩票导致的跨天,或者注单延迟导致的今日流水问题 op.TodayGameData.TodayConvertibleFlow += availableBet task.New(nil, task.CallableWrapper(func(o *basic.Object) interface{} { //注意流控,防止该任务过渡占用登陆队列,可以在datasrv上配置心跳和maxdone来控制 return model.UpdatePlayerExchageFlow(op.Platform, op.SnId, op.TotalConvertibleFlow, op.TotalFlow) }), nil).StartByExecutor(strconv.Itoa(int(op.SnId))) }, false) } } } } } return nil } func init() { netlib.RegisterHandler(int(server.SSPacketID_PACKET_DW_ThirdRebateMessage), &DWThirdRebateMessageHandler{}) netlib.RegisterFactory(int(server.SSPacketID_PACKET_DW_ThirdRebateMessage), &DWThirdRebateMessagePacketFactory{}) netlib.RegisterHandler(int(server.SSPacketID_PACKET_DW_ThirdRoundMessage), &DWThirdRoundMessageHandler{}) netlib.RegisterFactory(int(server.SSPacketID_PACKET_DW_ThirdRoundMessage), &DWThirdRoundMessagePacketFactory{}) } // 暂时约定为:result=1正常,result=-1错误 func SendAckToDataSrv(snid uint64, result int32) bool { datasrvSess := srvlib.ServerSessionMgrSington.GetSession(common.GetSelfAreaId(), common.DataServerType, common.DataServerId) if datasrvSess != nil { pack := &server.WDACKThirdRebateMessage{ Tag: proto.Uint64(snid), Result: proto.Int32(result), } proto.SetDefaults(pack) datasrvSess.Send(int(server.SSPacketID_PACKET_WD_ACKThirdRebateMessage), pack) return true } else { logger.Logger.Error("datasrv server not found.") } return false } //func init() { // go func() { // for { // time.Sleep(time.Second) // SendAckToDataSrv(205656,1) // } // }() //}