Files
postbot/app/bots/editor/handlers/templates.py

147 lines
5.4 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

"""Обработчики для работы с шаблонами."""
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