domovoy_bot/utils/validators.py
Admin ba4676b0af v1.0 MVP - Инициализация проекта 🏠
 Регистрация и верификация жильцов
 Рейтинг активности (уровни)
 Детект шпионов (Score 0-100)
 Анти-мат система (3 предупреждения → бан)
 Админ-панель с рассылкой
 Учёт квартир (несколько жильцов)
 Телефоны экстренных служб и мастеров
 Еженедельный экспорт JSON
 Прокси (socks5) для обхода РКН

Бекап: backups/versions/v1.0_mvp_2026-02-26/

Co-authored-by: Qwen-Coder <qwen-coder@alibabacloud.com>
2026-02-27 10:54:16 +00:00

85 lines
2.6 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

"""
Валидация данных
"""
import re
def validate_apartment(apartment: str) -> bool:
"""
Проверка номера квартиры
Допустимы: цифры, буквы (корпус/строение), дефисы
Примеры: 45, 12А, 100-1, 5к1
"""
if not apartment:
return False
# Убираем пробелы и приводим к верхнему регистру
apartment = apartment.strip().upper()
# Простая проверка: от 1 до 10 символов, есть хотя бы цифра
if len(apartment) > 10 or len(apartment) < 1:
return False
if not any(c.isdigit() for c in apartment):
return False
# Разрешённые символы: цифры, буквы, дефис, пробел, к/к (корпус)
pattern = r'^[0-9А-ЯA-Z\s\-/]+$'
return bool(re.match(pattern, apartment))
def validate_phone(phone: str) -> bool:
"""
Проверка телефона
Допустимы: +7, 8, скобки, дефисы, пробелы
"""
if not phone:
return False
# Убираем всё кроме цифр и +
cleaned = re.sub(r'[^\d+]', '', phone)
# Российские номера: +7 или 8, потом 10 цифр
if len(cleaned) == 11 and cleaned[0] in ('7', '8'):
return True
if len(cleaned) == 12 and cleaned[0] == '+' and cleaned[1] == '7':
return True
# Короткие номера (103, 112 и т.д.)
if len(cleaned) in (2, 3) and cleaned.isdigit():
return True
return False
def normalize_phone(phone: str) -> str:
"""Нормализация телефона к единому формату"""
cleaned = re.sub(r'[^\d+]', '', phone)
if len(cleaned) == 11 and cleaned[0] == '8':
return '+7' + cleaned[1:]
if len(cleaned) == 11 and cleaned[0] == '7':
return '+' + cleaned
if len(cleaned) == 12 and cleaned[0] == '+':
return cleaned
return phone # Короткие номера оставляем как есть
def is_generic_username(username: str) -> bool:
"""
Проверка, является ли никнейм «стандартным»
user12345, user_abc123 и т.п.
"""
if not username:
return True
# Паттерны стандартных ников
patterns = [
r'^user\d+$',
r'^user_\w+$',
r'^id\d+$',
r'^\d+$', # Просто цифры
]
return any(re.match(p, username.lower()) for p in patterns)