Exemple #1
0
def adjust_elo(winning_deck_id: int, losing_deck_id: int) -> None:
    if not losing_deck_id:
        return # Intentional draws do not affect Elo.
    winner = guarantee.exactly_one(person.load_people('p.id IN (SELECT person_id FROM deck WHERE id = {winning_deck_id})'.format(winning_deck_id=sqlescape(winning_deck_id))))
    loser = guarantee.exactly_one(person.load_people('p.id IN (SELECT person_id FROM deck WHERE id = {losing_deck_id})'.format(losing_deck_id=sqlescape(losing_deck_id))))
    adj = adjustment(winner.elo or STARTING_ELO, loser.elo or STARTING_ELO)
    sql = 'UPDATE person SET elo = IFNULL(elo, {starting_elo}) + %s WHERE id = %s'.format(starting_elo=sqlescape(STARTING_ELO))
    db().execute(sql, [adj, winner.id])
    db().execute(sql, [-adj, loser.id])
Exemple #2
0
def run() -> None:
    sql = """
        SELECT
            GROUP_CONCAT(d.person_id) AS people,
            GROUP_CONCAT(dm.games) AS games
        FROM
            `match` AS m
        INNER JOIN
            deck_match AS dm ON dm.match_id = m.id
        INNER JOIN
            deck AS d ON dm.deck_id = d.id
        GROUP BY
            m.id
        ORDER BY
            m.date,
            `round`
    """
    matches = db().select(sql)
    for m in matches:
        match(m)
    current = person.load_people()
    people_by_id = {p.id: p for p in current}
    sql = 'UPDATE person SET elo = %s WHERE id = %s'
    for person_id, new_elo in sorted(PEOPLE.items(), key=lambda x: -x[1]):
        p = people_by_id[int(person_id)]
        if p.elo != new_elo:
            logger.warning('{id} currently has Elo of {current_elo} and we are setting it to {new_elo}'.format(id=p.id, current_elo=p.elo, new_elo=new_elo))
            db().execute(sql, [new_elo, p.id])
def people() -> List[Dict[str, str]]:
    urls = []
    for p in person.load_people():
        urls.append({
            'name': p.name,
            'type': 'Person',
            'url': url_for('person', mtgo_username=p.name)
        })
    return urls
Exemple #4
0
def matchups() -> str:
    hero, enemy = {}, {}
    for k, v in request.args.items():
        if k.startswith('hero_'):
            k = k.replace('hero_', '')
            hero[k] = v
        else:
            k = k.replace('enemy_', '')
            enemy[k] = v
    season_id = request.args.get('season_id')
    results = mus.matchup(hero, enemy,
                          season_id=season_id) if request.args else {}
    matchup_archetypes = archs.load_archetypes_deckless()
    matchup_archetypes.sort(key=lambda a: a.name)
    matchup_people = list(ps.load_people(where='p.mtgo_username IS NOT NULL'))
    matchup_people.sort(key=lambda p: p.name)
    matchup_cards = cs.load_cards()
    matchup_cards.sort(key=lambda c: c.name)
    view = Matchups(hero, enemy, season_id, matchup_archetypes, matchup_people,
                    matchup_cards, results)
    return view.page()
Exemple #5
0
def people_api() -> Response:
    """
    Grab a slice of results from a 0-indexed resultset of people.
    Input:
        {
            'page': <int>,
            'pageSize': <int>,
            'sortBy': <str>,
            'sortOrder': <'ASC'|'DESC'>,
            'seasonId': <int|'all'>,
            'q': <str>
        }
    Output:
        {
            'page': <int>,
            'objects': [<person>],
            'total': <int>
        }
    """
    order_by = query.people_order_by(request.args.get('sortBy'),
                                     request.args.get('sortOrder'))
    page_size = int(request.args.get('pageSize', DEFAULT_LIVE_TABLE_PAGE_SIZE))
    page = int(request.args.get('page', 0))
    start = page * page_size
    limit = f'LIMIT {start}, {page_size}'
    season_id = seasons.season_id(str(request.args.get('seasonId')), None)
    q = request.args.get('q', '').strip()
    where = query.text_match_where(query.person_query(), q) if q else 'TRUE'
    people = ps.load_people(where=where,
                            order_by=order_by,
                            limit=limit,
                            season_id=season_id)
    prepare_people(people)
    total = ps.load_people_count(where=where, season_id=season_id)
    r = {'page': page, 'total': total, 'objects': people}
    resp = return_json(r, camelize=True)
    resp.set_cookie('page_size', str(page_size))
    return resp
Exemple #6
0
def edit_aliases() -> str:
    aliases = ps.load_aliases()
    all_people = ps.load_people(order_by_name=True)
    view = EditAliases(aliases, all_people)
    return view.page()
Exemple #7
0
def unlink(num_affected_people: Optional[int] = None,
           errors: List[str] = None) -> str:
    all_people = ps.load_people(order_by_name=True)
    view = Unlink(all_people, num_affected_people, errors)
    return view.page()
Exemple #8
0
def player_notes() -> str:
    notes = ps.load_notes()
    all_people = ps.load_people(order_by_name=True)
    view = PlayerNotes(notes, all_people)
    return view.page()
Exemple #9
0
def people() -> str:
    view = People(ps.load_people(season_id=get_season_id()))
    return view.page()
Exemple #10
0
def player_notes():
    notes = ps.load_notes()
    all_people = ps.load_people(order_by='p.mtgo_username')
    view = PlayerNotes(notes, all_people)
    return view.page()
Exemple #11
0
def people():
    view = People(ps.load_people())
    return view.page()
Exemple #12
0
def unlink(num_affected_people=None):
    all_people = ps.load_people(order_by='p.mtgo_username')
    view = Unlink(all_people, num_affected_people)
    return view.page()
Exemple #13
0
def edit_aliases() -> str:
    aliases = ps.load_aliases()
    all_people = ps.load_people(order_by='p.mtgo_username')
    view = EditAliases(aliases, all_people)
    return view.page()