forked from kodorvan/stcs
		
	
		
			
				
	
	
		
			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 = 10 / 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)
 |