Archived
feat(bot): add async DB and FSM state handling
This commit is contained in:
+41
-35
@@ -2,18 +2,15 @@ import asyncio
|
||||
|
||||
from aiogram import Router
|
||||
from aiogram.types import CallbackQuery
|
||||
from aiogram.fsm.context import FSMContext
|
||||
|
||||
from bot.api.asf import get_plugins, restart_asf as restart_asf_request
|
||||
from bot.filters import AdminCallbackFilter
|
||||
from bot.logging_utils import describe_user, get_logger
|
||||
|
||||
from bot.api.asf import get_plugins, restart_asf as restart_asf_request
|
||||
from bot.services.twofa import stop_twofa_task
|
||||
from bot.state import (
|
||||
bot_redeem_messages,
|
||||
bot_redeem_users,
|
||||
console_users,
|
||||
redeem_messages,
|
||||
redeem_users,
|
||||
)
|
||||
|
||||
|
||||
from bot.ui.formatters import get_asf_status_text, get_asf_status
|
||||
from bot.ui.keyboards import back_keyboard, confirm_action_keyboard, main_keyboard
|
||||
|
||||
@@ -21,28 +18,24 @@ router = Router()
|
||||
logger = get_logger(__name__)
|
||||
|
||||
|
||||
def clear_user_state(user_id: int) -> None:
|
||||
redeem_users.discard(user_id)
|
||||
redeem_messages.pop(user_id, None)
|
||||
console_users.discard(user_id)
|
||||
bot_redeem_users.pop(user_id, None)
|
||||
bot_redeem_messages.pop(user_id, None)
|
||||
logger.info("Состояние пользователя очищено: user_id=%s", user_id)
|
||||
|
||||
|
||||
@router.callback_query(lambda c: c.data == "back", AdminCallbackFilter())
|
||||
async def back_button(callback: CallbackQuery) -> None:
|
||||
async def back_button(callback: CallbackQuery, state: FSMContext) -> None:
|
||||
user = describe_user(callback.from_user.id)
|
||||
logger.info("Нажата кнопка возврата: %s", user)
|
||||
clear_user_state(callback.from_user.id)
|
||||
await stop_twofa_task(callback.message.message_id) # type: ignore[union-attr]
|
||||
|
||||
await state.clear()
|
||||
await stop_twofa_task(callback.message.message_id)
|
||||
|
||||
await callback.answer()
|
||||
try:
|
||||
await callback.message.edit_text(get_asf_status_text(), reply_markup=main_keyboard()) # type: ignore[union-attr]
|
||||
await callback.message.edit_text(
|
||||
get_asf_status_text(), reply_markup=main_keyboard()
|
||||
)
|
||||
logger.info("Пользователь возвращен в главное меню: %s", user)
|
||||
|
||||
except Exception as error:
|
||||
logger.exception("Не удалось вернуть пользователя в главное меню: %s", user)
|
||||
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 == "refresh", AdminCallbackFilter())
|
||||
@@ -50,22 +43,28 @@ async def refresh_handler(callback: CallbackQuery) -> None:
|
||||
user = describe_user(callback.from_user.id)
|
||||
logger.info("Запрошено обновление главного экрана: %s", user)
|
||||
await callback.answer()
|
||||
|
||||
try:
|
||||
await callback.message.edit_text(get_asf_status_text(), reply_markup=main_keyboard()) # type: ignore[union-attr]
|
||||
await callback.message.edit_text(
|
||||
get_asf_status_text(), reply_markup=main_keyboard()
|
||||
)
|
||||
logger.info("Главный экран обновлен: %s", user)
|
||||
|
||||
except Exception as error:
|
||||
logger.exception("Не удалось обновить главный экран: %s", user)
|
||||
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 == "delete_msg", AdminCallbackFilter())
|
||||
async def delete_message(callback: CallbackQuery) -> None:
|
||||
user = describe_user(callback.from_user.id)
|
||||
logger.info("Запрошено удаление сообщения: %s", user)
|
||||
|
||||
await callback.answer()
|
||||
try:
|
||||
await callback.message.delete() # type: ignore[union-attr]
|
||||
await callback.message.delete()
|
||||
logger.info("Сообщение удалено: %s", user)
|
||||
|
||||
except Exception:
|
||||
logger.exception("Не удалось удалить сообщение: %s", user)
|
||||
|
||||
@@ -74,8 +73,9 @@ async def delete_message(callback: CallbackQuery) -> None:
|
||||
async def restart_asf_confirm(callback: CallbackQuery) -> None:
|
||||
user = describe_user(callback.from_user.id)
|
||||
logger.info("Открыто подтверждение перезапуска ASF: %s", user)
|
||||
|
||||
await callback.answer()
|
||||
await callback.message.edit_text( # type: ignore[union-attr]
|
||||
await callback.message.edit_text(
|
||||
"♻ Точно перезапустить ASF?\n\nВо время перезапуска IPC будет недоступен несколько секунд.",
|
||||
reply_markup=confirm_action_keyboard("restart_asf", "back"),
|
||||
)
|
||||
@@ -85,9 +85,10 @@ async def restart_asf_confirm(callback: CallbackQuery) -> None:
|
||||
async def restart_asf(callback: CallbackQuery) -> None:
|
||||
user = describe_user(callback.from_user.id)
|
||||
logger.info("Подтвержден перезапуск ASF: %s", user)
|
||||
|
||||
await callback.answer()
|
||||
try:
|
||||
await callback.message.edit_text("♻ ASF перезапускается...") # type: ignore[union-attr]
|
||||
await callback.message.edit_text("♻ ASF перезапускается...")
|
||||
|
||||
response = restart_asf_request()
|
||||
if response.status_code != 200:
|
||||
@@ -96,7 +97,7 @@ async def restart_asf(callback: CallbackQuery) -> None:
|
||||
user,
|
||||
response.status_code,
|
||||
)
|
||||
await callback.message.edit_text( # type: ignore[union-attr]
|
||||
await callback.message.edit_text(
|
||||
f"Ошибка HTTP {response.status_code}",
|
||||
reply_markup=main_keyboard(),
|
||||
)
|
||||
@@ -113,7 +114,7 @@ async def restart_asf(callback: CallbackQuery) -> None:
|
||||
status = get_asf_status()
|
||||
await asyncio.sleep(1)
|
||||
|
||||
await callback.message.edit_text( # type: ignore[union-attr]
|
||||
await callback.message.edit_text(
|
||||
f"ASF успешно перезапущен\n\n{get_asf_status_text()}",
|
||||
reply_markup=main_keyboard(),
|
||||
)
|
||||
@@ -123,7 +124,7 @@ async def restart_asf(callback: CallbackQuery) -> None:
|
||||
except Exception as error:
|
||||
logger.exception("Не удалось перезапустить ASF: %s", user)
|
||||
|
||||
await callback.message.edit_text( # type: ignore[union-attr]
|
||||
await callback.message.edit_text(
|
||||
f"Ошибка: {error}",
|
||||
reply_markup=main_keyboard(),
|
||||
)
|
||||
@@ -133,7 +134,8 @@ async def restart_asf(callback: CallbackQuery) -> None:
|
||||
async def plugins_handler(callback: CallbackQuery) -> None:
|
||||
user = describe_user(callback.from_user.id)
|
||||
logger.info("Открыт список плагинов ASF: %s", user)
|
||||
await stop_twofa_task(callback.message.message_id) # type: ignore[union-attr]
|
||||
await stop_twofa_task(callback.message.message_id)
|
||||
|
||||
await callback.answer()
|
||||
try:
|
||||
response = get_plugins()
|
||||
@@ -143,13 +145,15 @@ async def plugins_handler(callback: CallbackQuery) -> None:
|
||||
user,
|
||||
response.status_code,
|
||||
)
|
||||
await callback.message.edit_text("Ошибка API") # type: ignore[union-attr]
|
||||
await callback.message.edit_text("Ошибка API")
|
||||
return
|
||||
|
||||
data = response.json()
|
||||
if not data.get("Success"):
|
||||
logger.warning("ASF вернул ошибку при получении плагинов: %s", user)
|
||||
await callback.message.edit_text("ASF вернул ошибку") # type: ignore[union-attr]
|
||||
await callback.message.edit_text("ASF вернул ошибку")
|
||||
return
|
||||
|
||||
plugins = data.get("Result", [])
|
||||
if not plugins:
|
||||
logger.info("Плагины ASF не установлены: %s", user)
|
||||
@@ -161,7 +165,9 @@ async def plugins_handler(callback: CallbackQuery) -> None:
|
||||
text += (
|
||||
f"{plugin.get('Name', '???')} ({plugin.get('Version', '???')})\n"
|
||||
)
|
||||
await callback.message.edit_text(text.strip(), reply_markup=back_keyboard()) # type: ignore[union-attr]
|
||||
|
||||
await callback.message.edit_text(text.strip(), reply_markup=back_keyboard())
|
||||
|
||||
except Exception as error:
|
||||
logger.exception("Не удалось отобразить список плагинов: %s", user)
|
||||
await callback.message.edit_text(f"Ошибка: {error}") # type: ignore[union-attr]
|
||||
await callback.message.edit_text(f"Ошибка: {error}")
|
||||
|
||||
Reference in New Issue
Block a user