from telegram import Update, InlineKeyboardButton, InlineKeyboardMarkup from telegram.ext import CommandHandler, CallbackQueryHandler, ConversationHandler, ContextTypes from db import AsyncSessionLocal from models import Channel, Button SELECT_CHANNEL, MANAGE_BUTTONS = range(2) async def channel_buttons_start(update: Update, context: ContextTypes.DEFAULT_TYPE): from sqlalchemy import select session = AsyncSessionLocal() try: channels_result = await session.execute(select(Channel)) channels = channels_result.scalars().all() keyboard = [[InlineKeyboardButton(f'{getattr(c, "name", str(c.name))}', callback_data=str(getattr(c, "id", str(c.id))))] for c in channels] if update.message: await update.message.reply_text( "Выберите канал для настройки клавиатуры:", reply_markup=InlineKeyboardMarkup(keyboard) ) return SELECT_CHANNEL return ConversationHandler.END finally: await session.close() async def select_channel(update: Update, context: ContextTypes.DEFAULT_TYPE): query = update.callback_query if query and query.data: await query.answer() channel_id = int(query.data) if context.user_data is None: context.user_data = {} context.user_data['channel_id'] = channel_id from sqlalchemy import select session = AsyncSessionLocal() try: buttons_result = await session.execute(select(Button).where(Button.channel_id == channel_id)) buttons = buttons_result.scalars().all() text = "Кнопки этого канала:\n" for b in buttons: text += f"- {b.name}: {b.url}\n" text += "\nДобавить новую кнопку: /add_button\nУдалить: /del_button <название>" await query.edit_message_text(text) finally: await session.close() return ConversationHandler.END channel_buttons_conv = ConversationHandler( entry_points=[CommandHandler('channel_buttons', channel_buttons_start)], states={ SELECT_CHANNEL: [CallbackQueryHandler(select_channel)], }, fallbacks=[] )