def updatePlayerFormatByVehicleList(vehicles, forced=False): try: from threading import Thread vehicleInfoTasks = set() for vID, vData in vehicles.iteritems(): if "name" in vData: playerName = vData["name"] if not forced and playerName in _formatted: continue playerId = vData.get("accountDBID", PLAYER_ID_NOT_KNOWN) task = Thread(target=_updatePlayerName, args=(playerName, playerId)) vehicleInfoTasks.add(task) task.start() logInfo("Vehicle info task count: %d" % len(vehicleInfoTasks)) for task in vehicleInfoTasks: task.join() logInfo("Tasks are joined") except BaseException: logError("Can't update player format by vehicle list", traceback.format_exc())
def __init__(self, configFormat=None, configMain=None, configWgId=None): # type: (ConfigFormat, ConfigMain, ConfigWgId) -> None logInfo("Mod loading is started.") self._configFormat = configFormat or ConfigFormat() self._configMain = configMain or ConfigMain() self._configWgId = configWgId or ConfigWgId() self._playerIdToData = dict() self._wgStats = WgStats(self._configMain, self._configWgId) self._welcomeMessage = self._loadWelcomeMessage() self._infoMessage = self._loadInfoMessage() logInfo("Mod loading is finished: main = %s, format = %s." % (self._configMain, self._configFormat))
def getStatistics(region, nickname, playerId): if playerId == PLAYER_ID_NOT_KNOWN: idSiteText = getSiteText("http://www.noobmeter.com/player/%s/%s" % (region, nickname)) playerId = getPlayerId(idSiteText, nickname) logInfo("Player ID of %s = %s" % (nickname, playerId)) siteText = getSiteText("http://www.noobmeter.com/player/%s/%s/%d" % (region, nickname, playerId)) try: tableBeginIdx = _getStatTableBeginIdx(siteText) overallColumnIdx, recentColumnIdx = _getOverallAndRecentColumnIdx(siteText, tableBeginIdx) trs = _getTrsWithData(siteText, tableBeginIdx) wn8 = "" battlesRecent = None battlesOverall = "" for tds in trs: if len(tds) != 0: loweredRowTitle = tds[0].lower() if "wn8" in loweredRowTitle: if recentColumnIdx != -1: wn8ParsedStr = getNumberFromCell(tds[recentColumnIdx]) else: wn8ParsedStr = getNumberFromCell(tds[overallColumnIdx]) if wn8ParsedStr is not None: wn8 = wn8ParsedStr elif "battles:" in loweredRowTitle or "кол. боёв:" in loweredRowTitle: if recentColumnIdx != -1: battlesRecent = getNumberFromCell(tds[recentColumnIdx]) battlesOverall = getNumberFromCell(tds[overallColumnIdx]) playerStat = wn8 + "[" if battlesRecent is not None: playerStat += battlesRecent + "/" playerStat += str(int(round(int(battlesOverall) / 1000.0))) + "k]" return playerStat except BaseException: logError("Error in getStatistics(%s, %s, %s)" % (region, nickname, playerId), traceback.format_exc()) return "[?-?]"
def getStatistics(region, nickname, playerId): try: mainSiteText = getSiteText("https://kttc.ru/wot/%s/user/%s/" % (region, nickname)) if playerId == PLAYER_ID_NOT_KNOWN: playerId = _getPlayerId(mainSiteText) logInfo("Player ID of %s = %s" % (nickname, playerId)) _updateStatus = getSiteText( "https://kttc.ru/wot/%s/statistics/user/update/%s/" % (region, playerId)) mainSiteText = getSiteText("https://kttc.ru/wot/%s/user/%s/" % (region, nickname)) overallStatTable = _getStatTable(mainSiteText) wn8 = str(int(round(overallStatTable["WN8"]))) battlesOverall = overallStatTable["BT"] battlesRecent = None recentStatJson = json.loads( getSiteText("https://kttc.ru/wot/ru/user/%s/get-by-battles/%s/" % (nickname, playerId)).replace("'", '"')) if recentStatJson["success"] and "1000" in recentStatJson["data"]: battlesRecent = recentStatJson["data"]["1000"]["BT"] if battlesRecent == 0: # Filter not valid recent stats battlesRecent = None else: battlesRecent = str(battlesRecent) wn8 = str(int(round(recentStatJson["data"]["1000"]["WN8"]))) playerStat = wn8 + "[" if battlesRecent is not None: playerStat += battlesRecent + "/" playerStat += str(int(round(int(battlesOverall) / 1000.0))) + "k]" return playerStat except BaseException: logError( "Error in getStatistics(%s, %s, %s)" % (region, nickname, playerId), traceback.format_exc()) return "[?-?]"
def loadPlayerDataByVehicleList(self, vehicles): # type: (dict) -> None self._checkIfHostIsAnonymous(vehicles) startTime = time.time() self._wgStats.loadPlayerDataByVehicleList(vehicles, self._playerIdToData) try: vehicleInfoTasks = set() for _vehicleID, vehicleData in vehicles.items(): if "name" in vehicleData and "accountDBID" in vehicleData: playerName = vehicleData["name"] playerId = vehicleData["accountDBID"] if playerId in self._playerIdToData and self._playerIdToData[ playerId].hasRecentStat: continue for provider in self._configMain.recentStatProviders: task = Thread(target=provider.getStatistics, args=(self._configMain.region, playerName, playerId, self._playerIdToData)) vehicleInfoTasks.add(task) task.start() logInfo("Vehicle info task count: %d." % len(vehicleInfoTasks)) for task in vehicleInfoTasks: task.join() logInfo("Tasks are joined.") except BaseException: logError("Can't load recent stats by vehicle list.", traceback.format_exc()) withStat = 0 withRecentStat = 0 withoutStat = 0 for _vehicleID, vehicleData in vehicles.items(): if "accountDBID" in vehicleData: playerId = vehicleData["accountDBID"] if playerId in self._playerIdToData: withStat += 1 # TODO if all nulls then withoutStat if self._playerIdToData[playerId].hasRecentStat: withRecentStat += 1 else: withoutStat += 1 logInfo( "Stats loaded in %s ms. With stats: %s, with recent stats: %s, without stats: %s." % (int(round((time.time() - startTime) * 1000)), withStat, withRecentStat, withoutStat))
import re import BigWorld from gui.Scaleform.daapi.view.battle.shared.stats_exchage.vehicle import VehicleInfoComponent from gui.battle_control.arena_info.arena_dp import ArenaDataProvider from gui.battle_control.arena_info.player_format import PlayerFullNameFormatter, PlayerFormatResult from gui.SystemMessages import SM_TYPE, pushMessage from gui.Scaleform.daapi.view.lobby.LobbyView import LobbyView from notification.settings import NOTIFICATION_TYPE from notification.actions_handlers import NotificationsActionsHandlers from mod_recent_stat_loader import ModRecentStat from mod_recent_stat_logging import logInfo, logError logInfo("Mod initialization is started.") modRecentStat = ModRecentStat() def buildVehiclesDataNew(self, vehicles): try: modRecentStat.loadPlayerDataByVehicleList(vehicles) except BaseException: logError("Error in buildVehiclesDataNew", traceback.format_exc()) buildVehiclesDataOld(self, vehicles) ArenaDataProvider.buildVehiclesData, buildVehiclesDataOld = buildVehiclesDataNew, ArenaDataProvider.buildVehiclesData
def warnInvalidAttribute(self, attributeName, value, expectedValues): # type: (str, str, str) -> None logInfo( 'In config "%s": attribute "%s" has an invalid value "%s". Possible values: %s.' % (self._defaultConfigPath, attributeName, value, expectedValues))
def warnNoAttribute(self, attributeName): # type: (str) -> None logInfo('No attribute "%s" in config "%s"' % (attributeName, self._defaultConfigPath))
def warnCantFindFiles(self): # type: () -> None logInfo("Can't open configs %s" % self._defaultConfigPaths)