import logging.config from aiogram import F, Router from aiogram.fsm.context import FSMContext from aiogram.types import CallbackQuery, Message import app.telegram.keyboards.inline as kbi import database.request as rq from app.bybit.get_functions.get_tickers import get_tickers from app.bybit.get_functions.get_instruments_info import get_instruments_info from app.bybit.profile_bybit import user_profile_bybit from app.bybit.set_functions.set_leverage import set_leverage from app.bybit.set_functions.set_margin_mode import set_margin_mode from app.helper_functions import safe_float from app.telegram.states.states import ChangingTheSymbolState from logger_helper.logger_helper import LOGGING_CONFIG logging.config.dictConfig(LOGGING_CONFIG) logger = logging.getLogger("changing_the_symbol") router_changing_the_symbol = Router(name="changing_the_symbol") @router_changing_the_symbol.callback_query(F.data == "change_symbol") async def change_symbol(callback_query: CallbackQuery, state: FSMContext) -> None: """ Handler for the "change_symbol" command. Sends a message with available symbols to choose from. """ try: await state.clear() await state.set_state(ChangingTheSymbolState.symbol_state) msg = await callback_query.message.edit_text( text="Выберите название инструмента без лишних символов (например: BTCUSDT):", reply_markup=kbi.symbol, ) await state.update_data(prompt_message_id=msg.message_id) logger.debug( "Command change_symbol processed successfully for user: %s", callback_query.from_user.id, ) except Exception as e: await callback_query.answer( text="Произошла ошибка. Пожалуйста, попробуйте позже." ) logger.error( "Error processing command change_symbol for user %s: %s", callback_query.from_user.id, e, ) @router_changing_the_symbol.message(ChangingTheSymbolState.symbol_state) async def set_symbol(message: Message, state: FSMContext) -> None: """ Handler for user input for setting the symbol. Updates FSM context with the selected symbol 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 selected symbol. 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 symbol = message.text.upper() additional_settings = await rq.get_user_additional_settings( tg_id=message.from_user.id ) if not additional_settings: await rq.create_user_additional_settings(tg_id=message.from_user.id) return margin_type = additional_settings.margin_type or "ISOLATED_MARGIN" ticker = await get_tickers(tg_id=message.from_user.id, symbol=symbol) if ticker is None: await message.answer( text=f"Инструмент {symbol} не найден.", reply_markup=kbi.symbol ) return instruments_info = await get_instruments_info(tg_id=message.from_user.id, symbol=symbol) max_leverage = instruments_info.get("leverageFilter").get("maxLeverage") req = await rq.set_user_symbol(tg_id=message.from_user.id, symbol=symbol) if not req: await message.answer( text="Произошла ошибка при установке инструмента.", reply_markup=kbi.symbol, ) return await user_profile_bybit( tg_id=message.from_user.id, message=message, state=state ) await set_margin_mode(tg_id=message.from_user.id, margin_mode=margin_type) await set_leverage( tg_id=message.from_user.id, symbol=symbol, leverage=str(max_leverage) ) await rq.set_leverage(tg_id=message.from_user.id, leverage=str(max_leverage)) risk_percent = 100 / safe_float(max_leverage) await rq.set_stop_loss_percent( tg_id=message.from_user.id, stop_loss_percent=risk_percent) await rq.set_take_profit_percent( tg_id=message.from_user.id, take_profit_percent=risk_percent) await rq.set_trigger_price(tg_id=message.from_user.id, trigger_price=0) await rq.set_order_quantity(tg_id=message.from_user.id, order_quantity=1.0) await state.clear() except Exception as e: await message.answer(text="Произошла ошибка. Пожалуйста, попробуйте позже.") logger.error("Error setting symbol for user %s: %s", message.from_user.id, e)