All checks were successful
Build and Push Docker Images / build (push) Successful in 1m28s
- Рефакторинг Telegram бота на модульную структуру для удобства поддержки и расширения - Создан общий RabbitMQ клиент для Flask и Telegram компонентов - Подготовлена базовая архитектура для будущего масштабирования и новых функций Signed-off-by: UdoChudo <stream@udochudo.ru>
47 lines
2.3 KiB
Python
47 lines
2.3 KiB
Python
|
||
from telebot.types import Message, InlineKeyboardMarkup, InlineKeyboardButton
|
||
|
||
from app import Subscriptions
|
||
from app.bot.constants import UserStates
|
||
from app.bot.processors.subscribe_processor import process_subscription_button
|
||
from app.bot.states import UserStateManager
|
||
from app.bot.utils.auth import auth
|
||
from app.bot.utils.regions import get_sorted_regions, format_regions_list, format_regions_list_marked
|
||
from telebot import TeleBot, logger
|
||
|
||
|
||
def register_handlers(bot: TeleBot, app, state_manager: UserStateManager):
|
||
@bot.message_handler(commands=['subscribe'])
|
||
@bot.message_handler(func=lambda msg: msg.text == "Подписаться")
|
||
def handle_subscribe_button(message: Message):
|
||
with app.app_context():
|
||
chat_id = message.chat.id
|
||
username = f"{message.from_user.username}" if message.from_user.username else "N/A"
|
||
if not auth(chat_id, app):
|
||
bot.send_message(chat_id, "Вы не авторизованы для использования этого бота.")
|
||
logger.warning(f"Неавторизованный пользователь {chat_id} @{username}")
|
||
state_manager.set_state(chat_id, UserStates.REGISTRATION)
|
||
return
|
||
else:
|
||
state_manager.set_state(chat_id, UserStates.WAITING_INPUT)
|
||
|
||
# Получаем регионы
|
||
regions = get_sorted_regions()
|
||
|
||
# Получаем список подписанных регионов пользователя
|
||
subscribed = {s.region_id for s in Subscriptions.query.filter_by(chat_id=chat_id, active=True).all()}
|
||
|
||
|
||
# Формируем строку с пометками
|
||
regions_text = format_regions_list_marked(regions, subscribed)
|
||
|
||
markup = InlineKeyboardMarkup()
|
||
markup.add(InlineKeyboardButton(text="Отмена", callback_data="cancel_input"))
|
||
|
||
bot_message = bot.send_message(chat_id,
|
||
f"Введите номер(а) региона(ов) через запятую для подписки:\n\n{regions_text}",
|
||
reply_markup=markup)
|
||
|
||
bot.register_next_step_handler(message, process_subscription_button, app, bot, chat_id, state_manager, bot_message.message_id)
|
||
|