import logging.config import app.telegram.Keyboards.inline_keyboards as inline_markup from aiogram import Router, F from aiogram.types import Message, CallbackQuery from aiogram.fsm.context import FSMContext import app.telegram.database.requests as rq from app.states.States import condition_settings from app.states.States import state_limit_price, state_update_entry_type, state_trigger_price from logger_helper.logger_helper import LOGGING_CONFIG logging.config.dictConfig(LOGGING_CONFIG) logger = logging.getLogger("condition_settings") condition_settings_router = Router() async def reg_new_user_default_condition_settings(id): tg_id = id trigger = await rq.get_for_registration_trigger(tg_id) await rq.set_new_user_default_condition_settings(tg_id, trigger) async def main_settings_message(id, message): data = await rq.get_user_main_settings(id) entry_order_type = data['entry_order_type'] if entry_order_type == "Market": entry_order_type_rus = "Маркет" elif entry_order_type == "Limit": entry_order_type_rus = "Лимит" else: entry_order_type_rus = "Условный" trigger_price = data['trigger_price'] or 0.0 limit_price = data['limit_order_price'] or 0.0 text = f""" Условия запуска - Таймер: установить таймер / удалить таймер - Тип позиции: {entry_order_type_rus} - Триггер цена: {trigger_price:,.4f} - Лимит цена: {limit_price:,.4f} """ await message.answer(text=text, parse_mode='html', reply_markup=inline_markup.condition_settings_markup) async def timer_message(id, message: Message, state: FSMContext): await state.set_state(condition_settings.timer) timer_info = await rq.get_user_timer(id) if timer_info is None: await message.answer("Таймер не установлен.", reply_markup=inline_markup.timer_markup) return await message.answer( f"Таймер установлен на: {timer_info['timer_minutes']} мин\n", reply_markup=inline_markup.timer_markup ) @condition_settings_router.callback_query(F.data == "clb_set_timer") async def set_timer_callback(callback: CallbackQuery, state: FSMContext): await state.set_state(condition_settings.timer) # состояние для ввода времени await callback.message.answer("Введите время работы в минутах (например, 60):", reply_markup=inline_markup.cancel) await callback.answer() @condition_settings_router.message(condition_settings.timer) async def process_timer_input(message: Message, state: FSMContext): try: minutes = int(message.text) if minutes <= 0: await message.reply("Введите число больше нуля.") return await rq.update_user_timer(message.from_user.id, minutes) logger.info("Timer set for user %s: %s minutes", message.from_user.id, minutes) await timer_message(message.from_user.id, message, state) await state.clear() except ValueError: await message.reply("Пожалуйста, введите корректное число.") @condition_settings_router.callback_query(F.data == "clb_delete_timer") async def delete_timer_callback(callback: CallbackQuery, state: FSMContext): await state.clear() await rq.update_user_timer(callback.from_user.id, 0) logger.info("Timer deleted for user %s", callback.from_user.id) await timer_message(callback.from_user.id, callback.message, state) await callback.answer() @condition_settings_router.callback_query(F.data == 'clb_update_entry_type') async def update_entry_type_message(callback: CallbackQuery, state: FSMContext) -> None: """ Запрашивает у пользователя тип входа в позицию (Market или Limit). """ await state.set_state(state_update_entry_type.entry_type) await callback.message.answer("Выберите тип входа в позицию:", reply_markup=inline_markup.entry_order_type_markup) await callback.answer() @condition_settings_router.callback_query(lambda c: c.data and c.data.startswith('entry_order_type:')) async def entry_order_type_callback(callback: CallbackQuery, state: FSMContext) -> None: """ Обработка выбора типа входа в позицию. Если Limit, запрашивает цену лимитного ордера. Если Market — обновляет настройки. """ order_type = callback.data.split(':')[1] if order_type not in ['Market', 'Limit']: await callback.answer("Ошибка выбора", show_alert=True) return if order_type == 'Limit': order_type_rus = 'Лимит' else: order_type_rus = 'Маркет' try: await state.update_data(entry_order_type=order_type) await rq.update_entry_order_type(callback.from_user.id, order_type) await callback.message.answer(f"Выбран тип входа {order_type_rus}", reply_markup=inline_markup.back_to_condition_settings) await callback.answer() except Exception as e: logger.error("Произошла ошибка при обновлении типа входа в позицию: %s", e) await callback.message.answer("Произошла ошибка при обновлении типа входа в позицию", reply_markup=inline_markup.back_to_condition_settings) await state.clear() @condition_settings_router.callback_query(F.data == 'clb_change_limit_price') async def set_limit_price_callback(callback: CallbackQuery, state: FSMContext) -> None: await state.set_state(state_limit_price.price) await callback.message.answer("Введите цену лимитного ордера:", reply_markup=inline_markup.cancel) await callback.answer() @condition_settings_router.message(state_limit_price.price) async def process_limit_price_input(message: Message, state: FSMContext) -> None: try: price = float(message.text) await state.update_data(price=price) await rq.update_limit_price(tg_id=message.from_user.id, price=price) await message.answer(f"Цена лимитного ордера установлена: {price}", reply_markup=inline_markup.back_to_condition_settings) await state.clear() except ValueError: await message.reply("Пожалуйста, введите корректную цену.") @condition_settings_router.callback_query(F.data == 'clb_change_trigger_price') async def change_trigger_price_callback(callback: CallbackQuery, state: FSMContext) -> None: await state.set_state(state_trigger_price.price) await callback.message.answer("Введите цену триггера:", reply_markup=inline_markup.cancel) await callback.answer() @condition_settings_router.message(state_trigger_price.price) async def process_trigger_price_input(message: Message, state: FSMContext) -> None: try: price = float(message.text) await state.update_data(price=price) await rq.update_trigger_price(tg_id=message.from_user.id, price=price) await message.answer(f"Цена триггера установлена: {price}", reply_markup=inline_markup.back_to_condition_settings) await state.clear() except ValueError: await message.reply("Пожалуйста, введите корректную цену.") async def filter_volatility_message(message, state): text = '''Фильтр волатильности Описание... ''' await message.answer(text=text, parse_mode='html', reply_markup=inline_markup.buttons_on_off_markup) async def external_cues_message(message, state): text = '''Внешние сигналы Описание... ''' await message.answer(text=text, parse_mode='html', reply_markup=None) async def trading_cues_message(message, state): text = '''Использование сигналов Описание... ''' await message.answer(text=text, parse_mode='html', reply_markup=inline_markup.buttons_yes_no_markup) async def webhook_message(message, state): text = '''Скиньте ссылку на webhook (если есть trading view): ''' await message.answer(text=text, parse_mode='html') async def ai_analytics_message(message, state): text = '''ИИ - Аналитика Описание... ''' await message.answer(text=text, parse_mode='html', reply_markup=inline_markup.buttons_yes_no_markup)