#!/usr/bin/python  
 | 
# -*- coding: GBK -*-  
 | 
#-------------------------------------------------------------------------------  
 | 
#  
 | 
##@package Player.PlayerFlashGiftbag  
 | 
#  
 | 
# @todo:ÏÞʱÀñ°ü  
 | 
# @author hxp  
 | 
# @date 2018-7-20  
 | 
# @version 1.0  
 | 
#  
 | 
# ÏêϸÃèÊö: ÏÞʱÀñ°ü  
 | 
#  
 | 
#-------------------------------------------------------------------------------  
 | 
#"""Version = 2018-7-20 17:30"""  
 | 
#-------------------------------------------------------------------------------  
 | 
  
 | 
import PyGameData  
 | 
import ShareDefine  
 | 
import PlayerControl  
 | 
import IpyGameDataPY  
 | 
import NetPackCommon  
 | 
import ChPyNetSendPack  
 | 
import DataRecordPack  
 | 
import ItemControler  
 | 
import IPY_GameWorld  
 | 
import ItemCommon  
 | 
import GameWorld  
 | 
import ChConfig  
 | 
  
 | 
  
 | 
def OnPlayerLogin(curPlayer):  
 | 
    isReset = __CheckPlayerFlashGiftbagAction(curPlayer)  
 | 
    if not isReset:  
 | 
        actInfo = PyGameData.g_operationActionDict.get(ShareDefine.OperationActionName_FlashGiftbag, {})  
 | 
        # »î¶¯ÖÐͬ²½»î¶¯ÐÅÏ¢  
 | 
        if actInfo.get(ShareDefine.ActKey_State):  
 | 
            SyncFlashGiftbagBuyCount(curPlayer, giftbagTypeList=actInfo.get(ShareDefine.ActKey_GiftbagTypeList, []))  
 | 
            Sync_FlashGiftbagActionInfo(curPlayer)  
 | 
    return  
 | 
  
 | 
def RefreshFlashGiftbagActionInfo():  
 | 
    ## ÊÕµ½GameServerͬ²½µÄ»î¶¯ÐÅÏ¢£¬Ë¢Ð»ÐÅÏ¢  
 | 
    playerManager = GameWorld.GetPlayerManager()  
 | 
    for index in xrange(playerManager.GetPlayerCount()):  
 | 
        curPlayer = playerManager.GetPlayerByIndex(index)  
 | 
        if curPlayer.GetID() == 0:  
 | 
            continue  
 | 
        __CheckPlayerFlashGiftbagAction(curPlayer)  
 | 
    return  
 | 
  
 | 
def __CheckPlayerFlashGiftbagAction(curPlayer):  
 | 
    ## ¼ì²éÍæ¼ÒÏÔʾÀñ°ü»î¶¯Êý¾ÝÐÅÏ¢  
 | 
      
 | 
    playerID = curPlayer.GetPlayerID()  
 | 
      
 | 
    actInfo = PyGameData.g_operationActionDict.get(ShareDefine.OperationActionName_FlashGiftbag, {})  
 | 
    actID = actInfo.get(ShareDefine.ActKey_ID, 0)  
 | 
    state = actInfo.get(ShareDefine.ActKey_State, 0)  
 | 
    giftbagTypeList = actInfo.get(ShareDefine.ActKey_GiftbagTypeList, [])  
 | 
    #if not state or not giftbagTypeList:  
 | 
    #    return  
 | 
      
 | 
    playerActID = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_FlashGiftbagID) # Íæ¼ÒÉíÉϵĻID  
 | 
      
 | 
    # »î¶¯ID ÏàͬµÄ»°²»´¦Àí  
 | 
    if actID == playerActID:  
 | 
        GameWorld.DebugLog("ÏÞʱÀñ°ü»î¶¯ID²»±ä£¬²»´¦Àí£¡", curPlayer.GetPlayerID())  
 | 
        return  
 | 
      
 | 
    PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_FlashGiftbagID, actID)  
 | 
    ResetGiftbagItemBuyCount(curPlayer, giftbagTypeList)  
 | 
      
 | 
    GameWorld.DebugLog("ÏÞʱÀñ°üÖØÖÃ! actID=%s,playerActID=%s,state=%s,giftbagTypeList=%s" % (actID, playerActID, state, giftbagTypeList), playerID)  
 | 
      
 | 
    Sync_FlashGiftbagActionInfo(curPlayer)  
 | 
    return True  
 | 
  
 | 
