continue
if user_id in slack_channel_members(turb.slack_client,
hunt['channel_id']):
- my_hunt_blocks += hunt_blocks(turb, hunt)
+ my_hunt_blocks += hunt_blocks(turb, hunt, puzzle_status='all')
else:
available_hunt_blocks.append(hunt_link_block(turb, hunt))
else:
return None
-def hunt_blocks(turb, hunt):
+def hunt_blocks(turb, hunt, puzzle_status='unsolved'):
"""Generate Slack blocks for a hunt
The hunt argument should be a dictionary as returned from the
- database. 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.).
+ database.
+
+ Option 'puzzle_status' indicates which puzzles to include. If
+ either 'solved' or 'unsolved' only puzzles with that status from
+ the hunt will be included in the result. If any other value, all
+ puzzles in the hunt will be included.
+
+ 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.).
+
"""
name = hunt['name']
)
puzzles = response['Items']
+ # Filter the set of puzzles according the the requested puzzle_status
+ if puzzle_status in ('solved', 'unsolved'):
+ puzzles = [p for p in puzzles if p['status'] == puzzle_status]
+
# Compute the set of rounds across all puzzles
rounds = set()
for puzzle in puzzles:
channel_id = body['channel_id'][0]
response_url = body['response_url'][0]
+ status = args
+
+ if len(status):
+ if status not in ('unsolved', 'solved', 'all'):
+ return bot_reply("Usage: /hunt [all|solved|unsolved]")
+ else:
+ status = 'unsolved'
hunt = hunt_for_channel(turb, channel_id)
return bot_reply("Sorry, this channel doesn't appear to "
+ "be a hunt or puzzle channel")
- blocks = hunt_blocks(turb, hunt)
+ blocks = hunt_blocks(turb, hunt, puzzle_status=status)
requests.post(response_url,
json = { 'blocks': blocks },