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>
65 lines
3.0 KiB
Python
65 lines
3.0 KiB
Python
from flask import Flask
|
||
from telebot import TeleBot, logger
|
||
from telebot.types import Message, InlineKeyboardMarkup, InlineKeyboardButton
|
||
from app.bot.keyboards.settings_menu import get_settings_menu
|
||
from app.bot.utils.helpers import get_user_subscribed_regions
|
||
from app import Subscriptions
|
||
from app.bot.utils.tg_audit import log_user_event
|
||
from app.extensions.db import db
|
||
from app.bot.states import UserStateManager
|
||
from app.bot.constants import UserStates
|
||
|
||
def process_unsubscribe_button(message: Message, app: Flask, bot: TeleBot, chat_id: int, state_manager: UserStateManager):
|
||
unsubbed_regions = []
|
||
invalid_regions = []
|
||
username = f"{message.from_user.username}" if message.from_user.username else "N/A"
|
||
|
||
parts = [part.strip() for part in message.text.split(',')]
|
||
if not parts or not all(part.isdigit() for part in parts):
|
||
markup = InlineKeyboardMarkup()
|
||
markup.add(InlineKeyboardButton('Отмена', callback_data='cancel_input'))
|
||
|
||
bot.send_message(chat_id,
|
||
"Неверный ввод, введите число(а) через запятую, либо нажмите отмена.",
|
||
reply_markup=markup)
|
||
|
||
def delayed_handler(msg):
|
||
process_unsubscribe_button(msg, app, bot, chat_id, state_manager)
|
||
|
||
bot.register_next_step_handler(message, delayed_handler)
|
||
return
|
||
|
||
region_ids = [int(part) for part in parts]
|
||
|
||
try:
|
||
with app.app_context():
|
||
valid_region_ids = [int(region[0]) for region in get_user_subscribed_regions(chat_id)]
|
||
|
||
for region_id in region_ids:
|
||
if region_id not in valid_region_ids:
|
||
invalid_regions.append(str(region_id))
|
||
continue
|
||
|
||
subscription = Subscriptions.query.filter_by(chat_id=chat_id, region_id=region_id).first()
|
||
if subscription:
|
||
subscription.active = False
|
||
db.session.add(subscription)
|
||
unsubbed_regions.append(str(region_id))
|
||
|
||
db.session.commit()
|
||
|
||
|
||
except Exception as e:
|
||
bot.send_message(chat_id, "⚠ Произошла ошибка при обработке запроса. Попробуйте позже.")
|
||
logger.error(f"Unexpected Error: {e}")
|
||
return
|
||
|
||
if unsubbed_regions:
|
||
bot.send_message(chat_id, f"✅ Вы успешно отписались от регионов: {', '.join(unsubbed_regions)}")
|
||
log_user_event(chat_id, app, username, f"Отписался от регионов: {', '.join(unsubbed_regions)}")
|
||
if invalid_regions:
|
||
bot.send_message(chat_id,
|
||
f"⚠ Регионы с ID {', '.join(invalid_regions)} не найдены среди ваших подписок и не были изменены.")
|
||
|
||
state_manager.set_state(chat_id, UserStates.SETTINGS_MENU)
|
||
bot.send_message(chat_id, "⚙ Вернулись в меню настроек.", reply_markup=get_settings_menu()) |