]> git.cworth.org Git - turbot/blobdiff - turbot/hunt.py
Add notes on how to update the Google sheets credentials
[turbot] / turbot / hunt.py
index c2e59e2be937c4577e7696f80b01fce51356e05d..3063d879cb1069745a5405683b87f733dea58c1f 100644 (file)
@@ -1,4 +1,6 @@
-from turbot.blocks import section_block, text_block, divider_block
+from turbot.blocks import (
+    section_block, text_block, divider_block, accessory_block, button_block
+)
 from turbot.round import round_blocks
 from turbot.puzzle import puzzle_blocks, puzzle_matches_all
 from turbot.channel import channel_url
@@ -39,6 +41,10 @@ def hunt_blocks(turb, hunt, puzzle_status='unsolved', search_terms=[],
                 limit_to_rounds=None):
     """Generate Slack blocks for a hunt
 
+    Returns a list of lists of blocks, (broken up by round so that
+    the receiver should do one Slack post for each entry in the
+    outer array.
+
     The hunt argument should be a dictionary as returned from the
     database.
 
@@ -54,8 +60,9 @@ def hunt_blocks(turb, hunt, puzzle_status='unsolved', search_terms=[],
                     all of these terms will be included in the
                     result. A match will be considered on any of
                     puzzle title, round title, puzzle URL, puzzle
-                    state or solution string. Terms can include
-                    regular expression syntax.
+                    state, puzzle type, tags, 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:
@@ -109,12 +116,21 @@ def hunt_blocks(turb, hunt, puzzle_status='unsolved', search_terms=[],
         hunt_text += " matching {}".format(" AND ".join(quoted_terms))
 
     blocks = [
-        section_block(text_block(hunt_text)),
+        [
+            accessory_block(
+                section_block(text_block(hunt_text)),
+                button_block("✏", "edit_hunt", hunt_id)
+            )
+        ]
     ]
+    block = blocks[0]
 
     if not len(puzzles):
-        blocks += [
-            section_block(text_block("No puzzles found."))
+        text = "No puzzles found."
+        if puzzle_status != 'all':
+            text += ' (Consider searching for "all" puzzles?)'
+        block += [
+            section_block(text_block(text))
         ]
 
     # Construct blocks for each round
@@ -123,10 +139,12 @@ def hunt_blocks(turb, hunt, puzzle_status='unsolved', search_terms=[],
             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)
+            block += round_blocks(round, puzzles, omit_header=True)
         else:
-            blocks += round_blocks(round, puzzles)
-        blocks.append(divider_block())
+            block += round_blocks(round, puzzles)
+        block.append(divider_block())
+        blocks.append([])
+        block = blocks[-1]
 
     # Also blocks for any puzzles not in any round
     stray_puzzles = [puzzle for puzzle in puzzles if 'rounds' not in puzzle]
@@ -138,10 +156,33 @@ def hunt_blocks(turb, hunt, puzzle_status='unsolved', search_terms=[],
     # 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)))
+        block.append(section_block(text_block(stray_text)))
         for puzzle in stray_puzzles:
-            blocks += puzzle_blocks(puzzle)
+            block += puzzle_blocks(puzzle)
 
-    blocks.append(divider_block())
+    block.append(divider_block())
 
     return blocks
+
+def hunt_update_topic(turb, hunt):
+
+    channel_id = hunt['channel_id']
+
+    topic = ''
+
+    url = hunt.get('url', None)
+    if url:
+        topic += "<{}|Hunt website> ".format(url)
+
+    topic += "<https://halibut.cworth.org/{}|Big Board> ".format(
+        hunt['channel_id'])
+
+    state = hunt.get('state', None)
+    if state:
+        topic += state
+
+    # Slack only allows 250 characters for a topic
+    if len(topic) > 250:
+        topic = topic[:247] + "..."
+    turb.slack_client.conversations_setTopic(channel=channel_id,
+                                             topic=topic)