diff --git a/app/telegram/handlers/handlers_main.py b/app/telegram/handlers/handlers_main.py index 5efb478..fa5a125 100644 --- a/app/telegram/handlers/handlers_main.py +++ b/app/telegram/handlers/handlers_main.py @@ -53,7 +53,7 @@ async def cmd_start(message: Message, state: FSMContext) -> None: await rq.create_user_conditional_settings(tg_id=tg_id) await message.answer( text=f"Добро пожаловать, {full_name}!\n\n" - "PHANTOM TRADING - ваш надежный помощник для автоматизации трейдинга😉", + "Чат-робот для трейдинга - ваш надежный помощник для анализа рынка и принятия взвешенных решений.😉", reply_markup=kbi.connect_the_platform, ) logger.debug( diff --git a/app/telegram/handlers/main_settings/risk_management.py b/app/telegram/handlers/main_settings/risk_management.py index ad17564..86bb052 100644 --- a/app/telegram/handlers/main_settings/risk_management.py +++ b/app/telegram/handlers/main_settings/risk_management.py @@ -6,7 +6,7 @@ from aiogram.types import CallbackQuery, Message import app.telegram.keyboards.inline as kbi import database.request as rq -from app.helper_functions import is_int +from app.helper_functions import is_number, safe_float from app.telegram.states.states import RiskManagementState from logger_helper.logger_helper import LOGGING_CONFIG @@ -86,7 +86,7 @@ async def set_take_profit_percent(message: Message, state: FSMContext) -> None: take_profit_percent_value = message.text - if not is_int(take_profit_percent_value): + if not is_number(take_profit_percent_value): await message.answer( text="Ошибка: введите валидное число.", reply_markup=kbi.back_to_risk_management, @@ -98,7 +98,7 @@ async def set_take_profit_percent(message: Message, state: FSMContext) -> None: ) return - if int(take_profit_percent_value) < 1 or int(take_profit_percent_value) > 100: + if safe_float(take_profit_percent_value) < 1 or safe_float(take_profit_percent_value) > 100: await message.answer( text="Ошибка: введите число от 1 до 100.", reply_markup=kbi.back_to_risk_management, @@ -112,7 +112,7 @@ async def set_take_profit_percent(message: Message, state: FSMContext) -> None: req = await rq.set_take_profit_percent( tg_id=message.from_user.id, - take_profit_percent=int(take_profit_percent_value), + take_profit_percent=safe_float(take_profit_percent_value), ) if req: @@ -207,7 +207,7 @@ async def set_stop_loss_percent(message: Message, state: FSMContext) -> None: stop_loss_percent_value = message.text - if not is_int(stop_loss_percent_value): + if not is_number(stop_loss_percent_value): await message.answer( text="Ошибка: введите валидное число.", reply_markup=kbi.back_to_risk_management, @@ -219,7 +219,7 @@ async def set_stop_loss_percent(message: Message, state: FSMContext) -> None: ) return - if int(stop_loss_percent_value) < 1 or int(stop_loss_percent_value) > 100: + if safe_float(stop_loss_percent_value) < 1 or safe_float(stop_loss_percent_value) > 100: await message.answer( text="Ошибка: введите число от 1 до 100.", reply_markup=kbi.back_to_risk_management, @@ -232,7 +232,7 @@ async def set_stop_loss_percent(message: Message, state: FSMContext) -> None: return req = await rq.set_stop_loss_percent( - tg_id=message.from_user.id, stop_loss_percent=int(stop_loss_percent_value) + tg_id=message.from_user.id, stop_loss_percent=safe_float(stop_loss_percent_value) ) if req: @@ -262,130 +262,6 @@ async def set_stop_loss_percent(message: Message, state: FSMContext) -> None: ) -@router_risk_management.callback_query(F.data == "max_risk_percent") -async def max_risk_percent(callback_query: CallbackQuery, state: FSMContext) -> None: - """ - Handles the 'max_risk_percent' callback query. - - Clears the current FSM state, edits the message text to display the maximum risk percentage options, - and shows an inline keyboard for selection. - - Args: - callback_query (CallbackQuery): Incoming callback query from Telegram inline keyboard. - state (FSMContext): Finite State Machine context for the current user session. - - Logs: - Success or error messages with user identification. - """ - try: - await state.clear() - await state.set_state(RiskManagementState.max_risk_percent_state) - msg = await callback_query.message.edit_text( - text="Введите максимальный процент риска: ", - reply_markup=kbi.back_to_risk_management, - ) - await state.update_data(prompt_message_id=msg.message_id) - logger.debug( - "Command max_risk_percent processed successfully for user: %s", - callback_query.from_user.id, - ) - except Exception as e: - await callback_query.answer( - text="Произошла ошибка. Пожалуйста, попробуйте позже." - ) - logger.error( - "Error processing command max_risk_percent for user %s: %s", - callback_query.from_user.id, - e, - ) - - -@router_risk_management.message(RiskManagementState.max_risk_percent_state) -async def set_max_risk_percent(message: Message, state: FSMContext) -> None: - """ - Handles user input for setting the maximum risk percentage. - - Updates FSM context with the selected percentage and persists the choice in database. - Sends an acknowledgement to user and clears FSM state afterward. - - Args: - message (Message): Incoming message from user containing the maximum risk percentage. - state (FSMContext): Finite State Machine context for the current user session. - - Logs: - Success or error messages with user identification. - """ - try: - try: - data = await state.get_data() - if "prompt_message_id" in data: - prompt_message_id = data["prompt_message_id"] - await message.bot.delete_message( - chat_id=message.chat.id, message_id=prompt_message_id - ) - await message.delete() - except Exception as e: - if "message to delete not found" in str(e).lower(): - pass # Ignore this error - else: - raise e - - max_risk_percent_value = message.text - - if not is_int(max_risk_percent_value): - await message.answer( - text="Ошибка: введите валидное число.", - reply_markup=kbi.back_to_risk_management, - ) - logger.debug( - "User %s input invalid (not an valid number): %s", - message.from_user.id, - max_risk_percent_value, - ) - return - - if int(max_risk_percent_value) < 1 or int(max_risk_percent_value) > 100: - await message.answer( - text="Ошибка: введите число от 1 до 100.", - reply_markup=kbi.back_to_risk_management, - ) - logger.debug( - "User %s input invalid (not an valid number): %s", - message.from_user.id, - max_risk_percent_value, - ) - return - - req = await rq.set_max_risk_percent( - tg_id=message.from_user.id, max_risk_percent=int(max_risk_percent_value) - ) - - if req: - await message.answer( - text=f"Максимальный процент риска установлен на {max_risk_percent_value}%.", - reply_markup=kbi.back_to_risk_management, - ) - else: - await message.answer( - text="Произошла ошибка при установке максимального процента риска. " - "Пожалуйста, попробуйте позже.", - reply_markup=kbi.back_to_risk_management, - ) - - await state.clear() - except Exception as e: - await message.answer( - text="Произошла ошибка при установке максимального процента риска. " - "Пожалуйста, попробуйте позже.", - reply_markup=kbi.back_to_risk_management, - ) - logger.error( - "Error processing command max_risk_percent for user %s: %s", - message.from_user.id, - e, - ) - - @router_risk_management.callback_query(F.data == "commission_fee") async def commission_fee(callback_query: CallbackQuery, state: FSMContext) -> None: """