X-Git-Url: https://git.cworth.org/git?a=blobdiff_plain;ds=sidebyside;f=turbot%2Fevents.py;h=86a3c837d15f2f28485c13c7ae7a913c454f803c;hb=d57bca01664cb9ab20213ba1f4cf82fdb672b08c;hp=0dabb71d5cbca6902da2105fa314a8714d780a80;hpb=01ef7b71ad45338427c61722dbbee4fb19759661;p=turbot diff --git a/turbot/events.py b/turbot/events.py index 0dabb71..86a3c83 100644 --- a/turbot/events.py +++ b/turbot/events.py @@ -1,9 +1,10 @@ from turbot.blocks import ( section_block, text_block, button_block, actions_block, divider_block ) -import turbot.sheets import turbot.slack +from turbot.sheets import sheets_create, sheets_create_for_puzzle from turbot.slack import slack_send_message, slack_channel_members +from boto3.dynamodb.conditions import Key TURBOT_USER_ID = 'U01B9QM4P9R' @@ -74,9 +75,9 @@ def home(turb, user_id): The return value is a dictionary suitable to be published to the Slack views_publish API.""" - # Behave cleanly if there is no hunts table at all yet. + # Behave cleanly if there is no "turbot" table at all yet. try: - response = turb.db.Table("hunts").scan() + response = turb.table.scan() hunts = response['Items'] except Exception: hunts = [] @@ -114,37 +115,32 @@ def app_home_opened(turb, event): events['app_home_opened'] = app_home_opened def hunt_channel_created(turb, channel_name, channel_id): - """Creates sheet and a DynamoDB table for a newly-created hunt channel""" + """Creates a Google sheet for a newly-created hunt channel""" # First see if we can find an entry for this hunt in the database. # If not, simply return an error and let Slack retry - hunts_table = turb.db.Table("hunts") - response = hunts_table.get_item( - Key={'channel_id': channel_id}, - ConsistentRead=True + response = turb.table.query( + IndexName='channel_id_index', + KeyConditionExpression=Key("channel_id").eq(channel_id) ) - if 'Item' not in response: + if 'Items' not in response: print("Warning: Cannot find channel_id {} in hunts table. " .format(channel_id) + "Letting Slack retry this event") return lambda_error - item = response['Item'] + item = response['Items'][0] if 'sheet_url' in item: print("Info: channel_id {} already has sheet_url {}. Exiting." .format(channel_id, item['sheet_url'])) return lambda_success - # Remove any None items from our item before updating - if not item['url']: - del item['url'] - # 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 # and Slack retries the event, that next event will see this 'pending' # string and cleanly return (eliminating all future retries). item['sheet_url'] = 'pending' - hunts_table.put_item(Item=item) + turb.table.put_item(Item=item) # Also, let the channel users know what we are up to slack_send_message( @@ -153,37 +149,19 @@ def hunt_channel_created(turb, channel_name, channel_id): + "Please wait a minute or two while I create some backend resources.") # Create a sheet for the hunt - sheet = turbot.sheets.sheets_create(turb, item['name']) + sheet = sheets_create(turb, item['name']) # Update the database with the URL of the sheet item['sheet_url'] = sheet['url'] - hunts_table.put_item(Item=item) + turb.table.put_item(Item=item) # Message the channel with the URL of the sheet slack_send_message(turb.slack_client, channel_id, "Sheet created for this hunt: {}".format(sheet['url'])) - # Create a database table for this hunt's puzzles - table = turb.db.create_table( - TableName=channel_name, - KeySchema=[ - {'AttributeName': 'channel_id', 'KeyType': 'HASH'} - ], - AttributeDefinitions=[ - {'AttributeName': 'channel_id', 'AttributeType': 'S'} - ], - ProvisionedThroughput={ - 'ReadCapacityUnits': 5, - 'WriteCapacityUnits': 5 - } - ) - - # Wait until the table exists - table.meta.client.get_waiter('table_exists').wait(TableName=channel_name) - # Mark the hunt as active in the database item['active'] = True - hunts_table.put_item(Item=item) + turb.table.put_item(Item=item) # Message the hunt channel that the database is ready slack_send_message( @@ -220,8 +198,7 @@ def puzzle_channel_created(turb, puzzle_channel_name, puzzle_channel_id): # First see if we can find an entry for this puzzle in the database. # If not, simply return an error and let Slack retry - puzzle_table = turb.db.Table(hunt_id) - response = puzzle_table.get_item( + response = turb.table.get_item( Key={'channel_id': puzzle_channel_id}, ConsistentRead=True ) @@ -238,10 +215,6 @@ def puzzle_channel_created(turb, puzzle_channel_name, puzzle_channel_id): .format(puzzle_channel_id, item['sheet_url'])) return lambda_success - # Remove any None items from our item before updating - if not item['url']: - del item['url'] - # 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 # and Slack retries the event, that next event will see this 'pending' @@ -251,7 +224,7 @@ def puzzle_channel_created(turb, puzzle_channel_name, puzzle_channel_id): puzzle_table.put_item(Item=item) # Create a sheet for the puzzle - sheet = turbot.sheets.sheets_create_for_puzzle(turb, item) + sheet = sheets_create_for_puzzle(turb, item) # Update the database with the URL of the sheet item['sheet_url'] = sheet['url'] @@ -343,7 +316,6 @@ def puzzle_channel_created(turb, puzzle_channel_name, puzzle_channel_id): return lambda_success def channel_created(turb, event): - print("In channel_created with event: {}".format(str(event))) channel = event['channel'] channel_id = channel['id']