from telegram import Update from telegram.ext import ContextTypes, ConversationHandler, CommandHandler, CallbackQueryHandler, MessageHandler, filters from db import SessionLocal from models import Channel, Group, Button SELECT_TARGET, INPUT_NAME, INPUT_URL = range(3) async def add_button_start(update: Update, context: ContextTypes.DEFAULT_TYPE): # Если выбран канал или группа уже сохранены — сразу переход к названию if context.user_data.get('channel_id'): context.user_data['target'] = f"channel_{context.user_data['channel_id']}" await update.message.reply_text('Введите название кнопки:') return INPUT_NAME elif context.user_data.get('group_id'): context.user_data['target'] = f"group_{context.user_data['group_id']}" await update.message.reply_text('Введите название кнопки:') return INPUT_NAME # Если нет — стандартный выбор session = SessionLocal() channels = session.query(Channel).all() groups = session.query(Group).all() session.close() keyboard = [] for c in channels: keyboard.append([{'text': f'Канал: {c.name}', 'callback_data': f'channel_{c.id}'}]) for g in groups: keyboard.append([{'text': f'Группа: {g.name}', 'callback_data': f'group_{g.id}'}]) if not keyboard: await update.message.reply_text('Нет каналов или групп для добавления кнопки.') return ConversationHandler.END await update.message.reply_text('Выберите канал или группу:', reply_markup=None) context.user_data['keyboard'] = keyboard return SELECT_TARGET async def select_target(update: Update, context: ContextTypes.DEFAULT_TYPE): query = update.callback_query await query.answer() data = query.data context.user_data['target'] = data await query.edit_message_text('Введите название кнопки:') return INPUT_NAME async def input_name(update: Update, context: ContextTypes.DEFAULT_TYPE): context.user_data['button_name'] = update.message.text await update.message.reply_text('Введите ссылку для кнопки:') return INPUT_URL async def input_url(update: Update, context: ContextTypes.DEFAULT_TYPE): url = update.message.text name = context.user_data.get('button_name') target = context.user_data.get('target') if not target or ('_' not in target): await update.message.reply_text('Ошибка: не выбран канал или группа. Попробуйте снова.') return ConversationHandler.END session = SessionLocal() try: type_, obj_id = target.split('_', 1) obj_id = int(obj_id) if type_ == 'channel': button = Button(name=name, url=url, channel_id=obj_id) elif type_ == 'group': button = Button(name=name, url=url, group_id=obj_id) else: await update.message.reply_text('Ошибка: неверный тип объекта.') session.close() return ConversationHandler.END session.add(button) session.commit() await update.message.reply_text('Кнопка добавлена.') except Exception as e: await update.message.reply_text(f'Ошибка при добавлении кнопки: {e}') finally: session.close() return ConversationHandler.END add_button_conv = ConversationHandler( entry_points=[CommandHandler('add_button', add_button_start)], states={ SELECT_TARGET: [CallbackQueryHandler(select_target)], INPUT_NAME: [MessageHandler(filters.TEXT & ~filters.COMMAND, input_name)], INPUT_URL: [MessageHandler(filters.TEXT & ~filters.COMMAND, input_url)], }, fallbacks=[] )