From bb284affe6541fa85c492ce9af26b4ee35805aab Mon Sep 17 00:00:00 2001
From: hch <305670599@qq.com>
Date: 星期二, 12 三月 2019 14:25:07 +0800
Subject: [PATCH] 6328 【后端】优化代码eval -- 玩家缓存数据提取常用字段 等级和最后一次发送时间

---
 ServerPython/CoreServerGroup/GameServer/Script/Player/PlayerGeTui.py                              |   39 ++++++++----
 ServerPython/CoreServerGroup/GameServer/Script/Player/PlayerViewCache.py                          |   17 +++--
 ServerPython/CoreServerGroup/GameServer/Script/IPY_PlayerViewCache.py                             |    8 ++
 ServerPython/CoreServerGroup/GameServer/Script/Player/PlayerFriend.py                             |    3 
 ServerPython/CoreServerGroup/GameServer/Script/ChMapToGamePyPack.py                               |   11 +++
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChMapToGamePyPack.py          |   11 +++
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerViewCacheTube.py |    2 
 Tool/数据库/ChangeAccount/Collections/DataServerPlayerData.py                                        |   61 ++++++++++++++------
 8 files changed, 104 insertions(+), 48 deletions(-)

diff --git a/ServerPython/CoreServerGroup/GameServer/Script/ChMapToGamePyPack.py b/ServerPython/CoreServerGroup/GameServer/Script/ChMapToGamePyPack.py
index 7e666f7..741718a 100644
--- a/ServerPython/CoreServerGroup/GameServer/Script/ChMapToGamePyPack.py
+++ b/ServerPython/CoreServerGroup/GameServer/Script/ChMapToGamePyPack.py
@@ -672,6 +672,7 @@
     PlusDataSize = 0    #(DWORD PlusDataSize)
     PlusData = ""    #(String PlusData)//扩展记录
     IsLogouting = 0    #(BYTE IsLogouting)//本次是否为下线同步
+    OffTime = 0    #(DWORD OffTime)// 下线时间戳
     data = None
 
     def __init__(self):
@@ -692,6 +693,7 @@
         self.PlusDataSize,_pos = CommFunc.ReadDWORD(_lpData, _pos)
         self.PlusData,_pos = CommFunc.ReadString(_lpData, _pos,self.PlusDataSize)
         self.IsLogouting,_pos = CommFunc.ReadBYTE(_lpData, _pos)
+        self.OffTime,_pos = CommFunc.ReadDWORD(_lpData, _pos)
         return _pos
 
     def Clear(self):
@@ -708,6 +710,7 @@
         self.PlusDataSize = 0
         self.PlusData = ""
         self.IsLogouting = 0
+        self.OffTime = 0
         return
 
     def GetLength(self):
@@ -722,6 +725,7 @@
         length += 4
         length += len(self.PlusData)
         length += 1
+        length += 4
 
         return length
 
@@ -737,6 +741,7 @@
         data = CommFunc.WriteDWORD(data, self.PlusDataSize)
         data = CommFunc.WriteString(data, self.PlusDataSize, self.PlusData)
         data = CommFunc.WriteBYTE(data, self.IsLogouting)
+        data = CommFunc.WriteDWORD(data, self.OffTime)
         return data
 
     def OutputString(self):
@@ -750,7 +755,8 @@
                                 ItemData:%s,
                                 PlusDataSize:%d,
                                 PlusData:%s,
