+ return channel_name
+
+def puzzle_sheet_name(puzzle):
+ """Compute the sheet name for a puzzle"""
+
+ sheet_name = puzzle['name']
+ if puzzle['status'] == 'solved':
+ sheet_name += " - Solved {}".format(", ".join(puzzle['solution']))
+
+ return sheet_name
+
+def puzzle_update_channel_and_sheet(turb, puzzle, old_puzzle=None):
+
+ channel_id = puzzle['channel_id']
+
+ # Compute the channel topic and set it if it has changed
+ channel_topic = puzzle_channel_topic(puzzle)
+
+ old_channel_topic = None
+ if old_puzzle:
+ old_channel_topic = puzzle_channel_topic(old_puzzle)
+
+ if channel_topic != old_channel_topic:
+ # Slack only allows 250 characters for a topic
+ if len(channel_topic) > 250:
+ channel_topic = channel_topic[:247] + "..."
+ turb.slack_client.conversations_setTopic(channel=channel_id,
+ topic=channel_topic)
+
+ # Compute the sheet name and set it if it has changed
+ sheet_name = puzzle_sheet_name(puzzle)
+
+ old_sheet_name = None
+ if old_puzzle:
+ old_sheet_name = puzzle_sheet_name(old_puzzle)
+
+ if sheet_name != old_sheet_name:
+ turbot.sheets.rename_spreadsheet(turb, puzzle['sheet_url'], sheet_name)
+
+ # Compute the Slack channel name and set it if it has changed
+ channel_name = puzzle_channel_name(puzzle)
+
+ old_channel_name = None
+ if old_puzzle:
+ old_channel_name = puzzle_channel_name(old_puzzle)
+
+ if channel_name != old_channel_name:
+ turb.slack_client.conversations_rename(
+ channel=channel_id,
+ name=channel_name
+ )
+
+# A copy deep enough to work for puzzle_update_channel_and_sheet above
+def puzzle_copy(old_puzzle):
+ new_puzzle = old_puzzle.copy()
+
+ if 'tags' in old_puzzle:
+ new_puzzle['tags'] = old_puzzle['tags'].copy()
+
+ return new_puzzle