feat(bot): add async DB and FSM state handling

This commit is contained in:
2026-07-23 22:58:52 +05:00
parent b1c8f6d9f8
commit 87385228ea
28 changed files with 514 additions and 213 deletions
+24 -17
View File
@@ -3,11 +3,11 @@ import asyncio
from aiogram import Router
from aiogram.types import CallbackQuery
from bot.api.asf import accept_confirmations, get_confirmations
from bot.states import twofa_tasks
from bot.filters import AdminCallbackFilter
from bot.logging_utils import describe_user, get_logger
from bot.services.twofa import auto_update_2fa, stop_twofa_task
from bot.state import twofa_tasks
from bot.api.asf import accept_confirmations, get_confirmations
from bot.ui.keyboards import back_keyboard, confirmations_keyboard
router = Router()
@@ -29,14 +29,14 @@ async def twofa_handler(callback: CallbackQuery) -> None:
)
return
bot_name = callback.data.replace("2fa_", "")
message_id = callback.message.message_id # type: ignore[union-attr]
message_id = callback.message.message_id
logger.info(
"Пользователь %s открыл 2FA для бота %s",
describe_user(callback.from_user),
bot_name,
)
await stop_twofa_task(message_id)
await callback.message.edit_text( # type: ignore[union-attr]
await callback.message.edit_text(
f"🔐 {bot_name}\n\nЗагрузка 2FA...",
reply_markup=back_keyboard(f"bot_{bot_name}"),
)
@@ -58,7 +58,7 @@ async def twofa_handler(callback: CallbackQuery) -> None:
)
async def confirm_trades(callback: CallbackQuery) -> None:
await callback.answer()
bot_name = callback.data.replace("confirm_", "") # type: ignore[union-attr]
bot_name = callback.data.replace("confirm_", "")
logger.info(
"Пользователь %s подтвердил сделки для бота %s",
describe_user(callback.from_user),
@@ -82,14 +82,14 @@ async def confirm_trades(callback: CallbackQuery) -> None:
"Ошибка при подтверждении сделок для бота %s",
bot_name,
)
await callback.message.edit_text(f"Ошибка: {error}") # type: ignore[union-attr]
await callback.message.edit_text(f"Ошибка: {error}")
@router.callback_query(
lambda c: c.data and c.data.startswith("confirm_list_"), AdminCallbackFilter()
)
async def confirm_list(callback: CallbackQuery) -> None:
await stop_twofa_task(callback.message.message_id) # type: ignore[union-attr]
await stop_twofa_task(callback.message.message_id)
await callback.answer()
if not callback.data:
logger.debug(
@@ -117,20 +117,23 @@ async def confirm_list(callback: CallbackQuery) -> None:
text = f"🔐 {bot_name}\n\nПодтверждения:\n\n"
for conf in confirmations:
text += f"- {conf['type_name']}\nID: <code>{conf['id']}</code>\n\n"
await callback.message.edit_text(text, reply_markup=confirmations_keyboard(bot_name)) # type: ignore[union-attr]
await callback.message.edit_text(
text, reply_markup=confirmations_keyboard(bot_name)
)
except Exception as error:
logger.exception(
"Ошибка при загрузке списка подтверждений для бота %s",
bot_name,
)
await callback.message.edit_text(f"Ошибка: {error}") # type: ignore[union-attr]
await callback.message.edit_text(f"Ошибка: {error}")
@router.callback_query(
lambda c: c.data and c.data.startswith("confirm_all_"), AdminCallbackFilter()
)
async def confirm_all(callback: CallbackQuery) -> None:
await stop_twofa_task(callback.message.message_id) # type: ignore[union-attr]
await stop_twofa_task(callback.message.message_id)
await callback.answer()
if not callback.data:
logger.debug(
@@ -138,12 +141,14 @@ async def confirm_all(callback: CallbackQuery) -> None:
describe_user(callback.from_user),
)
return
bot_name = callback.data.replace("confirm_all_", "")
logger.info(
"Пользователь %s запустил подтверждение всех сделок для бота %s",
describe_user(callback.from_user),
bot_name,
)
try:
status = await accept_confirmations(bot_name)
if status != 200:
@@ -154,6 +159,7 @@ async def confirm_all(callback: CallbackQuery) -> None:
)
await callback.answer("Ошибка HTTP", show_alert=True)
return
confirmations = await get_confirmations(bot_name)
if not confirmations:
logger.info("После подтверждения у бота %s не осталось сделок", bot_name)
@@ -167,11 +173,12 @@ async def confirm_all(callback: CallbackQuery) -> None:
text = f"🔐 {bot_name}\n\nПодтверждения:\n\n"
for conf in confirmations:
text += f"- {conf['type_name']}\nID: <code>{conf['id']}</code>\n\n"
await callback.message.edit_text(text, reply_markup=confirmations_keyboard(bot_name)) # type: ignore[union-attr]
await callback.answer("Все подтверждено", show_alert=True)
except Exception as error:
logger.exception(
"Ошибка при подтверждении всех сделок для бота %s",
bot_name,
await callback.message.edit_text(
text, reply_markup=confirmations_keyboard(bot_name)
)
await callback.message.edit_text(f"Ошибка: {error}") # type: ignore[union-attr]
await callback.answer("Все подтверждено", show_alert=True)
except Exception as error:
logger.exception("Ошибка при подтверждении всех сделок для бота %s", bot_name)
await callback.message.edit_text(f"Ошибка: {error}")