-from turbot.blocks import section_block, text_block, divider_block
+from turbot.blocks import (
+ section_block, text_block, divider_block, accessory_block, button_block
+)
from turbot.round import round_blocks
from turbot.puzzle import puzzle_blocks, puzzle_matches_all
from turbot.channel import channel_url
limit_to_rounds=None):
"""Generate Slack blocks for a hunt
+ Returns a list of lists of blocks, (broken up by round so that
+ the receiver should do one Slack post for each entry in the
+ outer array.
+
The hunt argument should be a dictionary as returned from the
database.
all of these terms will be included in the
result. A match will be considered on any of
puzzle title, round title, puzzle URL, puzzle
- state or solution string. Terms can include
- regular expression syntax.
+ state, puzzle type, tags, or solution
+ string. Terms can include regular expression
+ syntax.
limit_to_rounds: A list of rounds. If provided only the given
rounds will be included in the output. Note:
hunt_text += " matching {}".format(" AND ".join(quoted_terms))
blocks = [
- section_block(text_block(hunt_text)),
+ accessory_block(
+ section_block(text_block(hunt_text)),
+ button_block("✏", "edit_hunt", hunt_id)
+ )
]
+ block = blocks[0]
if not len(puzzles):
- blocks += [
- section_block(text_block("No puzzles found."))
+ text = "No puzzles found."
+ if puzzle_status != 'all':
+ text += ' (Consider searching for "all" puzzles?)'
+ block += [
+ section_block(text_block(text))
]
# Construct blocks for each round
continue
# If we're only displaying one round the round header is redundant
if limit_to_rounds and len(limit_to_rounds) == 1:
- blocks += round_blocks(round, puzzles, omit_header=True)
+ block += round_blocks(round, puzzles, omit_header=True)
else:
- blocks += round_blocks(round, puzzles)
- blocks.append(divider_block())
+ block += round_blocks(round, puzzles)
+ block.append(divider_block())
+ blocks.append([])
+ block = blocks[-1]
# Also blocks for any puzzles not in any round
stray_puzzles = [puzzle for puzzle in puzzles if 'rounds' not in puzzle]
# to rounds but specifically the round of unassigned puzzles
if len(stray_puzzles) and not limit_to_rounds:
stray_text = "*Puzzles with no assigned round*"
- blocks.append(section_block(text_block(stray_text)))
+ block.append(section_block(text_block(stray_text)))
for puzzle in stray_puzzles:
- blocks += puzzle_blocks(puzzle)
+ block += puzzle_blocks(puzzle)
- blocks.append(divider_block())
+ block.append(divider_block())
return blocks