Telezab/app/bot/utils/helpers.py
UdoChudo ccb47d527f
All checks were successful
Build and Push Docker Images / build (push) Successful in 1m28s
refactor: modularize Telegram bot and add RabbitMQ client foundation
- Рефакторинг Telegram бота на модульную структуру для удобства поддержки и расширения
- Создан общий RabbitMQ клиент для Flask и Telegram компонентов
- Подготовлена базовая архитектура для будущего масштабирования и новых функций

Signed-off-by: UdoChudo <stream@udochudo.ru>
2025-06-16 09:08:46 +05:00

56 lines
1.9 KiB
Python
Raw Permalink 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.

from datetime import datetime, timezone
import telebot
from app.extensions.db import db
from app.models.users import Users
from app.models.regions import Regions
from app.models.subscriptions import Subscriptions
from app.models.userevents import UserEvents
def is_whitelisted(chat_id: int) -> tuple[bool, str | None]:
"""Проверяет, есть ли пользователь с заданным chat_id и не заблокирован ли он."""
user = Users.query.filter_by(chat_id=chat_id).first()
if user:
if user.is_blocked:
return False, "Ваш доступ заблокирован."
return True, None
return False, None
def get_sorted_regions() -> list[tuple[int, str]]:
"""Возвращает список всех активных регионов, отсортированных по region_id."""
return (
Regions.query
.filter_by(active=True)
.with_entities(Regions.region_id, Regions.region_name)
.order_by(Regions.region_id.asc())
.all()
)
def get_user_subscribed_regions(chat_id: int) -> list[tuple[int, str]]:
"""Возвращает список активных подписанных регионов пользователя."""
regions = (
Regions.query
.join(Subscriptions, Subscriptions.region_id == Regions.region_id)
.filter(
Subscriptions.chat_id == chat_id,
Subscriptions.active.is_(True),
Subscriptions.skip.is_(False),
Regions.active.is_(True)
)
.with_entities(Regions.region_id, Regions.region_name)
.order_by(Regions.region_id.asc())
.all()
)
return regions
def format_regions_list(regions: list[tuple[int, str]]) -> str:
"""Форматирует список регионов для отображения."""
return '\n'.join(f"{region_id} - {region_name}" for region_id, region_name in regions)