-                                IsLogouting:%d
+                                IsLogouting:%d,
+                                OffTime:%d
                                 '''\
                                 %(
                                 self.Head.OutputString(),
@@ -762,7 +768,8 @@
                                 self.ItemData,
                                 self.PlusDataSize,
                                 self.PlusData,
-                                self.IsLogouting
+                                self.IsLogouting,
+                                self.OffTime
                                 )
         return DumpString
 
diff --git a/ServerPython/CoreServerGroup/GameServer/Script/IPY_PlayerViewCache.py b/ServerPython/CoreServerGroup/GameServer/Script/IPY_PlayerViewCache.py
index c62a0c1..aa30a6a 100644
--- a/ServerPython/CoreServerGroup/GameServer/Script/IPY_PlayerViewCache.py
+++ b/ServerPython/CoreServerGroup/GameServer/Script/IPY_PlayerViewCache.py
@@ -233,8 +233,12 @@
     def Clear(self): return _IPY_PlayerViewCache.IPY_PlayerViewCache_Clear(self)
     def GetPlayerID(self): return _IPY_PlayerViewCache.IPY_PlayerViewCache_GetPlayerID(self)
     def SetPlayerID(self, *args): return _IPY_PlayerViewCache.IPY_PlayerViewCache_SetPlayerID(self, *args)
-    def GetUpdateTime(self): return _IPY_PlayerViewCache.IPY_PlayerViewCache_GetUpdateTime(self)
-    def SetUpdateTime(self, *args): return _IPY_PlayerViewCache.IPY_PlayerViewCache_SetUpdateTime(self, *args)
+    def GetPlayerLV(self): return _IPY_PlayerViewCache.IPY_PlayerViewCache_GetPlayerLV(self)
+    def SetPlayerLV(self, *args): return _IPY_PlayerViewCache.IPY_PlayerViewCache_SetPlayerLV(self, *args)
+    def GetOffTime(self): return _IPY_PlayerViewCache.IPY_PlayerViewCache_GetOffTime(self)
+    def SetOffTime(self, *args): return _IPY_PlayerViewCache.IPY_PlayerViewCache_SetOffTime(self, *args)
+    def GetGeTuiID(self): return _IPY_PlayerViewCache.IPY_PlayerViewCache_GetGeTuiID(self)
+    def SetGeTuiID(self, *args): return _IPY_PlayerViewCache.IPY_PlayerViewCache_SetGeTuiID(self, *args)
     def SetPropData(self, *args): return _IPY_PlayerViewCache.IPY_PlayerViewCache_SetPropData(self, *args)
     def GetPropData(self): return _IPY_PlayerViewCache.IPY_PlayerViewCache_GetPropData(self)
     def SetItemData(self, *args): return _IPY_PlayerViewCache.IPY_PlayerViewCache_SetItemData(self, *args)
diff --git a/ServerPython/CoreServerGroup/GameServer/Script/Player/PlayerFriend.py b/ServerPython/CoreServerGroup/GameServer/Script/Player/PlayerFriend.py
index ef6881f..4070bbf 100644
--- a/ServerPython/CoreServerGroup/GameServer/Script/Player/PlayerFriend.py
+++ b/ServerPython/CoreServerGroup/GameServer/Script/Player/PlayerFriend.py
@@ -81,8 +81,7 @@
             #玩家的数据没有缓存过
             PlayerControl.NotifyCode(curPlayer, 'Friend_OffLine')
             return
-        cacheDict = eval(curCache.GetPropData())
-        tagLV = cacheDict["LV"]
+        tagLV = curCache.GetPlayerLV()
     else:
         tagLV = tagPlayer.GetLV()
     
diff --git a/ServerPython/CoreServerGroup/GameServer/Script/Player/PlayerGeTui.py b/ServerPython/CoreServerGroup/GameServer/Script/Player/PlayerGeTui.py
index 8f3468d..be9c0d5 100644
--- a/ServerPython/CoreServerGroup/GameServer/Script/Player/PlayerGeTui.py
+++ b/ServerPython/CoreServerGroup/GameServer/Script/Player/PlayerGeTui.py
@@ -86,14 +86,6 @@
 
 # 检查是否可以个推,geTuiType小于0的代表默认可推,无VIP限制
 def CheckCanGeTui(playerCache, geTuiType=-1):
-    if not playerCache.get("GeTuiClientID", ""):
-        return False
-    
-    # 离线超过24小时不再推送,目前极光推送的特点是推送ID同机器不同包都是同一个ID
-    if not playerCache.get("Time", 0):
-        return False
-    if time.time() - playerCache.get("Time", 0) > 24*60*60:
-        return False
         
     if not playerCache.get("VIPLV", 0):
         if geTuiType < 0:
@@ -263,6 +255,16 @@
                 return True
     return True
     
+# 个推基础判定
+def CanGeTuiByCache(curCache):
+    if not curCache.GetGeTuiID():
+        return False
+    
+    # 离线超过24小时不再推送,目前极光推送的特点是推送ID同机器不同包都是同一个ID
+    if time.time() - curCache.GetOffTime() > 24*60*60:
+        return False
+    return True
+    
 def BossAttentionGeTui(bossData, bossID):
     if bossData.GetMapID() == ChConfig.Def_FBMapID_SealDemon:
         # 非VIP玩家 封魔坛个推
@@ -281,17 +283,24 @@
         curPlayer = GameWorld.GetPlayerManager().FindPlayerByID(playerID)
         if curPlayer and not PlayerControl.GetIsTJG(curPlayer):
             continue
-
+        
+        # 离线玩家
+        curCache = PlayerViewCache.ViewCacheMgr.FindCache(playerID)
+        if not curCache:
+            continue
+        
+        if not CanGeTuiByCache(curCache):
+            #无推送资格,减少检索和eval
+            continue
+        
         recordDict = eval(bossAttentionData.RecordData)
         if recordDict.get(bossID, 0) in [0, 9]:
             #0-默认未关注, 1-主动关注, 2-自动关注, 9-主动取消关注
             continue
-        curCache = PlayerViewCache.ViewCacheMgr.FindCache(playerID)
-        if not curCache:
-            continue
+        
         cacheDict = eval(curCache.GetPropData())
         if not CheckCanGeTui(cacheDict, geTuiType):
-            # 过滤个推
+            # 个推逻辑检查
             continue
         
         if not CheckBossGeTuiCnt(playerID, bossID, geTuiType, cacheDict):
@@ -327,6 +336,10 @@
     if not curCache:
         return
 
+    if not CanGeTuiByCache(curCache):
+        #无推送资格,基础判定
+        return
+
     cacheDict = eval(curCache.GetPropData())
     if not CheckCanGeTui(cacheDict, Def_Onoff_Chat):
         # 过滤个推
diff --git a/ServerPython/CoreServerGroup/GameServer/Script/Player/PlayerViewCache.py b/ServerPython/CoreServerGroup/GameServer/Script/Player/PlayerViewCache.py
index ae14d3b..959c0e7 100644
--- a/ServerPython/CoreServerGroup/GameServer/Script/Player/PlayerViewCache.py
+++ b/ServerPython/CoreServerGroup/GameServer/Script/Player/PlayerViewCache.py
@@ -55,11 +55,13 @@
 ##更新缓存数据
 #  @param PlayerID, PropData, ItemData, PlusData, isSaveDB
 #  @return None
-def UpdatePlayerCache(PlayerID, PropData, ItemData, PlusData, isSaveDB=False):
+def UpdatePlayerCache(PlayerID, PropData, ItemData, PlusData, isSaveDB=False, packData=None):
     curCache = ViewCacheMgr.FindCache(PlayerID)
     if not curCache:
         curCache = ViewCacheMgr.AddNewCache(PlayerID) 
-    curCache.SetUpdateTime(GameWorld.GetCurrentDataTimeStr())
+    if packData:
+        curCache.SetPlayerLV(packData.PlayerLV)
+        curCache.SetOffTime(packData.OffTime)
     
 
     GameWorld.DebugLog('ViewCache### UpdatePlayerCache PlayerID %s, \
@@ -106,13 +108,15 @@
 ##玩家下线缓存数据
 #  @param PlayerID, PlayerLV, PropData, ItemData, PlusData
 #  @return None
-def OnPlayerLogout(PlayerID, PlayerLV, PropData, ItemData, PlusData): 
+def OnPlayerLogout(curPackData): 
+    PlayerID = curPackData.PlayerID
+    PlayerLV = curPackData.PlayerLV
     #不需要保存离线数据的,直接删除缓存数据
     if not IsNeedSaveLogoutPlayer(PlayerID, PlayerLV):
         ViewCacheMgr.DeleteCache(PlayerID)
         return
     #更新数据,并设置需要保存数据库
-    UpdatePlayerCache(PlayerID, PropData, ItemData, PlusData, True)    
+    UpdatePlayerCache(PlayerID, curPackData.PropData, curPackData.ItemData, curPackData.PlusData, True, packData=curPackData)    
     return
 
 ## 根据规则判定是否需要继续保存离线玩家数据
@@ -179,12 +183,11 @@
     PlayerID = curPackData.PlayerID
     PlayerLV = curPackData.PlayerLV
     if curPackData.IsLogouting:
-        OnPlayerLogout(PlayerID, PlayerLV, \
-                       curPackData.PropData, curPackData.ItemData, curPackData.PlusData)
+        OnPlayerLogout(curPackData)
     else:
         # 此处保存设置为True是为安全防范,比如突然断电,宕机等情况 导致误以为不保存,故等级可设置高一点
         UpdatePlayerCache(PlayerID, curPackData.PropData, \
-                          curPackData.ItemData, curPackData.PlusData, True if PlayerLV > 150 else False)
+                          curPackData.ItemData, curPackData.PlusData, True if PlayerLV > 150 else False, packData=curPackData)
     GameWorld.DebugLog('ViewCache### OnMGUpdatePlayerCache out')
     return
 
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChMapToGamePyPack.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChMapToGamePyPack.py
index 7e666f7..741718a 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChMapToGamePyPack.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChMapToGamePyPack.py
@@ -672,6 +672,7 @@
     PlusDataSize = 0    #(DWORD PlusDataSize)
     PlusData = ""    #(String PlusData)//扩展记录
     IsLogouting = 0    #(BYTE IsLogouting)//本次是否为下线同步
+    OffTime = 0    #(DWORD OffTime)// 下线时间戳
     data = None
 
     def __init__(self):
@@ -692,6 +693,7 @@
         self.PlusDataSize,_pos = CommFunc.ReadDWORD(_lpData, _pos)
         self.PlusData,_pos = CommFunc.ReadString(_lpData, _pos,self.PlusDataSize)
         self.IsLogouting,_pos = CommFunc.ReadBYTE(_lpData, _pos)
+        self.OffTime,_pos = CommFunc.ReadDWORD(_lpData, _pos)
         return _pos
 
     def Clear(self):
@@ -708,6 +710,7 @@
         self.PlusDataSize = 0
         self.PlusData = ""
         self.IsLogouting = 0
+        self.OffTime = 0
         return
 
     def GetLength(self):
@@ -722,6 +725,7 @@
         length += 4
         length += len(self.PlusData)
         length += 1
+        length += 4
 
         return length
 
@@ -737,6 +741,7 @@
         data = CommFunc.WriteDWORD(data, self.PlusDataSize)
         data = CommFunc.WriteString(data, self.PlusDataSize, self.PlusData)
         data = CommFunc.WriteBYTE(data, self.IsLogouting)
+        data = CommFunc.WriteDWORD(data, self.OffTime)
         return data
 
     def OutputString(self):
@@ -750,7 +755,8 @@
                                 ItemData:%s,
                                 PlusDataSize:%d,
                                 PlusData:%s,
-                                IsLogouting:%d
+                                IsLogouting:%d,
+                                OffTime:%d
                                 '''\
                                 %(
                                 self.Head.OutputString(),
@@ -762,7 +768,8 @@
                                 self.ItemData,
                                 self.PlusDataSize,
                                 self.PlusData,
-                                self.IsLogouting
+                                self.IsLogouting,
+                                self.OffTime
                                 )
         return DumpString
 
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerViewCacheTube.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerViewCacheTube.py
index 9384eae..fbe96b7 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerViewCacheTube.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerViewCacheTube.py
@@ -73,6 +73,7 @@
     sendPack.PlusData = curPlayerPlusData
     sendPack.PlusDataSize = len(curPlayerPlusData)
     sendPack.IsLogouting = IsLogouting #通知本次同步是否下线前保存
