Ejemplo n.º 1
0
def league_run_api(person: str) -> Response:
    decks = league.active_decks_by(person)
    if len(decks) == 0:
        return return_json(None)

    run = guarantee_at_most_one_or_retire(decks)
    if run is None:
        return return_json(None)

    decks = league.active_decks()
    already_played = [
        m.opponent_deck_id for m in match.load_matches_by_deck(run)
    ]
    run.can_play = [
        d.person for d in decks
        if d.person != person and d.id not in already_played
    ]

    return return_json(run)
Ejemplo n.º 2
0
 def __init__(self,
              d: deck.Deck,
              person_id: Optional[int] = None,
              discord_id: Optional[int] = None) -> None:
     super().__init__()
     self.deck = d
     prepare.prepare_deck(self.deck)
     self.cards = d.all_cards()
     self.matches = match.load_matches_by_deck(d, should_load_decks=True)
     for m in self.matches:
         m.display_date = dtutil.display_date(m.date)
         if m.opponent:
             m.opponent_url = url_for('.person', mtgo_username=m.opponent)
         else:
             m.opponent = 'BYE'
             m.opponent_url = False
         if m.opponent_deck_id:
             m.opponent_deck_url = url_for('deck',
                                           deck_id=m.opponent_deck_id)
         else:
             m.opponent_deck_url = False
         if m.opponent_deck and m.opponent_deck.is_in_current_run():
             m.opponent_deck_name = '(Active League Run)'
         elif m.opponent_deck:
             m.opponent_deck_name = m.opponent_deck.name
         else:
             m.opponent_deck_name = '-'
         if self.has_rounds():
             m.display_round = display_round(m)
     self.deck['maindeck'].sort(key=lambda x: oracle.deck_sort(x.card))
     self.deck['sideboard'].sort(key=lambda x: oracle.deck_sort(x.card))
     self.archetypes = archetype.load_archetypes_deckless(order_by='a.name')
     self.edit_archetype_url = url_for('edit_archetypes')
     self.legal_formats = d.legal_formats
     self.is_in_current_run = d.is_in_current_run()
     self.person_id = person_id
     self.discord_id = discord_id
     self.is_deck_page = True
Ejemplo n.º 3
0
def report(form: ReportForm) -> bool:
    try:
        db().get_lock('deck_id:{id}'.format(id=form.entry))
        db().get_lock('deck_id:{id}'.format(id=form.opponent))

        pdbot = form.get('api_token',
                         None) == configuration.get('pdbot_api_token')

        entry_deck_id = int(form.entry)
        opponent_deck_id = int(form.opponent)

        ds = {
            d.id: d
            for d in deck.load_decks(
                f'd.id IN ({entry_deck_id}, {opponent_deck_id})')
        }
        entry_deck = ds.get(entry_deck_id)
        opponent_deck = ds.get(opponent_deck_id)

        if not entry_deck:
            form.errors[
                'entry'] = 'This deck does not appear to exist. Please try again.'
            return False

        if not opponent_deck:
            form.errors[
                'opponent'] = 'This deck does not appear to exist. Please try again.'
            return False

        if not pdbot:
            if entry_deck.retired:
                form.errors[
                    'entry'] = 'Your deck is retired, you cannot report results for it. If you need to do this, contact a mod on the Discord.'
                return False
            if opponent_deck.retired:
                form.errors[
                    'opponent'] = "Your opponent's deck is retired, you cannot report results against it. If you need to do this, please contact a mod on the Discord."
                return False

        for m in match.load_matches_by_deck(form):
            if int(form.opponent) == m.opponent_deck_id:
                form.errors[
                    'result'] = 'This match was reported as You {game_wins}–{game_losses} {opponent} {date}'.format(
                        game_wins=m.game_wins,
                        game_losses=m.game_losses,
                        opponent=m.opponent,
                        date=dtutil.display_date(m.date))
                return False

        counts = deck.count_matches(form.entry, form.opponent)
        if counts[int(form.entry)] >= 5:
            form.errors['entry'] = 'You already have 5 matches reported'
            return False
        if counts[int(form.opponent)] >= 5:
            form.errors[
                'opponent'] = 'Your opponent already has 5 matches reported'
            return False

        if pdbot:
            mtgo_match_id = form.get('matchID', None)
        else:
            mtgo_match_id = None
        match.insert_match(dtutil.now(), form.entry, form.entry_games,
                           form.opponent, form.opponent_games, None, None,
                           mtgo_match_id)
        if not pdbot:
            if configuration.get('league_webhook_id') and configuration.get(
                    'league_webhook_token'):
                fetch_tools.post_discord_webhook(
                    configuration.get_str('league_webhook_id'),
                    configuration.get_str('league_webhook_token'),
                    '{entry} reported {f.entry_games}-{f.opponent_games} vs {opponent}'
                    .format(f=form,
                            entry=entry_deck.person,
                            opponent=opponent_deck.person))
            else:
                logger.warning(
                    'Not posting manual report to discord because not configured.'
                )
        return True
    except LockNotAcquiredException:
        form.errors[
            'entry'] = 'Cannot report right now, somebody else is reporting a match for you or your opponent. Try again a bit later'
        return False
    finally:
        db().release_lock('deck_id:{id}'.format(id=form.opponent))
        db().release_lock('deck_id:{id}'.format(id=form.entry))