Stage 07.3.4 - monitoring screen and journal migration
This commit is contained in:
@@ -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
|
||||
|
||||
|
||||
Reference in New Issue
Block a user