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
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
#!/usr/bin/python
# -*- coding: GBK -*-
#-------------------------------------------------------------------------------
#
#-------------------------------------------------------------------------------
#
##@package PlayerDataCollect
#
# @todo: Íæ¼ÒÊý¾Ý²É¼¯
# @author zhangd
# @date 2011-07-29 16:00
# @version 1.5
#
# ÏêϸÃèÊö:
# @change: "2011-08-02 18:00" zhangd Ð޸Ŀͻ§¶Ë·¢°üDwordÀàÐÍkey±»C++½âÎöʱǿתintºó±ä¸ºÊý£¬³öÏÖ±£´æÎÊÌâ
# @change: "2011-08-23 15:30" panwei ¼Ç¼ÐÅÏ¢ÐÂÔöKey¼Ç¼
# @change: "2011-08-24 10:47" panwei ¼Ç¼ÐÅÏ¢KeyÐÞ¸Ä, ÐÂÔöÉÏÏ߼ǼÐÅÏ¢
# @change: "2011-08-25 15:00" panwei É¾³ýIPY_GameServerNew
# @change: "2012-08-02 09:30" jiang ´æ´¢Â·¾¶ÐÞ¸Ä
#------------------------------------------------------------------------------ 
"""Version = 2012-08-02 09:30"""
#------------------------------------------------------------------------------ 
import GameWorld
import ChConfig
import ReadChConfig
import ShareDefine
import PlayerControl
import IPY_GameServer
import base64
import ctypes
import os
#------------------------------------------------------------------------------ 
##µÇ½ÏìÓ¦
# @param curPlayer Íæ¼ÒʵÀý
# @return None
# @remarks 
def OnLogin(curPlayer):
    saveData = __GetServerUserData(curPlayer)
    #¼Ç¼·þÎñÆ÷¶ËÐÅÏ¢
    userInfoCollection = GameWorld.GetGameWorld().GetUserInfoCollection()
    userInfoCollection.AddClientUserData(curPlayer.GetPlayerID(), len(saveData), saveData)
    return
 
#===============================================================================
# //01 20 ¿Í»§¶ËÉ豸ÐÅÏ¢#tagCClientMachineNote 
# struct tagCClientMachineNote 
# { 
# tagHead Head; 
# DWORD Key; //µ±Ç°ÎªMAC 
# WORD DataLen; 
# char Data[DataLen]; 
# }; 
#===============================================================================
##¿Í»§¶ËÉ豸ÐÅÏ¢
#  @param index  Íæ¼ÒÔÚGameServerÖеÄindex
#  @param tick   µ÷ÓÃʱµÄtick
#  @return None
def RecvClientMachineInfo(index, tick):
    recvPack = IPY_GameServer.IPY_CClientMachineNote()
 
    userInfoCollection = GameWorld.GetGameWorld().GetUserInfoCollection()
    key = recvPack.GetKey()
    
    #ÐÞ¸ÄC++·â°ü½âÎöʱDWORD±»Ç¿×ª³ÉintÀàÐÍʱ£¬Êý¾ÝΪ¸º,´íÎó
    if key < 0:
        key = ctypes.c_ulong(key).value
        
    userInfoCollection.AddClientMachineData(key, 
                                            recvPack.GetDataLen(), 
                                            recvPack.GetData())
 
    return
 
 
#===============================================================================
# //01 21 ¿Í»§¶ËÓû§ÐÅÏ¢#tagCClientUserNote 
# struct tagCClientUserNote 
# { 
# tagHead Head; 
# DWORD Key; //µ±Ç°¶¨ÒåË÷ÒýΪ½ÇÉ«ID 
# WORD DataLen; 
# char Data[DataLen]; 
# }; 
#===============================================================================
##¿Í»§¶ËÓû§ÐÅÏ¢
#  @param index  Íæ¼ÒÔÚGameServerÖеÄindex
#  @param tick   µ÷ÓÃʱµÄtick
#  @return None
def RecvClientUserNote(index, tick):
    curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index)
    curPlayerID = curPlayer.GetPlayerID()
    #»ñÈ¡·â°ü²ÎÊý
    recvPack = IPY_GameServer.IPY_CClientUserNote()
    key = recvPack.GetKey()
    
    #keyÅжÏ
    if key != curPlayerID:
        GameWorld.ErrLog("Íæ¼ÒÊý¾Ý²É¼¯£¬Óû§ÐÅÏ¢key(%s)²»ÎªÍæ¼ÒID(%s)"%(key, curPlayerID), curPlayerID)
        return
    
    data = recvPack.GetData() + ';' + __GetServerUserData(curPlayer)
    #¼Ç¼
    userInfoCollection = GameWorld.GetGameWorld().GetUserInfoCollection()
    userInfoCollection.AddClientUserData(key, len(data), data)
    return
 
