/
ARCHAEUS
/
archaeus22-bot
Обзор
Документация
Войти
/
ARCHAEUS
/
archaeus22-bot
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
Безопасность
master
utils.py
137 строк
5 KB
ARCHAEUS
Update: utils.py
08 авг 2026, 02:10
Верифицирован
08 авг 2026, 02:10
0ec0658
Код
Авторство
О чём код?
# ============================================================ # ВСПОМОГАТЕЛЬНЫЕ ФУНКЦИИ ДЛЯ БОТА «АРХЕЙ22» (ARCHAEUS22) # ============================================================ from datetime import datetime from geopy.geocoders import Nominatim from geopy.exc import GeocoderTimedOut, GeocoderUnavailable # ============================================================ # 1. ГЕОКОДЕР (ОПРЕДЕЛЕНИЕ КООРДИНАТ ПО ГОРОДУ) # ============================================================ # Инициализация геокодера (один раз при старте) _geolocator = Nominatim(user_agent="archaeus_bot", timeout=10) def get_coords(city: str) -> tuple: """ Определяет координаты (широта, долгота) по названию города. Использует геокодер Nominatim. Возвращает (latitude, longitude) или (None, None), если город не найден. """ try: location = _geolocator.geocode(city, language='ru') if location: return (location.latitude, location.longitude) except (GeocoderTimedOut, GeocoderUnavailable): # Если геокодер недоступен — возвращаем None pass # Город не найден или геокодер недоступен return (None, None) # ============================================================ # 2. ВАЛИДАЦИЯ ДАННЫХ # ============================================================ def validate_name(name: str) -> bool: """Проверяет, что имя содержит хотя бы два слова.""" parts = name.strip().split() return len(parts) >= 2 def validate_date(date_str: str) -> bool: """Проверяет корректность даты в формате ГГГГ-ММ-ДД.""" try: datetime.strptime(date_str, "%Y-%m-%d") return True except ValueError: return False def validate_time(time_str: str) -> bool: """Проверяет корректность времени в формате ЧЧ:ММ.""" try: datetime.strptime(time_str, "%H:%M") return True except ValueError: return False # ============================================================ # 3. РАЗБИВКА ДЛИННЫХ СООБЩЕНИЙ # ============================================================ def split_long_message(text: str, max_len: int = 4096) -> list: """ Разбивает длинное сообщение на части, не разрывая слова. Возвращает список строк, каждая длиной не более max_len символов. """ if len(text) <= max_len: return [text] parts = [] lines = text.split('\n') current = "" for line in lines: if len(current) + len(line) + 1 <= max_len: current += line + '\n' else: if current: parts.append(current.strip()) current = line + '\n' if current: parts.append(current.strip()) return parts # ============================================================ # 4. НУМЕРОЛОГИЧЕСКИЕ УТИЛИТЫ # ============================================================ def reduce_to_single(n: int) -> int: """ Сворачивает число до однозначного, но сохраняет мастер-числа 11, 22, 33. """ if n in [11, 22, 33]: return n while n > 9: n = sum(int(d) for d in str(n)) return n def cap_at_22(n: int) -> int: """ Приводит число к диапазону 1-22 (для арканов Таро / Матрицы судьбы). """ n = n % 22 return 22 if n == 0 else n # ============================================================ # 5. АСТРОЛОГИЧЕСКАЯ УТИЛИТА # ============================================================ def get_sign_by_degree(deg: float) -> str: """ Возвращает название знака зодиака по градусу (0-360). """ signs = [ "Овен", "Телец", "Близнецы", "Рак", "Лев", "Дева", "Весы", "Скорпион", "Стрелец", "Козерог", "Водолей", "Рыбы" ] return signs[int(deg // 30) % 12] # ============================================================ # 6. ДОПОЛНИТЕЛЬНАЯ УТИЛИТА — БЕЗОПАСНОЕ ПОЛУЧЕНИЕ ДАННЫХ # ============================================================ def safe_get(data: dict, key: str, default=None): """Безопасно получает значение из словаря.""" try: return data.get(key, default) except AttributeError: return default