def ResetGiftbagItemBuyCount(curPlayer, giftbagTypeList):  
 | 
    ##ÖØÖÃÏÞʱÀñ°üÏÞ¹ºÎïÆ·´ÎÊý  
 | 
    syncIDList = []  
 | 
    ipyDataMgr = IpyGameDataPY.IPY_Data()  
 | 
    for i in xrange(ipyDataMgr.GetFlashGiftbagCount()):  
 | 
        giftbag = ipyDataMgr.GetFlashGiftbagByIndex(i)  
 | 
        if not giftbag.GetBuyCountLimit():  
 | 
            continue  
 | 
        if giftbag.GetGiftbagType() not in giftbagTypeList:  
 | 
            continue  
 | 
        buyCntKey = ChConfig.Def_PDict_FlashGiftbagBuyCount % giftbag.GetGiftbagID()  
 | 
        if curPlayer.NomalDictGetProperty(buyCntKey) <= 0:  
 | 
            continue  
 | 
        PlayerControl.NomalDictSetProperty(curPlayer, buyCntKey, 0)  
 | 
        syncIDList.append(giftbag.GetGiftbagID())  
 | 
    if syncIDList:  
 | 
        SyncFlashGiftbagBuyCount(curPlayer, syncIDList)  
 | 
    return  
 | 
  
 | 
