Напоминалки: выбор часового пояса кнопками городов + ручной ввод

При гейте часового пояса теперь показывается клавиатура с частыми
российскими городами-поясами (Калининград..Камчатка). Клик по кнопке
шлёт 'Город, UTC+N' — _parse_tz_offset распознаёт и это, и обычный
ручной ввод вида '+3'/'-5', если своего города в списке нет.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
This commit is contained in:
Kenik
2026-09-05 15:18:29 +03:00
parent 0085195941
commit e41db35f13
3 changed files with 49 additions and 9 deletions
+15 -9
View File
@@ -488,12 +488,16 @@ class VKBotApplication:
return f"{name} (vk.com/id{uid})" if name else f"vk.com/id{uid}"
def _parse_tz_offset(self, raw: str) -> Optional[int]:
"""Парсит смещение от UTC вида '+3', '-5', '0'. None, если не число
или вне диапазона реальных часовых поясов (-12..+14)."""
"""Парсит смещение от UTC: либо чистое число '+3'/'-5'/'0' (ручной ввод),
либо 'Город, UTC+N' (клик по кнопке get_timezone_keyboard). None, если
не удалось распознать или число вне диапазона реальных поясов (-12..+14)."""
raw = raw.strip()
if not re.match(r"^[+-]?\d{1,2}$", raw):
m = re.search(r"UTC\s*([+-]?\d{1,2})\s*$", raw, re.I)
if not m:
m = re.match(r"^([+-]?\d{1,2})$", raw)
if not m:
return None
val = int(raw)
val = int(m.group(1))
return val if -12 <= val <= 14 else None
def _require_reminder_tz(self, user_id: int) -> bool:
@@ -505,9 +509,10 @@ class VKBotApplication:
db.update_user_state(user_id, "ADMIN_REMINDER_TZ_SETUP")
self.send_message(
user_id,
"🌐 Прежде чем пользоваться напоминалками, укажите свой часовой пояс "
"относительно UTC.\nНапример: +3 (Москва), +5 (Екатеринбург), 0 (UTC).",
keyboard=get_cancel_admin_keyboard()
"🌐 Прежде чем пользоваться напоминалками, укажите свой часовой пояс.\n"
"Выберите город кнопкой ниже, либо введите смещение от UTC вручную "
"(например, +3), если своего города в списке нет.",
keyboard=get_timezone_keyboard()
)
return False
@@ -1784,8 +1789,9 @@ class VKBotApplication:
if state == "ADMIN_REMINDER_TZ_SETUP":
offset = self._parse_tz_offset(text)
if offset is None:
self.send_message(user_id, "⚠️ Формат: число от -12 до +14, например +3 или -5.",
keyboard=get_cancel_admin_keyboard())
self.send_message(user_id, "⚠️ Выберите город кнопкой ниже, либо введите число "
"от -12 до +14 вручную, например +3 или -5.",
keyboard=get_timezone_keyboard())
return
db.set_admin_tz_offset(user_id, offset)
db.update_user_state(user_id, "FREE_CHAT")