X-Git-Url: https://git.cworth.org/git?a=blobdiff_plain;f=turbot%2Fpuzzle.py;h=316620c085da5d8936d808f06ec0e747a8c88c26;hb=58422543a8aeba8e9011403fc49049d3c3730a33;hp=1d1fda85bff975dea6adea33942a5eeaaece7914;hpb=d63943a1adccccda1ddf43e609701a0615577670;p=turbot diff --git a/turbot/puzzle.py b/turbot/puzzle.py index 1d1fda8..316620c 100644 --- a/turbot/puzzle.py +++ b/turbot/puzzle.py @@ -223,6 +223,12 @@ def puzzle_matches_all(puzzle, patterns): def puzzle_id_from_name(name): return re.sub(r'[^a-zA-Z0-9_]', '', name).lower() +def round_id_from_name(name): + """Normalize and abbreviate round name for use as a prefix + in a channel name.""" + + return re.sub(r'[^a-zA-Z0-9_]', '', name).lower()[:7] + def puzzle_sort_key(puzzle): """Return an appropriate sort key for a puzzle in the database @@ -249,8 +255,6 @@ def puzzle_channel_topic(puzzle): if puzzle['status'] == 'solved': topic += "SOLVED: `{}` ".format('`, `'.join(puzzle['solution'])) - topic += puzzle['name'] - links = [] url = puzzle.get('url', None) @@ -262,7 +266,7 @@ def puzzle_channel_topic(puzzle): links.append("<{}|Sheet>".format(sheet_url)) if len(links): - topic += "({})".format(', '.join(links)) + topic += "({}) ".format(', '.join(links)) tags = puzzle.get('tags', []) if tags: @@ -274,16 +278,47 @@ def puzzle_channel_topic(puzzle): return topic +def puzzle_channel_description(puzzle): + """Compute the channel description for a puzzle""" + + url = puzzle.get('url', None) + sheet_url = puzzle.get('sheet_url', None) + tags = puzzle.get('tags', []) + state = puzzle.get('state', None) + + description = ( + "Puzzle: \"{}\".\n".format(puzzle['name']) + ) + + links = '' + if url: + links += " <{}|Original puzzle> ".format(url) + + if sheet_url: + links += " <{}|Sheet>".format(sheet_url) + + if links: + description += "Links:{}\n".format(links) + + if tags: + description += "Tags: {}\n".format( + " ".join(["`{}`".format(t) for t in tags])) + + if state: + description += "State: {}\n".format(state) + + return description + def puzzle_channel_name(puzzle): """Compute the channel name for a puzzle""" round = '' if 'rounds' in puzzle: - round = '-' + puzzle_id_from_name(puzzle['rounds'][0]) + round = '-' + round_id_from_name(puzzle['rounds'][0]) meta = '' if puzzle.get('type', 'plain') == 'meta': - meta = '-m' + meta = '--m' # Note: We don't use puzzle['puzzle_id'] here because we're keeping # that as a persistent identifier in the database. Instead we @@ -327,6 +362,20 @@ def puzzle_update_channel_and_sheet(turb, puzzle, old_puzzle=None): turb.slack_client.conversations_setTopic(channel=channel_id, topic=channel_topic) + # Compute the channel description and set it if it has changed + channel_description = puzzle_channel_description(puzzle) + + old_channel_description = None + if old_puzzle: + old_channel_description = puzzle_channel_description(old_puzzle) + + if channel_description != old_channel_description: + # Slack also only allows 250 characters for a description + if len(channel_description) > 250: + channel_description = channel_description[:247] + "..." + turb.slack_client.conversations_setPurpose(channel=channel_id, + purpose=channel_description) + # Compute the sheet name and set it if it has changed sheet_name = puzzle_sheet_name(puzzle) @@ -357,4 +406,7 @@ def puzzle_copy(old_puzzle): if 'tags' in old_puzzle: new_puzzle['tags'] = old_puzzle['tags'].copy() + if 'solution' in old_puzzle: + new_puzzle['solution'] = old_puzzle['solution'].copy() + return new_puzzle