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
)
TURBOT_USER_ID = 'U01B9QM4P9R'
+# This is a list of user IDs that should not be auto-invited to new channels
+AUTO_INVITE_DENY_LIST = (
+ 'U01B9QM4P9R', # Turbot itself
+ 'U01HQABASLW', # Lavi
+)
+
events = {}
lambda_success = {'statusCode': 200}
my_hunt_blocks = []
available_hunt_blocks = []
for hunt in hunts:
- print("Generating turbot home view for hunt '" + hunt['hunt_id'] + "'")
if not hunt['active']:
- print("Never mind, that hunt is not active.")
continue
- print("Hunt '" + hunt['hunt_id'] + "' is active, moving forward.")
if user_id in slack_channel_members(turb.slack_client,
hunt['channel_id']):
my_hunt_blocks.append(hunt_link_block(turb, hunt))
"Welcome to the channel for the {} hunt! ".format(hunt['name'])
+ "Please wait a moment or two while I create some backend resources.")
- # Create a new folder within Google drive for the hunt
- hunt['folder_id'] = sheets_create_folder(turb, hunt['hunt_id'])
+ # Create a new folder within Google drive for the hunt in two parts:
+
+ # ... first, a top-level folder named for the hunt
+ hunt_folder = sheets_create_folder(turb, hunt['hunt_id'])
+
+ # ... second, a folder within that named "turbot"
+ #
+ # The concept here is that non-turbot related content could
+ # be placed adjacent to the turbot folder.
+ hunt['folder_id'] = sheets_create_folder(turb, "turbot",
+ parents = [hunt_folder])
# Create a sheet for the hunt
sheet = sheets_create(turb, hunt['name'], hunt['folder_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"""
# 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
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 as well as that of any user who
+ # has opted out of being auto-invited
+ members = [m for m in members if m not in AUTO_INVITE_DENY_LIST]
+
+ ### With the code below disabling auto-invitation, be honest about that.
+ slack_send_message(
+ turb.slack_client, channel_id,
+ "Not inviting all members from the hunt channel: "
+ + "<#{}>".format(hunt['channel_id']))
+
+ # Invite those members to the puzzle channel (in chunks of 500)
+ cursor = 0
+
+ ### This line of code disables the auto-invitation of hunt members
+ ### to channels, (which I'm throwing in at the request of Avram
+ ### who is mostly-solo solving puzzles after Mystery Hunt 2022 is
+ ### over).
+ cursor = len(members)
+
+ 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.
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(