#!/usr/bin/python # -*- coding: utf-8 -*- # @todo: 玩家货币查询 import CommFunc import ConfigParser import DBOperate import mylog import logging cfg = ConfigParser.ConfigParser() cfg.read("../../InterfaceConfig.php") ServerPath = cfg.get("ServerInfo", "ServerPath") def queryPlayerMoneyInfo(argvDict): ## 查询玩家货币信息 startDate = argvDict.get("startDate", "") endDate = argvDict.get("endDate", "") moneyType = CommFunc.toInt(argvDict.get("moneyType")) recordType = argvDict.get("recordType") if not moneyType or not recordType: print _(u"需指定查询货币类型及选项") return # 查询中心备份的 if CommFunc.isQueryCenterbak(argvDict): queryPlayerMoneyInfo_CenterBak(startDate, endDate, argvDict, moneyType, recordType) return playerFind = argvDict.get("playerFind", "") if not playerFind: print _(u"需要指定要查询的玩家") return queryType = argvDict.get("queryType", "") dboper = DBOperate.DBOper(ServerPath) if queryType == "playerName": findDBRet = dboper.findPlayerInfoByName([playerFind]) else: findDBRet = dboper.findPlayerInfoByAccID([playerFind]) dboper.close() if findDBRet and findDBRet.count(): dbPlayer = findDBRet[0] playerID = CommFunc.encode(dbPlayer["PlayerID"]) queryAccID = CommFunc.encode(dbPlayer["AccID"]) playerName = CommFunc.encode(dbPlayer["PlayerName"]) elif queryType == "accID": queryAccID = playerFind playerID = 0 playerName = "" else: print "%s!
%s
" % (_(u"找不到该玩家"), playerFind) return drList = [] needQueryCenterbak = CommFunc.loopMainServerDR(cfg, startDate, endDate, argvDict, checkDrFileNeedParseFunc, parseLineFunc, drList, queryAccID, moneyType, recordType) if needQueryCenterbak: argvDict["queryAccID"] = queryAccID bakDataList = CommFunc.queryBackupCenterDR(cfg, argvDict) if bakDataList == None: return drList = bakDataList + drList itemNameDict = CommFunc.getCfgKeyNameDict("item", argvDict) useNameDict = CommFunc.getCfgKeyNameDict("money_enent_use", argvDict) giveNameDict = CommFunc.getCfgKeyNameDict("money_enent_give", argvDict) giveItemNameDict = CommFunc.getCfgKeyNameDict("item_enent_give", argvDict) needMoney2 = False totalGive, totalUse = 0, 0 bossTypeNameDict = {0:_(u"世界Boss"), 1:_(u"Boss之家"), 2:_(u"跨服Boss")} prayTypeNameDict = {13:_(u"金币"), 14:_(u"经验")} drList = sorted(drList, key=lambda dr:(dr["time"], dr['PlayerMoneyCount']), reverse=False) # 按time升序排 for drDict in drList: if not needMoney2 and "PlayerMoneyCount2" in drDict: needMoney2 = True MoneyCount = drDict['MoneyCount'] eventName = drDict['eventName'] reason_name_son = drDict.get("reason_name_son") if reason_name_son: if eventName in ["UseItem", "BuyStoreItem", "TransformItem"]: itemID = reason_name_son itemName = itemNameDict.get(str(itemID), "") if itemName: drDict["reason_name_son"] = "%s(%s)" % (itemName, itemID) # 物品转换的,补上物品来源 if eventName == "TransformItem" and "GiveItemEvent" in drDict: giveItemEventName = drDict["GiveItemEvent"] giveItemNameCh = giveItemNameDict.get(giveItemEventName, giveItemEventName) drDict["reason_name_son"] = "%s %s:%s" % (drDict["reason_name_son"], _(u"物品来源"), str(giveItemNameCh)) # 抵扣 if drDict.get("CouponMoney", 0) > 0: drDict["reason_name_son"] = "%s %s:%s %s:%s" % (drDict["reason_name_son"], _(u"原价"), drDict.get("ItemPrice", 0), _(u"抵扣"), drDict["CouponMoney"]) elif eventName == "BuyKillBossCnt": drDict["reason_name_son"] = bossTypeNameDict.get(reason_name_son, reason_name_son) elif eventName == "Pray": drDict["reason_name_son"] = prayTypeNameDict.get(reason_name_son, reason_name_son) eventNameCh = "" if "-" in MoneyCount: eventNameCh = useNameDict.get(eventName) totalUse += CommFunc.toInt(MoneyCount.replace("-", "").replace(" ", "")) elif "+" in MoneyCount: eventNameCh = giveNameDict.get(eventName) totalGive += CommFunc.toInt(MoneyCount.replace("+", "").replace(" ", "")) if eventNameCh: drDict['eventName'] = "%s %s" % (eventNameCh, CommFunc.encode(eventName)) if not playerName and drList: drDict = drList[-1] playerID = drDict.get("PlayerID", playerID) playerName = CommFunc.encodePych(drDict.get("PlayerName", "")) moneyNameDict = CommFunc.getCfgKeyNameDict("money", argvDict) moneyName = moneyNameDict.get(str(moneyType), str(moneyType)) printStr = "