+    sendPack.OffTime = int(time.time())    # 最后一次发送即当做离线时间
     NetPackCommon.SendPyPackToGameServer(sendPack)
     GameWorld.DebugLog('ViewCache### UpdateGameServerPlayerCache out')
     return
@@ -106,7 +107,6 @@
     curPlayerPropDict[ChConfig.Def_PDict_GeTuiSet] = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_GeTuiSet)
     curPlayerPropDict[ChConfig.Def_PDict_NoGeTuiTime] = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_NoGeTuiTime)
     curPlayerPropDict['GeTuiClientID'] = curPlayer.GetAccountData().GetGeTuiClientID()
-    curPlayerPropDict['Time'] = int(time.time())    # 最后一次发送即当做离线时间
     
     # 各类功能 BOSS次数, BOSS相关对应B.Boss信息.xlsx的CntMark
     # 封魔坛剩余次数
diff --git "a/Tool/\346\225\260\346\215\256\345\272\223/ChangeAccount/Collections/DataServerPlayerData.py" "b/Tool/\346\225\260\346\215\256\345\272\223/ChangeAccount/Collections/DataServerPlayerData.py"
index 4ee595f..549e0c8 100644
--- "a/Tool/\346\225\260\346\215\256\345\272\223/ChangeAccount/Collections/DataServerPlayerData.py"
+++ "b/Tool/\346\225\260\346\215\256\345\272\223/ChangeAccount/Collections/DataServerPlayerData.py"
@@ -18854,13 +18854,15 @@
         else:
             self.GUID = Str[:40]
             
