Fixed a bug where the subscription handler failed when MessageID was not properly received, causing the process to break or behave unexpectedly. Signed-off-by: UdoChudo <stream@udochudo.ru>
78 lines
3.5 KiB
Python
78 lines
3.5 KiB
Python
from telebot.types import Message, InlineKeyboardMarkup, InlineKeyboardButton, MessageID
|
||
|
||
from app import Regions, Subscriptions
|
||
from app.bot.constants import UserStates
|
||
from app.bot.keyboards.settings_menu import get_settings_menu
|
||
from app.bot.utils.tg_audit import log_user_event
|
||
from app.extensions.db import db
|
||
|
||
|
||
def process_subscription_button(message: Message, app, bot, chat_id: int, state_manager, bot_message: MessageID):
|
||
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(text="Отмена", callback_data="cancel_input"))
|
||
|
||
bot.send_message(chat_id,
|
||
"❌ Неверный ввод, введите число(а) через запятую, либо нажмите отмена.",
|
||
reply_markup=markup)
|
||
|
||
def delayed_handler(msg):
|
||
message_id = msg.message_id
|
||
process_subscription_button(msg, app, bot, chat_id, state_manager, message_id)
|
||
|
||
bot.register_next_step_handler(message, delayed_handler)
|
||
return
|
||
bot.delete_message(chat_id, bot_message)
|
||
region_ids = [int(part) for part in parts]
|
||
|
||
try:
|
||
with app.app_context():
|
||
valid_region_ids = [r.region_id for r in Regions.query.filter(Regions.active == True).all()]
|
||
|
||
subbed_regions = []
|
||
invalid_regions = []
|
||
|
||
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:
|
||
if not subscription.active:
|
||
subscription.active = True
|
||
db.session.add(subscription)
|
||
subbed_regions.append(str(region_id))
|
||
else:
|
||
new_sub = Subscriptions(chat_id=chat_id, region_id=region_id, active=True)
|
||
db.session.add(new_sub)
|
||
subbed_regions.append(str(region_id))
|
||
|
||
db.session.commit()
|
||
|
||
except Exception as e:
|
||
bot.send_message(chat_id, "⚠️ Произошла ошибка при обработке запроса. Попробуйте позже.")
|
||
return
|
||
|
||
if invalid_regions:
|
||
bot.send_message(chat_id,
|
||
f"⚠️ Регион с ID {', '.join(invalid_regions)} не существует. Введите корректные номера или 'отмена'.")
|
||
# Можно не менять состояние, чтобы пользователь мог повторить ввод
|
||
# И снова ждём ввод:
|
||
bot.register_next_step_handler(message, process_subscription_button, bot, chat_id, state_manager)
|
||
return
|
||
|
||
if subbed_regions:
|
||
|
||
username = f"{message.from_user.username}" if message.from_user.username else "N/A"
|
||
log_user_event(chat_id, app, username, f"Подписался на регионы: {', '.join(subbed_regions)}")
|
||
|
||
# Сбрасываем состояние, чтобы не продолжать ждать ввод
|
||
state_manager.set_state(chat_id, UserStates.SETTINGS_MENU)
|
||
|
||
# Показываем меню
|
||
bot.send_message(chat_id, f"✅ Подписка на регионы: {', '.join(subbed_regions)} оформлена.", reply_markup=get_settings_menu())
|
||
|