From: Carl Worth Date: Tue, 5 Jan 2021 03:49:35 +0000 (-0800) Subject: Add support for an argument to the /hunt command X-Git-Url: https://git.cworth.org/git?a=commitdiff_plain;h=40c52b62c680ec06927b28ad812d6eea3e0635e4;hp=609130e36ca9ca8642caf618f7b3a50a688f46af;p=turbot Add support for an argument to the /hunt command This will work with three options: /hunt all: Show all puzzles /hunt unsolved: Show unsolved puzzles /hunt solved: Show solved puzzles --- diff --git a/turbot/events.py b/turbot/events.py index bf4154f..b8fd429 100644 --- a/turbot/events.py +++ b/turbot/events.py @@ -45,7 +45,7 @@ def home(turb, user_id): 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)) diff --git a/turbot/hunt.py b/turbot/hunt.py index 77c1797..6d44662 100644 --- a/turbot/hunt.py +++ b/turbot/hunt.py @@ -23,13 +23,21 @@ def find_hunt_for_hunt_id(turb, hunt_id): 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'] @@ -44,6 +52,10 @@ def hunt_blocks(turb, hunt): ) 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: diff --git a/turbot/interaction.py b/turbot/interaction.py index bb09b68..9045778 100644 --- a/turbot/interaction.py +++ b/turbot/interaction.py @@ -625,6 +625,13 @@ def hunt(turb, body, args): 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) @@ -632,7 +639,7 @@ def hunt(turb, body, args): 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 },