Beispiel #1
0
    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)
Beispiel #3
0
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())
Beispiel #4
0
 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())
Beispiel #5
0
    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))
Beispiel #6
0
 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())
Beispiel #7
0
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)
Beispiel #12
0
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 "[?-?]"
Beispiel #13
0
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
Beispiel #15
0
    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
Beispiel #16
0
    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())