feat: unify market/portfolio/system UI, improve exchange errors and asset valuation
This commit is contained in:
@@ -4,16 +4,66 @@ from __future__ import annotations
|
||||
|
||||
from aiogram import F, Router
|
||||
from aiogram.fsm.context import FSMContext
|
||||
from aiogram.types import Message
|
||||
from aiogram.types import CallbackQuery, InlineKeyboardMarkup, Message
|
||||
from aiogram.utils.keyboard import InlineKeyboardBuilder
|
||||
|
||||
from src.core.system_status import build_system_text
|
||||
from src.core.system_status import build_system_text, get_system_snapshot, has_system_alerts
|
||||
|
||||
|
||||
router = Router(name="system")
|
||||
|
||||
|
||||
def _system_keyboard() -> InlineKeyboardMarkup:
|
||||
builder = InlineKeyboardBuilder()
|
||||
builder.button(text="🏠 К торговле", callback_data="trade:home")
|
||||
builder.adjust(1)
|
||||
return builder.as_markup()
|
||||
|
||||
|
||||
def _system_alert_keyboard() -> InlineKeyboardMarkup:
|
||||
builder = InlineKeyboardBuilder()
|
||||
builder.button(text="🔁 Обновить", callback_data="system:retry")
|
||||
builder.button(text="🏠 К торговле", callback_data="trade:home")
|
||||
builder.adjust(1, 1)
|
||||
return builder.as_markup()
|
||||
|
||||
|
||||
async def _render_system_screen(
|
||||
target_message: Message,
|
||||
*,
|
||||
edit_mode: bool,
|
||||
) -> None:
|
||||
snapshot = get_system_snapshot()
|
||||
is_alert = has_system_alerts(snapshot)
|
||||
|
||||
text = build_system_text(include_updated_at=is_alert)
|
||||
reply_markup = _system_alert_keyboard() if is_alert else _system_keyboard()
|
||||
|
||||
if edit_mode:
|
||||
await target_message.edit_text(text, reply_markup=reply_markup)
|
||||
else:
|
||||
await target_message.answer(text, reply_markup=reply_markup)
|
||||
|
||||
|
||||
@router.message(F.text.in_({"⚙️ Система", "⚙ Система"}))
|
||||
async def open_system(message: Message, state: FSMContext) -> None:
|
||||
# Глобальный экран: всегда выходим из текущего FSM-сценария.
|
||||
await state.clear()
|
||||
await message.answer(build_system_text())
|
||||
await _render_system_screen(
|
||||
message,
|
||||
edit_mode=False,
|
||||
)
|
||||
|
||||
|
||||
@router.callback_query(F.data == "system:retry")
|
||||
async def retry_system(callback: CallbackQuery, state: FSMContext) -> None:
|
||||
await state.clear()
|
||||
|
||||
if callback.message is None:
|
||||
await callback.answer("Сообщение не найдено", show_alert=True)
|
||||
return
|
||||
|
||||
await _render_system_screen(
|
||||
callback.message,
|
||||
edit_mode=True,
|
||||
)
|
||||
await callback.answer()
|
||||
Reference in New Issue
Block a user