def addVehicleInfoNew(self, vInfoVO, overrides): returnValue = addVehicleInfoOld(self, vInfoVO, overrides) try: badgeIcon = modRecentStat.getPlayerBadgeIcon( vInfoVO.player.accountDBID) if badgeIcon is not None: badgesDict = { "hasSelectedBadge": True, "badge": { "content": None, "sizeContent": "24x24", "isDynamic": False, "isAtlasSource": True, "icon": badgeIcon, }, } # TODO: show correct badge (if persists) in center: # if "badgeType" in self._data: # badgesDict["suffixBadgeType"] = self._data["badgeType"] returnValue = self._data.update(badgesDict) else: self._data.update({ "hasSelectedBadge": False, }) self._data.pop("badge", None) except BaseException: logError("Error in addVehicleInfoNew", traceback.format_exc()) return returnValue
def buildVehiclesDataNew(self, vehicles): try: modRecentStat.loadPlayerDataByVehicleList(vehicles) except BaseException: logError("Error in buildVehiclesDataNew", traceback.format_exc()) buildVehiclesDataOld(self, vehicles)
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 getStatistics(self, region, nickname, playerId, playerIdToData): # type: (str, str, int, dict) -> None try: self._getStatistics(region, nickname, playerId, playerIdToData) except BaseException: logError( "Error in getStatistics(%s, %s, %s)" % (region, nickname, playerId), traceback.format_exc())
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))
def _checkIfHostIsAnonymous(self, vehicles): # type: (dict) -> None try: for _vehicleID, vehicleData in vehicles.items(): if vehicleData["name"] != vehicleData["fakeName"]: self._isAnonymousHost = True except BaseException: logError("Can't check if host is anonymous.", traceback.format_exc())
def getPlayerId(idSiteText, nickname): try: nameTitle = "<h1>%s</h1>" % nickname nameTitleEndIndex = idSiteText.find(nameTitle) + len(nameTitle) idStartIndex = idSiteText.find("<!--", nameTitleEndIndex) + len("<!--") idEndIndex = idSiteText.find("-->", idStartIndex) - 1 return int(idSiteText[idStartIndex:idEndIndex].strip()) except BaseException: logError("Can't get id from text", traceback.format_exc()) return PLAYER_ID_NOT_KNOWN
def LobbyView_populateNew(self): LobbyView_populateOld(self) try: if not modRecentStat.notificationsShowed: modRecentStat.notificationsShowed = True pushMessage(modRecentStat.getWelcomeMessage(), SM_TYPE.Information) pushMessage(modRecentStat.getInfoMessage(), SM_TYPE.Information) except BaseException: logError("Error in LobbyView_populateNew", traceback.format_exc())
def handleActionNew(self, model, typeID, entityID, actionName): needOpen = False try: needOpen = typeID == NOTIFICATION_TYPE.MESSAGE and re.match( 'https?://', actionName, re.I) if needOpen: BigWorld.wg_openWebBrowser(actionName) except BaseException: logError("Error in handleActionNew", traceback.format_exc()) if not needOpen: handleActionOld(self, model, typeID, entityID, actionName)
def formatPlayerName(self, accountDBID, playerName): # type: (int, str) -> str playerInfo = self._playerIdToData.get(accountDBID, None) if playerInfo is not None: try: formattedPlayerStat = self._configFormat.playerName.format(**playerInfo.createDict(self._configFormat)) newPlayerName = formattedPlayerStat + playerName return newPlayerName except BaseException: logError("Can't format player name", traceback.format_exc()) return playerName return playerName
def formatNew(self, vInfoVO, playerName=None): result = formatOld(self, vInfoVO, playerName) newPlayerName = result.playerName try: accountDBID = vInfoVO.player.accountDBID newPlayerName = modRecentStat.formatPlayerName(accountDBID, result.playerName) except BaseException: logError("Error in formatNew", traceback.format_exc()) return PlayerFormatResult(result.playerFullName, newPlayerName, result.clanAbbrev, result.regionCode, result.vehicleName)
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 addVehicleInfoNew(self, vInfoVO, overrides): returnValue = addVehicleInfoOld(self, vInfoVO, overrides) try: colorId = modRecentStat.getPlayerColorId(vInfoVO.player.accountDBID) if colorId is not None: badgesDict = { "badgeType": "badge_%s" % (10 + colorId), } # TODO: show correct badge (if persists) in center: # if "badgeType" in self._data: # badgesDict["suffixBadgeType"] = self._data["badgeType"] returnValue = self._data.update(badgesDict) else: self._data.pop("badgeType", None) except BaseException: logError("Error in addVehicleInfoNew", traceback.format_exc()) return returnValue
def formatPlayerName(self, accountDBID, playerName): # type: (int, str) -> str if self._isAnonymousHost: return "? %s" % playerName # TODO move to config_format if isPlayerFake(accountDBID): return "? %s" % playerName # TODO move to config_format playerInfo = self._playerIdToData.get(accountDBID, None) if playerInfo is not None: try: formattedPlayerStat = self._configFormat.playerName.format( **playerInfo.createDict(self._configFormat)) newPlayerName = formattedPlayerStat + playerName return newPlayerName except BaseException: logError("Can't format player name", traceback.format_exc()) return playerName return playerName
def loadPlayerDataByVehicleList(self, vehicles, playerIdToData): # type: (dict, dict) -> None idsToBeLoaded = set() for _vehicleID, vehicleData in vehicles.items(): if "accountDBID" in vehicleData: playerId = vehicleData["accountDBID"] if playerId in playerIdToData or isPlayerFake(playerId): continue idsToBeLoaded.add(playerId) for playerId in idsToBeLoaded: playerIdToData[playerId] = PlayerData() if len( idsToBeLoaded ) == 0: # All IDs can be already loaded or vehicle list can be empty return joinedIds = ",".join(map(str, idsToBeLoaded)) accountsInfoUrl = self._ACCOUNT_INFO_URL \ .format(region=self._configMain.region, appId=self._configWgId.wgId, joinedIds=joinedIds) accountsTanksUrl = self._ACCOUNT_TANK_URL \ .format(region=self._configMain.region, appId=self._configWgId.wgId, joinedIds=joinedIds) accountsAchievementsUrl = self._ACCOUNT_ACHIEVEMENTS_URL \ .format(region=self._configMain.region, appId=self._configWgId.wgId, joinedIds=joinedIds) try: accountsInfo = json.loads( getJsonText(accountsInfoUrl, self._configMain.timeout)).get("data", None) accountsTanks = json.loads( getJsonText(accountsTanksUrl, self._configMain.timeout)).get("data", None) accountsAchievements = json.loads( getJsonText(accountsAchievementsUrl, self._configMain.timeout)).get("data", None) except BaseException: logError("Error loading statistics...", traceback.format_exc()) else: for playerId in idsToBeLoaded: strPlayerId = str(playerId) try: if accountsInfo[strPlayerId]["statistics"]["all"][ "battles"] != 0: currentAccountInfo = accountsInfo[strPlayerId] battles = currentAccountInfo["statistics"]["all"][ "battles"] playerData = playerIdToData[playerId] playerData.battles = battles playerData.kb = formatBattlesToKiloBattles(battles) playerData.wn8 = None playerData.xwn8 = None if strPlayerId in accountsAchievements: playerData.achievements = accountsAchievements[ strPlayerId]["achievements"] if strPlayerId in accountsTanks and battles != 0: floatBattles = float(battles) winrate = currentAccountInfo["statistics"]["all"][ "wins"] * 100.0 / floatBattles avgDmg = currentAccountInfo["statistics"]["all"][ "damage_dealt"] / floatBattles avgFrags = currentAccountInfo["statistics"]["all"][ "frags"] / floatBattles avgSpot = currentAccountInfo["statistics"]["all"][ "spotted"] / floatBattles avgDef = currentAccountInfo["statistics"]["all"][ "dropped_capture_points"] / floatBattles wn8 = self.getWN8(winrate, avgDmg, avgFrags, avgSpot, avgDef, accountsTanks[strPlayerId], self._wn8Expected) playerData.wn8 = wn8 playerData.xwn8 = getXWN8(wn8) except BaseException: logError( "Error calculating stats for PlayerID %s..." % playerId, traceback.format_exc())
def errorCantFindFile(self): # type: () -> None logError("Can't open config %s" % self._defaultConfigPath, traceback.format_exc())