def OnPlayerOrderGiftbag(curPlayer, giftbagIDList, addDRDict):  
 | 
    ## Íæ¼Ò¶©¹ºÏÞʱÀñ°ü  
 | 
    actInfo = PyGameData.g_operationActionDict.get(ShareDefine.OperationActionName_FlashGiftbag, {})  
 | 
    if not actInfo:  
 | 
        DataRecordPack.DR_CTGError(curPlayer, "FlashGiftbag action info is null!", addDRDict)  
 | 
        return  
 | 
      
 | 
    actInfo = PyGameData.g_operationActionDict.get(ShareDefine.OperationActionName_FlashGiftbag, {})  
 | 
    state = actInfo.get(ShareDefine.ActKey_State, 0)  
 | 
    if not state:  
 | 
        DataRecordPack.DR_CTGError(curPlayer, "FlashGiftbag state is 0!", addDRDict)  
 | 
        return  
 | 
      
 | 
    giftbagTypeList = actInfo.get(ShareDefine.ActKey_GiftbagTypeList, [])  
 | 
    if not giftbagTypeList:  
 | 
        DataRecordPack.DR_CTGError(curPlayer, "FlashGiftbag GiftbagTypeList is null!", addDRDict)  
 | 
        return  
 | 
    actGiftbagType = giftbagTypeList[-1] if state > len(giftbagTypeList) else giftbagTypeList[state - 1]  
 | 
    giftbagIpyDataList = IpyGameDataPY.GetIpyGameDataByCondition("FlashGiftbag", {"GiftbagType":actGiftbagType}, True, True)  
 | 
    actGiftbagIDList = []  
 | 
    giftbagIpyData = None  
 | 
    for ipyData in giftbagIpyDataList:  
 | 
        actGiftbagIDList.append(ipyData.GetGiftbagID())  
 | 
        if ipyData.GetGiftbagID() in giftbagIDList:  
 | 
            giftbagIpyData = ipyData  
 | 
            break  
 | 
          
 | 
    if not giftbagIpyData:  
 | 
        DataRecordPack.DR_CTGError(curPlayer, "OrderInfo giftbagIDList=%s can not found actGiftbagID in actGiftbagIDList=%s,actGiftbagType=%s"   
 | 
                                   % (giftbagIDList, actGiftbagIDList, actGiftbagType), addDRDict)  
 | 
        return  
 | 
      
 | 
    giftbagID = giftbagIpyData.GetGiftbagID()  
 | 
    giftItemList = giftbagIpyData.GetGiftItemList()  
 | 
    addDRDict.update({"giftbagID":giftbagID, "giftItemList":giftItemList})  
 | 
    buyCountLimit = giftbagIpyData.GetBuyCountLimit()  
 | 
    buyCount = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_FlashGiftbagBuyCount % giftbagID)  
 | 
    if buyCountLimit:  
 | 
        addDRDict.update({"buyCountLimit":buyCountLimit, "buyCount":buyCount})  
 | 
        if buyCount >= buyCountLimit:  
 | 
            DataRecordPack.DR_CTGError(curPlayer, "FlashGiftbag Pay count limit !buyCount=%s,buyCountLimit=%s"   
 | 
                                       % (buyCount, buyCountLimit), addDRDict)  
 | 
            return  
 | 
    PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_FlashGiftbagBuyCount % giftbagID, buyCount + 1)  
 | 
      
 | 
    if giftItemList:  
 | 
        needSpace = len(giftItemList)  
 | 
        emptySpace = ItemCommon.GetItemPackSpace(curPlayer, IPY_GameWorld.rptItem, needSpace)  
 | 
        if emptySpace < needSpace:  
 | 
            PlayerControl.SendMailByKey("", [curPlayer.GetPlayerID()], giftItemList)  
 | 
        else:  
 | 
            for itemID, itemCount, isBind in giftItemList:  
 | 
                ItemControler.GivePlayerItem(curPlayer, itemID, itemCount, isBind, [IPY_GameWorld.rptItem],   
 | 
                                             event=[ChConfig.ItemGive_CTG, True, addDRDict])  
 | 
      
 | 
    # È¡Íæ¼ÒAPPID£¬»ì·þʹÓà  
 | 
    appID = GameWorld.GetPlayerPlatform(curPlayer.GetAccID())  
 | 
    notifyKey = giftbagIpyData.GetNotifyKey()  
 | 
    if notifyKey:  
 | 
        orderIpyData = GetFlashGiftbagIDOrderInfoIpyData(giftbagID, appID)  
 | 
        rmb = 0 if not orderIpyData else int(orderIpyData.GetPayRMBNum())  
 | 
        PlayerControl.WorldNotify(0, notifyKey, [curPlayer.GetPlayerName(), rmb, giftbagIpyData.GetMainItemID()])  
 | 
          
 | 
    SyncFlashGiftbagBuyCount(curPlayer, [giftbagID])  
 | 
    return True  
 | 
  
 | 
