]> git.cworth.org Git - turbot/blobdiff - turbot/interaction.py
Use a set instead of a list for a puzzle's solution
[turbot] / turbot / interaction.py
index 507da76741730f2944962b10306a1de42c2696d6..75ff299bc6a5df9edd8feaaab4aff01029a12531 100644 (file)
@@ -187,9 +187,9 @@ def edit_puzzle(turb, puzzle, trigger_id):
         solved = True
 
     solution_str = None
-    solution_list = puzzle.get("solution", [])
-    if solution_list:
-        solution_str = ", ".join(solution_list)
+    solution_set = puzzle.get("solution", set())
+    if solution_set:
+        solution_str = ", ".join(solution_set)
 
     view = {
         "type": "modal",
@@ -267,10 +267,11 @@ def edit_puzzle_submission(turb, payload, metadata):
         puzzle['type'] = 'meta'
     else:
         puzzle['type'] = 'plain'
-    rounds = [option['value'] for option in
-              state['rounds']['rounds']['selected_options']]
-    if rounds:
-        puzzle['rounds'] = rounds
+    if 'rounds' in state:
+        rounds = [option['value'] for option in
+                  state['rounds']['rounds']['selected_options']]
+        if rounds:
+            puzzle['rounds'] = rounds
     new_rounds = state['new_rounds']['new_rounds']['value']
     puzzle_state = state['state']['state']['value']
     if puzzle_state:
@@ -279,12 +280,12 @@ def edit_puzzle_submission(turb, payload, metadata):
         puzzle['status'] = 'solved'
     else:
         puzzle['status'] = 'unsolved'
-    puzzle['solution'] = []
+    puzzle['solution'] = set()
     solution = state['solution']['solution']['value']
     if solution:
-        puzzle['solution'] = [
+        puzzle['solution'] = {
             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']:
@@ -534,7 +535,7 @@ def new_hunt(turb, trigger_id):
 
     return lambda_ok
 
-actions['button']['new_hunt'] = new_hunt
+actions['button']['new_hunt'] = new_hunt_button
 
 def new_hunt_submission(turb, payload, metadata):
     """Handler for the user submitting the new hunt modal
@@ -928,13 +929,20 @@ def new_puzzle(turb, body):
         return bot_reply("Sorry, this channel doesn't appear to "
                          + "be a hunt or puzzle channel")
 
+    # We used puzzle (if available) to select the initial round(s)
+    puzzle = puzzle_for_channel(turb, channel_id)
+    initial_rounds = None
+    if puzzle:
+        initial_rounds=puzzle.get("rounds", None)
+
     round_options = hunt_rounds(turb, hunt['hunt_id'])
 
     if len(round_options):
         round_options_block = [
             multi_select_block("Round(s)", "rounds",
                                "Existing round(s) this puzzle belongs to",
-                               round_options)
+                               round_options,
+                               initial_options=initial_rounds)
         ]
     else:
         round_options_block = []
@@ -1036,7 +1044,7 @@ def new_puzzle_submission(turb, payload, metadata):
     if rounds:
         puzzle['rounds'] = rounds
 
-    puzzle['solution'] = []
+    puzzle['solution'] = set()
     puzzle['status'] = 'unsolved'
 
     # Create a channel for the puzzle
@@ -1176,7 +1184,7 @@ def solved(turb, body, args):
 
     # Set the status and solution fields in the database
     puzzle['status'] = 'solved'
-    puzzle['solution'].append(args)
+    puzzle['solution'].add(args)
     if 'state' in puzzle:
         del puzzle['state']
     turb.table.put_item(Item=puzzle)
@@ -1262,10 +1270,13 @@ def hunt(turb, body, args):
 
     blocks = hunt_blocks(turb, hunt, puzzle_status=status, search_terms=terms)
 
-    requests.post(response_url,
-                  json = { 'blocks': blocks },
-                  headers = {'Content-type': 'application/json'}
-                  )
+    for block in blocks:
+        if len(block) > 100:
+            block = block[:100]
+        requests.post(response_url,
+                      json = { 'blocks': block },
+                      headers = {'Content-type': 'application/json'}
+                      )
 
     return lambda_ok
 
@@ -1336,10 +1347,13 @@ def round(turb, body, args):
                          limit_to_rounds=puzzle.get('rounds', [])
                          )
 
-    requests.post(response_url,
-                  json = { 'blocks': blocks },
-                  headers = {'Content-type': 'application/json'}
-                  )
+    for block in blocks:
+        if len(block) > 100:
+            block = block[:100]
+        requests.post(response_url,
+                      json = { 'blocks': block },
+                      headers = {'Content-type': 'application/json'}
+                      )
 
     return lambda_ok