hxp
2024-10-31 402ed2e6a90a785d2fce3eca23cd324f350d54c5
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
#!/usr/bin/python
# -*- coding: utf-8 -*-
# @todo: 在线人数统计
 
import CommFunc
import ConfigParser
import logging
import mylog
import json
 
cfg = ConfigParser.ConfigParser()
cfg.read("../../InterfaceConfig.php")
 
# 需要处理的流向名及顺序列表
DRNameList = ["OnLinePlayerCount"]
 
def queryOnlinePlayerInfo(argvDict):
    logging.info("queryOnlinePlayerInfo %s" % str(argvDict))
    startDate = argvDict.get("startDate", "")
    endDate = argvDict.get("endDate", "")
    
    # 查询中心备份的
    if CommFunc.isQueryCenterbak(argvDict):
        queryCenterBak_OnlinePlayerInfo(startDate, endDate, argvDict)
        return
    
    drInfo = {}
    needQueryCenterbak = CommFunc.loopMainServerDR(cfg, startDate, endDate, argvDict, checkDrFileNeedParseFunc_OnlinePlayerInfo,
                                                   parseLineFunc_OnlinePlayerInfo, drInfo, drNameList=DRNameList)
    logging.info("needQueryCenterbak=%s" % needQueryCenterbak)
    if needQueryCenterbak:
        bakDataInfo = CommFunc.queryBackupCenterDR(cfg, argvDict)
        if bakDataInfo != None:
            # 合并数据
            drInfo.update(bakDataInfo)
        
    ret = {"OK":1, "DRData":drInfo}
    
    #logging.info("ret:%s" % ret)
    print json.dumps(ret, ensure_ascii=False, default=lambda obj: obj.__dict__)
    return
 
def queryCenterBak_OnlinePlayerInfo(startDate, endDate, argvDict):
    drInfo = {}
    
    if not CommFunc.loopCenterbakRarDR(cfg, startDate, endDate, argvDict, checkDrFileNeedParseFunc_OnlinePlayerInfo,
                                       parseLineFunc_OnlinePlayerInfo, drInfo, drNameList=DRNameList):
        return
    
    return CommFunc.queryBackupCenterOK(drInfo)
 
def checkDrFileNeedParseFunc_OnlinePlayerInfo(drFileName, *parseArgs, **kv):
    ''' 检查流向是否需要处理
    @param drFileName: 流向文件名  xxx_日期.txt
    @param *parseArgs: 自定义参数
    @return: isNeed, checkNeedParseRetInfo
    '''
    isNeed = True # 指定了DRNameList,这里默认True即可
    return isNeed, None
 
def parseLineFunc_OnlinePlayerInfo(drName, dateStr, checkNeedParseRetInfo, line, *parseArgs, **kv):
    ''' 解析流向行内容
    @param drName: 流向名
    @param dateStr: 对应日期字符串
    @param checkNeedParseRetInfo: checkDrFileNeedParseFunc 返回的内容
    @param line: 本行内容
    @param *parseArgs: 自定义参数
    '''
    
    drInfo = parseArgs[0]
    
    drDict = eval(line)
    
    # 统计在线
    if drName == "OnLinePlayerCount":
        #{'OnLinePlayerCount': 2, 'tjgOnlineCnt': 28, 'platformOLDict': 'qkbtgame', 'time': '2021-01-01 00:00:46'} 按平台记录
        # ...
        #{'OnLinePlayerCount': 30, 'tjgOnlineCnt': 28, 'platformOLDict': {}, 'time': '2021-01-01 00:00:46'} 最后一条汇总
        if drDict["platformOLDict"] != {}:
            # 暂只处理汇总的信息
            return
        drTime = drDict["time"]
        drOnlineCount = drDict["OnLinePlayerCount"]
        drTjCount = drDict["tjgOnlineCnt"]
        
        drTime = drTime[:-2] + "00" # 秒数默认设置为0,确保所有服务器记录的时间点统一,不然可能有秒数的时间误差
        realOnlineCount = drOnlineCount - drTjCount # 实际在线
        
        dateStr = drTime[:10]
        if dateStr not in drInfo:
            drInfo[dateStr] = {}
        drInfo[dateStr][drTime[11:16]] = realOnlineCount
        
    return
 
def main():
    CommFunc.setdefaultencoding()
    argvDict = CommFunc.parse_args()
    mylog.InitMyLog(argvDict.get("eventType", ""))
    queryOnlinePlayerInfo(argvDict)
    return
 
if __name__ == "__main__":
    try:
        main()
    except:
        CommFunc.printExceptionError()