#!/usr/bin/python
|
# -*- coding: GBK -*-
|
#-------------------------------------------------------------------------------
|
#
|
##@package Player.PlayerOnline
|
#
|
# @todo:ÔÚÏßÍæ¼Ò¹ÜÀí
|
# @author hxp
|
# @date 2025-07-02
|
# @version 1.0
|
#
|
# ÏêϸÃèÊö: ÔÚÏßÍæ¼Ò¹ÜÀí£¬ÓÃÓÚ¹ÜÀíÔÚÏßÍæ¼Ò¡¢×¼ÔÚÏßÍæ¼ÒµÄÁÙʱÊý¾Ý
|
# ×¼ÔÚÏßÍæ¼Ò - ʵ¼Ê²»ÔÚÏߣ¬x·ÖÖÓÄÚÀëÏßµÄÍæ¼Ò£¬ÓÃÓÚÖ§³Ö¶ÏÏßÖØÁ¬£¬¶Ìʱ¼äÄÚÁÙʱÊý¾Ý¿É³ÖÐø
|
#
|
#-------------------------------------------------------------------------------
|
#"""Version = 2025-07-02 17:30"""
|
#-------------------------------------------------------------------------------
|
|
import TurnAttack
|
import PyGameData
|
|
import time
|
|
class OnlinePlayer():
|
## ×¼ÔÚÏßÍæ¼ÒÁÙʱÊý¾Ý
|
|
def __init__(self, playerID):
|
self.playerID = playerID
|
self.mainFight = TurnAttack.MainFight(playerID)
|
return
|
|
def OnPlayerLogin(self, curPlayer):
|
self.mainFight.playerLogin(curPlayer)
|
return
|
|
def OnPlayerOffline(self, curPlayer):
|
self.mainFight.playerOffline(curPlayer)
|
return
|
|
def OnClear(self):
|
self.mainFight.clear()
|
return
|
|
class OnlineMgr():
|
## ×¼ÔÚÏßÍæ¼Ò¹ÜÀí
|
|
def __init__(self):
|
self.__onlinePlayerDict = {} # ×¼ÔÚÏßÍæ¼ÒÁÙʱÊý¾Ý×Öµä {playerID:OnlinePlayer, ...}
|
self.__offlinePlayerTimeDict = {} # ×¼ÔÚÏßÍæ¼ÒÁÙʱÀëÏßʱ¼ä´Á {playerID:ÀëÏßʱ¼ä´Á, ...}
|
return
|
|
def GetOnlinePlayer(self, curPlayer):
|
olPlayer = None
|
playerID = curPlayer.GetPlayerID()
|
if playerID in self.__onlinePlayerDict:
|
olPlayer = self.__onlinePlayerDict[playerID]
|
else:
|
olPlayer = OnlinePlayer(playerID)
|
self.__onlinePlayerDict[playerID] = olPlayer
|
|
return olPlayer
|
|
def SetPlayerOnline(self, curPlayer):
|
## ÉèÖÃÍæ¼ÒÔÚÏß
|
playerID = curPlayer.GetPlayerID()
|
self.__offlinePlayerTimeDict.pop(playerID, None)
|
if playerID not in self.__onlinePlayerDict:
|
olPlayer = OnlinePlayer(playerID)
|
self.__onlinePlayerDict[playerID] = olPlayer
|
else:
|
olPlayer = self.__onlinePlayerDict[playerID]
|
olPlayer.OnPlayerLogin(curPlayer)
|
return
|
|
def SetPlayerOffline(self, curPlayer):
|
## ÉèÖÃÍæ¼ÒÀëÏß
|
playerID = curPlayer.GetPlayerID()
|
if playerID not in self.__onlinePlayerDict:
|
return
|
olPlayer = self.__onlinePlayerDict[playerID]
|
olPlayer.OnPlayerOffline(curPlayer)
|
self.__offlinePlayerTimeDict[playerID] = int(time.time())
|
return
|
|
def ProcessOffline(self):
|
## ¶¨Ê±´¦ÀíÀëÏßÍæ¼Ò
|
curTime = int(time.time())
|
offlineTimes = 5 * 60 # 5·ÖÖÓºóÇå³ýÊý¾Ý
|
for playerID, offlineTime in self.__offlinePlayerTimeDict.items():
|
if curTime - offlineTime < offlineTimes:
|
continue
|
self.__offlinePlayerTimeDict.pop(playerID, None)
|
if playerID not in self.__onlinePlayerDict:
|
continue
|
olPlayer = self.__onlinePlayerDict.pop(playerID, None)
|
olPlayer.OnClear()
|
return
|
|
def GetOnlineMgr():
|
mgr = None
|
if PyGameData.g_onlineMgr:
|
mgr = PyGameData.g_onlineMgr
|
else:
|
mgr = OnlineMgr()
|
PyGameData.g_onlineMgr = mgr
|
return mgr
|
|
def OnPlayerLogin(curPlayer):
|
GetOnlineMgr().SetPlayerOnline(curPlayer)
|
return
|
|
def OnPlayerLogoff(curPlayer):
|
GetOnlineMgr().SetPlayerOffline(curPlayer)
|
return
|
|
def OnMinute():
|
GetOnlineMgr().ProcessOffline()
|
return
|