#!/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", "") onlyServerIDHis = argvDict.get("onlyServerIDHis", "") # 只查备档单服数据 # 查询中心备份的 if CommFunc.isQueryCenterbak(argvDict): queryCenterBak_OnlinePlayerInfo(startDate, endDate, argvDict) return drInfo = {} if not onlyServerIDHis: needQueryCenterbak = CommFunc.loopMainServerDR(cfg, startDate, endDate, argvDict, checkDrFileNeedParseFunc_OnlinePlayerInfo, parseLineFunc_OnlinePlayerInfo, drInfo, drNameList=DRNameList) needQueryCenterbak = False # 默认不查备档 else: logging.info("onlyServerIDHis %s" % argvDict.get("OnlyServerID", "")) needQueryCenterbak = True 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()