"""Обработчики для работы с шаблонами.""" from typing import Optional, Dict, Any from telegram import Update, Message from telegram.ext import ContextTypes, ConversationHandler from app.bots.editor.states import BotStates from app.bots.editor.session import get_session_store from ..keyboards import template_type_keyboard, get_templates_keyboard from ..utils.parsers import parse_key_value_lines from ..utils.validation import validate_template_name async def start_template_creation(update: Update, context: ContextTypes.DEFAULT_TYPE) -> BotStates: """Начало создания шаблона.""" if not update.message: return BotStates.CONVERSATION_END message = update.message await message.reply_text( "Выберите тип шаблона:", reply_markup=template_type_keyboard() ) return BotStates.TPL_TYPE async def handle_template_type(update: Update, context: ContextTypes.DEFAULT_TYPE) -> BotStates: """Обработка выбора типа шаблона.""" if not update.callback_query: return BotStates.CONVERSATION_END query = update.callback_query await query.answer() tpl_type = query.data user_id = query.from_user.id session_store = get_session_store() session = session_store.get_or_create(user_id) session.type = tpl_type await query.message.edit_text("Введите название шаблона:") return BotStates.TPL_NAME async def handle_template_name(update: Update, context: ContextTypes.DEFAULT_TYPE) -> BotStates: """Обработка ввода имени шаблона.""" if not update.message: return BotStates.CONVERSATION_END message = update.message user_id = message.from_user.id name = message.text.strip() if not validate_template_name(name): await message.reply_text( "Некорректное имя шаблона. Используйте только буквы, цифры и знаки - _" ) return BotStates.TPL_NAME session = get_session_store().get_or_create(user_id) session.template_name = name await message.reply_text("Введите текст шаблона:") return BotStates.TPL_TEXT async def handle_template_text(update: Update, context: ContextTypes.DEFAULT_TYPE) -> BotStates: """Обработка текста шаблона.""" if not update.message: return BotStates.CONVERSATION_END message = update.message user_id = message.from_user.id text = message.text.strip() session = get_session_store().get_or_create(user_id) session.text = text await message.reply_text( "Введите клавиатуру в формате:\n" "текст кнопки = ссылка\n\n" "Или отправьте 'skip' чтобы пропустить" ) return BotStates.TPL_NEW_KB async def handle_template_keyboard(update: Update, context: ContextTypes.DEFAULT_TYPE) -> BotStates: """Обработка клавиатуры шаблона.""" if not update.message: return BotStates.CONVERSATION_END message = update.message user_id = message.from_user.id kb_text = message.text.strip() session = get_session_store().get_or_create(user_id) if kb_text != "skip": try: keyboard = parse_key_value_lines(kb_text) session.keyboard = keyboard except ValueError as e: await message.reply_text(f"Ошибка разбора клавиатуры: {e}") return BotStates.TPL_NEW_KB try: template_data = { "owner_id": user_id, "name": session.template_name, "title": session.template_name, "content": session.text, "type": session.type, "parse_mode": session.parse_mode or "HTML", "keyboard_tpl": session.keyboard } await create_template(template_data) await message.reply_text("Шаблон успешно создан") # Очищаем сессию get_session_store().drop(user_id) return BotStates.CONVERSATION_END except ValueError as e: await message.reply_text(f"Ошибка создания шаблона: {e}") return BotStates.TPL_NEW_KB except Exception as e: logger.error(f"Неожиданная ошибка при создании шаблона: {e}") await message.reply_text("Произошла непредвиденная ошибка при создании шаблона") return BotStates.TPL_NEW_KB async def list_templates(update: Update, context: ContextTypes.DEFAULT_TYPE) -> BotStates: """Список шаблонов.""" if not update.message: return BotStates.CONVERSATION_END message = update.message user_id = message.from_user.id templates = await get_user_templates(user_id) if not templates: await message.reply_text("У вас пока нет шаблонов") return BotStates.CONVERSATION_END page = context.user_data.get("tpl_page", 0) keyboard = get_templates_keyboard(templates, page) await message.reply_text( "Выберите шаблон:", reply_markup=keyboard ) return BotStates.TPL_SELECT