def SyncFlashGiftbagBuyCount(curPlayer, syncIDList=[], giftbagTypeList=[]):  
 | 
    ## Í¨ÖªÏÞʱÀñ°üÍæ¼Ò»î¶¯ÐÅÏ¢  
 | 
    giftbagBuyInfo = ChPyNetSendPack.tagMCFlashGiftbagPlayerInfo()  
 | 
    giftbagBuyInfo.BuyCountList = []  
 | 
    if syncIDList:  
 | 
        for giftID in syncIDList:  
 | 
            buyCnt = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_FlashGiftbagBuyCount % giftID)  
 | 
            buyCountInfo = ChPyNetSendPack.tagMCFlashGiftbagBuyCount()  
 | 
            buyCountInfo.GiftbagID = giftID  
 | 
            buyCountInfo.BuyCount = buyCnt  
 | 
            giftbagBuyInfo.BuyCountList.append(buyCountInfo)  
 | 
    else:  
 | 
        ipyDataMgr = IpyGameDataPY.IPY_Data()  
 | 
        for i in xrange(ipyDataMgr.GetFlashGiftbagCount()):  
 | 
            giftbag = ipyDataMgr.GetFlashGiftbagByIndex(i)  
 | 
            if not giftbag.GetBuyCountLimit():  
 | 
                continue  
 | 
            if giftbagTypeList and giftbag.GetGiftbagType() not in giftbagTypeList:  
 | 
                continue  
 | 
            giftID = giftbag.GetGiftbagID()  
 | 
            buyCnt = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_FlashGiftbagBuyCount % giftID)  
 | 
            if buyCnt <= 0:  
 | 
                continue  
 | 
            buyCountInfo = ChPyNetSendPack.tagMCFlashGiftbagBuyCount()  
 | 
            buyCountInfo.GiftbagID = giftID  
 | 
            buyCountInfo.BuyCount = buyCnt  
 | 
            giftbagBuyInfo.BuyCountList.append(buyCountInfo)  
 | 
    giftbagBuyInfo.Count = len(giftbagBuyInfo.BuyCountList)  
 | 
    NetPackCommon.SendFakePack(curPlayer, giftbagBuyInfo)  
 | 
    return  
 | 
  
 | 
def Sync_FlashGiftbagActionInfo(curPlayer):  
 | 
    ## Í¨ÖªÏÞʱÀñ°ü»î¶¯ÐÅÏ¢  
 | 
    actInfo = PyGameData.g_operationActionDict.get(ShareDefine.OperationActionName_FlashGiftbag, {})  
 | 
    if not actInfo:  
 | 
        return  
 | 
      
 | 
    if not actInfo.get(ShareDefine.ActKey_State):  
 | 
        return  
 | 
      
 | 
    cfgID = actInfo.get(ShareDefine.ActKey_CfgID, 0)  
 | 
    giftbagTypeList = actInfo.get(ShareDefine.ActKey_GiftbagTypeList, 0)  
 | 
      
 | 
    if not cfgID or not giftbagTypeList:  
 | 
        return  
 | 
      
 | 
    flashGiftbagIpyData = IpyGameDataPY.GetIpyGameData("ActFlashGiftbag", cfgID)  
 | 
    if not flashGiftbagIpyData:  
 | 
        return  
 | 
      
 | 
    startTimeList = flashGiftbagIpyData.GetStartTimeList()  
 | 
    endTimeList = flashGiftbagIpyData.GetEndTimeList()  
 | 
    if len(startTimeList) != len(endTimeList):  
 | 
        GameWorld.ErrLog("ÏÞʱÀñ°ü¿ª¹ØÊ±¼äʱ·ÖÅäÖôíÎó!cfgID=%s" % cfgID)  
 | 
        return  
 | 
      
 | 
    # È¡Íæ¼ÒAPPID£¬»ì·þʹÓà  
 | 
    appID = GameWorld.GetPlayerPlatform(curPlayer.GetAccID())  
 | 
      
 | 
    packInfo = ChPyNetSendPack.tagMCFlashGiftbagInfo()  
 | 
    packInfo.StartDate = flashGiftbagIpyData.GetStartDate()  
 | 
    packInfo.EndtDate = flashGiftbagIpyData.GetEndDate()  
 | 
    packInfo.ActivityTime = []  
 | 
    for i, startTime in enumerate(startTimeList):  
 | 
        timeInfo = ChPyNetSendPack.tagMCFlashGiftbagTime()  
 | 
        timeInfo.StartTime = startTime  
 | 
        timeInfo.EndtTime = endTimeList[i]  
 | 
        packInfo.ActivityTime.append(timeInfo)  
 | 
    packInfo.ActivityTimeCount = len(packInfo.ActivityTime)  
 | 
    packInfo.IsDayReset = flashGiftbagIpyData.GetIsDayReset()  
 | 
    packInfo.LimitLV = flashGiftbagIpyData.GetLVLimit()  
 | 
    packInfo.GiftbagTypeInfo = []  
 | 
    for giftbagType in giftbagTypeList:  
 | 
          
 | 
        giftbagIpyDataList = IpyGameDataPY.GetIpyGameDataByCondition("FlashGiftbag", {"GiftbagType":giftbagType}, True, True)  
 | 
        if not giftbagIpyDataList:  
 | 
            continue  
 | 
          
 | 
        giftType = ChPyNetSendPack.tagMCFlashGiftbagType()  
 | 
        giftType.GiftbagInfo = []  
 | 
          
 | 
        for giftIpyData in giftbagIpyDataList:  
 | 
            giftbagID = giftIpyData.GetGiftbagID()  
 | 
            orderIpyData = GetFlashGiftbagIDOrderInfoIpyData(giftbagID, appID)  
 | 
            giftBag = ChPyNetSendPack.tagMCFlashGiftbag()  
 | 
            giftBag.GiftID = giftbagID  
 | 
            giftBag.OrderInfo = "" if not orderIpyData else orderIpyData.GetOrderInfo()  
 | 
            giftBag.OrderInfoLen = len(giftBag.OrderInfo)  
 | 
            giftBag.BuyCountLimit = giftIpyData.GetBuyCountLimit()  
 | 
            giftBag.RMB = 0 if not orderIpyData else int(orderIpyData.GetPayRMBNum())  
 | 
            giftBag.RMBOriginal = giftIpyData.GetOriginalRMB()  
 | 
            giftBag.ItemInfo = []  
 | 
            for itemID, itemCount, isBind in giftIpyData.GetGiftItemList():  
 | 
                item = ChPyNetSendPack.tagMCFlashGiftbagItem()  
 | 
                item.ItemID = itemID  
 | 
                item.ItemCount = itemCount  
 | 
                item.IsBind = isBind  
 | 
                item.IsMainItem = int(itemID == giftIpyData.GetMainItemID())  
 | 
                giftBag.ItemInfo.append(item)  
 | 
            giftBag.GiftItemCount = len(giftBag.ItemInfo)  
 | 
            giftType.GiftbagInfo.append(giftBag)  
 | 
              
 | 
        giftType.GiftbagCount = len(giftType.GiftbagInfo)  
 | 
        packInfo.GiftbagTypeInfo.append(giftType)  
 | 
          
 | 
    packInfo.GiftbagTypeCount = len(packInfo.GiftbagTypeInfo)  
 | 
    NetPackCommon.SendFakePack(curPlayer, packInfo)  
 | 
    return  
 | 
  
 | 
