X-Git-Url: https://git.cworth.org/git?a=blobdiff_plain;f=turbot%2Fhunt.py;h=1c2ee0e1120c579d8462e65cb721e29c95c122dc;hb=2b1b344f4734089e591acac75d8c2d2f1bc70f3b;hp=f57e7565f5998a55a207dbf617422735491db4af;hpb=a1851eaee7e0f3312a370c9decbcc2e22ae214fa;p=turbot diff --git a/turbot/hunt.py b/turbot/hunt.py index f57e756..1c2ee0e 100644 --- a/turbot/hunt.py +++ b/turbot/hunt.py @@ -1,6 +1,6 @@ from turbot.blocks import section_block, text_block, divider_block from turbot.round import round_blocks -from turbot.puzzle import puzzle_block, puzzle_matches_all +from turbot.puzzle import puzzle_blocks, puzzle_matches_all from turbot.channel import channel_url from boto3.dynamodb.conditions import Key @@ -23,19 +23,14 @@ def find_hunt_for_hunt_id(turb, hunt_id): else: return None -def quote_if_has_space(term): - if ' ' in term: - return '"{}"'.format(term) - else: - return term - -def hunt_blocks(turb, hunt, puzzle_status='unsolved', search_terms=[]): +def hunt_blocks(turb, hunt, puzzle_status='unsolved', search_terms=[], + limit_to_rounds=None): """Generate Slack blocks for a hunt The hunt argument should be a dictionary as returned from the database. - Two optional arguments can be used to filter which puzzles to + Three optional arguments can be used to filter which puzzles to include in the result: puzzle_status: If either 'solved' or 'unsolved' only puzzles @@ -50,6 +45,13 @@ def hunt_blocks(turb, hunt, puzzle_status='unsolved', search_terms=[]): state or solution string. Terms can include regular expression syntax. + limit_to_rounds: A list of rounds. If provided only the given + rounds will be included in the output. Note: + an empty list means to display only puzzles + assigned to no rounds, while an argument of + None means to display all puzzles with no + limit on the rounds. + The return value can be used in a Slack command expecting blocks to provide all the details of a hunt, (puzzles, their state, solution, links to channels and sheets, etc.). @@ -86,13 +88,18 @@ def hunt_blocks(turb, hunt, puzzle_status='unsolved', search_terms=[]): for round in puzzle['rounds']: rounds.add(round) - hunt_text = "*{}* puzzles in hunt <{}|{}>".format( + hunt_text = "*{} puzzles in hunt <{}|{}>*".format( puzzle_status.capitalize(), channel_url(channel_id), name ) + if limit_to_rounds is not None: + hunt_text += " *in round{}: {}*".format( + "s" if len(limit_to_rounds) > 1 else "", + ", ".join(limit_to_rounds) if limit_to_rounds else "" + ) if search_terms: - quoted_terms = [quote_if_has_space(term) for term in search_terms] + quoted_terms = ['`{}`'.format(term) for term in search_terms] hunt_text += " matching {}".format(" AND ".join(quoted_terms)) blocks = [ @@ -106,15 +113,28 @@ def hunt_blocks(turb, hunt, puzzle_status='unsolved', search_terms=[]): # Construct blocks for each round for round in rounds: - blocks += round_blocks(round, puzzles) + if limit_to_rounds is not None and round not in limit_to_rounds: + continue + # If we're only displaying one round the round header is redundant + if limit_to_rounds and len(limit_to_rounds) == 1: + blocks += round_blocks(round, puzzles, omit_header=True) + else: + blocks += round_blocks(round, puzzles) + blocks.append(divider_block()) # Also blocks for any puzzles not in any round stray_puzzles = [puzzle for puzzle in puzzles if 'rounds' not in puzzle] - if len(stray_puzzles): + + # For this condition, either limit_to_rounds is None which + # means we definitely want to display these stray puzzles + # (since we are not limiting), _OR_ limit_to_rounds is not + # None but is a zero-length array, meaning we are limiting + # to rounds but specifically the round of unassigned puzzles + if len(stray_puzzles) and not limit_to_rounds: stray_text = "*Puzzles with no assigned round*" blocks.append(section_block(text_block(stray_text))) for puzzle in stray_puzzles: - blocks.append(puzzle_block(puzzle)) + blocks += puzzle_blocks(puzzle) blocks.append(divider_block())