]> git.cworth.org Git - turbot/blobdiff - turbot/hunt.py
Implement a /round command
[turbot] / turbot / hunt.py
index ccab28daa4e004de56229291de50dc7b2b50e926..edc8b87c4c2365394a2abcc5163928ec41bdfde8 100644 (file)
@@ -23,13 +23,14 @@ def find_hunt_for_hunt_id(turb, hunt_id):
     else:
         return None
 
-def hunt_blocks(turb, hunt, puzzle_status='unsolved', search_terms=[]):
+def hunt_blocks(turb, hunt, puzzle_status='unsolved', search_terms=[],
+                limit_to_rounds=None):
     """Generate Slack blocks for a hunt
 
     The hunt argument should be a dictionary as returned from the
     database.
 
-    Two optional arguments can be used to filter which puzzles to
+    Three optional arguments can be used to filter which puzzles to
     include in the result:
 
       puzzle_status: If either 'solved' or 'unsolved' only puzzles
@@ -44,6 +45,13 @@ def hunt_blocks(turb, hunt, puzzle_status='unsolved', search_terms=[]):
                     state or solution string. Terms can include
                     regular expression syntax.
 
+      limit_to_rounds: A list of rounds. If provided only the given
+                       rounds will be included in the output. Note:
+                       an empty list means to display only puzzles
+                       assigned to no rounds, while an argument of
+                       None means to display all puzzles with no
+                       limit on the rounds.
+
     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.).
@@ -85,6 +93,11 @@ def hunt_blocks(turb, hunt, puzzle_status='unsolved', search_terms=[]):
         channel_url(channel_id),
         name
     )
+    if limit_to_rounds is not None:
+        hunt_text += " *in round{}: {}*".format(
+            "s" if len(limit_to_rounds) > 1 else "",
+            ", ".join(limit_to_rounds) if limit_to_rounds else "<no round>"
+        )
     if search_terms:
         quoted_terms = ['`{}`'.format(term) for term in search_terms]
         hunt_text += " matching {}".format(" AND ".join(quoted_terms))
@@ -100,11 +113,23 @@ def hunt_blocks(turb, hunt, puzzle_status='unsolved', search_terms=[]):
 
     # Construct blocks for each round
     for round in rounds:
-        blocks += round_blocks(round, puzzles)
+        if limit_to_rounds is not None and round not in limit_to_rounds:
+            continue
+        # If we're only displaying one round the round header is redundant
+        if limit_to_rounds and len(limit_to_rounds) == 1:
+            blocks += round_blocks(round, puzzles, omit_header=True)
+        else:
+            blocks += round_blocks(round, puzzles)
 
     # Also blocks for any puzzles not in any round
     stray_puzzles = [puzzle for puzzle in puzzles if 'rounds' not in puzzle]
-    if len(stray_puzzles):
+
+    # For this condition, either limit_to_rounds is None which
+    # means we definitely want to display these stray puzzles
+    # (since we are not limiting), _OR_ limit_to_rounds is not
+    # None but is a zero-length array, meaning we are limiting
+    # to rounds but specifically the round of unassigned puzzles
+    if len(stray_puzzles) and not limit_to_rounds:
         stray_text = "*Puzzles with no assigned round*"
         blocks.append(section_block(text_block(stray_text)))
         for puzzle in stray_puzzles: