]> git.cworth.org Git - turbot/commitdiff
Implement a `/puzzle edit` command
authorCarl Worth <cworth@cworth.org>
Sat, 9 Jan 2021 08:39:57 +0000 (00:39 -0800)
committerCarl Worth <cworth@cworth.org>
Sat, 9 Jan 2021 08:50:45 +0000 (00:50 -0800)
As a simple shortcut rather than making the user type `/puzzle` and
then click the pencil icon.

TODO
turbot/interaction.py

diff --git a/TODO b/TODO
index 20387a6694ee20bf15ffebc1d78a337490675612..8cabbd65e9e196a4d924206bae4c93dc1f709a50 100644 (file)
--- 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 <round-name> (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
index bfb759ada53f9395ac0f8c629ec0fd0991a4b55f..6e353c120e1ba3d2a8a5dbca4584b2aa3033f750 100644 (file)
@@ -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]