示例#1
0
文件: views.py 项目: tikz/ns2sud-web
def player(steamid):
    steamid = int(steamid)
    if not steamid:
        return abort(404)

    data = {}

    with Database() as db:
        # Fetch all query data first
        player_stats = db.execute(ns2plus_queries.PLAYER_STATS,
                                  steamid).fetchall()
        if not player_stats:
            return abort(404)
        data.update(player_stats[0])

        player_other_names = db.execute(ns2plus_queries.PLAYER_OTHER_NAMES,
                                        steamid).fetchall()
        data['other_names'] = [x['playerName'] for x in player_other_names]

        player_weapon_acc = db.execute(ns2plus_queries.PLAYER_WEAPON_ACC,
                                       steamid).fetchall()
        data['weapon_acc'] = {x['weapon']: x['acc'] for x in player_weapon_acc}

        player_wins = pd.DataFrame(
            db.execute(ns2plus_queries.PLAYER_WINS, steamid).fetchall())

        # TODO: check formula
        data['steam_url'] = SteamID(int((data['steamId'] - 1) / 2), 1, 1,
                                    0).community_url()

        # Winrate over time chart
        for team in (1, 2):
            df = player_wins[player_wins['teamNumber'] == team]
            shift = 30 - len(df) % 30
            df = df.groupby((np.arange(len(df)) + shift) // 30).agg({
                'win': ['sum', 'count'],
                'roundDate': ['last']
            })
            if len(df):
                df['winrate'] = df[('win', 'sum')] / df[('win', 'count')]
                data[f'team{team}_winrate'] = [{
                    'x': p[2],
                    'y': int(p[3] * 100)
                } for p in df.values]

        # Activity chart
        q = [(ns2plus_queries.PLAYER_ACTIVITY, 'activity', steamid),
             (ns2plus_queries.SERVER_ACTIVITY, 'server_activity', None)]
        for query, key, arg in q:
            if arg:
                q = db.execute(query, arg).fetchall()
            else:
                q = db.execute(query).fetchall()
            df = pd.DataFrame(q)
            df['Datetime'] = pd.to_datetime(df['roundDate'])
            df = df.set_index('Datetime')
            df = df.hoursPlayed.resample('W').sum()
            data[key] = [{
                'x': x.to_pydatetime().strftime('%Y-%m-%d %H:%M:%S'),
                'y': '%.2f' % y
            } for x, y in zip(list(df.index), list(df.values))]

        # Class time chart
        q = db.execute(ns2plus_queries.PLAYER_CLASSTIME, steamid).fetchall()
        data['classes'] = {
            c['class']: '%.2f' % c['classTime'] if c['classTime'] else 0
            for c in q
        }
        lifeforms = ['Gorge', 'Lerk', 'Fade', 'Onos']
        lifeforms_time = [(l, float(data['classes'][l])) for l in lifeforms]
        data['lifeform'] = max(lifeforms_time, key=lambda x: x[1])[0]

    return render_template('player.html', data=data)
示例#2
0
        r = requests.get(app.config['GAMESERVER_WEB_HOST'] +
                         '/?request=getchatlist',
                         auth=auth).json()
    except:
        pass

    else:
        for msg in r:
            if app.config['LINK_PREFIX'] in msg['message']:
                token = msg['message'].strip()
                user = models.User.query.filter_by(token=token).first()
                if user:
                    if token == user.token:
                        user.ns2_id = msg['steamId']
                        user.steam_id = int((msg['steamId'] - 1) / 2)
                        user.steam_url = SteamID(user.steam_id, 1, 1,
                                                 0).community_url()
                        user.token_used = datetime.datetime.now()

                        while True:
                            new_token = app.config['LINK_PREFIX'] + ''.join(
                                random.choices(
                                    string.ascii_lowercase + string.digits,
                                    k=5))
                            token_exists = models.User.query.filter_by(
                                token=new_token).first()
                            if not token_exists:
                                break
                        user.token = new_token

                        db.session.commit()
                        logging.info(