Stage 07.3.4 - monitoring screen and journal migration

This commit is contained in:
2026-04-29 15:15:07 +03:00
parent 51659037bb
commit 41c332d9cb
15 changed files with 455 additions and 70 deletions

View File

@@ -7,11 +7,12 @@ from dataclasses import dataclass
from typing import Callable
from aiogram import Bot
from aiogram.exceptions import TelegramBadRequest
@dataclass(slots=True)
class LiveScreen:
# имя live-экрана: market / portfolio / journal
# имя live-экрана: market / portfolio
screen: str
# Telegram bot instance
@@ -33,6 +34,71 @@ class LiveScreen:
interval_seconds: int = 5
@dataclass(slots=True)
class StaticScreen:
# имя статичного экрана: journal / monitoring / etc
screen: str
# Telegram bot instance
bot: Bot
# чат, где находится экран
chat_id: int
# сообщение экрана
message_id: int
class ScreenRegistry:
_screens: dict[str, list[StaticScreen]] = {}
# зарегистрировать статичный экран
@classmethod
def register_screen(cls, static_screen: StaticScreen) -> None:
screens = cls._screens.setdefault(static_screen.screen, [])
screens[:] = [
item
for item in screens
if not (
item.chat_id == static_screen.chat_id
and item.message_id == static_screen.message_id
)
]
screens.append(static_screen)
# удалить старые статичные экраны указанного типа
@classmethod
async def delete_screen(
cls,
*,
screen: str,
bot: Bot,
chat_id: int,
) -> None:
screens = cls._screens.get(screen, [])
remaining: list[StaticScreen] = []
for static_screen in screens:
if static_screen.chat_id != chat_id:
remaining.append(static_screen)
continue
try:
await bot.delete_message(
chat_id=static_screen.chat_id,
message_id=static_screen.message_id,
)
except Exception:
pass
if remaining:
cls._screens[screen] = remaining
else:
cls._screens.pop(screen, None)
class LiveScreenRunner:
_screens: dict[str, list[LiveScreen]] = {}
_tasks: dict[str, asyncio.Task] = {}
@@ -63,7 +129,6 @@ class LiveScreenRunner:
chat_id: int,
) -> None:
screens = cls._screens.get(screen, [])
remaining: list[LiveScreen] = []
for live_screen in screens:
@@ -139,6 +204,12 @@ class LiveScreenRunner:
reply_markup=live_screen.render_markup(),
)
alive_screens.append(live_screen)
except TelegramBadRequest as exc:
if "message is not modified" in str(exc).lower():
alive_screens.append(live_screen)
continue
except Exception:
pass