136 lines
		
	
	
		
			5.3 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
			
		
		
	
	
			136 lines
		
	
	
		
			5.3 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
| 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)
 | 
