forked from kodorvan/stcs
The entire database has been changed to PostgresSQL. The entire code has been updated.
This commit is contained in:
164
app/telegram/handlers/changing_the_symbol.py
Normal file
164
app/telegram/handlers/changing_the_symbol.py
Normal file
@@ -0,0 +1,164 @@
|
||||
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.profile_bybit import user_profile_bybit
|
||||
from app.bybit.set_functions.set_leverage import (
|
||||
set_leverage,
|
||||
set_leverage_to_buy_and_sell,
|
||||
)
|
||||
from app.bybit.set_functions.set_margin_mode import set_margin_mode
|
||||
from app.bybit.set_functions.set_switch_position_mode import set_switch_position_mode
|
||||
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
|
||||
|
||||
trade_mode = additional_settings.trade_mode or "Merged_Single"
|
||||
mode = 0 if trade_mode == "Merged_Single" else 3
|
||||
margin_type = additional_settings.margin_type or "ISOLATED_MARGIN"
|
||||
leverage = "10"
|
||||
leverage_to_buy = "10"
|
||||
leverage_to_sell = "10"
|
||||
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
|
||||
|
||||
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
|
||||
)
|
||||
|
||||
res = await set_switch_position_mode(
|
||||
tg_id=message.from_user.id, symbol=symbol, mode=mode
|
||||
)
|
||||
if res == "You have an existing position, so position mode cannot be switched":
|
||||
if mode == 0:
|
||||
mode = 3
|
||||
else:
|
||||
mode = 0
|
||||
await set_switch_position_mode(
|
||||
tg_id=message.from_user.id, symbol=symbol, mode=mode
|
||||
)
|
||||
if trade_mode == "Merged_Single":
|
||||
trade_mode = "Both_Sides"
|
||||
else:
|
||||
trade_mode = "Merged_Single"
|
||||
await rq.set_trade_mode(tg_id=message.from_user.id, trade_mode=trade_mode)
|
||||
|
||||
await set_margin_mode(tg_id=message.from_user.id, margin_mode=margin_type)
|
||||
|
||||
if margin_type == "ISOLATED_MARGIN":
|
||||
await set_leverage_to_buy_and_sell(
|
||||
tg_id=message.from_user.id,
|
||||
symbol=symbol,
|
||||
leverage_to_buy=str(leverage_to_buy),
|
||||
leverage_to_sell=str(leverage_to_sell),
|
||||
)
|
||||
else:
|
||||
await set_leverage(
|
||||
tg_id=message.from_user.id, symbol=symbol, leverage=str(leverage)
|
||||
)
|
||||
|
||||
await rq.set_leverage(tg_id=message.from_user.id, leverage=str(leverage))
|
||||
await rq.set_leverage_to_buy_and_sell(
|
||||
tg_id=message.from_user.id,
|
||||
leverage_to_buy=str(leverage_to_buy),
|
||||
leverage_to_sell=str(leverage_to_sell),
|
||||
)
|
||||
await rq.set_limit_price(tg_id=message.from_user.id, limit_price=0)
|
||||
await rq.set_trigger_price(tg_id=message.from_user.id, trigger_price=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)
|
Reference in New Issue
Block a user