""" Модели данных для отправки простых сообщений в Telegram. Автор: Сергей Антропов Сайт: https://devops.org.ru """ from typing import Optional from pydantic import BaseModel, Field class SendMessageRequest(BaseModel): """Запрос на отправку текстового сообщения.""" tg_group: str = Field(..., description="Имя группы Telegram из конфигурации", examples=["monitoring", "alerts", "devops"]) tg_thread_id: int = Field(0, description="ID треда в группе Telegram (0 для основной группы)", examples=[0, 123, 456]) text: str = Field(..., description="Текст сообщения", examples=["Привет! Это тестовое сообщение.", "Важное уведомление\n\nСистема работает нормально."]) parse_mode: Optional[str] = Field("HTML", description="Режим парсинга (HTML, Markdown, MarkdownV2)", examples=["HTML", "Markdown", "MarkdownV2"]) disable_web_page_preview: bool = Field(True, description="Отключить превью ссылок", examples=[True, False]) model_config = { "json_schema_extra": { "examples": [ { "tg_group": "monitoring", "tg_thread_id": 0, "text": "Привет! Это тестовое сообщение.", "parse_mode": "HTML", "disable_web_page_preview": True }, { "tg_group": "alerts", "tg_thread_id": 123, "text": "Критическое уведомление\n\nСистема недоступна!\n\nВремя: 2024-02-08 16:49:44", "parse_mode": "HTML", "disable_web_page_preview": False }, { "tg_group": "monitoring", "tg_thread_id": 0, "text": "**Важное уведомление**\n\nСистема работает нормально.\n\n[Подробнее](https://example.com)", "parse_mode": "Markdown", "disable_web_page_preview": True } ] } } class SendPhotoRequest(BaseModel): """Запрос на отправку фото.""" tg_group: str = Field(..., description="Имя группы Telegram из конфигурации", examples=["monitoring", "alerts"]) tg_thread_id: int = Field(0, description="ID треда в группе Telegram (0 для основной группы)", examples=[0, 123]) photo: str = Field(..., description="URL фото или путь к файлу (поддерживается автоматическая загрузка с URL)", examples=["https://example.com/image.jpg", "https://grafana.example.com/render/dashboard-solo?panelId=1&width=1000&height=500"]) caption: Optional[str] = Field(None, description="Подпись к фото", examples=["График производительности", "График CPU\n\nВремя: 2024-02-08 16:49:44"]) parse_mode: Optional[str] = Field("HTML", description="Режим парсинга подписи (HTML, Markdown, MarkdownV2)", examples=["HTML", "Markdown"]) model_config = { "json_schema_extra": { "examples": [ { "tg_group": "monitoring", "tg_thread_id": 0, "photo": "https://example.com/image.jpg", "caption": "Описание фото", "parse_mode": "HTML" }, { "tg_group": "alerts", "tg_thread_id": 123, "photo": "https://grafana.example.com/render/dashboard-solo?panelId=1&width=1000&height=500", "caption": "График CPU\n\nВремя: 2024-02-08 16:49:44", "parse_mode": "HTML" } ] } } class SendVideoRequest(BaseModel): """Запрос на отправку видео.""" tg_group: str = Field(..., description="Имя группы Telegram из конфигурации", examples=["monitoring", "alerts"]) tg_thread_id: int = Field(0, description="ID треда в группе Telegram (0 для основной группы)", examples=[0, 123]) video: str = Field(..., description="URL видео или путь к файлу (поддерживается автоматическая загрузка с URL)", examples=["https://example.com/video.mp4", "https://example.com/recording.webm"]) caption: Optional[str] = Field(None, description="Подпись к видео", examples=["Запись экрана", "Запись работы системы\n\nДлительность: 60 сек"]) parse_mode: Optional[str] = Field("HTML", description="Режим парсинга подписи (HTML, Markdown, MarkdownV2)", examples=["HTML", "Markdown"]) duration: Optional[int] = Field(None, description="Длительность видео в секундах", examples=[60, 120, 300]) width: Optional[int] = Field(None, description="Ширина видео в пикселях", examples=[1280, 1920]) height: Optional[int] = Field(None, description="Высота видео в пикселях", examples=[720, 1080]) model_config = { "json_schema_extra": { "examples": [ { "tg_group": "monitoring", "tg_thread_id": 0, "video": "https://example.com/video.mp4", "caption": "Описание видео", "parse_mode": "HTML", "duration": 60, "width": 1280, "height": 720 }, { "tg_group": "alerts", "tg_thread_id": 123, "video": "https://example.com/recording.webm", "caption": "Запись работы системы\n\nДлительность: 60 сек", "parse_mode": "HTML", "duration": 60, "width": 1920, "height": 1080 } ] } } class SendAudioRequest(BaseModel): """Запрос на отправку аудио.""" tg_group: str = Field(..., description="Имя группы Telegram из конфигурации", examples=["monitoring", "alerts"]) tg_thread_id: int = Field(0, description="ID треда в группе Telegram (0 для основной группы)", examples=[0, 123]) audio: str = Field(..., description="URL аудио файла или путь к файлу (поддерживается автоматическая загрузка с URL)", examples=["https://example.com/audio.mp3", "https://example.com/notification.ogg"]) caption: Optional[str] = Field(None, description="Подпись к аудио", examples=["Аудио уведомление", "Аудио запись\n\nДлительность: 3 мин"]) parse_mode: Optional[str] = Field("HTML", description="Режим парсинга подписи (HTML, Markdown, MarkdownV2)", examples=["HTML", "Markdown"]) duration: Optional[int] = Field(None, description="Длительность аудио в секундах", examples=[180, 300]) performer: Optional[str] = Field(None, description="Исполнитель (для музыкальных файлов)", examples=["Artist Name", "System Notification"]) title: Optional[str] = Field(None, description="Название трека (для музыкальных файлов)", examples=["Song Title", "Alert Notification"]) model_config = { "json_schema_extra": { "examples": [ { "tg_group": "monitoring", "tg_thread_id": 0, "audio": "https://example.com/audio.mp3", "caption": "Описание аудио", "parse_mode": "HTML", "duration": 180, "performer": "Artist Name", "title": "Song Title" }, { "tg_group": "alerts", "tg_thread_id": 123, "audio": "https://example.com/notification.ogg", "caption": "Аудио уведомление\n\nСистема работает нормально", "parse_mode": "HTML", "duration": 30, "performer": "System Notification", "title": "Alert Notification" } ] } } class SendDocumentRequest(BaseModel): """Запрос на отправку документа.""" tg_group: str = Field(..., description="Имя группы Telegram из конфигурации", examples=["monitoring", "alerts"]) tg_thread_id: int = Field(0, description="ID треда в группе Telegram (0 для основной группы)", examples=[0, 123]) document: str = Field(..., description="URL документа или путь к файлу (поддерживается автоматическая загрузка с URL)", examples=["https://example.com/file.pdf", "https://example.com/report.xlsx"]) caption: Optional[str] = Field(None, description="Подпись к документу", examples=["Отчет за неделю", "Отчет\n\nДата: 2024-02-08"]) parse_mode: Optional[str] = Field("HTML", description="Режим парсинга подписи (HTML, Markdown, MarkdownV2)", examples=["HTML", "Markdown"]) filename: Optional[str] = Field(None, description="Имя файла (если не указано, используется имя из URL)", examples=["document.pdf", "report_2024-02-08.xlsx"]) model_config = { "json_schema_extra": { "examples": [ { "tg_group": "monitoring", "tg_thread_id": 0, "document": "https://example.com/file.pdf", "caption": "Описание документа", "parse_mode": "HTML", "filename": "document.pdf" }, { "tg_group": "alerts", "tg_thread_id": 123, "document": "https://example.com/report.xlsx", "caption": "Отчет за неделю\n\nДата: 2024-02-08", "parse_mode": "HTML", "filename": "report_2024-02-08.xlsx" }, { "tg_group": "monitoring", "tg_thread_id": 0, "document": "https://example.com/logs.txt", "caption": "Логи системы", "parse_mode": "HTML", "filename": "system_logs_2024-02-08.txt" } ] } }