Esempio n. 1
0
    def _get_user(self):
        (value, isId) = self.req['args']
        orig_value = value
        reg = GAME_REGION
        if isId:
            value = str(int(value))
        else:
            if reg == "CT":
                suf = value[-3:]
                if suf in ('_RU', '_EU', '_NA', '_US', '_SG'):
                    reg = value[-2:]
                    value = value[:-3]
                    if reg == 'US':
                        reg = 'NA'
                else:
                    reg = "RU"
        cacheKey = "%s/%s" % ("ID" if isId else reg, value)
        data = None
        if cacheKey not in self.cacheUser:
            try:
                tdata = token.getXvmActiveTokenData()
                if tdata is None or 'token' not in tdata:
                    err('No valid token for XVM network services (key=%s)' % cacheKey)
                else:
                    tok = tdata['token'].encode('ascii')
                    if isId:
                        req = "user/%s/%s" % (tok, value)
                    else:
                        req = "nick/%s/%s/%s" % (tok, reg, value)
                    server = XVM.SERVERS[randint(0, len(XVM.SERVERS) - 1)]
                    (response, duration, errStr) = loadUrl(server, req)

                    # log(response)

                    if not response:
                        # err('Empty response or parsing error')
                        pass
                    else:
                        try:
                            data = None if response in ('', '[]') else simplejson.loads(response)[0]
                        except Exception:
                            err('  Bad answer: ' + response)

                        if data is not None:
                            self._fix_user(data, None if isId else orig_value)
                            if 'nm' in data and '_id' in data:
                                self.cacheUser[reg + "/" + data['nm']] = data
                                self.cacheUser["ID/" + str(data['_id'])] = data
                        elif response == '[]':
                            self.cacheUser[cacheKey] = {}

            except Exception:
                err(traceback.format_exc())

        with self.lock:
            self.resp = self.cacheUser.get(cacheKey, {})
Esempio n. 2
0
    def _load_stat(self, playerVehicleID):
        requestList = []

        replay = isReplay()
        all_cached = True
        for (vehId, pl) in self.players.iteritems():
            cacheKey = "%d=%d" % (pl.playerId, pl.vId)

            if cacheKey not in self.cacheBattle:
                all_cached = False

            requestList.append("%d=%d%s" % (pl.playerId, pl.vId,
                                            '=1' if not replay and pl.vehId == playerVehicleID else ''))

        if all_cached or not requestList:
            return

        try:
            tdata = token.getXvmActiveTokenData()
            if token.networkServicesSettings['statBattle']:
                if tdata is None or 'token' not in tdata:
                    err('No valid token for XVM network services (id=%s)' % playerVehicleID)
                    return

                cmd = 'rplstat' if isReplay() else 'stat'
                updateRequest = '%s/%s/%s' % (cmd, tdata['token'].encode('ascii'), ','.join(requestList))

                if XVM.SERVERS is None or len(XVM.SERVERS) <= 0:
                    err('Cannot read data: no suitable server was found.')
                    return

                server = XVM.SERVERS[randint(0, len(XVM.SERVERS) - 1)]
                (response, duration, errStr) = loadUrl(server, updateRequest)

                if not response:
                    # err('Empty response or parsing error')
                    return

                data = simplejson.loads(response)
                if 'players' not in data:
                    err('Stat request failed: ' + str(response))
                    return

            else:
                if isReplay():
                    log('XVM network services inactive (id=%s)' % playerVehicleID)
                players = []
                for (vehId, pl) in self.players.iteritems():
                    players.append(self._get_battle_stub(pl))
                data = {'players': players}

            for stat in data['players']:
                # debug(simplejson.dumps(stat))
                self._fix(stat)
                # pprint(stat)
                if 'nm' not in stat or not stat['nm']:
                    continue
                if 'b' not in stat or stat['b'] <= 0:
                    continue
                cacheKey = "%d=%d" % (stat['_id'], stat.get('v', {}).get('id', 0))
                self.cacheBattle[cacheKey] = stat

        except Exception:
            err(traceback.format_exc())