|  |  | 
 |  |  |     #curItemData.GUID = curItemDict['GUID']
 | 
 |  |  |     curItemData.ItemID = curItemDict['ItemID']
 | 
 |  |  |     curItemData.Count = curItemDict['Count']
 | 
 |  |  |     curItemData.IsBind = curItemDict.get('IsBind',0)
 | 
 |  |  |     #curItemData.IsBind = curItemDict.get('IsBind',0)
 | 
 |  |  |     curItemData.IsBind = curItemDict.get('IsAuctionItem',0)
 | 
 |  |  |     curItemData.UserData = curItemDict.get('UserData', '')
 | 
 |  |  |     return curItemData
 | 
 |  |  | 
 | 
 |  |  | #  此处货币playerIDList发放统一,如根据玩家不同而变,则应需修改
 | 
 |  |  | ## 功能发放物品补偿/奖励邮件
 | 
 |  |  | #  @param addItemList [(itemID, itemCnt, isBind), {或物品信息字典}, ...]
 | 
 |  |  | #  @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):
 | 
 |  |  | 
 |  |  |     content = "<MailTemplate>%s</MailTemplate>%s" % (mailTypeKey, json.dumps(paramList, ensure_ascii=False))
 | 
 |  |  |     return SendPersonalItemMailEx(title, content, 30, playerIDList, addItemList, gold, goldPaper, silver, detail, moneySource)
 | 
 |  |  | 
 | 
 |  |  | 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, isBind), {或物品信息字典}, ...]
 | 
 |  |  | #  @param addItemList [(itemID, itemCnt, 是否拍品), {或物品信息字典}, ...]
 | 
 |  |  | #  @return GUID
 | 
 |  |  | #  @remarks addItemList支持append字典
 | 
 |  |  | def SendPersonalItemMail(title, content, limitTime, playerIDList, addItemList, gold = 0, goldPaper = 0, silver = 0, 
 | 
 |  |  | 
 |  |  |         
 | 
 |  |  |         
 | 
 |  |  |         if len(itemInfo) == 3:
 | 
 |  |  |             itemID, itemCnt, isBind = itemInfo
 | 
 |  |  |             itemID, itemCnt, isAuctionItem = itemInfo
 | 
 |  |  |         else:
 | 
 |  |  |             continue
 | 
 |  |  |             
 | 
 |  |  |         addItemDict = {}
 | 
 |  |  |         addItemDict['ItemID'] = itemID
 | 
 |  |  |         addItemDict['Count'] = itemCnt
 | 
 |  |  |         addItemDict['IsBind'] = isBind
 | 
 |  |  |         addItemDict['IsAuctionItem'] = isAuctionItem
 | 
 |  |  |         addItemDictList.append(addItemDict)
 | 
 |  |  |         
 | 
 |  |  |     perMailItemCnt = IpyGameDataPY.GetFuncCfg("MailMaxItemCnt")
 | 
 |  |  | 
 |  |  |         curPlayer.SetDict(Def_RequestState, 0)#解锁
 | 
 |  |  |         GameWorld.DebugLog("Compensation### OnMGRequestCompensation no found")
 | 
 |  |  |         return
 | 
 |  |  |     Text, gold, goldPaper, silver, moneySource = curEntireRequire.Text, curEntireRequire.Gold, curEntireRequire.GoldPaper, curEntireRequire.Silver, curEntireRequire.Type
 | 
 |  |  |     #校验背包剩余空间是否足够
 | 
 |  |  |     #===========================================================================
 | 
 |  |  |     # curCUIDItemCount = GameWorld.GetCompensationMgr().FindItemCount(GUID)
 | 
 |  |  | 
 |  |  |     #    return
 | 
 |  |  |     #===========================================================================
 | 
 |  |  |     #发送到MapServer给予奖励
 | 
 |  |  |     SendGMRequestCompensationResult(routeIndex, mapID, curPlayer, GUID, compensationType, Text, gold, goldPaper, silver, moneySource)
 | 
 |  |  |     SendGMRequestCompensationResult(routeIndex, mapID, curPlayer, GUID, compensationType, curEntireRequire)
 | 
 |  |  |     GameWorld.DebugLog("Compensation### OnMGRequestCompensation out")
 | 
 |  |  |     
 | 
 |  |  | ##请求领取物品
 | 
 |  |  | 
 |  |  | ##发送封包 03 02 玩家领取补偿结果#tagGMRequestCompensationResult
 | 
 |  |  | #  @param routeIndex, mapID, curPlayer, curItem
 | 
 |  |  | #  @return None
 | 
 |  |  | def SendGMRequestCompensationResult(routeIndex, mapID, curPlayer, GUID, compensationType, Text,
 | 
 |  |  |                                     gold, goldPaper, silver, moneySource):
 | 
 |  |  | 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
 | 
 |  |  | 
 |  |  |     return
 | 
 |  |  | 
 | 
 |  |  | 
 | 
 |  |  | ##清理超时30天的个人邮件, 否则流失玩家在不断合服情况下数据会累积
 | 
 |  |  | # 个人邮件暂无过期时间设定,只有30天清理逻辑,以创建时间为准
 | 
 |  |  | #  @param None
 | 
 |  |  | #  @return None
 | 
 |  |  | def ClearUpPersonalCompensation():
 | 
 |  |  |     #校验过期补偿
 | 
 |  |  |     curTime = datetime.datetime.today()
 | 
 |  |  |     needClearGUIDList = []
 | 
 |  |  |     allCnt = GameWorld.GetCompensationMgr().GetAllPersonalCompensationCount()
 | 
 |  |  |     for i in xrange(allCnt):
 | 
 |  |  |         curMail = GameWorld.GetCompensationMgr().AtAllPersonalCompensation(i)
 | 
 |  |  |         # 超过接收邮件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)
 | 
 |  |  |     return
 | 
 |  |  | 
 | 
 |  |  | ## 清理超时补偿, 个人邮件在超过上限后才会自动删除
 | 
 |  |  | #  @param None
 | 
 |  |  | #  @return None
 | 
 |  |  | def ClearUpTimeOutCompensation():
 | 
 |  |  |     
 | 
 |  |  |     ClearUpPersonalCompensation()
 | 
 |  |  |     ClearUpEntireCompensation()
 | 
 |  |  |     return
 | 
 |  |  | 
 | 
 |  |  | 
 |  |  |     #在个人补偿中
 | 
 |  |  |     curPersonalCompensation = GameWorld.GetCompensationMgr().FindPersonalCompensation(curPlayerID, GUID)
 | 
 |  |  |     if curPersonalCompensation.PlayerID == curPlayerID:
 | 
 |  |  |         if not CheckCanDelCompensation(curPersonalCompensation, GUID):
 | 
 |  |  |             #有附件不可删除
 | 
 |  |  |             NotifyCompensationResult(curPlayer, GUID, 0)
 | 
 |  |  |             return
 | 
 |  |  |          | 
 |  |  |         ClearPersonalCompensation(curPlayerID, GUID)
 | 
 |  |  |         NotifyCompensationResult(curPlayer, GUID, 1)
 | 
 |  |  |         #GameWorld.DebugLog("个人补偿中OnDelCompensation:%s"%GUID)
 | 
 |  |  | 
 |  |  |     #全服邮件
 | 
 |  |  |     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):    
 |