from dataclasses import dataclass from enum import Enum from pathlib import Path from typing import Literal class Language(str, Enum): FI = "fi" SV = "sv" EN = "en" LANGUAGE_DISPLAY_NAMES: dict[Language, str] = { Language.FI: "Finnish", Language.SV: "Swedish", Language.EN: "English", } @dataclass(frozen=True) class Config: bot_token: str chat_id: str channel_username: str discussion_group_id: str = "" @dataclass(frozen=True) class LanguageAssets: language: Language text_file: Path text_raw: str images: list[Path] @dataclass(frozen=True) class ScanResult: global_images: list[Path] languages: list[LanguageAssets] @dataclass(frozen=True) class PlaceholderToken: label: str target_lang: Language source_span: tuple[int, int] @dataclass class PostedMessageRef: language: Language text_message_id: int | None caption_message_id: int | None message_url: str had_placeholders: bool text_mode: Literal["message", "caption", "none"] @dataclass(frozen=True) class TextSegmentBinding: message_id: int mode: Literal["message", "caption"] @dataclass(frozen=True) class LanguageBinding: language: Language image_message_ids: list[int] text_segments: list[TextSegmentBinding] primary_message_id: int | None primary_message_url: str discussion_message_id: int | None = None @dataclass(frozen=True) class PublishBinding: global_message_ids: list[int] global_attached_to_language: Language | None languages: dict[Language, LanguageBinding] discussion_message_ids: dict[int, int] global_primary_message_id: int | None = None global_discussion_message_id: int | None = None