bot rafactor and bugfix
This commit is contained in:
146
app/bots/editor/handlers/templates.py
Normal file
146
app/bots/editor/handlers/templates.py
Normal file
@@ -0,0 +1,146 @@
|
||||
"""Обработчики для работы с шаблонами."""
|
||||
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
|
||||
Reference in New Issue
Block a user