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)
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
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))