#---------------------------------------------------------------------
##·µ»Ø·þÎñÆ÷¶ËÐèÒª¼Ç¼µÄÄÚÈÝ
# @param curPlayer Íæ¼ÒʵÀý
# @return ×Ö·û´®
# @remarks 
def __GetServerUserData(curPlayer):
    curPlayerIP = curPlayer.GetIP()
    curPlayerName = curPlayer.GetName()
    curPlayerLv = curPlayer.GetLV()
    curPlayerSex = curPlayer.GetSex()
    curPlayerCountry = curPlayer.GetCountry()
    curPlayerJob = curPlayer.GetJob()
    curPlayerMapID = curPlayer.GetMapID()
    curPlayerLineNO = curPlayer.GetLineNO()
    
    serverUserData = "SDataVer:%s;IP:%s;Name:%s;Lv:%s;Sex:%s;Country:%s;Job:%s;MapID:%s;LineNO:%s"%\
                    (ChConfig.Def_DataCollect_Ver, curPlayerIP, curPlayerName, curPlayerLv, 
                     curPlayerSex, curPlayerCountry, curPlayerJob, curPlayerMapID, curPlayerLineNO)
    
    return serverUserData
 
##²É¼¯Íæ¼ÒÊý¾Ý
#@param curTimeStr -> 2009-03-05 16:00:00 type -> str
#@return ·µ»ØÖµÎÞÒâÒå
def CollectAndClearPlayerData(curTimeStr):
    userInfoCollection = GameWorld.GetGameWorld().GetUserInfoCollection()
    
    # »úÆ÷Êý¾ÝÌõÊý
    machineDataCnt = userInfoCollection.GetClientMachineDatasCount()
    
    # ±éÀú»úÆ÷Êý¾Ý¼Ç¼µ½log\\CollectFile\\Machine\\
    for index in range(machineDataCnt):
        machineData = userInfoCollection.GetClientMachineDataByIndex(index)
        LogPlayerData(machineData.GetKey(), machineData.GetData(), 0, curTimeStr)
        
    # Çå¿Õ»úÆ÷Êý¾Ý
    userInfoCollection.ClearClientMachineDatas()
    
    # Íæ¼ÒÊý¾ÝÌõÊý
    userDataCnt = userInfoCollection.GetClientUserDatasCount() 
       
    # ±éÀúÍæ¼ÒÊý¾Ý¼Ç¼µ½log\\CollectFile\\User\\
    for index in range(userDataCnt):
        userData = userInfoCollection.GetClientUserDataByIndex(index)
        LogPlayerData(userData.GetKey(), userData.GetData(), 1, curTimeStr)
    
    # Çå¿ÕÍæ¼ÒÊý¾Ý
    userInfoCollection.ClearClientUserDatas()
     
    return
        
 
##¼ÇÂ¼Íæ¼ÒÊý¾Ýµ½log
#@param dataKey ÊýÖµ×Öµä
#@param dataStr Íæ¼ÒÊý¾Ý
#@param dataType Êý¾ÝÀàÐÍ0:»úÆ÷Êý¾Ý£¬1£ºÍæ¼ÒÊý¾Ý
#@param curTimeStr -> 2009-03-05 16:00:00
#@return ·µ»ØÖµÎÞÒâÒå
def LogPlayerData(dataKey, dataStr, dataType, curTimeStr):
    curTimeStr = curTimeStr.split()[0]
    
    #ChinGameServer.exeËùÔÚµÄÂß¼­ÅÌ·û
    diskPath = ChConfig.GetAppPath().split("\\")[0]
    
    #0: »úÆ÷Êý¾Ý
    if dataType == 0:
        dataStr = __EncryptStr(dataStr)
        logPath = os.path.join(diskPath, "\\ServerCollectFile\\%s\\Machine"%curTimeStr)
 
    #1£ºÍæ¼ÒÊý¾Ý
    else:
        dataStr = __EncryptStr('playerID:%s;'%(dataKey) + dataStr)
        logPath = os.path.join(diskPath, "\\ServerCollectFile\\%s\\User"%curTimeStr)
    
    if not os.path.isdir(logPath):
        os.makedirs(logPath)
    
    #дÈëÊý¾Ý
    logFileName = curTimeStr + ".log"
    logFile = os.path.join(logPath, logFileName)
    saveFile = file(logFile, "ab")
    saveFile.write(dataStr + "\r\n")
    saveFile.close()
    return
 
##¶Ô×Ö·û´®½øÐмÓÃÜ
#@param inStr Òª¼ÓÃܵÄ×Ö·û´®
#@return ·µ»ØÖµ¼ÓÃܺóµÄ×Ö·û´®    
def __EncryptStr(inStr):
 
    outStr = ""
    for char in inStr:
        #ÿ¸ö¶¼ÒªºÍkeyÒì»ò
        outStr += chr(ord(char) ^ ChConfig.Def_PlayerDataCollect_Key)
    
    outStr = base64.b64encode(outStr)
    
    return outStr