else:
return None
+def hunt_puzzles_for_hunt_id(turb, hunt_id):
+ """Return all puzzles that belong to the given hunt_id"""
+
+ response = turb.table.query(
+ KeyConditionExpression=(
+ Key('hunt_id').eq(hunt_id) &
+ Key('SK').begins_with('puzzle-')
+ )
+ )
+
+ return response['Items']
+
def hunt_blocks(turb, hunt, puzzle_status='unsolved', search_terms=[],
limit_to_rounds=None):
"""Generate Slack blocks for a hunt
all of these terms will be included in the
result. A match will be considered on any of
puzzle title, round title, puzzle URL, puzzle
- state or solution string. Terms can include
- regular expression syntax.
+ state, puzzle type, tags, 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:
hunt_id = hunt['hunt_id']
channel_id = hunt['channel_id']
- response = turb.table.query(
- KeyConditionExpression=(
- Key('hunt_id').eq(hunt_id) &
- Key('SK').begins_with('puzzle-')
- )
- )
- puzzles = response['Items']
+ puzzles = hunt_puzzles_for_hunt_id(turb, hunt_id)
# Filter the set of puzzles according the the requested puzzle_status
if puzzle_status in ('solved', 'unsolved'):
]
if not len(puzzles):
+ text = "No puzzles found."
+ if puzzle_status != 'all':
+ text += ' (Consider searching for "all" puzzles?)'
blocks += [
- section_block(text_block("No puzzles found."))
+ section_block(text_block(text))
]
# Construct blocks for each round
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]