diff --git a/app/telegram/Keyboards/inline_keyboards.py b/app/telegram/Keyboards/inline_keyboards.py index 140c05e..ae1cb2c 100644 --- a/app/telegram/Keyboards/inline_keyboards.py +++ b/app/telegram/Keyboards/inline_keyboards.py @@ -6,10 +6,15 @@ start_markup = InlineKeyboardMarkup(inline_keyboard=[ ]) settings_markup = InlineKeyboardMarkup(inline_keyboard=[ - [InlineKeyboardButton(text="Настройки", callback_data='clb_settings_message')], [InlineKeyboardButton(text="Запуск", callback_data='clb_start_trading')] ]) +back_btn_list_settings = [InlineKeyboardButton(text="Назад", + callback_data='clb_back_to_special_settings_message')] # Кнопка для возврата к списку каталога настроек +back_btn_list_settings_markup = InlineKeyboardMarkup(inline_keyboard=[[InlineKeyboardButton(text="Назад", + callback_data='clb_back_to_special_settings_message')]]) # Клавиатура для возврата к списку каталога настроек +back_btn_to_main = [InlineKeyboardButton(text="На главную", callback_data='clb_back_to_main')] + back_btn_profile = [InlineKeyboardButton(text="Назад", callback_data='clb_start_chatbot_message')] special_settings_markup = InlineKeyboardMarkup(inline_keyboard=[ @@ -20,8 +25,6 @@ special_settings_markup = InlineKeyboardMarkup(inline_keyboard=[ InlineKeyboardButton(text="Дополнительные параметры", callback_data='clb_change_additional_settings')], [InlineKeyboardButton(text="Подключить Bybit", callback_data='clb_new_user_connect_bybit_api_message')], - - back_btn_profile ]) connect_bybit_api_markup = InlineKeyboardMarkup(inline_keyboard=[ @@ -32,7 +35,7 @@ trading_markup = InlineKeyboardMarkup(inline_keyboard=[ [InlineKeyboardButton(text="Настройки", callback_data='clb_settings_message')], [InlineKeyboardButton(text="Мои сделки", callback_data='clb_my_deals')], [InlineKeyboardButton(text="Указать торговую пару", callback_data='clb_update_trading_pair')], - [InlineKeyboardButton(text="Начать торговлю", callback_data='clb_update_entry_type')], + [InlineKeyboardButton(text="Начать торговать", callback_data='clb_update_entry_type')], [InlineKeyboardButton(text="Остановить торговлю", callback_data='clb_stop_trading')], ]) @@ -52,15 +55,11 @@ entry_order_type_markup = InlineKeyboardMarkup( [ InlineKeyboardButton(text="Market (текущая цена)", callback_data="entry_order_type:Market"), InlineKeyboardButton(text="Limit (фиксированная цена)", callback_data="entry_order_type:Limit"), - ], + ], back_btn_to_main ] ) -back_btn_list_settings = [InlineKeyboardButton(text="Назад", - callback_data='clb_back_to_special_settings_message')] # Кнопка для возврата к списку каталога настроек -back_btn_list_settings_markup = InlineKeyboardMarkup(inline_keyboard=[[InlineKeyboardButton(text="Назад", - callback_data='clb_back_to_special_settings_message')]]) # Клавиатура для возврата к списку каталога настроек -back_btn_to_main = [InlineKeyboardButton(text="На главную", callback_data='clb_back_to_main')] + back_to_main = InlineKeyboardMarkup(inline_keyboard=[ [InlineKeyboardButton(text="На главную", callback_data='back_to_main')], @@ -68,6 +67,7 @@ back_to_main = InlineKeyboardMarkup(inline_keyboard=[ main_settings_markup = InlineKeyboardMarkup(inline_keyboard=[ [InlineKeyboardButton(text='Режим торговли', callback_data='clb_change_trading_mode'), + InlineKeyboardButton(text='Режим свитч', callback_data='clb_change_switch_mode'), InlineKeyboardButton(text='Тип маржи', callback_data='clb_change_margin_type')], [InlineKeyboardButton(text='Размер кредитного плеча', callback_data='clb_change_size_leverage'), @@ -120,9 +120,7 @@ additional_settings_markup = InlineKeyboardMarkup(inline_keyboard=[ trading_mode_markup = InlineKeyboardMarkup(inline_keyboard=[ [InlineKeyboardButton(text="Лонг", callback_data="trade_mode_long"), - InlineKeyboardButton(text="Шорт", callback_data="trade_mode_short")], - - [InlineKeyboardButton(text="Свитч", callback_data="trade_mode_switch"), + InlineKeyboardButton(text="Шорт", callback_data="trade_mode_short"), InlineKeyboardButton(text="Смарт", callback_data="trade_mode_smart")], back_btn_list_settings, @@ -138,9 +136,11 @@ margin_type_markup = InlineKeyboardMarkup(inline_keyboard=[ ]) trigger_markup = InlineKeyboardMarkup(inline_keyboard=[ # ИЗМЕНИТЬ НА INLINE - [InlineKeyboardButton(text='Ручной', callback_data="clb_trigger_ruchnoy"), - InlineKeyboardButton(text='TradingView', callback_data="clb_trigger_tradingview")], - [InlineKeyboardButton(text="Автоматический", callback_data="clb_trigger_auto")] + [InlineKeyboardButton(text='Ручной', callback_data="clb_trigger_manual")], + # [InlineKeyboardButton(text='TradingView', callback_data="clb_trigger_tradingview")], + [InlineKeyboardButton(text="Автоматический", callback_data="clb_trigger_auto")], + back_btn_list_settings, + back_btn_to_main ]) buttons_yes_no_markup = InlineKeyboardMarkup(inline_keyboard=[ @@ -185,7 +185,6 @@ def create_close_deal_markup(symbol: str) -> InlineKeyboardMarkup: def create_close_limit_markup(symbol: str) -> InlineKeyboardMarkup: return InlineKeyboardMarkup(inline_keyboard=[ [InlineKeyboardButton(text="Закрыть лимитный ордер", callback_data=f"close_limit:{symbol}")], - [InlineKeyboardButton(text="Установить TP/SL", callback_data="clb_set_tp_sl_")], back_btn_to_main ]) @@ -194,10 +193,6 @@ timer_markup = InlineKeyboardMarkup(inline_keyboard=[ back_btn_to_main ]) -cancel_start_markup = InlineKeyboardMarkup(inline_keyboard=[ - [InlineKeyboardButton(text="Отменить таймер", callback_data="clb_stop_timer")] -]) - stop_choice_markup = InlineKeyboardMarkup( inline_keyboard=[ [ @@ -205,4 +200,16 @@ stop_choice_markup = InlineKeyboardMarkup( InlineKeyboardButton(text="Остановить по таймеру", callback_data="stop_with_timer"), ] ] -) \ No newline at end of file +) + +buttons_on_off_markup_for_switch = InlineKeyboardMarkup(inline_keyboard=[ # ИЗМЕНИТЬ НА INLINE + [InlineKeyboardButton(text='Включить', callback_data="clb_on_switch"), + InlineKeyboardButton(text='Выключить', callback_data="clb_off_switch")], + [InlineKeyboardButton(text="Изменить состояние", callback_data="clb_switch_state")], + back_btn_to_main +]) + +switch_state_markup = InlineKeyboardMarkup(inline_keyboard=[ + [InlineKeyboardButton(text='Long', callback_data="clb_long_switch"), + InlineKeyboardButton(text='Short', callback_data="clb_short_switch")], +]) \ No newline at end of file diff --git a/app/telegram/handlers/handlers.py b/app/telegram/handlers/handlers.py index d5a45df..3152ae5 100644 --- a/app/telegram/handlers/handlers.py +++ b/app/telegram/handlers/handlers.py @@ -12,7 +12,9 @@ import app.telegram.functions.condition_settings.settings as func_condition_sett import app.telegram.functions.additional_settings.settings as func_additional_settings import app.telegram.database.requests as rq -import app.telegram.Keyboards.reply_keyboards as reply_markup + +from app.services.Bybit.functions.balance import get_balance +from app.services.Bybit.functions.bybit_ws import run_ws_for_user from logger_helper.logger_helper import LOGGING_CONFIG @@ -26,16 +28,11 @@ router = Router() async def start_message(message: Message) -> None: """ Обработчик команды /start. - Запускает WebSocket для пользователя и инициализирует нового пользователя в БД. + Инициализирует нового пользователя в БД. Args: message (Message): Входящее сообщение с командой /start. """ - from BybitBot_API import run_ws_for_user - tg_id = message.from_user.id - asyncio.create_task(run_ws_for_user(tg_id, message)) - logger.info(f"Получение event loop") - await rq.set_new_user_bybit_api(message.from_user.id) await func.start_message(message) @@ -50,26 +47,14 @@ async def profile_message(message: Message) -> None: message (Message): Сообщение с текстом кнопки. """ user = await rq.check_user(message.from_user.id) - - if user: + tg_id = message.from_user.id + balance = await get_balance(message.from_user.id, message) + if user and balance: + asyncio.create_task(run_ws_for_user(tg_id, message)) + logger.info(f"Получение event loop") await func.profile_message(message.from_user.username, message) -@router.message(F.text == "Настройки") -async def settings_msg(message: Message) -> None: - """ - Обработчик кнопки 'Настройки'. - Проверяет пользователя и отображает меню настроек. - - Args: - message (Message): Сообщение с текстом кнопки. - """ - user = await rq.check_user(message.from_user.id) - - if user: - await func.settings_message(message) - - @router.callback_query(F.data == "clb_start_chatbot_message") async def clb_profile_msg(callback: CallbackQuery) -> None: """ @@ -81,12 +66,12 @@ async def clb_profile_msg(callback: CallbackQuery) -> None: callback (CallbackQuery): Полученный колбэк. """ user = await rq.check_user(callback.from_user.id) - + balance = await get_balance(callback.from_user.id, callback.message) first_name = callback.from_user.first_name or "" last_name = callback.from_user.last_name or "" username = f"{first_name} {last_name}".strip() or callback.from_user.username or "Пользователь" - if user: + if user and balance: await func.profile_message(callback.from_user.username, callback.message) else: await rq.save_tg_id_new_user(callback.from_user.id) @@ -94,13 +79,9 @@ async def clb_profile_msg(callback: CallbackQuery) -> None: await func_main_settings.reg_new_user_default_main_settings(callback.from_user.id, callback.message) await func_rmanagement_settings.reg_new_user_default_risk_management_settings(callback.from_user.id, callback.message) - await func_condition_settings.reg_new_user_default_condition_settings(callback.from_user.id, callback.message) + await func_condition_settings.reg_new_user_default_condition_settings(callback.from_user.id) await func_additional_settings.reg_new_user_default_additional_settings(callback.from_user.id, callback.message) - await callback.message.answer(f'Здравствуйте, {username}!', reply_markup=reply_markup.base_buttons_markup) - - await func.profile_message(username, callback.message) - await callback.answer() @@ -166,7 +147,7 @@ async def clb_change_condition_message(callback: CallbackQuery, state: FSMContex callback (CallbackQuery): полученный колбэк. state (FSMContext): текущее состояние FSM. """ - await func_condition_settings.main_settings_message(callback.from_user.id, callback.message, state) + await func_condition_settings.main_settings_message(callback.from_user.id, callback.message) await callback.answer() @@ -187,6 +168,7 @@ async def clb_change_additional_message(callback: CallbackQuery, state: FSMConte # Конкретные настройки каталогов list_main_settings = ['clb_change_trading_mode', + 'clb_change_switch_mode', 'clb_change_margin_type', 'clb_change_size_leverage', 'clb_change_starting_quantity', @@ -210,6 +192,8 @@ async def clb_main_settings_msg(callback: CallbackQuery, state: FSMContext) -> N match callback.data: case 'clb_change_trading_mode': await func_main_settings.trading_mode_message(callback.message, state) + case 'clb_change_switch_mode': + await func_main_settings.switch_mode_enabled_message(callback.message, state) case 'clb_change_margin_type': await func_main_settings.margin_type_message(callback.message, state) case 'clb_change_size_leverage': @@ -280,7 +264,7 @@ async def clb_condition_settings_msg(callback: CallbackQuery, state: FSMContext) try: match callback.data: case 'clb_change_trigger': - await func_condition_settings.trigger_message(callback.message, state) + await func_condition_settings.trigger_message(callback.from_user.id, callback.message, state) case 'clb_change_timer': await func_condition_settings.timer_message(callback.from_user.id, callback.message, state) case 'clb_change_filter_volatility':