| #!/usr/bin/python  | 
| # -*- coding: GBK -*-  | 
| #-------------------------------------------------------------------------------  | 
| #  | 
| ##@package Player.PlayerFlashSale  | 
| #  | 
| # @todo:ÏÞʱÇÀ¹º»î¶¯  | 
| # @author xdh  | 
| # @date 2018-7-17  | 
| # @version 1.0  | 
| #  | 
| # ÏêϸÃèÊö: ÏÞʱÇÀ¹º»î¶¯  | 
| #  | 
| #-------------------------------------------------------------------------------  | 
| #"""Version = 2018-7-17 12:00"""  | 
| #-------------------------------------------------------------------------------  | 
|   | 
| import PyGameData  | 
| import ShareDefine  | 
| import PlayerControl  | 
| import IpyGameDataPY  | 
| import FunctionNPCCommon  | 
| import ChPyNetSendPack  | 
| import NetPackCommon  | 
| import GameWorld  | 
| import ChConfig  | 
|   | 
| import datetime  | 
|   | 
| def GetActNumDictType(actNum):  | 
|     '''»ñÈ¡»î¶¯·Ö×é±àºÅ¶ÔÓ¦µÄ×ÖµäÀàÐÍ  | 
|     ÒòΪ±¾¹¦ÄÜÓÃÁË ClearNomalDict ²»Í¬µÄ»î¶¯·Ö×鱨Ðë²»Ò»ÑùµÄ×ÖµäÀàÐÍ£¬²»ÄÜ¿ÉÄܵ¼Ö²»Í¬»î¶¯·Ö×éÊý¾ÝÒì³£  | 
|     '''  | 
|     actType = actNum / 10  | 
|     if actType == ShareDefine.ActType_OpenComm:  | 
|         return ChConfig.Def_PDictType_FlashSale  | 
|     if actType == ShareDefine.ActType_MixServer:  | 
|         return ChConfig.Def_PDictType_FlashSaleMix  | 
|     if actType == ShareDefine.ActType_Feast:  | 
|         return ChConfig.Def_PDictType_FlashSaleFeast  | 
|     return 0  | 
|   | 
| def GetShopTypeList(cfgID, dayIndex, state, woldLV):  | 
|     if cfgID == 0 or state == 0:  | 
|         return []  | 
|     ipyData = IpyGameDataPY.GetIpyGameData("ActFlashSale", cfgID)  | 
|     if not ipyData:  | 
|         return []  | 
|     shopTypeList = GameWorld.GetDictValueByRangeKey(ipyData.GetShopTypeList(), woldLV, [])  | 
|     if not shopTypeList:  | 
|         return []  | 
|     todayShopTypeList = shopTypeList[-1] if dayIndex >= len(shopTypeList) else shopTypeList[dayIndex]  | 
|     return [todayShopTypeList[state - 1] if state - 1 < len(todayShopTypeList) else todayShopTypeList[-1]]  | 
|   | 
|   | 
| def OnPlayerLogin(curPlayer):  | 
|       | 
|     for actInfo in PyGameData.g_operationActionDict.get(ShareDefine.OperationActionName_FlashSale, {}).values():  | 
|         actNum = actInfo.get(ShareDefine.ActKey_ActNum, 0)  | 
|         __CheckPlayerflashSaleAction(curPlayer, actNum)  | 
|           | 
|     return  | 
|   | 
| def RefreshflashSaleActionInfo(actNum):  | 
|     ## ÊÕµ½GameServerͬ²½µÄ»î¶¯ÐÅÏ¢£¬Ë¢Ð»ÐÅÏ¢  | 
|     playerManager = GameWorld.GetPlayerManager()  | 
|     for index in xrange(playerManager.GetPlayerCount()):  | 
|         curPlayer = playerManager.GetPlayerByIndex(index)  | 
|         if curPlayer.GetID() == 0:  | 
|             continue  | 
|         __CheckPlayerflashSaleAction(curPlayer, actNum)  | 
|     return  | 
|   | 
|   | 
| def __CheckPlayerflashSaleAction(curPlayer, actNum):  | 
|     ## ¼ì²éÍæ¼ÒÏÞʱÇÀ¹º»î¶¯Êý¾ÝÐÅÏ¢  | 
|       | 
|     playerID = curPlayer.GetPlayerID()  | 
|       | 
|     actInfo = GameWorld.GetActInfo(ShareDefine.OperationActionName_FlashSale, actNum)  | 
|     actID = actInfo.get(ShareDefine.ActKey_ID, 0)  | 
|     state = actInfo.get(ShareDefine.ActKey_State, 0)  | 
|     cfgID = actInfo.get(ShareDefine.ActKey_CfgID, 0)  | 
|     dayIndex = actInfo.get(ShareDefine.ActKey_DayIndex, 0)  | 
|     woldLV = actInfo.get(ShareDefine.ActKey_WorldLV, 0)  | 
|     dType = GetActNumDictType(actNum)  | 
|       | 
|     playerActID = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_FlashSaleID % actNum, 0, dType)  # Íæ¼ÒÉíÉϵĻID  | 
|     playerActState = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_FlashSaleState % actNum, 0, dType)  # Íæ¼ÒÉíÉϵĻState  | 
|     playerMailState = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_FlashSaleMailState % actNum, 0, dType)  # Íæ¼ÒÉíÉϵĻÌáÐÑÓʼþ״̬  | 
|     isReset = False  | 
|     if actID != playerActID or (state != playerActState):  | 
|         isReset = True  | 
|         if cfgID:  | 
|             flashSaleIpyData = IpyGameDataPY.GetIpyGameData("ActFlashSale", cfgID)  | 
|             if not flashSaleIpyData:  | 
|                 return  | 
|             startDate, _ = GameWorld.GetOperationActionDateStr(flashSaleIpyData)  | 
|             startTimeNum = GameWorld.ChangeTimeStrToNum(startDate, timeFormat=ChConfig.TYPE_Time_Format_Day)  | 
|         else:  | 
|             startTimeNum = 0  | 
|         if playerMailState != startTimeNum:  | 
|             GameWorld.DebugLog('    ÏÞʱÇÀ¹º»î¶¯ÖØÖÃ! actNum=%s,dType=%s' % (actNum, dType), playerID)  | 
|             curPlayer.ClearNomalDict(dType)  | 
|               | 
|         shopTypeList = GetShopTypeList(cfgID, dayIndex, state, woldLV)  | 
|         if shopTypeList:  | 
|             FunctionNPCCommon.ResetShopItemBuyCountByShopType(curPlayer, shopTypeList)  | 
|         PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_FlashSaleID % actNum, actID, dType)  | 
|         PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_FlashSaleState % actNum, state, dType)  | 
|         #Sync_flashSaleActionInfo(curPlayer)  | 
|         GameWorld.DebugLog("ÏÞʱÇÀ¹ºµ¥³¡ÖØÖÃ! actNum=%s,actID=%s,playerActID=%s,dayIndex=%s,state=%s,playerActState=%s,shopTypeList=%s,playerMailState=%s" % (actNum, actID, playerActID, dayIndex, state, playerActState, shopTypeList,playerMailState), playerID)  | 
|     else:  | 
|         GameWorld.DebugLog("ÏÞʱÇÀ¹º»î¶¯ID²»±ä£¬²»´¦Àí£¡actNum=%s,actID=%s,state=%s" % (actNum, actID, state), playerID)  | 
|           | 
|     if cfgID:  | 
|         Sync_flashSaleActionInfo(curPlayer, actNum)  | 
|         Sync_FlashSaleAppointmentInfo(curPlayer, actNum)  | 
|     return isReset  | 
|   | 
| def IsFlashSaleShopType(shopType):  | 
|     ## ÅжÏÊÇ·ñ»î¶¯ÖеÄÉÌµê  | 
|     for actInfo in PyGameData.g_operationActionDict.get(ShareDefine.OperationActionName_FlashSale, {}).values():  | 
|         actNum = actInfo.get(ShareDefine.ActKey_ActNum, 0)  | 
|           | 
|         state = actInfo.get(ShareDefine.ActKey_State, 0)  | 
|         if not state:  | 
|             continue  | 
|         shopTypeList = GetShopTypeList(actInfo.get(ShareDefine.ActKey_CfgID, 0), actInfo.get(ShareDefine.ActKey_DayIndex, 0), state, actInfo.get(ShareDefine.ActKey_WorldLV, 0))  | 
|         if not shopTypeList:  | 
|             continue  | 
|         actShopType = shopTypeList[0]  | 
|         if shopType == actShopType:  | 
|             GameWorld.DebugLog("ÏÞʱÇÀ¹º»î¶¯ÖеÄÉ̵êÀàÐÍ: actNum=%s,shopType=%s" % (actNum, shopType))  | 
|             return True  | 
|           | 
|     GameWorld.DebugLog("ÏÞʱÇÀ¹º·Ç»î¶¯Öлò·Ç»î¶¯ÖеÄÉ̵êÀàÐÍ£¡shopType=%s" % (shopType))  | 
|     return False  | 
|   | 
| def ProcessFlashSaleMail(curPlayer, tick):  | 
|     if not GameWorld.SetPlayerTickTime(curPlayer, ChConfig.TYPE_Player_Tick_FlashSale, tick):  | 
|         return  | 
|       | 
|     for actInfo in PyGameData.g_operationActionDict.get(ShareDefine.OperationActionName_FlashSale, {}).values():  | 
|         actNum = actInfo.get(ShareDefine.ActKey_ActNum, 0)  | 
|         if not actInfo:  | 
|             continue  | 
|         cfgID = actInfo.get(ShareDefine.ActKey_CfgID, 0)  | 
|         if not cfgID:  | 
|             continue  | 
|         dType = GetActNumDictType(actNum)  | 
|         playerMailState = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_FlashSaleMailState % actNum, 0, dType)  # Íæ¼ÒÉíÉϵĻÌáÐÑÓʼþ״̬  | 
|         if playerMailState:  | 
|             continue  | 
|         flashSaleIpyData = IpyGameDataPY.GetIpyGameData("ActFlashSale", cfgID)  | 
|         if not flashSaleIpyData:  | 
|             continue  | 
|         mailKey = flashSaleIpyData.GetMailKey()  | 
|         LVLimit = flashSaleIpyData.GetLVLimit()  | 
|         if not mailKey or curPlayer.GetLV() < LVLimit:  | 
|             continue  | 
|         startDate, endDate = GameWorld.GetOperationActionDateStr(flashSaleIpyData)  | 
|         startTimeList = flashSaleIpyData.GetStartTimeList()  | 
|         endTimeList = flashSaleIpyData.GetEndTimeList()  | 
|         if not startTimeList or not endTimeList:  | 
|             continue  | 
|         advanceMinutes = flashSaleIpyData.GetAdvanceMinutes()  | 
|         startTime = datetime.datetime.strptime("%s %s:00" % (startDate, startTimeList[0]), ChConfig.TYPE_Time_Format) + datetime.timedelta(minutes=-advanceMinutes)  | 
|         endTime = datetime.datetime.strptime("%s %s:00" % (endDate, endTimeList[-1]), ChConfig.TYPE_Time_Format)  | 
|         curDateTime = GameWorld.GetCurrentTime()  | 
|         if startTime <= curDateTime <= endTime:  | 
|             paramList = [startDate.replace('-','/'), endDate.replace('-','/'), GameWorld.GbkToCode('¡¢').join(startTimeList)]  | 
|             PlayerControl.SendMailByKey(mailKey, [curPlayer.GetID()], flashSaleIpyData.GetMailItemPrize(), paramList)  | 
|             startTimeNum = GameWorld.ChangeTimeStrToNum(startDate, timeFormat=ChConfig.TYPE_Time_Format_Day)  | 
|             PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_FlashSaleMailState % actNum, startTimeNum, dType)  | 
|             GameWorld.DebugLog("    ·¢ËÍÐÂÏÞʱÇÀ¹ºÓʼþÌáÐÑ!", curPlayer.GetID())  | 
|     #    else:  | 
|     #        GameWorld.DebugLog("    ·¢ËÍÐÂÏÞʱÇÀ¹ºÓʼþÌáÐÑ  Ê±¼äûµ½!startTime=%s,endTime=%s,curDateTime=%s"%(startTime,endTime,curDateTime), curPlayer.GetID())  | 
|     return  | 
|   | 
|   | 
| def Sync_flashSaleActionInfo(curPlayer, actNum):  | 
|     ## Í¨ÖªÏÞʱÇÀ¹º»î¶¯ÐÅÏ¢  | 
|     actInfo = GameWorld.GetActInfo(ShareDefine.OperationActionName_FlashSale, actNum)  | 
|     if not actInfo:  | 
|         return  | 
|       | 
|     #ÐèÒªÌáǰ֪ͨ£¬ËùÒÔÈ¥µô´ËÏÞÖÆ  | 
|     #if not actInfo.get(ShareDefine.ActKey_State):  | 
|     #    return  | 
|       | 
|     cfgID = actInfo.get(ShareDefine.ActKey_CfgID, 0)  | 
|     if not cfgID:  | 
|         return  | 
|   | 
|     flashSaleIpyData = IpyGameDataPY.GetIpyGameData("ActFlashSale", cfgID)  | 
|     if not flashSaleIpyData:  | 
|         return  | 
|     woldLV = actInfo.get(ShareDefine.ActKey_WorldLV, 0)  | 
|     shopTypeList = GameWorld.GetDictValueByRangeKey(flashSaleIpyData.GetShopTypeList(), woldLV, [])  | 
|     startTimeList = flashSaleIpyData.GetStartTimeList()  | 
|     endTimeList = flashSaleIpyData.GetEndTimeList()  | 
|     if len(startTimeList) != len(endTimeList):  | 
|         GameWorld.ErrLog("ÏÞʱÇÀ¹º¿ª¹ØÊ±¼äʱ·ÖÅäÖôíÎó!cfgID=%s" % cfgID)  | 
|         return  | 
|     job = curPlayer.GetJob()  | 
|     startDateStr, endDateStr = GameWorld.GetOperationActionDateStr(flashSaleIpyData)  | 
|     packInfo = ChPyNetSendPack.tagMCFlashSaleInfo()  | 
|     packInfo.ActNum = actNum  | 
|     packInfo.StartDate = startDateStr  | 
|     packInfo.EndtDate = endDateStr  | 
|     packInfo.AdvanceMinutes = flashSaleIpyData.GetAdvanceMinutes()  | 
|     packInfo.ActivityTime = []  | 
|     for i, startTime in enumerate(startTimeList):  | 
|         timeInfo = ChPyNetSendPack.tagMCFlashSaleTime()  | 
|         timeInfo.StartTime = startTime  | 
|         timeInfo.EndtTime = endTimeList[i]  | 
|         packInfo.ActivityTime.append(timeInfo)  | 
|     packInfo.ActivityTimeCount = len(packInfo.ActivityTime)  | 
|     packInfo.IsDayReset = flashSaleIpyData.GetIsDayReset()  | 
|     packInfo.LimitLV = flashSaleIpyData.GetLVLimit()  | 
|     packInfo.ShopInfo = []  | 
|     for dayIndex, shopList in enumerate(shopTypeList):  | 
|         for timeIndex, shopType in enumerate(shopList):   | 
|             shopItemIpyDataList = IpyGameDataPY.GetIpyGameDataByCondition("Store", {"ShopType":shopType}, True, True)  | 
|             if not shopItemIpyDataList:  | 
|                 continue  | 
|               | 
|             shop = ChPyNetSendPack.tagMCFlashSaleShop()  | 
|             shop.DayIndex = dayIndex  | 
|             shop.TimeIndex = timeIndex  | 
|             shop.GiftbagInfo = []  | 
|               | 
|             for itemIpyData in shopItemIpyDataList:  | 
|                 giftBag = ChPyNetSendPack.tagMCFlashSaleGiftbag()  | 
|                 giftBag.GiftID = itemIpyData.GetID()  | 
|                 giftBag.BuyCountLimit = 0 if not itemIpyData.GetLimitCnt() else itemIpyData.GetLimitCnt()[0]  | 
|                 giftBag.ServerBuyCountLimit = itemIpyData.GetServerLimitCnt()  | 
|                 giftBag.MoneyType = itemIpyData.GetMoneyType()  | 
|                 giftBag.MoneyNumber = itemIpyData.GetMoneyNum()  | 
|                 giftBag.MoneyOriginal = itemIpyData.GetMoneyOriginal()  | 
|                 itemID = itemIpyData.GetItemID()  | 
|                 jobItemList = itemIpyData.GetJobItem()  | 
|                 jobItemID = FunctionNPCCommon.GetShopJobItem(job, itemID, jobItemList)  | 
|                 giftBag.ItemID = jobItemID  | 
|                 giftBag.ItemCount = itemIpyData.GetItemCnt()  | 
|                 giftBag.IsBind = itemIpyData.GetIsBind()  | 
|                 shop.GiftbagInfo.append(giftBag)  | 
|                   | 
|             shop.GiftbagCount = len(shop.GiftbagInfo)  | 
|             packInfo.ShopInfo.append(shop)  | 
|           | 
|     packInfo.ShopCount = len(packInfo.ShopInfo)  | 
|     NetPackCommon.SendFakePack(curPlayer, packInfo)  | 
|     return  | 
|   | 
|   | 
| #// AA 05 ÏÞʱÇÀ¹ºÔ¤Ô¼ #tagCMFlashSaleAppointment  | 
| #  | 
| #struct     tagCMFlashSaleAppointment  | 
| #{  | 
| #    tagHead        Head;  | 
| #    BYTE        ActNum;        //»î¶¯±àºÅ  | 
| #    DWORD        GoodsID;         // ÇÀ¹ºÉÌÆ·±êʶ  | 
| #    BYTE        State;         // 1-Ô¤Ô¼ 0-È¡Ïû  | 
| #};  | 
| def OnFlashSaleAppointment(index, packData, tick):  | 
|     curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index)  | 
|     actNum = packData.ActNum  | 
|     goodsID = packData.GoodsID  | 
|       | 
|     actInfo = GameWorld.GetActInfo(ShareDefine.OperationActionName_FlashSale, actNum)  | 
|     if not actInfo:  | 
|         return  | 
|     cfgID = actInfo.get(ShareDefine.ActKey_CfgID, 0)  | 
|     if not cfgID:  | 
|         return  | 
|     dType = GetActNumDictType(actNum)  | 
|     PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_FlashSaleYY % (actNum, goodsID), packData.State, dType)  | 
|     Sync_FlashSaleAppointmentInfo(curPlayer, actNum, goodsID)  | 
|     return  | 
|   | 
|   | 
| def Sync_FlashSaleAppointmentInfo(curPlayer, actNum, goodsID=0):  | 
|     ##֪ͨÏÞʱÇÀ¹ºÔ¤Ô¼Çé¿ö  | 
|     actInfo = GameWorld.GetActInfo(ShareDefine.OperationActionName_FlashSale, actNum)  | 
|     if not actInfo:  | 
|         return  | 
|     cfgID = actInfo.get(ShareDefine.ActKey_CfgID, 0)  | 
|     if not cfgID:  | 
|         return  | 
|     flashSaleIpyData = IpyGameDataPY.GetIpyGameData("ActFlashSale", cfgID)  | 
|     if not flashSaleIpyData:  | 
|         return  | 
|     woldLV = actInfo.get(ShareDefine.ActKey_WorldLV, 0)  | 
|     dType = GetActNumDictType(actNum)  | 
|       | 
|     packInfo = ChPyNetSendPack.tagMCFlashSaleAppointmentInfo()  | 
|     packInfo.ActNum = actNum  | 
|     packInfo.GoodsList = []  | 
|     if goodsID == 0:  | 
|         packInfo.IsAll = 1  | 
|         shopTypeList = GameWorld.GetDictValueByRangeKey(flashSaleIpyData.GetShopTypeList(), woldLV, [])  | 
|         for dayIndex, shopList in enumerate(shopTypeList):  | 
|             for timeIndex, shopType in enumerate(shopList):  | 
|                 shopItemIpyDataList = IpyGameDataPY.GetIpyGameDataByCondition("Store", {"ShopType":shopType}, True, True)  | 
|                 if not shopItemIpyDataList:  | 
|                     continue  | 
|                 for i in xrange(len(shopItemIpyDataList)):  | 
|                     goodsMark = dayIndex * 10000 + timeIndex * 100 + i  #ÉÌÆ·±êʶ  | 
|                     isAppointment = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_FlashSaleYY % (actNum, goodsMark), 0, dType)  | 
|                     if isAppointment:  | 
|                         appoinetmentPack = ChPyNetSendPack.tagMCFlashSaleAppointmentState()  | 
|                         appoinetmentPack.GoodsMark = goodsMark  | 
|                         appoinetmentPack.State = 1  | 
|                         packInfo.GoodsList.append(appoinetmentPack)  | 
|     else:  | 
|         packInfo.IsAll = 0  | 
|         isAppointment = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_FlashSaleYY % (actNum, goodsID), 0, dType)  | 
|         appoinetmentPack = ChPyNetSendPack.tagMCFlashSaleAppointmentState()  | 
|         appoinetmentPack.GoodsMark = goodsID  | 
|         appoinetmentPack.State = isAppointment  | 
|         packInfo.GoodsList.append(appoinetmentPack)  | 
|     packInfo.GoodsCount = len(packInfo.GoodsList)  | 
|     NetPackCommon.SendFakePack(curPlayer, packInfo)  | 
|     return  |