07.4.4.1.10.3 — Telegram Diagnostic Screen
This commit is contained in:
@@ -8,6 +8,7 @@ from aiogram.fsm.context import FSMContext
|
||||
from aiogram.types import CallbackQuery, Message
|
||||
|
||||
from src.telegram.handlers.auto.ui import (
|
||||
auto_diagnostics_keyboard,
|
||||
auto_keyboard,
|
||||
build_auto_text,
|
||||
is_auto_configured,
|
||||
@@ -16,6 +17,8 @@ from src.telegram.handlers.system import open_auto_settings
|
||||
from src.telegram.live.active_screen import ActiveScreenManager
|
||||
from src.trading.auto.runner import AutoTradeRunner
|
||||
from src.trading.auto.service import AutoTradeService
|
||||
from src.trading.diagnostics.formatter import SemanticDiagnosticFormatter
|
||||
from src.trading.diagnostics.snapshot import SemanticDiagnosticSnapshotBuilder
|
||||
|
||||
|
||||
router = Router(name="auto")
|
||||
@@ -88,6 +91,58 @@ async def _prepare_auto_from_callback(callback: CallbackQuery) -> bool:
|
||||
return True
|
||||
|
||||
|
||||
|
||||
def build_auto_diagnostics_text() -> str:
|
||||
service = AutoTradeService()
|
||||
state = service.get_state()
|
||||
|
||||
snapshot = SemanticDiagnosticSnapshotBuilder().build(
|
||||
state,
|
||||
is_configured=is_auto_configured(state),
|
||||
)
|
||||
|
||||
return SemanticDiagnosticFormatter().format(snapshot)
|
||||
|
||||
|
||||
async def render_auto_diagnostics_screen(
|
||||
target_message: Message,
|
||||
) -> None:
|
||||
text = build_auto_diagnostics_text()
|
||||
|
||||
try:
|
||||
await target_message.edit_text(
|
||||
text,
|
||||
reply_markup=auto_diagnostics_keyboard(),
|
||||
)
|
||||
except TelegramBadRequest as exc:
|
||||
error_text = str(exc).lower()
|
||||
|
||||
if "message to edit not found" in error_text:
|
||||
await target_message.answer(
|
||||
text,
|
||||
reply_markup=auto_diagnostics_keyboard(),
|
||||
)
|
||||
return
|
||||
|
||||
if "message is not modified" in error_text:
|
||||
return
|
||||
|
||||
raise
|
||||
|
||||
AutoTradeRunner.register_screen(
|
||||
bot=target_message.bot,
|
||||
chat_id=target_message.chat.id,
|
||||
message_id=target_message.message_id,
|
||||
render_text=build_auto_diagnostics_text,
|
||||
render_markup=auto_diagnostics_keyboard,
|
||||
)
|
||||
|
||||
ActiveScreenManager.register(
|
||||
screen="auto_diagnostics",
|
||||
message=target_message,
|
||||
)
|
||||
|
||||
|
||||
@router.message(F.text.in_({"🤖 Автоторговля", "🤖 Авто"}))
|
||||
async def open_auto(message: Message, state: FSMContext) -> None:
|
||||
await state.clear()
|
||||
@@ -173,4 +228,21 @@ async def auto_stop(callback: CallbackQuery) -> None:
|
||||
await _prepare_auto_from_callback(callback)
|
||||
await render_auto_screen(callback.message, edit_mode=True)
|
||||
|
||||
await callback.answer(message)
|
||||
await callback.answer(message)
|
||||
|
||||
|
||||
@router.callback_query(F.data == "auto:diagnostics")
|
||||
async def open_auto_diagnostics(callback: CallbackQuery) -> None:
|
||||
if callback.message is None:
|
||||
await callback.answer("Сообщение не найдено", show_alert=True)
|
||||
return
|
||||
|
||||
await ActiveScreenManager.prepare_new_screen(
|
||||
screen="auto_diagnostics",
|
||||
bot=callback.message.bot,
|
||||
chat_id=callback.message.chat.id,
|
||||
keep_message_id=callback.message.message_id,
|
||||
)
|
||||
|
||||
await render_auto_diagnostics_screen(callback.message)
|
||||
await callback.answer()
|
||||
@@ -15,15 +15,45 @@ from src.trading.auto.service import AutoTradeService
|
||||
|
||||
|
||||
def auto_keyboard() -> InlineKeyboardMarkup:
|
||||
state = AutoTradeService().get_state()
|
||||
|
||||
builder = InlineKeyboardBuilder()
|
||||
|
||||
builder.button(text="▶️ Start", callback_data="auto:start")
|
||||
builder.button(text="👀 Watch", callback_data="auto:observe")
|
||||
builder.button(text="🛑 Stop", callback_data="auto:stop")
|
||||
status = (state.status or "").upper()
|
||||
|
||||
if status == "OFF":
|
||||
builder.button(text="▶️ Start", callback_data="auto:start")
|
||||
builder.button(text="👀 Watch", callback_data="auto:observe")
|
||||
|
||||
elif status == "RUNNING":
|
||||
builder.button(text="👀 Watch", callback_data="auto:observe")
|
||||
builder.button(text="🛑 Stop", callback_data="auto:stop")
|
||||
|
||||
elif status == "OBSERVING":
|
||||
builder.button(text="▶️ Start", callback_data="auto:start")
|
||||
builder.button(text="🛑 Stop", callback_data="auto:stop")
|
||||
|
||||
else:
|
||||
builder.button(text="▶️ Start", callback_data="auto:start")
|
||||
builder.button(text="👀 Watch", callback_data="auto:observe")
|
||||
builder.button(text="🛑 Stop", callback_data="auto:stop")
|
||||
|
||||
builder.button(text="🛠️ Настройки", callback_data="settings:auto")
|
||||
builder.button(text="🧯 Защита", callback_data="auto:risk")
|
||||
builder.button(text="🔬 Диагностика", callback_data="auto:diagnostics")
|
||||
|
||||
builder.adjust(3, 2)
|
||||
builder.adjust(2, 2, 1)
|
||||
|
||||
return builder.as_markup()
|
||||
|
||||
|
||||
def auto_diagnostics_keyboard() -> InlineKeyboardMarkup:
|
||||
builder = InlineKeyboardBuilder()
|
||||
|
||||
builder.button(text="🔄 Обновить", callback_data="auto:diagnostics")
|
||||
builder.button(text="⬅️ Назад", callback_data="auto:home")
|
||||
|
||||
builder.adjust(2)
|
||||
return builder.as_markup()
|
||||
|
||||
|
||||
@@ -281,7 +311,6 @@ def _build_waiting_text(state) -> str:
|
||||
_order_header_line(state),
|
||||
f"{_price_label_for_signal(state)} · {_format_plain_or_dash(price)}",
|
||||
_estimated_size_text(state, price),
|
||||
_adaptive_size_line(state),
|
||||
_max_reserved_line(state, price),
|
||||
_effective_risk_line(state),
|
||||
]
|
||||
@@ -346,7 +375,6 @@ def _build_active_position_text(state) -> str:
|
||||
"",
|
||||
f"Размер · {_format_crypto_size(size)}",
|
||||
f"Позиция · {_format_money_compact(notional)}",
|
||||
_adaptive_size_line(state),
|
||||
f"Вход · {_format_plain_or_dash(state.entry_price)}",
|
||||
f"Цена · {_format_plain_or_dash(price_for_calc)}",
|
||||
"",
|
||||
|
||||
Reference in New Issue
Block a user