X-Git-Url: https://git.cworth.org/git?a=blobdiff_plain;f=turbot%2Fevents.py;h=4099ac5a25c11f30f45f7994ed2328a8846cce45;hb=d47444e021aab4d3a89fd0e1b75c0a49867290b7;hp=4ea06841cb48d5f3427d0f67630ecc77b574839c;hpb=75f458c3cda727eec38f65571db60e284893c2e7;p=turbot diff --git a/turbot/events.py b/turbot/events.py index 4ea0684..4099ac5 100644 --- a/turbot/events.py +++ b/turbot/events.py @@ -1,7 +1,10 @@ from turbot.blocks import ( section_block, text_block, button_block, actions_block, divider_block ) -from turbot.hunt import hunt_blocks, find_hunt_for_hunt_id +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 ) @@ -47,7 +50,7 @@ def home(turb, user_id): continue if user_id in slack_channel_members(turb.slack_client, hunt['channel_id']): - my_hunt_blocks += hunt_blocks(turb, hunt, puzzle_status='all') + my_hunt_blocks.append(hunt_link_block(turb, hunt)) else: available_hunt_blocks.append(hunt_link_block(turb, hunt)) @@ -58,9 +61,9 @@ def home(turb, user_id): * my_hunt_blocks ] else: - my_hunt_blocks = [ + my_hunt_blocks.append([ section_block(text_block("You do not belong to any hunts")) - ] + ]) if len(available_hunt_blocks): available_hunt_blocks = [ @@ -125,8 +128,17 @@ def hunt_channel_created(turb, channel_name, channel_id): "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']) @@ -146,29 +158,21 @@ def hunt_channel_created(turb, channel_name, channel_id): slack_send_message( turb.slack_client, channel_id, "Thank you for waiting. This hunt is now ready to begin! " - + "Type `/puzzle new` to create puzzles for the hunt.") + + "Type `/new` to create a puzzle for the hunt and `/help` for help.") 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""" @@ -193,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 @@ -210,60 +215,57 @@ 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. welcome_msg = ( "Welcome! This channel is the primary place to " + "discuss things as the team works together to solve the " - + "puzzle '{}'. ".format(puzzle['name']) + + "puzzle \"{}\". ".format(puzzle['name']) ) if 'url' in puzzle: welcome_msg += ( "See the <{}|puzzle itself> ".format(puzzle['url']) - + "for what was originally presented to us." + + "for what was originally presented to us. " ) - sheet_msg = ( - "Actual puzzle solving work will take place within the following " - + "<{}|shared spreadsheet> ".format(puzzle['sheet_url']) + welcome_msg += ( + "Actual puzzle solving work will take place within the following " + + "<{}|shared spreadsheet> ".format(puzzle['sheet_url']) + + "\n\n" + "Common commands for updating the puzzle are `/state NEW STATE`, " + + "`/tag NEW_TAG`, and `/solved SOLUTION` . See `/help` for details " + + "and for additional commands." ) - state_msg = ( - "Whenever the status of the puzzle progress changes " - + "significantly, please type `/state` with a brief message " - + "explaining where things stand. This could be something " - + "like `/state Grid is filled. Need insight for extraction.` " - + "or `/state Nathan has printed this and is cutting/assembling`. " - + "It's especially important to put information in `/state` " - + "when you step away from a puzzle so the next team members " - + "to arrive will know what is going on." - ) - - solved_msg = ( - "When a puzzle has been solved, submitted, and the solution is " - + "confirmed, please type `/solved THE PUZZLE ANSWER HERE`. All " - + "information given in `/state` and `/solved` will be presented " - + "in this channel's topic as well as in the hunt overview " - + "(which is available by selecting \"Turbot\" from the Slack " - + "list of members)." - ) - - turb.slack_client.chat_postMessage( - channel=channel_id, - text="New puzzle: {}".format(['name']), - blocks=[ - section_block(text_block(welcome_msg)), - section_block(text_block(sheet_msg)), - section_block(text_block(state_msg)), - section_block(text_block(solved_msg)) - ]) + 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(