59 lines
1.7 KiB
Python
59 lines
1.7 KiB
Python
from __future__ import annotations
|
|
|
|
|
|
DEFAULT_STATUS_LABELS = {
|
|
"open": "исполняет роль",
|
|
"backstage": "в закулисье",
|
|
"delay": "задержки",
|
|
"rest": "антракт",
|
|
}
|
|
|
|
|
|
def build_channel_text(config: dict, state: dict) -> str:
|
|
parts: list[str] = []
|
|
|
|
header = config.get("header", "").strip()
|
|
if header:
|
|
parts.append(header)
|
|
|
|
intro_links = config.get("intro_links", "").strip()
|
|
if intro_links:
|
|
parts.append(intro_links)
|
|
|
|
projects = config.get("projects_block", "").strip()
|
|
if projects:
|
|
parts.append(projects)
|
|
|
|
actors_title = config.get("actors_title", "").strip()
|
|
if actors_title:
|
|
parts.append(actors_title)
|
|
|
|
actor_lines: list[str] = []
|
|
actor_state = state.get("actors", {})
|
|
status_labels = {**DEFAULT_STATUS_LABELS, **config.get("status_labels", {})}
|
|
for actor in config["actors"]:
|
|
current = actor_state.get(actor["key"], {})
|
|
status = current.get("status", actor.get("default_status", "backstage"))
|
|
phrase = current.get("phrase", actor.get("phrases", {}).get(status, ""))
|
|
label = status_labels.get(status, status)
|
|
|
|
line = (
|
|
f'{actor["emoji"]} {actor["display_name"]} ({actor["link"]}) '
|
|
f'{actor["pronouns"]} {label}.'
|
|
)
|
|
if phrase:
|
|
line = f"{line}\n {phrase}"
|
|
actor_lines.append(line)
|
|
|
|
parts.append("\n".join(actor_lines))
|
|
|
|
legend = config.get("legend", "").strip()
|
|
if legend:
|
|
parts.append(legend)
|
|
|
|
footer = config.get("footer", "").strip()
|
|
if footer:
|
|
parts.append(footer)
|
|
|
|
return "\n\n".join(part for part in parts if part)
|