-            
 #玩家数据查看缓存表#tagPlayerViewCache
 class tagPlayerViewCache(Structure):
     _pack_ = 1
     _fields_ = [
         ('PlayerID', ctypes.c_ulong),
-        ('UpdateTime', ctypes.c_char * 30),
+        ('GeTuiIDSize', ctypes.c_ubyte),
+        ('GeTuiID', ctypes.c_char_p),
+        ('LV', ctypes.c_ushort),
+        ('OffTime', ctypes.c_ulong),
         ('PropDataSize', ctypes.c_ulong),
         ('PropData', ctypes.c_char_p),
         ('ItemDataSize', ctypes.c_ulong),
@@ -18876,7 +18878,10 @@
 
     def clear(self):
         self.PlayerID = 0
-        self.UpdateTime = ''
+        self.GeTuiIDSize = 0
+        self.GeTuiID = ''
+        self.LV = 0
+        self.OffTime = 0
         self.PropDataSize = 0
         self.PropData = ''
         self.ItemDataSize = 0
@@ -18894,7 +18899,11 @@
             mylog.error(msg)
         self.clear()
         self.PlayerID, pos = CommFunc.ReadDWORD(buf, pos)
-        self.UpdateTime, pos = CommFunc.ReadString(buf, pos, 30)
+        self.GeTuiIDSize, pos = CommFunc.ReadBYTE(buf, pos)
+        tmp, pos = CommFunc.ReadString(buf, pos, self.GeTuiIDSize)
+        self.GeTuiID = ctypes.c_char_p(tmp)
+        self.LV, pos = CommFunc.ReadWORD(buf, pos)
+        self.OffTime, pos = CommFunc.ReadDWORD(buf, pos)
         self.PropDataSize, pos = CommFunc.ReadDWORD(buf, pos)
         tmp, pos = CommFunc.ReadString(buf, pos, self.PropDataSize)
         self.PropData = ctypes.c_char_p(tmp)
@@ -18909,7 +18918,10 @@
     def getBuffer(self):
         buf = ''
         buf = CommFunc.WriteDWORD(buf, self.PlayerID)
-        buf = CommFunc.WriteString(buf, sizeof(ctypes.c_char) * 30, self.UpdateTime)
+        buf = CommFunc.WriteBYTE(buf, self.GeTuiIDSize)
+        buf = CommFunc.WriteString(buf, self.GeTuiIDSize, self.GeTuiID)
+        buf = CommFunc.WriteWORD(buf, self.LV)
+        buf = CommFunc.WriteDWORD(buf, self.OffTime)
         buf = CommFunc.WriteDWORD(buf, self.PropDataSize)
         buf = CommFunc.WriteString(buf, self.PropDataSize, self.PropData)
         buf = CommFunc.WriteDWORD(buf, self.ItemDataSize)
@@ -18921,7 +18933,10 @@
     def getLength(self):
         length = 0
         length += sizeof(ctypes.c_ulong)
-        length += sizeof(ctypes.c_char) * 30
+        length += sizeof(ctypes.c_ubyte)
+        length += self.GeTuiIDSize
+        length += sizeof(ctypes.c_ushort)
+        length += sizeof(ctypes.c_ulong)
         length += sizeof(ctypes.c_ulong)
         length += self.PropDataSize
         length += sizeof(ctypes.c_ulong)
@@ -18934,7 +18949,10 @@
         '''组织存储记录'''
         rec = {}
         rec[u'PlayerID'] = self.PlayerID
-        rec[u'UpdateTime'] = fix_incomingText(self.UpdateTime)
+        rec[u'GeTuiIDSize'] = self.GeTuiIDSize
+        rec[u'GeTuiID'] = fix_incomingText(self.GeTuiID)
+        rec[u'LV'] = self.LV
+        rec[u'OffTime'] = self.OffTime
         rec[u'PropDataSize'] = self.PropDataSize
         rec[u'PropData'] = fix_incomingText(self.PropData)
         rec[u'ItemDataSize'] = self.ItemDataSize
@@ -18946,7 +18964,10 @@
     def readRecord(self, rec):
         '''由于MongoDB读出来是unicode,所有字符串需要进行转换'''
         self.PlayerID = rec.get(u'PlayerID', 0)
-        self.UpdateTime = fix_outgoingText(rec.get(u'UpdateTime', u''))
+        self.GeTuiIDSize = rec.get(u'GeTuiIDSize', 0)
+        self.GeTuiID = fix_outgoingText(rec.get(u'GeTuiID', u''))
+        self.LV = rec.get(u'LV', 0)
+        self.OffTime = rec.get(u'OffTime', 0)
         self.PropDataSize = rec.get(u'PropDataSize', 0)
         self.PropData = fix_outgoingText(rec.get(u'PropData', u''))
         self.ItemDataSize = rec.get(u'ItemDataSize', 0)
@@ -19057,7 +19078,10 @@
     def outputString(self):
         output = '''//玩家数据查看缓存表#tagPlayerViewCache:
             PlayerID = %s,
-            UpdateTime = %s,
+            GeTuiIDSize = %s,
+            GeTuiID = %s,
+            LV = %s,
+            OffTime = %s,
             PropDataSize = %s,
             PropData = %s,
             ItemDataSize = %s,
@@ -19067,7 +19091,10 @@
             ADOResult = %s,
             '''%(
                 self.PlayerID,
-                self.UpdateTime,
+                self.GeTuiIDSize,
+                self.GeTuiID,
+                self.LV,
+                self.OffTime,
                 self.PropDataSize,
                 self.PropData,
                 self.ItemDataSize,
@@ -19079,9 +19106,12 @@
         return output
 
     def dumpString(self):
-        output = '''%1s\t%1s\t%1s\t%1s\t%1s\t%1s\t%1s\t%1s'''%(
+        output = '''%1s\t%1s\t%1s\t%1s\t%1s\t%1s\t%1s\t%1s\t%1s\t%1s\t%1s'''%(
                 self.PlayerID,
-                self.UpdateTime,
+                self.GeTuiIDSize,
+                self.GeTuiID,
+                self.LV,
+                self.OffTime,
                 self.PropDataSize,
                 self.PropData,
                 self.ItemDataSize,
@@ -19091,13 +19121,6 @@
             )
         return output
 
-    #Char数组类型Set接口,使用该接口对此类型数据赋值,防止赋值的数据过长报错
-    def SetUpdateTime(self,Str):
-        if len(Str)<=30:
-            self.UpdateTime = Str
-        else:
-            self.UpdateTime = Str[:30]
-            
 
 
 #玩家好友表#tagDBPyPlayerFriend

--
Gitblit v1.8.0