def GetFlashGiftbagIDOrderInfoIpyData(giftbagID, appID):  
 | 
    ## »ñÈ¡Àñ°üID¶ÔӦʵ¼ÊÊÛ¼Û  
 | 
    key = "FlashGiftbagIDRMB"  
 | 
    FlashGiftbagIDRMBDict = IpyGameDataPY.GetConfigEx(key)  
 | 
    if not FlashGiftbagIDRMBDict:  
 | 
        FlashGiftbagIDRMBDict = {}  
 | 
        ipyDataMgr = IpyGameDataPY.IPY_Data()  
 | 
        for i in xrange(ipyDataMgr.GetOrderInfoCount()):  
 | 
            ipyData = ipyDataMgr.GetOrderInfoByIndex(i)  
 | 
            #if ipyData.GetAppID() != appID:  
 | 
            #    continue  
 | 
            if not ipyData.GetGiftbagID():  
 | 
                continue  
 | 
            FlashGiftbagIDRMBDict[(ipyData.GetGiftbagID(), ipyData.GetAppID())] = ipyData  
 | 
        IpyGameDataPY.SetConfigEx(key, FlashGiftbagIDRMBDict)  
 | 
    return FlashGiftbagIDRMBDict.get((giftbagID, appID))  
 | 
  
 |