|
1 | 1 | """Обработчики для диалога создания покупки на бирже.""" |
2 | 2 |
|
3 | 3 | import logging |
4 | | -import re |
5 | 4 | from datetime import datetime |
6 | 5 |
|
7 | 6 | from aiogram.types import CallbackQuery, Message |
|
10 | 9 | from aiogram_dialog.widgets.kbd import Button, ManagedCalendar |
11 | 10 | from stp_database import MainRequestsRepo |
12 | 11 |
|
| 12 | +from tgbot.dialogs.events.common.exchanges.create.sell import ( |
| 13 | + create_datetime_for_shift, |
| 14 | + validate_time_range, |
| 15 | +) |
13 | 16 | from tgbot.dialogs.states.common.exchanges import ExchangeCreateBuy, Exchanges |
14 | 17 | from tgbot.services.notifications.subscription_matcher import ( |
15 | 18 | notify_matching_subscriptions, |
@@ -60,72 +63,33 @@ async def on_buy_hours_input( |
60 | 63 | data: str, |
61 | 64 | ) -> None: |
62 | 65 | """Обработчик ввода времени для покупки.""" |
63 | | - # Проверяем формат времени (09:00-13:00) |
64 | | - time_pattern = r"^(\d{1,2}):(\d{2})-(\d{1,2}):(\d{2})$" |
65 | | - match = re.match(time_pattern, data.strip()) |
66 | | - |
67 | | - if not match: |
68 | | - await message.answer( |
69 | | - "<b>❌ Неверный формат времени</b>\n\nИспользуй формат: 09:00-13:00" |
70 | | - ) |
71 | | - return |
72 | | - |
73 | | - start_hour, start_min, end_hour, end_min = map(int, match.groups()) |
74 | | - |
75 | | - # Проверяем валидность времени |
76 | | - if not ( |
77 | | - 0 <= start_hour <= 23 |
78 | | - and 0 <= start_min <= 59 |
79 | | - and 0 <= end_hour <= 23 |
80 | | - and 0 <= end_min <= 59 |
81 | | - ): |
82 | | - await message.answer("<b>❌ Неверное время</b>\n\nЧасы: 0-23, минуты: 0-59") |
83 | | - return |
84 | | - |
85 | | - if (start_min not in (0, 30)) or (end_min not in (0, 30)): |
86 | | - await message.answer( |
87 | | - "<b>❌ Неверное время</b>\n\nВремя должно начинаться и заканчиваться либо на 00 минутах, либо на 30 минутах часа" |
88 | | - ) |
89 | | - return |
90 | | - |
91 | | - start_time = f"{start_hour:02d}:{start_min:02d}" |
92 | | - end_time = f"{end_hour:02d}:{end_min:02d}" |
93 | | - |
94 | | - # Проверяем, что время начала меньше времени окончания |
95 | | - start_minutes = start_hour * 60 + start_min |
96 | | - end_minutes = end_hour * 60 + end_min |
97 | | - |
98 | | - if start_minutes >= end_minutes: |
99 | | - await message.answer( |
100 | | - "<b>❌ Неверное время</b>\n\nВремя начала должно быть раньше времени окончания" |
101 | | - ) |
| 66 | + # Используем ту же валидацию, что и в sell exchange |
| 67 | + is_valid, error_message = validate_time_range(data) |
| 68 | + if not is_valid: |
| 69 | + await message.answer(f"<b>❌ {error_message}</b>") |
102 | 70 | return |
103 | 71 |
|
104 | | - if end_minutes - start_minutes < 30: |
105 | | - await message.answer( |
106 | | - "<b>❌ Неверное время</b>\n\nМинимальная продолжительность: 30 минут" |
107 | | - ) |
108 | | - return |
| 72 | + # Извлекаем время начала и окончания |
| 73 | + start_time_str, end_time_str = data.split("-") |
| 74 | + start_time_str = start_time_str.strip() |
| 75 | + end_time_str = end_time_str.strip() |
109 | 76 |
|
110 | 77 | # Создаем timestamp для start_time и end_time |
111 | 78 | buy_date = dialog_manager.dialog_data.get("buy_date") |
112 | 79 |
|
113 | 80 | if buy_date: |
114 | | - # Если дата выбрана, создаем полные timestamp |
| 81 | + # Если дата выбрана, создаем полные timestamp с учетом ночных смен |
115 | 82 | shift_date = datetime.fromisoformat(buy_date) |
116 | | - start_datetime = datetime.combine( |
117 | | - shift_date.date(), datetime.strptime(start_time, "%H:%M").time() |
118 | | - ) |
119 | | - end_datetime = datetime.combine( |
120 | | - shift_date.date(), datetime.strptime(end_time, "%H:%M").time() |
| 83 | + start_datetime, end_datetime = create_datetime_for_shift( |
| 84 | + shift_date, start_time_str, end_time_str |
121 | 85 | ) |
122 | 86 |
|
123 | 87 | dialog_manager.dialog_data["start_time"] = start_datetime.isoformat() |
124 | 88 | dialog_manager.dialog_data["end_time"] = end_datetime.isoformat() |
125 | 89 | else: |
126 | 90 | # Если дата не выбрана, сохраняем только время |
127 | | - dialog_manager.dialog_data["start_time"] = start_time |
128 | | - dialog_manager.dialog_data["end_time"] = end_time |
| 91 | + dialog_manager.dialog_data["start_time"] = start_time_str |
| 92 | + dialog_manager.dialog_data["end_time"] = end_time_str |
129 | 93 |
|
130 | 94 | # Переходим к вводу цены |
131 | 95 | await dialog_manager.switch_to(ExchangeCreateBuy.price) |
@@ -224,15 +188,13 @@ async def on_confirm_buy( |
224 | 188 | start_time = datetime.fromisoformat(data["start_time"]) |
225 | 189 | end_time = datetime.fromisoformat(data["end_time"]) |
226 | 190 | else: |
227 | | - # Если дата не указана, создаем timestamp с условной датой |
| 191 | + # Если дата не указана, создаем timestamp с условной датой с учетом ночных смен |
228 | 192 | today = datetime.now().date() |
229 | 193 | start_time_str = data["start_time"] |
230 | 194 | end_time_str = data["end_time"] |
231 | | - start_time = datetime.combine( |
232 | | - today, datetime.strptime(start_time_str, "%H:%M").time() |
233 | | - ) |
234 | | - end_time = datetime.combine( |
235 | | - today, datetime.strptime(end_time_str, "%H:%M").time() |
| 195 | + today_datetime = datetime.combine(today, datetime.min.time()) |
| 196 | + start_time, end_time = create_datetime_for_shift( |
| 197 | + today_datetime, start_time_str, end_time_str |
236 | 198 | ) |
237 | 199 | else: |
238 | 200 | # Если время не указано, устанавливаем весь день (00:00 - 23:59) |
|
0 commit comments