]> git.cworth.org Git - turbot/blobdiff - turbot/interaction.py
Add a /delete command
[turbot] / turbot / interaction.py
index 75ff299bc6a5df9edd8feaaab4aff01029a12531..d7e8da6ff905bd086046ce499e82e47be319192a 100644 (file)
@@ -187,9 +187,9 @@ def edit_puzzle(turb, puzzle, trigger_id):
         solved = True
 
     solution_str = None
-    solution_set = puzzle.get("solution", set())
-    if solution_set:
-        solution_str = ", ".join(solution_set)
+    solution_list = puzzle.get("solution", [])
+    if solution_list:
+        solution_str = ", ".join(solution_list)
 
     view = {
         "type": "modal",
@@ -280,12 +280,13 @@ def edit_puzzle_submission(turb, payload, metadata):
         puzzle['status'] = 'solved'
     else:
         puzzle['status'] = 'unsolved'
-    puzzle['solution'] = set()
+    puzzle['solution'] = []
     solution = state['solution']['solution']['value']
     if solution:
-        puzzle['solution'] = {
+        # Construct a list from a set to avoid any duplicates
+        puzzle['solution'] = list({
             sol.strip() for sol in solution.split(',')
-        }
+        })
 
     # Verify that there's a solution if the puzzle is mark solved
     if puzzle['status'] == 'solved' and not puzzle['solution']:
@@ -320,7 +321,7 @@ def edit_puzzle_submission(turb, payload, metadata):
                                           puzzle['SK'])
 
     # If we are changing puzzle type (meta -> plain or plain -> meta)
-    # the the sort key has to change, so compute the new one and delete
+    # then the sort key has to change, so compute the new one and delete
     # the old item from the database.
     #
     # XXX: We should really be using a transaction here to combine the
@@ -1044,7 +1045,7 @@ def new_puzzle_submission(turb, payload, metadata):
     if rounds:
         puzzle['rounds'] = rounds
 
-    puzzle['solution'] = set()
+    puzzle['solution'] = []
     puzzle['status'] = 'unsolved'
 
     # Create a channel for the puzzle
@@ -1184,7 +1185,10 @@ def solved(turb, body, args):
 
     # Set the status and solution fields in the database
     puzzle['status'] = 'solved'
-    puzzle['solution'].add(args)
+
+    # Don't append a duplicate solution
+    if args not in puzzle['solution']:
+        puzzle['solution'].append(args)
     if 'state' in puzzle:
         del puzzle['state']
     turb.table.put_item(Item=puzzle)
@@ -1192,7 +1196,7 @@ def solved(turb, body, args):
     # Report the solution to the puzzle's channel
     slack_send_message(
         turb.slack_client, channel_id,
-        "Puzzle mark solved by <@{}>: `{}`".format(user_id, args))
+        "Puzzle marked solved by <@{}>: `{}`".format(user_id, args))
 
     # Also report the solution to the hunt channel
     hunt = find_hunt_for_hunt_id(turb, puzzle['hunt_id'])
@@ -1210,6 +1214,50 @@ def solved(turb, body, args):
 
 commands["/solved"] = solved
 
+def delete(turb, body, args):
+    """Implementation of the /delete command
+
+    The argument to this command is the ID of a hunt.
+
+    The command will report an error if the specified hunt is active.
+
+    If the hunt is inactive, this command will archive all channels
+    from the hunt.
+    """
+
+    if not args:
+        return bot_reply("Error, no hunt provided. Usage: `/delete HUNT_ID`")
+
+    hunt_id = args
+    hunt = find_hunt_for_hunt_id(turb, hunt_id)
+
+    if not hunt:
+        return bot_reply("Error, no hunt named \"{}\" exists.".format(hunt_id))
+
+    if hunt['active']:
+        return bot_reply(
+            "Error, refusing to delete active hunt \"{}\".".format(hunt_id)
+        )
+
+    if hunt['hunt_id'] != hunt_id:
+        return bot_reply(
+            "Error, expected hunt ID of \"{}\" but found \"{}\".".format(
+                hunt_id, hunt['hunt_id']
+            )
+        )
+
+    puzzles = hunt_puzzles_for_hunt_id(turb, hunt_id)
+
+    for puzzle in puzzles:
+        channel_id = puzzle['channel_id']
+        turb.slack_client.conversations_archive(channel=channel_id)
+
+    turb.slack_client.conversations_archive(channel=hunt['channel_id'])
+
+    return lambda_ok
+
+commands["/delete"] = delete
+
 def hunt(turb, body, args):
     """Implementation of the /hunt command