]> git.cworth.org Git - turbot/blobdiff - turbot/events.py
Add code to auto-invite all users in a hunt to each new puzzle channel
[turbot] / turbot / events.py
index 25c83233865fee9063d91dc205e23f8fc761440a..4099ac5a25c11f30f45f7994ed2328a8846cce45 100644 (file)
@@ -2,6 +2,9 @@ from turbot.blocks import (
     section_block, text_block, button_block, actions_block, divider_block
 )
 from turbot.hunt import find_hunt_for_hunt_id
+from turbot.puzzle import (
+    puzzle_channel_topic, puzzle_channel_description,
+)
 from turbot.sheets import (
     sheets_create, sheets_create_for_puzzle, sheets_create_folder
 )
@@ -159,25 +162,17 @@ def hunt_channel_created(turb, channel_name, channel_id):
 
     return lambda_success
 
-def set_channel_description(turb, puzzle):
-    channel_id = puzzle['channel_id']
-    description = puzzle['name']
-    url = puzzle.get('url', None)
-    sheet_url = puzzle.get('sheet_url', None)
+def set_channel_topic_and_description(turb, puzzle):
 
-    links = []
-    if url:
-        links.append("<{}|Puzzle>".format(url))
-    if sheet_url:
-        links.append("<{}|Sheet>".format(sheet_url))
+    channel_id = puzzle['channel_id']
 
-    if len(links):
-        description += "({})".format(', '.join(links))
+    topic = puzzle_channel_topic(puzzle)
+    description = puzzle_channel_description(puzzle)
 
     turb.slack_client.conversations_setPurpose(channel=channel_id,
                                                purpose=description)
     turb.slack_client.conversations_setTopic(channel=channel_id,
-                                             topic=description)
+                                             topic=topic)
 
 def puzzle_channel_created(turb, channel_name, channel_id):
     """Creates sheet and invites user for a newly-created puzzle channel"""
@@ -202,7 +197,8 @@ def puzzle_channel_created(turb, channel_name, channel_id):
 
     # We need hunt from the database to know which folder to create
     # the sheet in.
-    hunt = find_hunt_for_hunt_id(turb, puzzle['hunt_id'])
+    hunt_id = puzzle['hunt_id']
+    hunt = find_hunt_for_hunt_id(turb, hunt_id)
 
     # Before launching into sheet creation, indicate that we're doing this
     # in the database. This way, if we take too long to create the sheet
@@ -219,8 +215,30 @@ def puzzle_channel_created(turb, channel_name, channel_id):
     puzzle['sheet_url'] = sheet['url']
     turb.table.put_item(Item=puzzle)
 
-    # Get the new sheet_url into the channel description
-    set_channel_description(turb, puzzle)
+    # Get the new sheet_url into the channel topic and description
+    set_channel_topic_and_description(turb, puzzle)
+
+    # Lookup and invite all users from this hunt to this new puzzle
+
+    # Find all members of the hunt channel
+    members = slack_channel_members(turb.slack_client, hunt['channel_id'])
+
+    # Filter out Turbot's own ID to avoid inviting itself
+    # has opted out of being auto-invited
+    members = [m for m in members if m != TURBOT_USER_ID]
+
+    slack_send_message(
+        turb.slack_client, channel_id,
+        "Inviting all members from the hunt channel: "
+        + "<#{}>".format(hunt['channel_id']))
+
+    # Invite those members to the puzzle channel (in chunks of 500)
+    cursor = 0
+    while cursor < len(members):
+        turb.slack_client.conversations_invite(
+            channel=channel_id,
+            users=members[cursor:cursor + 500])
+        cursor += 500
 
     # And finally, give a welcome message with some documentation
     # on how to update the state of the puzzle in the database.
@@ -248,7 +266,6 @@ def puzzle_channel_created(turb, channel_name, channel_id):
     turb.slack_client.chat_postMessage(channel=channel_id, text=welcome_msg)
 
     # Finally, finally, notify the hunt channel about the new puzzle
-    hunt = find_hunt_for_hunt_id(turb, puzzle['hunt_id'])
     slack_send_message(
         turb.slack_client, hunt['channel_id'],
         "New puzzle available: <{}|{}>".format(