From: Carl Worth Date: Sat, 9 Jan 2021 08:39:57 +0000 (-0800) Subject: Implement a `/puzzle edit` command X-Git-Url: https://git.cworth.org/git?p=turbot;a=commitdiff_plain;h=0e2a822502037c80985bccf99e378f41f38ed1b3 Implement a `/puzzle edit` command As a simple shortcut rather than making the user type `/puzzle` and then click the pencil icon. --- diff --git a/TODO b/TODO index 20387a6..8cabbd6 100644 --- a/TODO +++ b/TODO @@ -1,9 +1,6 @@ Ordered punch-list (aiming to complete by 2021-01-08) ----------------------------------------------------- -• Add new /puzzle edit as a shortcut instead of /puzzle followed by - clicking :pencil: - • Add /round as a shortcut for existing /hunt all (and slightly different in that it won't actually return a puzzle from some other round that happens to have a name that matches this diff --git a/turbot/interaction.py b/turbot/interaction.py index bfb759a..6e353c1 100644 --- a/turbot/interaction.py +++ b/turbot/interaction.py @@ -75,7 +75,25 @@ def multi_static_select(turb, payload): actions['multi_static_select'] = {"*": multi_static_select} -def edit_puzzle(turb, payload): +def edit_puzzle_command(turb, body): + """Implementation of the `/puzzle edit` command + + As dispatched from the puzzle() function. + """ + + channel_id = body['channel_id'][0] + trigger_id = body['trigger_id'][0] + + puzzle = puzzle_for_channel(turb, channel_id) + + if not puzzle: + return bot_reply("Sorry, this does not appear to be a puzzle channel.") + + return edit_puzzle(turb, puzzle, trigger_id) + + return lambda_ok + +def edit_puzzle_button(turb, payload): """Handler for the action of user pressing an edit_puzzle button""" action_id = payload['actions'][0]['action_id'] @@ -92,7 +110,18 @@ def edit_puzzle(turb, payload): headers = {"Content-type": "application/json"}) return bot_reply("Error: Puzzle not found.") - round_options = hunt_rounds(turb, hunt_id) + return edit_puzzle(turb, puzzle, trigger_id) + +actions['button']['edit_puzzle'] = edit_puzzle_button + +def edit_puzzle(turb, puzzle, trigger_id): + """Common code for implementing an edit puzzle dialog + + This implementation is common whether the edit operation was invoked + by a button (edit_puzzle_button) or a command (edit_puzzle_command). + """ + + round_options = hunt_rounds(turb, puzzle['hunt_id']) if len(round_options): round_options_block = [ @@ -116,9 +145,9 @@ def edit_puzzle(turb, payload): view = { "type": "modal", "private_metadata": json.dumps({ - "hunt_id": hunt_id, + "hunt_id": puzzle['hunt_id'], "SK": puzzle["SK"], - "puzzle_id": puzzle_id, + "puzzle_id": puzzle['puzzle_id'], "channel_id": puzzle["channel_id"], "channel_url": puzzle["channel_url"], "sheet_url": puzzle["sheet_url"], @@ -158,8 +187,6 @@ def edit_puzzle(turb, payload): return lambda_ok -actions['button']['edit_puzzle'] = edit_puzzle - def edit_puzzle_submission(turb, payload, metadata): """Handler for the user submitting the edit puzzle modal @@ -573,6 +600,8 @@ def puzzle(turb, body, args): /puzzle new: Bring up a dialog to create a new puzzle + /puzzle edit: Edit the puzzle for the current channel + Or with no argument at all: /puzzle: Print details of the current puzzle (if in a puzzle channel) @@ -581,9 +610,14 @@ def puzzle(turb, body, args): if args == 'new': return new_puzzle(turb, body) + if args == 'edit': + return edit_puzzle_command(turb, body) + if len(args): return bot_reply("Unknown syntax for `/puzzle` command. " + - "Use `/puzzle new` to create a new puzzle.") + "Valid commands are: `/puzzle`, `/puzzle edit`, " + + "and `/puzzle new` to display, edit, or create " + + "a puzzle.") # For no arguments we print the current puzzle as a reply channel_id = body['channel_id'][0]