#!/usr/bin/python # -*- coding: GBK -*- # # ##@package PlayerCompensation.py # # @todo:Óʼþ¹ÜÀí£¨²¹³¥£© # 1. È«·þÓʼþÒ»¸öGUIDÒ»·âÓʼþ£¬ÓÐʱ¼äÏÞÖÆ£¬½ÓÊÕÓʼþµÄ³ÖÐøÊ±¼äºÍÑÓ³Ùɾ³ýʱ¼äµã(¿É½ÓÊÕºóµÄXÌìɾ³ýÓʼþ) # ±íʾÈç¹ûÈ«·þÓʼþÒѾ­Í¨Öª¹ýij¸öÍæ¼Ò£¬ÄÇô¶ÔÓÚ¸ÃÍæ¼Ò£¬¼´Ê¹Óʼþ¹ýÆÚÍæ¼ÒûÓÐÖ÷¶¯É¾³ýÓʼþ£¬Ò²Ó¦¸Ã֪ͨ¸ÃÍæ¼Ò # 2. ¸öÈËÓʼþÒ»¸öGUID¿ÉÒÔÊǸöÈË»òÕß¶àÈËÓʼþ£¬µ«ÊǶàÈËÓʼþ²»Ö§³ÖÅäÖÿÉÁìÈ¡µÄ³ÖÐøÊ±¼ä£¬ÈôÒªÖ§³ÖÐèÐÞ¸ÄÁìÈ¡¼Ç¼Âß¼­ # 3. ¸öÈËÓʼþ°´ÀàÐÍ·Ö²»Í¬µÄ¿É±£´æÊýÁ¿£¬Íæ¼Ò²»¸ÐÖª # 4. ¹ØÓÚÓʼþ·¢¼þÈË ±êÌâ ºÍ ÕýÎÄ£¬Èç¹ûÊÇÄ£°å»òÕß×éºÏÐÅÏ¢À࣬¶¼Ó¦¸ÃÓÉǰ¶Ë×éÖ¯Íê³É£¬ºó¶Ëֻȡģ°å±êʶ # 5. ¿ÉÁìÈ¡¼´ÒÑ֪ͨ¹ýÍæ¼Ò¸Ã·âÓʼþ£¬ÐèÒªÔÚÓʼþ·¢ÉúʱºÍÉÏÏßʱÉèÖÃ״̬ # # @author alee # @date 2017-08-11 20:00 # @version 1.1 # @note: # @change: "2018-08-10 12:00" hxp È«·þÓʼþÔö¼ÓÉý¼¶ºóÊÇ·ñ¿ÉÁìȡѡÏîÉèÖã¬Ôö¼ÓÓʼþ²éѯ¡¢Í¨¹ýÉóºË¡¢É¾³ý¹¦ÄÜ£» #------------------------------------------------------------------------------ #"""Version = 2018-08-10 12:00""" #------------------------------------------------------------------------------ import GameWorld import ChConfig import ShareDefine import IPY_GameServer import ChGameToMapPyPack import NetPackCommon import CommFunc import ChPyNetSendPack import PyGameDataStruct import CrossRealmMsg import DataRecordPack import ReadChConfig import PlayerDBOper import EventReport import IpyGameDataPY import PlayerControl import PyDataManager import PyGameData import datetime import uuid import math import json #Áìȡ״̬ ¸öλÊý±êʶ £¨¿ÉÁìÈ¡¼´ÒÑ֪ͨ¹ýÍæ¼Ò¸Ã·âÓʼþ£¬ÐèÒªÔÚÓʼþ·¢ÉúʱºÍÉÏÏßʱÉèÖÃ״̬ #0 δ֪ͨ£¬1 ²»¿ÉÁìÈ¡£¬ 2 ¿ÉÁìÈ¡£¬ 3 ÒÑÁìÈ¡ ( Unknown_State, Disable_State, Enable_State, Yet_State ) = range(4) CheckState_OK = 0 # ÒÑÉóºË CheckState_No = 1 # δÉóºË LimitLVType_Not = 0 # Éý¼¶Âú×ãÁìÈ¡µÈ¼¶ºó²»¿ÉÁì LimitLVType_Can = 1 # Éý¼¶Âú×ãÁìÈ¡µÈ¼¶ºó¿ÉÁì #Áìȡ״̬ ʮλÊý±êʶ ( Read_State_No, # Óʼþδ¶Á Read_State_Yes # ÓʼþÒѶÁ ) = range(2) #Áìȡ״̬ ( Entire_CompensationType, #È«·þ Personal_CompensationType, #¸öÈË Unknow_CompensationType #δ֪ ) = range(3) Def_RequestState = "CompensationRequestState" #================================================================================================== class CrossPersonalCompensationManager(object): ## ¿ç·þÓʼþ¹ÜÀí£¬×¢Òâ¸ÃÀàÖ»´¦ÀíÊý¾ÝÂß¼­£¬¹¦ÄÜÏà¹ØÂß¼­²»ÒªÐ´ÔÚ¸ÃÀ࣬²»È»ÖضÁ½Å±¾²»»áÉúЧ def __init__(self): self.playerMailDict = {} # Íæ¼Ò²¹³¥Áбí {playerID:{GUID:tagDBCrossPersonalCompensation, ...}, ...} return # ±£´æÊý¾Ý ´æÊý¾Ý¿âºÍrealtimebackup def GetSaveData(self): savaData = "" cntData = "" cnt = 0 for mailDict in self.playerMailDict.values(): for mailObj in mailDict.values(): cnt += 1 savaData += mailObj.getBuffer() GameWorld.Log("Save DBCrossPersonalCompensation count :%s, len=%s" % (cnt, len(savaData))) return CommFunc.WriteDWORD(cntData, cnt) + savaData # ´ÓÊý¾Ý¿âÔØÈëÊý¾Ý def LoadPyGameData(self, datas, pos, dataslen): cnt, pos = CommFunc.ReadDWORD(datas, pos) GameWorld.Log("Load DBCrossPersonalCompensation count :%s" % cnt) for _ in xrange(cnt): mailObj = PyGameDataStruct.tagDBCrossPersonalCompensation() mailObj.clear() pos += mailObj.readData(datas, pos, dataslen) playerID = mailObj.PlayerID guid = mailObj.GUID if playerID not in self.playerMailDict: self.playerMailDict[playerID] = {} mailDict = self.playerMailDict[playerID] mailDict[guid] = mailObj return pos def Sync_CrossMailPlayerIDToClientServer(serverGroupID=0): ''' ͬ²½Óпç·þÓʼþµÄÍæ¼ÒIDµ½×Ó·þ @param serverGroupID: Ϊ0ʱͬ²½ËùÓÐ×Ó·þ ''' crossMailMgr = PyDataManager.GetCrossPersonalCompensationManager() addMailPlayerIDList = crossMailMgr.playerMailDict.keys() if not addMailPlayerIDList: return # ͬ²½×Ó·þÎñÆ÷ serverGroupIDList = [serverGroupID] if serverGroupID else [] dataMsg = {"IDType":"Add", "PlayerIDList":addMailPlayerIDList} CrossRealmMsg.SendMsgToClientServer(ShareDefine.CrossServerMsg_MailPlayerIDList, dataMsg, serverGroupIDList) return def CrossServerMsg_MailPlayerIDList(dataMsg): ## ÊÕµ½¿ç·þ·þÎñÆ÷ͬ²½Óпç·þÓʼþµÄÍæ¼ÒIDÁбí idType = dataMsg["IDType"] playerIDList = dataMsg["PlayerIDList"] for playerID in playerIDList: if idType == "Del": if playerID in PyGameData.g_crossMailPlayerDict: PyGameData.g_crossMailPlayerDict.pop(playerID) continue if idType == "Add": if playerID in PyGameData.g_crossMailPlayerDict: continue PyGameData.g_crossMailPlayerDict[playerID] = 0 player = GameWorld.GetPlayerManager().FindPlayerByID(playerID) if not player or not player.GetInitOK(): continue RequestToGetCrossMail(player) return def RequestToGetCrossMail(curPlayer): ## ÇëÇóͬ²½¿ç·þÓʼþÄÚÈÝ playerID = curPlayer.GetPlayerID() if playerID not in PyGameData.g_crossMailPlayerDict: return lastTick = PyGameData.g_crossMailPlayerDict[playerID] tick = GameWorld.GetGameWorld().GetTick() if tick - lastTick <= 30000: return PyGameData.g_crossMailPlayerDict[playerID] = tick dataMsg = {"CMD":"Get", "PlayerID":playerID} CrossRealmMsg.SendMsgToCrossServer(ShareDefine.ClientServerMsg_MailContent, dataMsg) return def ClientServerMsg_MailContent(serverGroupID, msgData, tick): ## ÊÕµ½×Ó·þÍæ¼ÒÇëÇóͬ²½¿ç·þÓʼþ GameWorld.Log("ÊÕµ½×Ó·þÍæ¼Òͬ²½¸öÈËÓʼþÃüÁî: serverGroupID=%s, %s" % (serverGroupID, msgData)) reqCMD = msgData["CMD"] playerID = msgData["PlayerID"] guidList = msgData.get("GuidList", []) crossMailMgr = PyDataManager.GetCrossPersonalCompensationManager() if playerID not in crossMailMgr.playerMailDict: return playerMailDict = crossMailMgr.playerMailDict[playerID] if reqCMD == "Get": SyncTickAttrKey = "SyncTick" getMailList = [] for guid, mailObj in playerMailDict.items(): if hasattr(mailObj, SyncTickAttrKey): getTick = getattr(mailObj, SyncTickAttrKey) if tick - getTick <= 30000: GameWorld.DebugLog("¶Ìʱ¼äÄÚÖØ¸´ÇëÇóÁìÈ¡µÄÓʼþ²»Í¬²½£¬·ÀÖ¹ÖØ¸´·¢·Å! GUID=%s" % guid) continue setattr(mailObj, SyncTickAttrKey, tick) crossMailDict = {"PlayerID":mailObj.PlayerID, "GUID":mailObj.GUID, "LimitTime":mailObj.LimitTime, "Text":mailObj.Text, "ItemInfo":mailObj.ItemInfo, "Detail":mailObj.Detail, "Gold":mailObj.Gold, "GoldPaper":mailObj.GoldPaper, "Silver":mailObj.Silver, "MoneySource":mailObj.MoneySource } getMailList.append(crossMailDict) if getMailList: CrossRealmMsg.SendMsgToClientServer(ShareDefine.CrossServerMsg_MailContent, getMailList, [serverGroupID]) elif reqCMD == "GetOK": for guid in guidList: playerMailDict.pop(guid, None) DataRecordPack.DR_GiveCompensationSuccess(playerID, guid) if not playerMailDict: crossMailMgr.playerMailDict.pop(playerID, None) dataMsg = {"IDType":"Del", "PlayerIDList":[playerID]} CrossRealmMsg.SendMsgToClientServer(ShareDefine.CrossServerMsg_MailPlayerIDList, dataMsg, [serverGroupID]) return def CrossServerMsg_MailContent(getMailList): ## ÊÕµ½¿ç·þ·þÎñÆ÷ͬ²½µÄ´ý·¢ËÍÓʼþÄÚÈÝ playerGetGUIDInfo = {} for mailDict in getMailList: GUID = mailDict.get("GUID", "") playerID = mailDict.get("PlayerID", 0) if not GUID or not playerID: continue GameWorld.Log("ÊÕµ½¿ç·þ¸öÈËÓʼþÄÚÈÝ£º%s" % mailDict, playerID) addItemDictList = eval(mailDict.get("ItemInfo", "[]")) LimitTime = mailDict.get("LimitTime", "") Text = mailDict.get("Text", "") gold = GameWorld.ToIntDef(mailDict.get("Gold")) goldPaper = GameWorld.ToIntDef(mailDict.get("GoldPaper")) silver = GameWorld.ToIntDef(mailDict.get("Silver")) moneySource = GameWorld.ToIntDef(mailDict.get("MoneySource"), ChConfig.Def_GiveMoney_Mail) detail = mailDict.get("Detail", "") AddPersonalItem(GUID, addItemDictList, [playerID], LimitTime, Text, gold, goldPaper, silver, detail, moneySource) if playerID not in playerGetGUIDInfo: playerGetGUIDInfo[playerID] = [] guidList = playerGetGUIDInfo[playerID] guidList.append(GUID) for playerID, guidList in playerGetGUIDInfo.items(): dataMsg = {"CMD":"GetOK", "PlayerID":playerID, "GuidList":guidList} CrossRealmMsg.SendMsgToCrossServer(ShareDefine.ClientServerMsg_MailContent, dataMsg) return def __AddPlayerCrossMail(addItemDictList, PlayerIDList, LimitTime, Text, gold, goldPaper, silver, detail, moneySource): ## Ìí¼Ó¿ç·þÍæ¼Ò¸öÈ˲¹³¥Óʼþ addMailPlayerIDList = [] crossMailMgr = PyDataManager.GetCrossPersonalCompensationManager() for playerID in PlayerIDList: GUID = str(uuid.uuid1()) # ÓÉÓÚ¿ç·þÓʼþÓÉÿ¸öÍæ¼Ò¶À×Ôͬ²½¸öÈËÓʼþ£¬ËùÒÔ²åÈëʱÿ¸öÈ˵ÄÓʼþµ¥¶ÀGUID£¬·ÀÖ¹ÅúÁ¿·¢ËÍͬÄÚÈÝÓʼþÊ±ÖØ¸´²åÈë½±ÀøÎïÆ· mailObj = PyGameDataStruct.tagDBCrossPersonalCompensation() mailObj.PlayerID = playerID mailObj.GUID = GUID mailObj.LimitTime = LimitTime mailObj.Text = Text mailObj.TextLen = len(mailObj.Text) mailObj.Gold = gold mailObj.GoldPaper = goldPaper mailObj.Silver = silver mailObj.ItemInfo = json.dumps(addItemDictList, ensure_ascii=False) mailObj.ItemLen = len(mailObj.ItemInfo) mailObj.Detail = detail mailObj.DetailLen = len(mailObj.Detail) mailObj.MoneySource = moneySource if playerID not in crossMailMgr.playerMailDict: crossMailMgr.playerMailDict[playerID] = {} addMailPlayerIDList.append(playerID) playerMailDict = crossMailMgr.playerMailDict[playerID] playerMailDict[GUID] = mailObj #Ìí¼ÓÁ÷Ïò addDict = {"LimitTime":LimitTime, "Text":Text, "Gold":gold, "GoldPaper":goldPaper, "Silver":silver, "ItemListLen":len(addItemDictList), "Detail":detail, "MoneySource":moneySource, "CrossMail":True} DataRecordPack.DR_AddPersonalCompensation(PlayerIDList, GUID, addItemDictList, addDict) if addMailPlayerIDList: dataMsg = {"IDType":"Add", "PlayerIDList":addMailPlayerIDList} CrossRealmMsg.SendMsgToClientServer(ShareDefine.CrossServerMsg_MailPlayerIDList, dataMsg) return #================================================================================================== ## ¸ù¾ÝÎïÆ·ÐÅÏ¢×ֵ䣬Éú³É²¹³¥ÎïÆ·ÊµÀý£¬ÓÃÓÚGM¹¤¾ßÌí¼Ó²¹³¥ # @param curItemDict # @return IpyCompensationItem def MakeCompensationItem(curItemDict): curItemData = IPY_GameServer.IpyCompensationItem() #curItemData.GUID = curItemDict['GUID'] curItemData.ItemID = curItemDict['ItemID'] curItemData.Count = curItemDict['Count'] #curItemData.IsBind = curItemDict.get('IsBind',0) curItemData.IsBind = curItemDict.get('IsAuctionItem',0) curItemData.UserData = curItemDict.get('UserData', '') return curItemData # ´Ë´¦»õ±ÒplayerIDList·¢·Åͳһ£¬Èç¸ù¾ÝÍæ¼Ò²»Í¬¶ø±ä£¬ÔòÓ¦ÐèÐÞ¸Ä ## ¹¦ÄÜ·¢·ÅÎïÆ·²¹³¥/½±ÀøÓʼþ # @param addItemList [(itemID, itemCnt, ÊÇ·ñÅÄÆ·), {»òÎïÆ·ÐÅÏ¢×Öµä}, ...] # @return GUID def SendPersonalItemMailEx(title, content, getDays, playerIDList, addItemList, gold = 0, goldPaper = 0, silver = 0, detail="", moneySource=ChConfig.Def_GiveMoney_Mail, crossMail=False): limitTime = str(GameWorld.GetDatetimeByDiffDays(getDays)) limitTime = limitTime.split(".")[0] return SendPersonalItemMail(title, content, limitTime, playerIDList, addItemList, gold, goldPaper, silver, detail, moneySource, crossMail) def SendPersonalItemMailBatch(batchMailInfoList): ## ÅúÁ¿·¢ËÍÓʼþ mailTypeKey, batchPlayerIDList, batchAddItemList, batchParamList, batchGold, batchGoldPaper, batchSilver, batchDetail, moneySource = batchMailInfoList lenPlayerID = len(batchPlayerIDList) lenItem = len(batchAddItemList) lenParam = len(batchParamList) lenGold = len(batchGold) lenGoldPaper = len(batchGoldPaper) lenSilver = len(batchSilver) lenDetail = len(batchDetail) title = "" getDays = 30 limitTime = str(GameWorld.GetDatetimeByDiffDays(getDays)) limitTime = limitTime.split(".")[0] for i, playerIDList in enumerate(batchPlayerIDList): if not playerIDList: continue addItemList = batchAddItemList[i] if lenItem == lenPlayerID else [] paramList = batchParamList[i] if lenParam == lenPlayerID else [] gold = batchGold[i] if lenGold == lenPlayerID else 0 goldPaper = batchGoldPaper[i] if lenGoldPaper == lenPlayerID else 0 silver = batchSilver[i] if lenSilver == lenPlayerID else 0 detail = batchDetail[i] if lenDetail == lenPlayerID else "" content = "%s%s" % (mailTypeKey, str(paramList)) SendPersonalItemMail(title, content, limitTime, playerIDList, addItemList, gold, goldPaper, silver, detail=detail, moneySource=moneySource) return def SendMailByKey(mailTypeKey, playerIDList, addItemList, paramList=[], gold=0, goldPaper=0, silver=0, detail="", moneySource=ChConfig.Def_GiveMoney_Mail, crossMail=False): if not mailTypeKey: mailTypeKey = ShareDefine.DefaultLackSpaceMailType GameWorld.DebugLog("SendMailByKey %s, playerIDList=%s, addItemList=%s, paramList=%s, gold=%s, goldPaper=%s, silver=%s, moneySource=%s" % (mailTypeKey, playerIDList, addItemList, paramList, gold, goldPaper, silver, moneySource)) title = "" content = "%s%s" % (mailTypeKey, json.dumps(paramList, ensure_ascii=False)) return SendPersonalItemMailEx(title, content, 30, playerIDList, addItemList, gold, goldPaper, silver, detail, moneySource, crossMail) def CrossServerMsg_SendMail(msgData): ## ÊÕµ½¿ç·þ·þÎñÆ÷ͬ²½µÄ·¢ËÍÓʼþ mailTypeKey = msgData["MailTypeKey"] playerIDList = msgData["Player"] addItemList = msgData.get("Item", []) paramList = msgData.get("Param", []) SendMailByKey(mailTypeKey, playerIDList, addItemList, paramList) return # ´Ë´¦»õ±ÒplayerIDList·¢·Åͳһ£¬Èç¸ù¾ÝÍæ¼Ò²»Í¬¶ø±ä£¬ÔòÓ¦ÐèÐÞ¸Ä ## ¹¦ÄÜ·¢·ÅÎïÆ·²¹³¥/½±ÀøÓʼþ # @param addItemList [(itemID, itemCnt, ÊÇ·ñÅÄÆ·), {»òÎïÆ·ÐÅÏ¢×Öµä}, ...] # @return GUID # @remarks addItemListÖ§³Öappend×Öµä def SendPersonalItemMail(title, content, limitTime, playerIDList, addItemList, gold = 0, goldPaper = 0, silver = 0, detail="", moneySource=ChConfig.Def_GiveMoney_Mail, crossMail=False): if not playerIDList: return "" #if not addItemList: # return "" curServerTime = GameWorld.GetCurrentDataTimeStr() # µ±Ç°Ê±¼äÒѾ­³¬¹ýÁìȡʱ¼ä if not curServerTime or curServerTime >= limitTime: GameWorld.DebugLog("¹¦ÄÜ·¢·ÅÎïÆ·²¹³¥/½±ÀøÓʼþ£¬Áìȡʱ¼äÒѳ¬Ê±£¬Ä¬Èϲ»Ìí¼Ó£¡LimitTime=%s" % limitTime) return "" addItemDictList = [] for itemInfo in addItemList: if isinstance(itemInfo, dict): addItemDictList.append(itemInfo) continue if len(itemInfo) == 3: itemID, itemCnt, isAuctionItem = itemInfo else: continue addItemDict = {} addItemDict['ItemID'] = itemID addItemDict['Count'] = itemCnt addItemDict['IsAuctionItem'] = isAuctionItem addItemDictList.append(addItemDict) perMailItemCnt = IpyGameDataPY.GetFuncCfg("MailMaxItemCnt") mailCnt = max(1, int(math.ceil(len(addItemDictList)/float(perMailItemCnt)))) # Ò»·âÓʼþ×î¶à5¸öÎïÆ· for i in xrange(mailCnt): if i != 0: gold, goldPaper, silver = 0, 0, 0 # ²ð·Öºó·ÇµÚÒ»·âµÄÓʼþ»õ±Ò¹éÁ㣬·ÀÖ¹ÖØ¸´¸ø»õ±Ò½±Àø startIndex = i*perMailItemCnt GUID = str(uuid.uuid1()) AddPersonalItem(GUID, addItemDictList[startIndex:startIndex + perMailItemCnt], playerIDList, limitTime, "%s<$_$>%s<$_$>%s" % (ChConfig.Def_Mail_SenderSys, title, content), gold, goldPaper, silver, detail, moneySource, crossMail) return GUID ## ·¢ËÍ´¿ÎÄ×Ö¸öÈ˲¹³¥ # @param limitTime ¿ÉÒÔ´«¿Õ # @return None def SendPersonalAsTextMail(PlayerID, title, content, limitTime): if GameWorld.IsCrossServer(): return GUID = str(uuid.uuid1()) PyAddPersonalCompensation(GUID, PlayerID, GameWorld.GetCurrentDataTimeStr(), limitTime, "%s<$_$>%s<$_$>%s" % (ChConfig.Def_Mail_SenderSys,title, content)) return def GetEntireCompensationInfo(checkState, limitLVType, limitLV): return checkState * 1000000 + limitLVType * 100000 + limitLV def ParseEntireCompensationInfo(mailInfo): limitLV = mailInfo % 100000 checkState = mailInfo / 1000000 limitLVType = (mailInfo - checkState * 1000000) / 100000 return checkState, limitLVType, limitLV def QueryCompensationPersonalInfo(playerID): '''¸öÈ˲¹³¥Óʼþ²éѯ ''' retList = [] compensationMgr = GameWorld.GetCompensationMgr() tempSign = "" tempSignEnd = "" curPersonalCount = compensationMgr.GetPersonalCompensationCount(playerID) GameWorld.DebugLog("QueryCompensationPersonalInfo %s" % curPersonalCount) for i in xrange(curPersonalCount): compensation = compensationMgr.PersonalCompensationAt(playerID, i) contentList = compensation.Text.split("<$_$>") if len(contentList) != 3: continue sender, title, content = contentList if tempSign in content and tempSignEnd in content: title = content[content.index(tempSign) + len(tempSign):content.index(tempSignEnd)] content = "" GUID = compensation.GUID itemList = [] curGUIDItemCount = compensationMgr.FindItemCount(GUID) for i in xrange(curGUIDItemCount): curItem = compensationMgr.FindItemAt(GUID, i) itemID = curItem.ItemID if not itemID: continue itemList.append([itemID, curItem.Count, curItem.IsBind, curItem.UserData]) recState = compensationMgr.FindPlayerRecState(playerID, GUID) infoDict = {"GUID":GUID, "Gold":compensation.Gold, "GoldPaper":compensation.GoldPaper, "Silver":compensation.Silver, "Sender":sender, "Title":title, "Content":content, "RecState":recState, "CreateTime":compensation.CreateTime, "LimitTime":compensation.LimitTime, "ItemList":itemList} retList.append(infoDict) return retList def QueryCompensationInfo(fromDate, toDate, guid, searchTitle, searchContent, searchState=None, maxCount=10): '''È«·þ²¹³¥Óʼþ²éѯ ''' compensationMgr = GameWorld.GetCompensationMgr() retList = [] if guid: infoDict = __GetQueryCompensationInfoDict(compensationMgr, compensationMgr.FindEntireCompensation(guid), "", "", searchTitle, searchContent, searchState) if infoDict: retList.append(infoDict) return retList if fromDate: fromDate = "%s 00:00:00" % fromDate if toDate: toDate = "%s 23:59:59" % toDate entireCnt = compensationMgr.GetEntireCompensationCount() for i in xrange(entireCnt): compensation = compensationMgr.AtEntireCompensation(i) infoDict = __GetQueryCompensationInfoDict(compensationMgr, compensation, fromDate, toDate, searchTitle, searchContent, searchState) if not infoDict: continue retList.append(infoDict) if len(retList) >= maxCount: break return retList def __GetQueryCompensationInfoDict(compensationMgr, compensation, fromDate, toDate, searchTitle, searchContent, searchState): if not compensation or not compensation.GUID: return if fromDate and compensation.CreateTime < fromDate: return if toDate and compensation.CreateTime > toDate: return contentList = compensation.Text.split("<$_$>") if len(contentList) != 3: return sender, title, content = contentList if searchTitle and searchTitle not in title: return if searchContent and searchContent not in content: return checkState, limitLVType, limitLV = ParseEntireCompensationInfo(compensation.PlayerLV) if searchState != None and searchState != checkState: return GUID = compensation.GUID itemList = [] curGUIDItemCount = compensationMgr.FindItemCount(GUID) for i in xrange(curGUIDItemCount): curItem = GameWorld.GetCompensationMgr().FindItemAt(GUID, i) itemID = curItem.ItemID if not itemID: continue itemList.append([itemID, curItem.Count, curItem.IsBind, curItem.UserData]) compensationDict = {"GUID":GUID, "CheckState":checkState, "LimitLVType":limitLVType, "LimitLV":limitLV, "Gold":compensation.Gold, "GoldPaper":compensation.GoldPaper, "Silver":compensation.Silver, "PlayerJob":compensation.PlayerJob, "Sender":sender, "Title":title, "Content":content, "OnlyServerID":compensation.ServerID, "CreateTime":compensation.CreateTime, "LimitTime":compensation.LimitTime, "ItemList":itemList} return compensationDict def EntireCompensationOper(operGUIDList, operation): '''È«·þÓʼþ²Ù×÷¹ÜÀí @param operGUIDList: ´ý²Ù×÷µÄÓʼþGUIDÁбí @param operation: 1-ͨ¹ý£»2-ɾ³ý ''' okGUIDList = [] successGUIDList = [] compensationMgr = GameWorld.GetCompensationMgr() for GUID in operGUIDList: compensation = compensationMgr.FindEntireCompensation(GUID) if not compensation or compensation.GUID != GUID: continue # ɾ³ý if operation == 2: compensationMgr.DeleteEntireCompensation(GUID) compensationMgr.DeleteCompensationItem(GUID) compensationMgr.DeleteRecByGUID(GUID) GameWorld.Log("ɾ³ýÈ«·þÓʼþ: GUID=%s" % GUID) DataRecordPack.DR_EntireCompensation(GUID, "Delete") # ͨ¹ý elif operation == 1: mailInfo = compensation.PlayerLV checkState, limitLVType, limitLV = ParseEntireCompensationInfo(mailInfo) updMailInfo = GetEntireCompensationInfo(CheckState_OK, limitLVType, limitLV) compensationMgr.SetEntireCompensationPlayerLV(GUID, updMailInfo) GameWorld.Log("È«·þÓʼþÉóºËͨ¹ý: GUID=%s,mailInfo=%s,checkState=%s,updMailInfo=%s" % (GUID, mailInfo, checkState, updMailInfo)) if checkState != CheckState_OK: okGUIDList.append(GUID) DataRecordPack.DR_EntireCompensation(GUID, "CheckOK") else: continue successGUIDList.append(GUID) playerManager = GameWorld.GetPlayerManager() for i in xrange(playerManager.GetActivePlayerCount()): player = playerManager.GetActivePlayerAt(i) if player == None or not player.GetInitOK() or PlayerControl.GetIsTJG(player): continue #¹ã²¥ÔÚÏßÍæ¼Ò notifyList = [] for GUID in okGUIDList: compensationType, curEntireRequire = CheckRequestCompensation(player, GUID, False) if compensationType == Unknow_CompensationType: continue Text, gold, goldPaper, silver = curEntireRequire.Text, curEntireRequire.Gold, curEntireRequire.GoldPaper, curEntireRequire.Silver createTime = curEntireRequire.CreateTime notifyList.append((GUID, Text, createTime, gold, goldPaper, silver)) #GameWorld.DebugLog("¹ã²¥ÔÚÏßÍæ¼ÒÈ«·þÓʼþ: %s" % str(notifyList), player.GetPlayerID()) if notifyList: SyncQueryCompensationResult(player, notifyList) return successGUIDList def SendEntireMail(mailTypeKey, getDays, limitLV, limitLVType, addItemList=[], paramList=[], \ gold=0, goldPaper=0, silver=0, detail="", moneySource=ChConfig.Def_GiveMoney_Mail, GUID=""): ''' ·¢ËÍÈ«·þÓʼþ @param mailTypeKey: ÓʼþÄ£°åkey @param getDays: ÓÐЧÌìÊý @param limitLV: ÁìÈ¡×îµÍµÈ¼¶ÏÞÖÆ @param limitLVType: µÈ¼¶²»×ãµÄÉý¼¶ºóÊÇ·ñ¿ÉÁì 0-²»¿É£¬1-¿ÉÒÔ ''' if not mailTypeKey or getDays <= 0: return addItemDictList = [] for itemInfo in addItemList: if isinstance(itemInfo, dict): addItemDictList.append(itemInfo) continue if len(itemInfo) == 3: itemID, itemCnt, isAuctionItem = itemInfo else: continue addItemDict = {} addItemDict['ItemID'] = itemID addItemDict['Count'] = itemCnt addItemDict['IsAuctionItem'] = isAuctionItem addItemDictList.append(addItemDict) if not GUID: GUID = str(uuid.uuid1()) limitTime = str(GameWorld.GetDatetimeByDiffDays(getDays)) limitTime = limitTime.split(".")[0] sender = ChConfig.Def_Mail_SenderSys title = "" content = "%s%s" % (mailTypeKey, json.dumps(paramList, ensure_ascii=False)) checkState = 0 # ÓʼþÉóºË״̬£¬Îª¼æÈÝÀÏÓʼþ£¬Ä¬ÈÏ0-ÒÑÉóºË£¬1-δÉóºË mailInfo = GetEntireCompensationInfo(checkState, limitLVType, limitLV) PlayerJob = 127 # ĬÈÏȫְҵ¿ÉÁì serverID = 0 # ĬÈÏËùÓзþÎñÆ÷ID AddEntireItem(GUID, addItemDictList, limitTime, mailInfo, PlayerJob, "%s<$_$>%s<$_$>%s" % (sender, title, content), gold, goldPaper, silver, detail, serverID) return ## Ìí¼ÓÈ«·þ²¹³¥ # @param addItemDictList, LimitTime, mailInfo, PlayerJob, Text # @return None def AddEntireItem(GUID, addItemDictList, LimitTime, mailInfo, PlayerJob, Text, gold = 0, goldPaper = 0, silver = 0, detail="", serverID=0): ''' @param mailInfo: GetEntireCompensationInfo µÄ·µ»ØÖµ, ĿǰÔÝ´æ×Ö¶Î PlayerLV ÖÐ ''' if GameWorld.IsCrossServer(): return #GameWorld.DebugLog("Compensation### AddEntireItem GUID:%s ItemDict:\n%s "%(GUID, addItemDictList)) #Ìí¼Ó²¹³¥°üµÄËùÓÐÎïÆ· for addItemDict in addItemDictList: curItemData = MakeCompensationItem(addItemDict) GameWorld.GetCompensationMgr().AddCompensationItem(GUID, curItemData) createTime = GameWorld.GetCurrentDataTimeStr() #Ìí¼ÓÈ«·þÁìÈ¡²¹³¥Ìõ¼þ GameWorld.GetCompensationMgr().AddEntireCompensationItem(GUID, createTime, LimitTime, mailInfo, PlayerJob, Text, gold, goldPaper, silver, serverID) checkState, limitLVType, limitLV = ParseEntireCompensationInfo(mailInfo) addDict = {"LimitTime":LimitTime, "LimitLV":limitLV, "LimitLVType":limitLVType, "CheckState":checkState, "PlayerJob":PlayerJob, "Text":Text, "Gold":gold, "GoldPaper":goldPaper, "Silver":silver, "ItemList":addItemDictList, "Detail":detail} #Ìí¼ÓÁ÷Ïò eventName = "Add" if checkState == CheckState_OK else "AddToCheck" DataRecordPack.DR_EntireCompensation(GUID, eventName, addDict) __WriteSendMailOKEvent(GUID, addItemDictList, LimitTime, Text, None, mailInfo, PlayerJob) testAccIDList = ReadChConfig.GetEvalChConfig("TestAccID") playerManager = GameWorld.GetPlayerManager() for i in xrange(playerManager.GetActivePlayerCount()): player = playerManager.GetActivePlayerAt(i) if player == None or not player.GetInitOK() or PlayerControl.GetIsTJG(player): continue if checkState == CheckState_No: playerAccID = GameWorld.GetPlatformAccID(player.GetAccID()) if playerAccID not in testAccIDList: continue #¹ã²¥ÔÚÏßÍæ¼Ò compensationType, curEntireRequire = CheckRequestCompensation(player, GUID, False) if compensationType == Unknow_CompensationType: continue Text, gold, goldPaper, silver = curEntireRequire.Text, curEntireRequire.Gold, curEntireRequire.GoldPaper, curEntireRequire.Silver #GameWorld.Log("#¹ã²¥ÔÚÏßÍæ¼Ò%s"%player.GetPlayerID()) SyncQueryCompensationResult(player, [(GUID, Text, createTime, gold, goldPaper, silver)]) return # ¼ì²éÓʼþÊÇ·ñÒÑ´ïµ½±£´æÉÏÏÞ£¬È糬¹ýÔòÏÈɾ³ý¾ÉÓʼþ # @param LimitTime ²ÎÊý¿É´«¿Õ£¬¸öÈËÓʼþ²»ÏÞÖÆÁìÈ¡ÆÚÏÞ£¬Ö»ÏÞÖÆ±£´æÊýÁ¿£¬ def PyAddPersonalCompensation(GUID, PlayerID, CreateTime, LimitTime, Text, gold = 0, goldPaper = 0, silver = 0, moneySource=ChConfig.Def_GiveMoney_Mail): curPlayer = GameWorld.GetPlayerManager().FindPlayerByID(PlayerID) totalCount = GameWorld.GetCompensationMgr().GetPersonalCompensationCount(PlayerID) #´ýÖ§³Öpy¶Á±í maxMailCount = IpyGameDataPY.GetFuncCfg("MailDefaultCount") delCount = totalCount - maxMailCount + 1 GameWorld.DebugLog("ÐÂÔö¸öÈËÓʼþ: totalCount=%s,maxMailCount=%s" % (totalCount, maxMailCount), PlayerID) if delCount > 0: GameWorld.Log("¸öÈËÓʼþ´ïµ½ÉÏÏÞ£¬ÐèҪɾ³ý£¡delCount=%s" % (delCount), PlayerID) delGUIDList = GetPlayerDelMailGUIDList(PlayerID) #ÏÈÈ¡µÃҪɾ³ýµÄGUID delGUIDs = [] for _ in xrange(delCount): if not delGUIDList: break delGUID = delGUIDList.pop(0) curIpyPersonalData = GameWorld.GetCompensationMgr().FindPersonalCompensation(PlayerID, delGUID) if curIpyPersonalData.GUID == delGUID: delGUIDs.append(curIpyPersonalData.GUID) for guid in delGUIDs: ClearPersonalCompensation(PlayerID, guid, "MaxCountLimiit") GameWorld.Log(" DeletePersonalCompensation GUID = %s" % guid, PlayerID) if curPlayer: NotifyCompensationResult(curPlayer, guid, 1) #δ²¹Á÷Ïò #´Ë´¦Ã»ÓÐÏ·¢Í¨Öª mailType = moneySource - ChConfig.Def_GiveMoney_Unknown # typeÀàÐÍΪbyte£¬´æÖµÊ±ÐèÒª´¦ÀíÏ GameWorld.GetCompensationMgr().AddPersonalCompensation(GUID, PlayerID, CreateTime, LimitTime, Text, mailType, gold, goldPaper, silver) if PlayerID in PyGameData.g_playerDelMailGUIDDict: guidList = PyGameData.g_playerDelMailGUIDDict[PlayerID] guidList.append(GUID) return def GetPlayerDelMailGUIDList(playerID): ## »ñÈ¡´ýɾ³ýµÄ¸öÈËÓʼþGUIDÁбí if playerID not in PyGameData.g_playerDelMailGUIDDict: timeGUIDList = [] curPersonalCount = GameWorld.GetCompensationMgr().GetPersonalCompensationCount(playerID) for i in xrange(curPersonalCount): curMail = GameWorld.GetCompensationMgr().PersonalCompensationAt(playerID, i) timeGUIDList.append([curMail.CreateTime, curMail.GUID]) timeGUIDList.sort() # °´´´½¨Ê±¼äÉýÐòÅÅÐò delGUIDList = [] for _, guid in timeGUIDList: if guid not in delGUIDList: delGUIDList.append(guid) PyGameData.g_playerDelMailGUIDDict[playerID] = delGUIDList return PyGameData.g_playerDelMailGUIDDict[playerID] # ´Ë´¦»õ±ÒplayerIDList·¢·Åͳһ£¬Èç¸ù¾ÝÍæ¼Ò²»Í¬¶ø±ä£¬ÔòÓ¦ÐèÐÞ¸Ä ## Ìí¼Ó¸öÈ˲¹³¥ # @param addItemDict, PlayerIDList, LimitTime, Text # @return None def AddPersonalItem(GUID, addItemDictList, PlayerIDList, LimitTime, Text, gold = 0, goldPaper = 0, silver = 0, detail="", moneySource=ChConfig.Def_GiveMoney_Mail, crossMail=False): if GameWorld.IsCrossServer(): if crossMail: __AddPlayerCrossMail(addItemDictList, PlayerIDList, LimitTime, Text, gold, goldPaper, silver, detail, moneySource) return GameWorld.DebugLog("Compensation### AddPersonalItem GUID:%s ItemDict:\n%s "%(GUID, addItemDictList)) #Ìí¼Ó²¹³¥°üµÄËùÓÐÎïÆ· for addItemDict in addItemDictList: curItemData = MakeCompensationItem(addItemDict) GameWorld.GetCompensationMgr().AddCompensationItem(GUID, curItemData) #offlinePlayerIDList = [] onlinePlayerInfo = {} #ÅúÁ¿Ìí¼ÓÍæ¼Ò¸öÈ˲¹³¥ÁìÈ¡±í createTime = GameWorld.GetCurrentDataTimeStr() for PlayerID in PlayerIDList: PyAddPersonalCompensation(GUID, PlayerID, createTime, LimitTime, Text, gold, goldPaper, silver, moneySource) # Õë¶Ô¸öÈ˲¹³¥£¬Èç¹ûÊÇÔÚÏßÍæ¼Ò£¬ÔòÁ¢¼´ÍÆË͸ø¿Í»§¶Ë curPlayer = GameWorld.GetPlayerManager().FindPlayerByID(PlayerID) if curPlayer: SyncQueryCompensationResult(curPlayer, [(GUID, Text, createTime, gold, goldPaper, silver)]) onlinePlayerInfo[curPlayer.GetAccID()] = [curPlayer.GetName(), curPlayer.GetLV()] #=========================================================================== # else: # offlinePlayerIDList.append(PlayerID) # # if offlinePlayerIDList: # PlayerDBOper.FindDBOper(PlayerDBOper.Table_DBPlayer, {"PlayerID":{"$in":offlinePlayerIDList}}, # {"PlayerID":1, "AccID":1, "PlayerName":1, "LV":1, "_id":0}, # FindDBResult_SendMail, [GUID, addItemDictList, createTime, Text]) # if onlinePlayerInfo: # __WriteSendMailOKEvent(GUID, addItemDictList, createTime, Text, onlinePlayerInfo) #=========================================================================== #Ìí¼ÓÁ÷Ïò addDict = {"LimitTime":LimitTime, "Text":Text, "Gold":gold, "GoldPaper":goldPaper, "Silver":silver, "ItemListLen":len(addItemDictList), "Detail":detail, "MoneySource":moneySource} DataRecordPack.DR_AddPersonalCompensation(PlayerIDList, GUID, addItemDictList, addDict) return def FindDBResult_SendMail(resultSetList, extendValueList): if not resultSetList: return playerInfoDict = {} GUID, addItemDictList, LimitTime, Text = extendValueList GameWorld.Log("ÓʼþÀëÏßÍæ¼ÒDBÐÅÏ¢: GUID=%s, %s" % (GUID, str(resultSetList))) for resultDict in resultSetList: playerInfoDict[resultDict["AccID"]] = [resultDict["PlayerName"], resultDict["LV"]] __WriteSendMailOKEvent(GUID, addItemDictList, LimitTime, Text, playerInfoDict) return ## ֪ͨµØÍ¼Óʼþ·¢ËÍOK def __WriteSendMailOKEvent(GUID, addItemDictList, LimitTime, Text, playerInfoDict={}, playerLV=0, playerJob=0): #=============================================================================== # eventName = "SendMail" # #%s<$_$>%s # sender, title, content = Text.split("<$_$>") # # #Ä£°å±àºÅ[%s,%s] # if "" in content: # mailContentList = content.split("") # mailTemplateNO = GameWorld.ToIntDef(mailContentList[0][14:], None) # EventMailInfo = ReadChConfig.GetEvalChConfig("EventMailInfo") # if mailTemplateNO not in EventMailInfo: # return # title, content = EventMailInfo[mailTemplateNO] # # mailParamStr = mailContentList[1] # mailParamStr = mailParamStr.replace(" ", "") # if mailParamStr.startswith("[") and mailParamStr.endswith("]") and len(mailParamStr) > 2: # content = content % tuple(eval(mailParamStr)) # # itemInfo = "ÎïÆ·:" # for addItemDict in addItemDictList: # itemName = "%s" % addItemDict['ItemID'] # if addItemDict.get('IsBind',0): # itemName += "(°ó)" # itemInfo += " %s*%s" % (itemName, addItemDict['Count']) # # # È«·þ # if not playerInfoDict: # comments = "%s: %s ÓÐЧÆÚ:%s, ÏÞÖÆµÈ¼¶:%s,Ö°Òµ:%s; %s; %s" % (title, GUID, LimitTime, playerLV, playerJob, itemInfo, content) # customEvent = EventReport.custom_events() # customEvent.account_id = "ServerAccount" # customEvent.event_name = eventName # customEvent.session_id = "ServerSession" # customEvent.account_name = customEvent.account_id # customEvent.comments = CommFunc.GetStrCutoff(comments, 255) # EventReport.WriteEvent(customEvent) # else: # comments = "%s: %s ÓÐЧÆÚ:%s, %s; %s" % (title, GUID, LimitTime, itemInfo, content) # comments = CommFunc.GetStrCutoff(comments, 255) # for accID, playerInfo in playerInfoDict.items(): # playerName, playerLV = playerInfo # customEvent = EventReport.custom_events() # customEvent.SetEventAgentInfo(GameWorld.GetPlayerPlatform(accID)) # customEvent.account_id = GameWorld.GetPlatformAccID(accID) # customEvent.event_name = eventName # customEvent.session_id = "GameServerPlayerSession" # # customEvent.account_name = customEvent.account_id # customEvent.chr_name = playerName # customEvent.comments = comments # EventReport.WriteEvent(customEvent) #=============================================================================== return ##A9 A1 ²éÑ¯Íæ¼Ò²¹³¥#tagCGQueryCompensation # @param index, clientData, tick # @return None def OnQueryPlayerCompensation(index, clientData, tick): curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index) NotifyPlayerCompensation(curPlayer) # ÌáÈ¡½ÓÊÕÓʼþÏ·¢ def NotifyPlayerCompensation(curPlayer): RequestToGetCrossMail(curPlayer) notifyList = SeekPlayerCompensation(curPlayer) SyncQueryCompensationResult(curPlayer, notifyList) return # ɾ³ý¸öÈËÓʼþ±í ״̬±í£¬Í¬Ò»¸öGUID ¿ÉÒÔ¶àÈËÁìÈ¡£¬²»ÄÜͬʱɾ³ýÎïÆ· def ClearPersonalCompensation(curPlayerID, curGUID, eventName=""): GameWorld.GetCompensationMgr().DeletePersonalCompensation(curPlayerID, curGUID) GameWorld.GetCompensationMgr().DeletePlayerCompensationRec(curPlayerID, curGUID) #´æÔÚ¶àÈËÓʼþµÄÇé¿ö£¬¹Êɾ³ýÎïÆ·Ðè¼ì²éÊÇ·ñ×îºóÒ»¸öÁìÈ¡Õ߲ſÉɾ³ý if GameWorld.GetCompensationMgr().GetPersonalCountByGUID(curGUID) == 0: GameWorld.GetCompensationMgr().DeleteCompensationItem(curGUID) if curPlayerID in PyGameData.g_playerDelMailGUIDDict: guidList = PyGameData.g_playerDelMailGUIDDict[curPlayerID] if curGUID in guidList: guidList.remove(curGUID) if eventName: # ÓÐÌØÊâ²Ù×÷ɾ³ýµÄ²Å¼Ç¼£¬³£¹æÁìȡɾ³ýµÄĬÈÏÎÞeventName£¬²»¼Ç¼ DataRecordPack.DR_DelPersonalCompensation(curPlayerID, curGUID, eventName) return # ÉèÖÃÁìȡ״̬ def SetPrizeState(curPlayerID, GUID, prizeState, readState): state = readState*10 + prizeState GameWorld.GetCompensationMgr().AddPlayerRec(curPlayerID, GUID, state) ##²éÕÒÍæ¼Ò¿ÉÁìÈ¡µÄ²¹³¥Áбí # @param curPlayer # @return None def SeekPlayerCompensation(curPlayer): curPlayerID = curPlayer.GetID() curTime = datetime.datetime.today() allList = [] #²¹³¥ÎïÆ·±í [(GUID,TEXT),(GUID,TEXT),...] #¸öÈ˲¹³¥ curPersonalCount = GameWorld.GetCompensationMgr().GetPersonalCompensationCount(curPlayerID) for i in xrange(curPersonalCount): curIpyPersonalData = GameWorld.GetCompensationMgr().PersonalCompensationAt(curPlayerID, i) #¿ÉÒÔÓõĽ±Àø allList.append((curIpyPersonalData.GUID, curIpyPersonalData.Text, curIpyPersonalData.CreateTime, curIpyPersonalData.Gold, curIpyPersonalData.GoldPaper, curIpyPersonalData.Silver)) #È«·þ²¹³¥ curEntireCount = GameWorld.GetCompensationMgr().GetEntireCompensationCount() curJob = curPlayer.GetJob() curLV = curPlayer.GetLV() isTestAccID = GameWorld.GetPlatformAccID(curPlayer.GetAccID()) in ReadChConfig.GetEvalChConfig("TestAccID") for i in xrange(curEntireCount - 1, -1, -1): curRequire = GameWorld.GetCompensationMgr().AtEntireCompensation(i) checkState, limitLVType, limitLV = ParseEntireCompensationInfo(curRequire.PlayerLV) if checkState == CheckState_No: if not isTestAccID: #δÉóºËµÄÓʼþ²»´¦Àí continue #»ñÈ¡¼Ç¼ states = GameWorld.GetCompensationMgr().FindPlayerRecState(curPlayerID, curRequire.GUID) readState = states/10 # ¿É¶Á curState = states%10 # Áìȡ״̬ if curState in (Disable_State, Yet_State): #²»¿ÉÁì »ò ÒÑÁì continue limitTime = datetime.datetime.strptime(curRequire.LimitTime, ChConfig.TYPE_Time_Format) if limitTime < curTime and curState == Unknown_State: #δ֪ͨ¹ýµÄÓʼþ³¬Ê±£¬²Å¿ÉÉèÖóɲ»¿ÉÁìÈ¡ SetPrizeState(curPlayerID, curRequire.GUID, Disable_State, readState) continue if limitLV > curLV: #µÈ¼¶²»×ã if limitLVType == LimitLVType_Not: SetPrizeState(curPlayerID, curRequire.GUID, Disable_State, readState) continue if curRequire.PlayerJob not in (-1, 127): curJob = curPlayer.GetJob() #ÓÐÖ°ÒµÏÞÖÆ if (curRequire.PlayerJob&pow(2,curJob)) == 0: SetPrizeState(curPlayerID, curRequire.GUID, Disable_State, readState) continue if curRequire.ServerID and curRequire.ServerID != GameWorld.GetPlayerServerID(curPlayer): # Ö¸¶¨·þÎñÆ÷Óʼþ SetPrizeState(curPlayerID, curRequire.GUID, Disable_State, readState) continue #¿ÉÒÔÓõĽ±Àø if Enable_State != curState: SetPrizeState(curPlayerID, curRequire.GUID, Enable_State, readState) allList.append((curRequire.GUID, curRequire.Text, curRequire.CreateTime, curRequire.Gold, curRequire.GoldPaper, curRequire.Silver)) return allList ##·¢ËÍ¿ÉÁìÈ¡½±Àø²éѯ½á¹û # @param curPlayer, notifyList # @return None def SyncQueryCompensationResult(curPlayer, notifyList): sendPack = ChPyNetSendPack.tagGCQueryCompensationResult() sendPack.Clear() for GUID, Text, CreateTime, gold, goldPaper, silver in notifyList: curGUIDItemCount = GameWorld.GetCompensationMgr().FindItemCount(GUID) subPack = ChPyNetSendPack.tagGCCompensationPack() subPack.GUID = GUID subPack.CreateTime = CreateTime subPack.Text = Text subPack.TextLen = len(Text) subPack.Gold = gold subPack.GoldPaper = goldPaper subPack.Silver = silver subPack.IsRead = GameWorld.GetCompensationMgr().FindPlayerRecState(curPlayer.GetPlayerID(), GUID)/10 for index in xrange(curGUIDItemCount): curItem = GameWorld.GetCompensationMgr().FindItemAt(GUID, index) subPackItem = ChPyNetSendPack.tagGCCompensationItem() subPackItem.ItemID = curItem.ItemID subPackItem.Count = curItem.Count subPackItem.IsBind = curItem.IsBind subPackItem.UserData = curItem.UserData subPackItem.UserDataLen = len(curItem.UserData) subPack.Items.append(subPackItem) subPack.Count = len(subPack.Items) sendPack.PackList.append(subPack) sendPack.Count = len(sendPack.PackList) NetPackCommon.SendFakePack(curPlayer, sendPack) return ##03 03 Íæ¼ÒÇëÇóÁìÈ¡²¹³¥#tagMGRequestCompensation # @param routeIndex, mapID, curPackData, tick # @return None def OnMGRequestCompensation(routeIndex, mapID, curPackData, tick): global g_PlayerRequestStateDict GameWorld.DebugLog("Compensation### OnMGRequestCompensation in") myPlayerID = curPackData.PlayerID curPlayer = GameWorld.GetPlayerManager().FindPlayerByID(myPlayerID) if not curPlayer: return if curPlayer.GetDictByKey(Def_RequestState):#УÑéËø GameWorld.DebugLog("Compensation### already request") return curPlayer.SetDict(Def_RequestState, 1)#¼ÓËø GUID = curPackData.GUID GameWorld.DebugLog("Compensation### OnMGRequestCompensation myPlayerID %s GUID %s"%(myPlayerID, GUID)) compensationType, curEntireRequire = CheckRequestCompensation(curPlayer, GUID) if compensationType == Unknow_CompensationType: #Áìȡʧ°Ü curPlayer.SetDict(Def_RequestState, 0)#½âËø GameWorld.DebugLog("Compensation### OnMGRequestCompensation no found") return #УÑé±³°üÊ£Óà¿Õ¼äÊÇ·ñ×ã¹» #=========================================================================== # curCUIDItemCount = GameWorld.GetCompensationMgr().FindItemCount(GUID) # if curPackData.PackSpaceCount < curCUIDItemCount: # curPlayer.SetDict(Def_RequestState, 0)#½âËø # GameWorld.DebugLog("Compensation### OnMGRequestCompensation no enough space") # return #=========================================================================== #·¢Ë͵½MapServer¸øÓè½±Àø SendGMRequestCompensationResult(routeIndex, mapID, curPlayer, GUID, compensationType, curEntireRequire) GameWorld.DebugLog("Compensation### OnMGRequestCompensation out") ##ÇëÇóÁìÈ¡ÎïÆ· # @param curPlayer, GUID # @return CompensationType ²¹³¥ÀàÐÍ def CheckRequestCompensation(curPlayer, GUID, isPersonnal = True): curPlayerID = curPlayer.GetID() if isPersonnal: #ÔÚ¸öÈ˲¹³¥ÖÐ curPersonalCompensation = GameWorld.GetCompensationMgr().FindPersonalCompensation(curPlayerID, GUID) if curPersonalCompensation.PlayerID == curPlayerID: #·µ»Ø²¹³¥ÀàÐÍ return Personal_CompensationType, curPersonalCompensation #--------- #ÔÚÈ«·þ²¹³¥ÖÐ states = GameWorld.GetCompensationMgr().FindPlayerRecState(curPlayerID, GUID) readState = states/10 # ¿É¶Á curState = states%10 # Áìȡ״̬ if curState in (Disable_State, Yet_State): #²»¿ÉÁì »ò ÒÑÁì return Unknow_CompensationType, None curEntireRequire = GameWorld.GetCompensationMgr().FindEntireCompensation(GUID) if curEntireRequire.GUID != GUID: #²»ÔÙÈ«·þ²¹³¥ÖУ¬É¾³ý¼Ç¼ GameWorld.GetCompensationMgr().DeletePlayerCompensationRec(curPlayerID, GUID) return Unknow_CompensationType, None checkState, limitLVType, limitLV = ParseEntireCompensationInfo(curEntireRequire.PlayerLV) if checkState == CheckState_No: isTestAccID = GameWorld.GetPlatformAccID(curPlayer.GetAccID()) in ReadChConfig.GetEvalChConfig("TestAccID") if not isTestAccID: #δÉóºËµÄÓʼþ²»´¦Àí return Unknow_CompensationType, None #δ֪ͨ¹ý£¬ÇÒÒѳ¬Ê± limitTime = datetime.datetime.strptime(curEntireRequire.LimitTime, ChConfig.TYPE_Time_Format) curTime = datetime.datetime.today() if limitTime < curTime and Unknown_State == curState: #³¬Ê±£¬ÉèÖóɲ»¿ÉÁìÈ¡ SetPrizeState(curPlayerID, GUID, Disable_State, readState) return Unknow_CompensationType, None if Enable_State == curState: #¿ÉÁìÈ¡ÇÒδ³¬Ê±£¬·µ»ØÎïÆ·ÐÅÏ¢ return Entire_CompensationType, curEntireRequire curLV = curPlayer.GetLV() if limitLV > curLV: #µÈ¼¶²»×ã if limitLVType == LimitLVType_Not: SetPrizeState(curPlayerID, GUID, Disable_State, readState) return Unknow_CompensationType, None curJob = curPlayer.GetJob() if curEntireRequire.PlayerJob not in (-1, 127): #ÓÐÖ°ÒµÏÞÖÆ if (curEntireRequire.PlayerJob&pow(2,curJob)) == 0: SetPrizeState(curPlayerID, GUID, Disable_State, readState) return Unknow_CompensationType, None if curEntireRequire.ServerID and curEntireRequire.ServerID != GameWorld.GetPlayerServerID(curPlayer): # Ö¸¶¨·þÎñÆ÷Óʼþ SetPrizeState(curPlayerID, GUID, Disable_State, readState) return Unknow_CompensationType, None #¿ÉÒÔÓõĽ±Àø SetPrizeState(curPlayerID, GUID, Enable_State, readState) #·µ»ØÎïÆ·ÐÅÏ¢ return Entire_CompensationType, curEntireRequire ##·¢ËÍ·â°ü 03 02 Íæ¼ÒÁìÈ¡²¹³¥½á¹û#tagGMRequestCompensationResult # @param routeIndex, mapID, curPlayer, curItem # @return None def SendGMRequestCompensationResult(routeIndex, mapID, curPlayer, GUID, compensationType, curEntireRequire): Text, gold, goldPaper, silver, createTime = curEntireRequire.Text, curEntireRequire.Gold, \ curEntireRequire.GoldPaper, curEntireRequire.Silver, curEntireRequire.CreateTime # È«·þÓʼþûÓÐ Type ×Ö¶Î moneySource = curEntireRequire.Type if compensationType == Personal_CompensationType else 0 sendPack = ChGameToMapPyPack.tagGMRequestCompensationResult() sendPack.PlayerID = curPlayer.GetID() sendPack.CompensationType = compensationType sendPack.GUID = GUID sendPack.CreateTime = createTime sendPack.Text = Text sendPack.TextLen = len(Text) sendPack.Gold = gold sendPack.GoldPaper = goldPaper sendPack.Silver = silver sendPack.MoneySource = moneySource curGUIDItemCount = GameWorld.GetCompensationMgr().FindItemCount(GUID) for i in xrange(curGUIDItemCount): curItem = GameWorld.GetCompensationMgr().FindItemAt(GUID, i) subPackItem = ChGameToMapPyPack.tagGMCompensationItem() subPackItem.ItemID = curItem.ItemID subPackItem.Count = curItem.Count subPackItem.IsBind = curItem.IsBind subPackItem.UserData = curItem.UserData subPackItem.UserDataLen = len(curItem.UserData) sendPack.Items.append(subPackItem) sendPack.Count = len(sendPack.Items) NetPackCommon.SendPyPackToMapServer(routeIndex, mapID, sendPack) return ##03 04 Íæ¼ÒÁìÈ¡²¹³¥ÎïÆ··¢·Å½á¹û#tagMGGiveCompensationResult # @param routeIndex, mapID, curPackData, tick # @return None def OnMGGiveCompensationResult(routeIndex, mapID, curPackData, tick): myPlayerID = curPackData.PlayerID curPlayer = GameWorld.GetPlayerManager().FindPlayerByID(myPlayerID) if not curPlayer: return GUID = curPackData.GUID CompensationType = curPackData.CompensationType curPlayer.SetDict(Def_RequestState, 0)#½âËø if curPackData.Result: GiveCompensationSuccess(curPlayer, GUID, CompensationType) return ##Íæ¼ÒÁìÈ¡²¹³¥ÎïÆ··¢·Å³É¹¦ # @param curPlayer, GUID # @return None def GiveCompensationSuccess(curPlayer, GUID, CompensationType): curPlayerID = curPlayer.GetID() NotifyCompensationResult(curPlayer, GUID, 1) #Á÷Ïò¼Ç¼ DataRecordPack.DR_GiveCompensationSuccess(curPlayerID, GUID) #È«·þ½±ÀøÁìÈ¡¼Ç¼±ä¸üΪÒÑÁìÈ¡ if CompensationType == Entire_CompensationType: GameWorld.GetCompensationMgr().AddPlayerRec(curPlayerID, GUID, 10 + Yet_State) return #¸öÈ˽±ÀøÁìÈ¡ÌõĿִÐÐɾ³ý if CompensationType == Personal_CompensationType: ClearPersonalCompensation(curPlayerID, GUID) return return ##ÇåÀí³¬Ê±È«·þ²¹³¥, È«·þÓʼþ·ÖÁ½²¿´¦Àí£º1. Óʼþ½ÓÊÕµÄÓÐЧʱ¼ä£¬ºǫ́ÉèÖã¬2. Óʼþɾ³ýʱ¼äΪ½ÓÊÕÓÐЧʱ¼äÔÙÑÓ³¤30Ìì # @param None # @return None def ClearUpEntireCompensation(): #УÑé¹ýÆÚ²¹³¥ curTime = datetime.datetime.today() needClearGUIDList = [] entireCnt = GameWorld.GetCompensationMgr().GetEntireCompensationCount() for i in xrange(entireCnt): curEntireRequire = GameWorld.GetCompensationMgr().AtEntireCompensation(i) # ³¬¹ý½ÓÊÕÓʼþ30ÌìÔòÍêȫɾ³ý´ËÓʼþ limitTime = datetime.datetime.strptime(curEntireRequire.LimitTime, ChConfig.TYPE_Time_Format) + datetime.timedelta(days = 30) if limitTime < curTime: needClearGUIDList.append(curEntireRequire.GUID) #ɾ³ý¹ýÆÚ²¹³¥ÐÅÏ¢£¬ ûÓÐÖ÷¶¯Í¨ÖªÔÚÏßÍæ¼Ò for GUID in needClearGUIDList: #ɾ³ýÁìÈ¡Ìõ¼þ GameWorld.GetCompensationMgr().DeleteEntireCompensation(GUID) #ɾ³ý¹ýÆÚÎïÆ· GameWorld.GetCompensationMgr().DeleteCompensationItem(GUID) #Çå³ýÁìȡ״̬¼Ç¼¾Í GameWorld.GetCompensationMgr().DeleteRecByGUID(GUID) return ##ÇåÀí³¬Ê±30ÌìµÄ¸öÈËÓʼþ, ·ñÔòÁ÷Ê§Íæ¼ÒÔÚ²»¶ÏºÏ·þÇé¿öÏÂÊý¾Ý»áÀÛ»ý # ¸öÈËÓʼþÔÝÎÞ¹ýÆÚʱ¼äÉ趨£¬Ö»ÓÐ30ÌìÇåÀíÂß¼­,ÒÔ´´½¨Ê±¼äΪ׼ # @param None # @return None def ClearUpPersonalCompensation(): #УÑé¹ýÆÚ²¹³¥ tempSign = "" tempSignEnd = "" curTime = datetime.datetime.today() needClearGUIDList = [] allCnt = GameWorld.GetCompensationMgr().GetAllPersonalCompensationCount() for i in xrange(allCnt): curMail = GameWorld.GetCompensationMgr().AtAllPersonalCompensation(i) mailText = curMail.Text # ֪ͨÀàÄ£°åÓʼþ£¬¹ýÌì¿ÉÖ±½Óɾ³ý if tempSign in mailText and tempSignEnd in mailText and CheckCanDelCompensation(curMail, curMail.GUID): #tempKey = mailText[mailText.index(tempSign) + len(tempSign):mailText.index(tempSignEnd)] #GameWorld.DebugLog("¹ýÌìɾ³ýÎÞ¸½¼þ֪ͨÀàÓʼþÄ£°å! tempKey=%s %s, %s" % (tempKey, curMail.PlayerID, curMail.GUID)) needClearGUIDList.append([curMail.PlayerID, curMail.GUID]) player = GameWorld.GetPlayerManager().FindPlayerByID(curMail.PlayerID) if player and player.GetInitOK(): NotifyCompensationResult(player, curMail.GUID, 1) continue # ³¬¹ý½ÓÊÕÓʼþ30ÌìÔòÍêȫɾ³ý´ËÓʼþ limitTime = datetime.datetime.strptime(curMail.CreateTime, ChConfig.TYPE_Time_Format) + datetime.timedelta(days = 30) if limitTime < curTime: needClearGUIDList.append([curMail.PlayerID, curMail.GUID]) GameWorld.Log("ClearUpPersonalCompensation count=%s"%len(needClearGUIDList)) #ɾ³ý¹ýÆÚ²¹³¥ÐÅÏ¢£¬ ûÓÐÖ÷¶¯Í¨ÖªÔÚÏßÍæ¼Ò for playerID, GUID in needClearGUIDList: ClearPersonalCompensation(playerID, GUID, "Timeout") return ## ÇåÀí³¬Ê±²¹³¥, ¸öÈËÓʼþÔÚ³¬¹ýÉÏÏÞºó²Å»á×Ô¶¯É¾³ý # @param None # @return None def ClearUpTimeOutCompensation(): ClearUpPersonalCompensation() ClearUpEntireCompensation() return #=============================================================================== # //A9 A6 ÉèÖÃÓʼþ£¨²¹³¥£©ÒѶÁ״̬ #tagCGReadCompensation # # struct tagCGReadCompensation # { # tagHead Head; # char GUID[40]; # BYTE IsRead; //ÉèÖÃÓʼþ£¨²¹³¥£©ÊÇ·ñÒѶÁ 1¶ÁÈ¡ # }; #=============================================================================== def OnReadCompensation(index, clientData, tick): curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index) GUID = clientData.GUID curPlayerID = curPlayer.GetID() #ÔÚ¸öÈ˲¹³¥ÖÐ curPersonalCompensation = GameWorld.GetCompensationMgr().FindPersonalCompensation(curPlayerID, GUID) if curPersonalCompensation.PlayerID != curPlayerID: curEntireRequire = GameWorld.GetCompensationMgr().FindEntireCompensation(GUID) if curEntireRequire.GUID != GUID: #GameWorld.DebugLog("ÕÒ²»µ½ÓʼþGUID:%s"%GUID) # ÕÒ²»µ½Óʼþ return curState = GameWorld.GetCompensationMgr().FindPlayerRecState(curPlayerID, GUID) if curState/10 >= Read_State_Yes: # ÒѶÁ #GameWorld.DebugLog("ÒѶÁGUID:%s"%GUID) return curState = Read_State_Yes*10 + curState%10 GameWorld.GetCompensationMgr().AddPlayerRec(curPlayerID, GUID, curState) #GameWorld.DebugLog("ÒѶÁcurState:%s"%curState) return #=============================================================================== # //A9 A7 ɾ³ýÓʼþ£¨²¹³¥£© #tagCGDelCompensation # # struct tagCGDelCompensation # { # tagHead Head; # char GUID[40]; # }; #=============================================================================== def OnDelCompensation(index, clientData, tick): curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index) GUID = clientData.GUID curPlayerID = curPlayer.GetID() #ÔÚ¸öÈ˲¹³¥ÖÐ curPersonalCompensation = GameWorld.GetCompensationMgr().FindPersonalCompensation(curPlayerID, GUID) if curPersonalCompensation.PlayerID == curPlayerID: if not CheckCanDelCompensation(curPersonalCompensation, GUID): #Óи½¼þ²»¿Éɾ³ý NotifyCompensationResult(curPlayer, GUID, 0) return ClearPersonalCompensation(curPlayerID, GUID, "ClientDel") NotifyCompensationResult(curPlayer, GUID, 1) #GameWorld.DebugLog("¸öÈ˲¹³¥ÖÐOnDelCompensation:%s"%GUID) return curEntireRequire = GameWorld.GetCompensationMgr().FindEntireCompensation(GUID) if curEntireRequire.GUID != GUID: # ÕÒ²»µ½Óʼþ NotifyCompensationResult(curPlayer, GUID, 0) #GameWorld.DebugLog("ÕÒ²»µ½ÓʼþOnDelCompensation:%s"%GUID) return #È«·þÓʼþ curEntireRequire = GameWorld.GetCompensationMgr().FindEntireCompensation(GUID) if curEntireRequire.GUID == GUID: if not CheckCanDelCompensation(curEntireRequire, GUID): #Óи½¼þ²»¿Éɾ³ý NotifyCompensationResult(curPlayer, GUID, 0) return SetPrizeState(curPlayerID, GUID, Disable_State, GameWorld.GetCompensationMgr().FindPlayerRecState(curPlayerID, GUID)/10) NotifyCompensationResult(curPlayer, GUID, 1) #GameWorld.DebugLog("È«·þÓʼþOnDelCompensation:%s"%GUID) return NotifyCompensationResult(curPlayer, GUID, 0) # Óи½¼þµÄÇé¿öÍæ¼Ò²»¿ÉÖ÷¶¯É¾³ýÓʼþ£¬±ÜÃâÎó²Ù×÷£»ÏµÍ³¿Éɾ³ý²»Óõ÷ÓÃ´Ë½Ó¿Ú def CheckCanDelCompensation(mailObj, GUID): if mailObj.Gold or mailObj.GoldPaper or mailObj.Silver: # Óи½¼Ó»õ±Ò²»¿Éɾ³ý return False if GameWorld.GetCompensationMgr().FindItemCount(GUID): # Óи½¼þÎïÆ·²»¿Éɾ³ý return False return True # Óʼþɾ³ýÇé¿ö def NotifyCompensationResult(curPlayer, GUID, result): sendMCPack = ChPyNetSendPack.tagGCDelCompensationResult() sendMCPack.GUID = GUID sendMCPack.Result = result NetPackCommon.SendFakePack(curPlayer, sendMCPack)