From c48998e0855211a770acdbbcc4577aef1feb4371 Mon Sep 17 00:00:00 2001 From: dv Date: Mon, 16 Mar 2026 00:14:09 +0300 Subject: [PATCH] =?UTF-8?q?=D0=BA=D0=BB=D0=BE=D1=83=D0=BD=D0=B0=D0=B4?= =?UTF-8?q?=D0=B0=202?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- bot/notifier.py | 81 +++++++++++++++++++++++++++++-------------------- bot/poster.py | 6 ++++ 2 files changed, 54 insertions(+), 33 deletions(-) diff --git a/bot/notifier.py b/bot/notifier.py index 99b1c3a..a82f992 100644 --- a/bot/notifier.py +++ b/bot/notifier.py @@ -13,12 +13,29 @@ from __future__ import annotations import logging +import time from abc import ABC, abstractmethod from dataclasses import dataclass log = logging.getLogger(__name__) +def _timed(label: str): + """Context manager: логирует старт и завершение операции с временем выполнения.""" + import contextlib + + @contextlib.contextmanager + def _cm(): + log.info("⏳ %s ...", label) + t0 = time.monotonic() + try: + yield + finally: + log.info("✅ %s — %.2fs", label, time.monotonic() - t0) + + return _cm() + + # ── Агностичное представление клавиатуры ────────────────────────────────────── @dataclass @@ -104,48 +121,46 @@ class TelegramChannelNotifier(Notifier): # ── Реализация интерфейса ────────────────────────────────────────────────── def send(self, text: str, keyboard: Keyboard | None = None) -> int: - log.info("Telegram send_message → channel %s", self._channel_id) - msg = self._bot.send_message( - self._channel_id, text, - parse_mode="Markdown", - disable_web_page_preview=True, - reply_markup=self._to_markup(keyboard), - ) - log.info("Telegram send_message OK, message_id=%s", msg.message_id) + with _timed(f"send_message → channel {self._channel_id}"): + msg = self._bot.send_message( + self._channel_id, text, + parse_mode="Markdown", + disable_web_page_preview=True, + reply_markup=self._to_markup(keyboard), + ) + log.info("send_message OK → message_id=%s", msg.message_id) return msg.message_id def edit_text(self, message_id: int, text: str, keyboard: Keyboard | None = None): - log.info("Telegram edit_message_text → message_id=%s", message_id) - self._bot.edit_message_text( - text, self._channel_id, message_id, - parse_mode="Markdown", - disable_web_page_preview=True, - reply_markup=self._to_markup(keyboard), - ) - log.info("Telegram edit_message_text OK, message_id=%s", message_id) + with _timed(f"edit_message_text → message_id={message_id}"): + self._bot.edit_message_text( + text, self._channel_id, message_id, + parse_mode="Markdown", + disable_web_page_preview=True, + reply_markup=self._to_markup(keyboard), + ) def edit_keyboard(self, message_id: int, keyboard: Keyboard | None): - log.info("Telegram edit_message_reply_markup → message_id=%s", message_id) - self._bot.edit_message_reply_markup( - self._channel_id, message_id, - reply_markup=self._to_markup(keyboard), - ) + with _timed(f"edit_message_reply_markup → message_id={message_id}"): + self._bot.edit_message_reply_markup( + self._channel_id, message_id, + reply_markup=self._to_markup(keyboard), + ) def delete(self, message_id: int): - log.info("Telegram delete_message → message_id=%s", message_id) - try: - self._bot.delete_message(self._channel_id, message_id) - log.info("Telegram delete_message OK, message_id=%s", message_id) - except Exception as e: - log.warning("Telegram delete_message failed (message_id=%s): %s", message_id, e) + with _timed(f"delete_message → message_id={message_id}"): + try: + self._bot.delete_message(self._channel_id, message_id) + except Exception as e: + log.warning("delete_message failed (message_id=%s): %s", message_id, e) def send_animation(self, url: str, disable_notification: bool = True) -> int: - log.info("Telegram send_animation → channel %s", self._channel_id) - msg = self._bot.send_animation( - self._channel_id, url, - disable_notification=disable_notification, - ) - log.info("Telegram send_animation OK, message_id=%s", msg.message_id) + with _timed(f"send_animation → channel {self._channel_id}"): + msg = self._bot.send_animation( + self._channel_id, url, + disable_notification=disable_notification, + ) + log.info("send_animation OK → message_id=%s", msg.message_id) return msg.message_id def is_stale_error(self, exc: Exception) -> bool: diff --git a/bot/poster.py b/bot/poster.py index cd03814..96025b3 100644 --- a/bot/poster.py +++ b/bot/poster.py @@ -10,6 +10,7 @@ from __future__ import annotations import logging +import time import config import database @@ -50,6 +51,8 @@ def recreate_post( Изменения (• ...) дедуплицируются по тексту. Комментарии (💬 ...) и описания (📝 ...) добавляются всегда. """ + t0 = time.monotonic() + log.info("recreate_post START task=%s", task_id) notifier = get_notifier() stored = database.get_stored_events(task_id) @@ -78,6 +81,7 @@ def recreate_post( }) old = database.get_message_data(task_id) + log.info("recreate_post task=%s old_msg=%s", task_id, old["message_id"] if old else None) try: message_id = notifier.send(full_text, keyboard) @@ -91,6 +95,8 @@ def recreate_post( if old: notifier.delete(old["message_id"]) + log.info("recreate_post DONE task=%s — %.2fs total", task_id, time.monotonic() - t0) + def refresh_responsible(task_id: int, task_number: str): """Редактирует текст поста — обновляет блок «В работе»."""