From aec8fea6282c4a0577f2edd77a81f1df48eff53a Mon Sep 17 00:00:00 2001 From: algizn97 Date: Wed, 27 Aug 2025 12:56:22 +0500 Subject: [PATCH] Updated --- app/telegram/handlers/handlers.py | 145 ++++++++++++++++++++++++------ 1 file changed, 120 insertions(+), 25 deletions(-) diff --git a/app/telegram/handlers/handlers.py b/app/telegram/handlers/handlers.py index 5c84064..d5a45df 100644 --- a/app/telegram/handlers/handlers.py +++ b/app/telegram/handlers/handlers.py @@ -1,5 +1,5 @@ import logging.config - +import asyncio from aiogram import F, Router from aiogram.filters import CommandStart from aiogram.types import Message, CallbackQuery @@ -13,23 +13,42 @@ import app.telegram.functions.additional_settings.settings as func_additional_se import app.telegram.database.requests as rq import app.telegram.Keyboards.reply_keyboards as reply_markup + from logger_helper.logger_helper import LOGGING_CONFIG logging.config.dictConfig(LOGGING_CONFIG) logger = logging.getLogger("handlers") - router = Router() @router.message(CommandStart()) -async def start_message(message: Message): +async def start_message(message: Message) -> None: + """ + Обработчик команды /start. + Запускает WebSocket для пользователя и инициализирует нового пользователя в БД. + + Args: + message (Message): Входящее сообщение с командой /start. + """ + from BybitBot_API import run_ws_for_user + tg_id = message.from_user.id + asyncio.create_task(run_ws_for_user(tg_id, message)) + logger.info(f"Получение event loop") + await rq.set_new_user_bybit_api(message.from_user.id) await func.start_message(message) @router.message(F.text == "👤 Профиль") -async def profile_message(message: Message): +async def profile_message(message: Message) -> None: + """ + Обработчик кнопки 'Профиль'. + Проверяет существование пользователя и отображает профиль. + + Args: + message (Message): Сообщение с текстом кнопки. + """ user = await rq.check_user(message.from_user.id) if user: @@ -37,7 +56,14 @@ async def profile_message(message: Message): @router.message(F.text == "Настройки") -async def settings_msg(message: Message): +async def settings_msg(message: Message) -> None: + """ + Обработчик кнопки 'Настройки'. + Проверяет пользователя и отображает меню настроек. + + Args: + message (Message): Сообщение с текстом кнопки. + """ user = await rq.check_user(message.from_user.id) if user: @@ -45,17 +71,20 @@ async def settings_msg(message: Message): @router.callback_query(F.data == "clb_start_chatbot_message") -async def clb_profile_msg(callback: CallbackQuery): +async def clb_profile_msg(callback: CallbackQuery) -> None: + """ + Обработчик колбэка 'clb_start_chatbot_message'. + Если пользователь есть в БД — показывает профиль, + иначе регистрирует нового пользователя и инициализирует настройки. + + Args: + callback (CallbackQuery): Полученный колбэк. + """ user = await rq.check_user(callback.from_user.id) - username = '' - - if callback.from_user.first_name == None: - username = callback.from_user.last_name - elif callback.from_user.last_name == None: - username = callback.from_user.first_name - else: - username = f'{callback.from_user.first_name} {callback.from_user.last_name}' + first_name = callback.from_user.first_name or "" + last_name = callback.from_user.last_name or "" + username = f"{first_name} {last_name}".strip() or callback.from_user.username or "Пользователь" if user: await func.profile_message(callback.from_user.username, callback.message) @@ -75,44 +104,82 @@ async def clb_profile_msg(callback: CallbackQuery): await callback.answer() -# Настройки торговли @router.callback_query(F.data == "clb_settings_message") -async def clb_settings_msg(callback: CallbackQuery): +async def clb_settings_msg(callback: CallbackQuery) -> None: + """ + Показать главное меню настроек. + + Args: + callback (CallbackQuery): полученный колбэк. + """ await func.settings_message(callback.message) await callback.answer() @router.callback_query(F.data == "clb_back_to_special_settings_message") -async def clb_back_to_settings_msg(callback: CallbackQuery): +async def clb_back_to_settings_msg(callback: CallbackQuery) -> None: + """ + Вернуть пользователя к меню специальных настроек. + + Args: + callback (CallbackQuery): полученный колбэк. + """ await func.settings_message(callback.message) await callback.answer() @router.callback_query(F.data == "clb_change_main_settings") -async def clb_change_main_settings_message(callback: CallbackQuery, state: FSMContext): +async def clb_change_main_settings_message(callback: CallbackQuery, state: FSMContext) -> None: + """ + Открыть меню изменения главных настроек. + + Args: + callback (CallbackQuery): полученный колбэк. + state (FSMContext): текущее состояние FSM. + """ await func_main_settings.main_settings_message(callback.from_user.id, callback.message, state) await callback.answer() @router.callback_query(F.data == "clb_change_risk_management_settings") -async def clb_change_risk_management_message(callback: CallbackQuery): +async def clb_change_risk_management_message(callback: CallbackQuery) -> None: + """ + Открыть меню изменения настроек управления рисками. + + Args: + callback (CallbackQuery): полученный колбэк. + """ await func_rmanagement_settings.main_settings_message(callback.from_user.id, callback.message) await callback.answer() @router.callback_query(F.data == "clb_change_condition_settings") -async def clb_change_condition_message(callback: CallbackQuery, state: FSMContext): +async def clb_change_condition_message(callback: CallbackQuery, state: FSMContext) -> None: + """ + Открыть меню изменения настроек условий. + + Args: + callback (CallbackQuery): полученный колбэк. + state (FSMContext): текущее состояние FSM. + """ await func_condition_settings.main_settings_message(callback.from_user.id, callback.message, state) await callback.answer() @router.callback_query(F.data == "clb_change_additional_settings") -async def clb_change_additional_message(callback: CallbackQuery, state: FSMContext): +async def clb_change_additional_message(callback: CallbackQuery, state: FSMContext) -> None: + """ + Открыть меню изменения дополнительных настроек. + + Args: + callback (CallbackQuery): полученный колбэк. + state (FSMContext): текущее состояние FSM. + """ await func_additional_settings.main_settings_message(callback.from_user.id, callback.message, state) await callback.answer() @@ -129,7 +196,14 @@ list_main_settings = ['clb_change_trading_mode', @router.callback_query(F.data.in_(list_main_settings)) -async def clb_main_settings_msg(callback: CallbackQuery, state: FSMContext): +async def clb_main_settings_msg(callback: CallbackQuery, state: FSMContext) -> None: + """ + Обработчик колбэков изменения главных настроек с dispatch через match-case. + + Args: + callback (CallbackQuery): полученный колбэк. + state (FSMContext): текущее состояние FSM. + """ await callback.answer() try: @@ -158,7 +232,14 @@ list_risk_management_settings = ['clb_change_price_profit', @router.callback_query(F.data.in_(list_risk_management_settings)) -async def clb_risk_management_settings_msg(callback: CallbackQuery, state: FSMContext): +async def clb_risk_management_settings_msg(callback: CallbackQuery, state: FSMContext) -> None: + """ + Обработчик изменений настроек управления рисками. + + Args: + callback (CallbackQuery): полученный колбэк. + state (FSMContext): текущее состояние FSM. + """ await callback.answer() try: @@ -186,7 +267,14 @@ list_condition_settings = ['clb_change_trigger', @router.callback_query(F.data.in_(list_condition_settings)) -async def clb_condition_settings_msg(callback: CallbackQuery, state: FSMContext): +async def clb_condition_settings_msg(callback: CallbackQuery, state: FSMContext) -> None: + """ + Обработчик изменений настроек условий трейдинга. + + Args: + callback (CallbackQuery): полученный колбэк. + state (FSMContext): текущее состояние FSM. + """ await callback.answer() try: @@ -216,7 +304,14 @@ list_additional_settings = ['clb_change_save_pattern', @router.callback_query(F.data.in_(list_additional_settings)) -async def clb_additional_settings_msg(callback: CallbackQuery, state: FSMContext): +async def clb_additional_settings_msg(callback: CallbackQuery, state: FSMContext) -> None: + """ + Обработчик дополнительных настроек бота. + + Args: + callback (CallbackQuery): полученный колбэк. + state (FSMContext): текущее состояние FSM. + """ await callback.answer() try: