Files
stcs/app/telegram/handlers/changing_the_symbol.py

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)