import logging.config from aiogram import F, Router from aiogram.fsm.context import FSMContext from aiogram.types import CallbackQuery import app.telegram.keyboards.inline as kbi import database.request as rq from app.bybit.get_functions.get_positions import ( get_active_orders, get_active_orders_by_symbol, get_active_positions, get_active_positions_by_symbol, ) from logger_helper.logger_helper import LOGGING_CONFIG logging.config.dictConfig(LOGGING_CONFIG) logger = logging.getLogger("get_positions_handlers") router_get_positions_handlers = Router(name="get_positions_handlers") @router_get_positions_handlers.callback_query(F.data == "my_deals") async def get_positions_handlers( callback_query: CallbackQuery, state: FSMContext ) -> None: """ Gets the user's active positions. :param callback_query: CallbackQuery object. :param state: FSMContext :return: None """ try: await state.clear() await callback_query.message.edit_text( text="Выберите какие сделки вы хотите посмотреть:", reply_markup=kbi.change_position, ) except Exception as e: logger.error("Error in get_positions_handler: %s", e) await callback_query.answer(text="Произошла ошибка при получении сделок.") @router_get_positions_handlers.callback_query(F.data == "change_position") async def get_positions_handler( callback_query: CallbackQuery, state: FSMContext ) -> None: """ Gets the user's active positions. :param callback_query: CallbackQuery object. :param state: FSMContext :return: None """ try: res = await get_active_positions(tg_id=callback_query.from_user.id) if res is None: await callback_query.answer( text="Произошла ошибка при получении активных позиций." ) return if res == ["No active positions found"]: await callback_query.answer(text="Нет активных позиций.") return await callback_query.message.edit_text( text="Ваши активные позиции:", reply_markup=kbi.create_active_positions_keyboard(res), ) except Exception as e: logger.error("Error in get_positions_handler: %s", e) await callback_query.answer( text="Произошла ошибка при получении активных позиций." ) finally: await state.clear() @router_get_positions_handlers.callback_query( lambda c: c.data.startswith("get_position_") ) async def get_position_handler(callback_query: CallbackQuery, state: FSMContext): try: symbol = callback_query.data.split("_", 2)[2] res = await get_active_positions_by_symbol( tg_id=callback_query.from_user.id, symbol=symbol ) if res is None: await callback_query.answer( text="Произошла ошибка при получении активных позиций." ) return symbol = res.get("symbol") or "Нет данных" avg_price = res.get("avgPrice") or "Нет данных" size = res.get("size") or "Нет данных" side = res.get("side") or "" side_rus = ( "Покупка" if side == "Buy" else "Продажа" if side == "Sell" else "Нет данных" ) take_profit = res.get("takeProfit") or "Нет данных" stop_loss = res.get("stopLoss") or "Нет данных" await callback_query.message.edit_text( text=f"Торговая пара: {symbol}\n" f"Цена входа: {avg_price}\n" f"Количество: {size}\n" f"Движение: {side_rus}\n" f"Тейк-профит: {take_profit}\n" f"Стоп-лосс: {stop_loss}\n", reply_markup=kbi.make_close_position_keyboard(symbol_pos=symbol), ) except Exception as e: logger.error("Error in get_position_handler: %s", e) await callback_query.answer( text="Произошла ошибка при получении активных позиций." ) finally: await state.clear() @router_get_positions_handlers.callback_query(F.data == "open_orders") async def get_open_orders_handler( callback_query: CallbackQuery, state: FSMContext ) -> None: """ Gets the user's open orders. :param callback_query: CallbackQuery object. :param state: FSMContext :return: None """ try: res = await get_active_orders(tg_id=callback_query.from_user.id) if res is None: await callback_query.answer( text="Произошла ошибка при получении активных ордеров." ) return if res == ["No active orders found"]: await callback_query.answer(text="Нет активных ордеров.") return await callback_query.message.edit_text( text="Ваши активные ордера:", reply_markup=kbi.create_active_orders_keyboard(res), ) except Exception as e: logger.error("Error in get_open_orders_handler: %s", e) await callback_query.answer( text="Произошла ошибка при получении активных ордеров." ) finally: await state.clear() @router_get_positions_handlers.callback_query(lambda c: c.data.startswith("get_order_")) async def get_order_handler(callback_query: CallbackQuery, state: FSMContext): try: symbol = callback_query.data.split("_", 2)[2] res = await get_active_orders_by_symbol( tg_id=callback_query.from_user.id, symbol=symbol ) if res is None: await callback_query.answer( text="Произошла ошибка при получении активных ордеров." ) return symbol = res.get("symbol") or "Нет данных" price = res.get("price") or "Нет данных" qty = res.get("qty") or "Нет данных" side = res.get("side") or "" side_rus = ( "Покупка" if side == "Buy" else "Продажа" if side == "Sell" else "Нет данных" ) order_type = res.get("orderType") or "" order_type_rus = ( "Рыночный" if order_type == "Market" else "Лимитный" if order_type == "Limit" else "Нет данных" ) trigger_price = res.get("triggerPrice") or "Нет данных" take_profit = res.get("takeProfit") or "Нет данных" stop_loss = res.get("stopLoss") or "Нет данных" await callback_query.message.edit_text( text=f"Торговая пара: {symbol}\n" f"Цена: {price}\n" f"Количество: {qty}\n" f"Движение: {side_rus}\n" f"Тип ордера: {order_type_rus}\n" f"Триггер цена: {trigger_price}\n" f"Тейк-профит: {take_profit}\n" f"Стоп-лосс: {stop_loss}\n", reply_markup=kbi.make_close_orders_keyboard(symbol_order=symbol), ) await rq.set_user_symbol(tg_id=callback_query.from_user.id, symbol=symbol) except Exception as e: logger.error("Error in get_order_handler: %s", e) await callback_query.answer( text="Произошла ошибка при получении активных ордеров." ) finally: await state.clear()