1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
#!/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