X-Git-Url: https://git.cworth.org/git?a=blobdiff_plain;f=turbot%2Fpuzzle.py;h=1dbea5d74906c447b3e6b09df70758f4379389d5;hb=0878d40471403513b6da016d7412d07a5d903e9b;hp=b86a529ed47b9d5c64e6d4660104bcbfeb58a0e9;hpb=32698832814a2c60498a1fc1f8ed1d28b69dd41a;p=turbot diff --git a/turbot/puzzle.py b/turbot/puzzle.py index b86a529..1dbea5d 100644 --- a/turbot/puzzle.py +++ b/turbot/puzzle.py @@ -62,6 +62,7 @@ def puzzle_blocks(puzzle, include_rounds=False): url = puzzle.get('url', None) sheet_url = puzzle.get('sheet_url', None) state = puzzle.get('state', None) + tags = puzzle.get('tags', []) status_emoji = '' solution_str = '' @@ -85,7 +86,15 @@ def puzzle_blocks(puzzle, include_rounds=False): state_str = '' if state: - state_str = "\n{}".format(state) + state_str = " State: {}".format(state) + + tags_str = '' + if tags: + tags_str = " Tags: "+" ".join(["`{}`".format(tag) for tag in tags]) + + extra_str = '' + if state_str or tags_str: + extra_str = "\n{}{}".format(tags_str, state_str) rounds_str = '' if include_rounds and 'rounds' in puzzle: @@ -101,7 +110,7 @@ def puzzle_blocks(puzzle, include_rounds=False): channel_url(channel_id), name, solution_str, ', '.join(links), rounds_str, - state_str + extra_str ) # Combining hunt ID and puzzle ID together here is safe because @@ -120,8 +129,9 @@ def puzzle_matches_one(puzzle, pattern): """Returns True if this puzzle matches the given string (regexp) A match will be considered on any of puzzle title, round title, - puzzle URL, puzzle state, or solution string. The string can - include regular expression syntax. Matching is case insensitive. + puzzle URL, puzzle state, puzzle type, tags, or solution + string. The string can include regular expression syntax. Matching + is case insensitive. """ p = re.compile('.*'+pattern+'.*', re.IGNORECASE) @@ -142,21 +152,31 @@ def puzzle_matches_one(puzzle, pattern): if p.match(puzzle['state']): return True + if 'type' in puzzle: + if p.match(puzzle['type']): + return True + if 'solution' in puzzle: for solution in puzzle['solution']: if p.match(solution): return True + if 'tags' in puzzle: + for tag in puzzle['tags']: + if p.match(tag): + return True + return False def puzzle_matches_all(puzzle, patterns): """Returns True if this puzzle matches all of the given list of patterns A match will be considered on any of puzzle title, round title, - puzzle URL, puzzle state, or solution string. All patterns must - match the puzzle somewhere, (that is, there is an implicit logical - AND between patterns). Patterns can include regular expression - syntax. Matching is case insensitive. + puzzle URL, puzzle state, puzzle types, tags, or solution + string. All patterns must match the puzzle somewhere, (that is, + there is an implicit logical AND between patterns). Patterns can + include regular expression syntax. Matching is case insensitive. + """ for pattern in patterns: @@ -209,6 +229,10 @@ def puzzle_channel_topic(puzzle): if len(links): topic += "({})".format(', '.join(links)) + tags = puzzle.get('tags', []) + if tags: + topic += " {}".format(" ".join(["`{}`".format(t) for t in tags])) + state = puzzle.get('state', None) if state: topic += " {}".format(state) @@ -280,3 +304,12 @@ def puzzle_update_channel_and_sheet(turb, puzzle, old_puzzle=None): 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