%s%s

" % (moneyName, _(u"记录")) printStr += "%s: %s
" % (_(u"玩家ID"), playerID) printStr += "%s: %s
" % (_(u"玩家账号"), queryAccID) printStr += "%s: %s
" % (_(u"玩家名称"), playerName) if startDate: printStr += "%s: %s
" % (_(u"开始日期"), startDate) if endDate: printStr += "%s: %s
" % (_(u"结束日期"), endDate) if totalGive: printStr += "%s: %s
" % (_(u"累计获得"), totalGive) if totalUse: printStr += "%s: %s
" % (_(u"累计消耗"), totalUse) maxShowCount = 5000 drCount = len(drList) if drCount > maxShowCount: logging.warn("drList len is %s" % drCount) drList = drList[:maxShowCount] printStr += "%s : %s
" % (_(u"满足条件总条数过多,请调整查询条件!当前仅展示部分,实际总条数为"), drCount) # 表格输出 tdList = ["MoneyCount", "PlayerMoneyCount", "eventName", "reason_name_son", "time"] styleInfo = {"MoneyCount":{"align":"right", "title":_(u"变化值")}, "PlayerMoneyCount":{"align":"right", "title":_(u"剩余")}, "eventName":{"align":"left"}, } if needMoney2: tdList = ["MoneyCount", "PlayerMoneyCount", "PlayerMoneyCount2", "eventName", "reason_name_son", "time"] money2TitleDict = {99:"时效"} money2Title = _(u"剩余") + money2TitleDict.get(moneyType, "2") styleInfo.update({ "PlayerMoneyCount2":{"align":"right", "title":money2Title}, }) printStr += CommFunc.editTableHtml(drList, tdList, _(u"编号"), styleInfo=styleInfo) # 只会返回最后一个print的内容 print printStr return def queryPlayerMoneyInfo_CenterBak(startDate, endDate, argvDict, moneyType, recordType): drList = [] queryAccID = argvDict.get("queryAccID", "") if not CommFunc.loopCenterbakRarDR(cfg, startDate, endDate, argvDict, checkDrFileNeedParseFunc, parseLineFunc, drList, queryAccID, moneyType, recordType): return return CommFunc.queryBackupCenterOK(drList) def checkDrFileNeedParseFunc(drFileName, *parseArgs, **kv): ''' 检查流向是否需要处理 @param drFileName: 流向文件名 xxx_日期.txt @param *parseArgs: 自定义参数 @return: isNeed, checkNeedParseRetInfo ''' _, _, moneyType, recordType = parseArgs queryUse = recordType in ["All", "Use"] queryGive = recordType in ["All", "Give"] changeType = "" # 仙玉 if moneyType == 1: if queryGive: if drFileName.startswith("GiveGold_"): changeType = "+" if queryUse: if drFileName.startswith("UseGold_"): changeType = "-" # 绑玉 elif moneyType == 2: if queryGive: if drFileName.startswith("GiveGoldPaper_"): changeType = "+" if queryUse: if drFileName.startswith("UseGoldPaper_"): changeType = "-" # 铜钱 elif moneyType == 3: if queryGive: if drFileName.startswith("GiveSilver_"): changeType = "+" if queryUse: if drFileName.startswith("UseSilver_"): changeType = "-" # 神玉 elif moneyType == 4: if queryGive: if drFileName.startswith("GiveSilverPaper_"): changeType = "+" if queryUse: if drFileName.startswith("UseSilverPaper_"): changeType = "-" # 代币 elif moneyType == 99: if queryGive: if drFileName.startswith("GivePayCoin_"): changeType = "+" if queryUse: if drFileName.startswith("UsePayCoin_"): changeType = "-" # 其他 else: if queryGive: if drFileName.startswith("GiveCurrency_%s" % moneyType): changeType = "+" if queryUse: if drFileName.startswith("UseCurrency_%s" % moneyType): changeType = "-" if not changeType: return False, None return True, changeType def parseLineFunc(drName, dateStr, checkNeedParseRetInfo, line, *parseArgs, **kv): ''' 解析流向行内容 @param drName: 流向名 @param dateStr: 对应日期字符串 @param checkNeedParseRetInfo: checkDrFileNeedParseFunc 返回的内容 @param line: 本行内容 @param *parseArgs: 自定义参数 ''' changeType = checkNeedParseRetInfo drList, queryAccID, moneyType, _ = parseArgs if queryAccID not in line: # 直接验证账号字符,省去eval消耗 return drDict = eval(line) accID = drDict["AccID"] if accID != queryAccID: return if moneyType != drDict["MoneyType"]: return drDict["MoneyCount"] = "%s %s" % (changeType, drDict["MoneyCount"]) drList.append(drDict) return def main(): CommFunc.setdefaultencoding() argvDict = CommFunc.parse_args() mylog.InitMyLog(argvDict.get("eventType", "")) CommFunc.gettextInstall(argvDict.get("lang", "")) queryPlayerMoneyInfo(argvDict) return if __name__ == "__main__": try: main() except: CommFunc.printExceptionError()