feat(tg): forum-first adapter complete — handlers, bot.py, 46 tests pass
This commit is contained in:
parent
82dc840544
commit
24c61468d7
9 changed files with 675 additions and 0 deletions
74
adapter/telegram/handlers/commands.py
Normal file
74
adapter/telegram/handlers/commands.py
Normal file
|
|
@ -0,0 +1,74 @@
|
|||
from __future__ import annotations
|
||||
|
||||
import structlog
|
||||
from aiogram import Router
|
||||
from aiogram.filters import Command
|
||||
from aiogram.types import Message
|
||||
|
||||
from adapter.telegram import db
|
||||
from adapter.telegram.keyboards.settings import settings_main_keyboard
|
||||
|
||||
logger = structlog.get_logger(__name__)
|
||||
|
||||
router = Router(name="commands")
|
||||
|
||||
|
||||
@router.message(Command("new"))
|
||||
async def cmd_new(message: Message) -> None:
|
||||
"""Create a new topic and register it as a new chat."""
|
||||
user_id = message.from_user.id
|
||||
chat_id = message.chat.id
|
||||
n = db.count_active_chats(user_id) + 1
|
||||
new_name = f"Чат #{n}"
|
||||
topic = await message.bot.create_forum_topic(chat_id=chat_id, name=new_name)
|
||||
thread_id = topic.message_thread_id
|
||||
db.create_chat(user_id=user_id, thread_id=thread_id, chat_name=new_name)
|
||||
await message.bot.send_message(
|
||||
chat_id=chat_id,
|
||||
message_thread_id=thread_id,
|
||||
text=f"Создан {new_name}. Напиши что-нибудь.",
|
||||
)
|
||||
logger.info("cmd_new", user_id=user_id, thread_id=thread_id, name=new_name)
|
||||
|
||||
|
||||
@router.message(Command("archive"))
|
||||
async def cmd_archive(message: Message) -> None:
|
||||
"""Archive the current topic."""
|
||||
user_id = message.from_user.id
|
||||
thread_id = message.message_thread_id
|
||||
chat = db.get_chat(user_id=user_id, thread_id=thread_id)
|
||||
if chat is None or chat["archived_at"] is not None:
|
||||
await message.answer("Этот чат не найден или уже архивирован.")
|
||||
return
|
||||
await message.bot.close_forum_topic(chat_id=message.chat.id, message_thread_id=thread_id)
|
||||
db.archive_chat(user_id=user_id, thread_id=thread_id)
|
||||
logger.info("cmd_archive", user_id=user_id, thread_id=thread_id)
|
||||
|
||||
|
||||
@router.message(Command("rename"))
|
||||
async def cmd_rename(message: Message) -> None:
|
||||
"""Rename the current topic. Usage: /rename New Name"""
|
||||
user_id = message.from_user.id
|
||||
thread_id = message.message_thread_id
|
||||
parts = (message.text or "").split(maxsplit=1)
|
||||
new_name = parts[1].strip() if len(parts) > 1 else ""
|
||||
if not new_name:
|
||||
await message.answer("Использование: /rename Новое название")
|
||||
return
|
||||
chat = db.get_chat(user_id=user_id, thread_id=thread_id)
|
||||
if chat is None:
|
||||
await message.answer("Этот чат не найден.")
|
||||
return
|
||||
await message.bot.edit_forum_topic(
|
||||
chat_id=message.chat.id,
|
||||
message_thread_id=thread_id,
|
||||
name=new_name[:128],
|
||||
)
|
||||
db.rename_chat(user_id=user_id, thread_id=thread_id, new_name=new_name[:128])
|
||||
logger.info("cmd_rename", user_id=user_id, thread_id=thread_id, new_name=new_name)
|
||||
|
||||
|
||||
@router.message(Command("settings"))
|
||||
async def cmd_settings(message: Message) -> None:
|
||||
"""Open settings menu."""
|
||||
await message.answer("⚙️ Настройки", reply_markup=settings_main_keyboard())
|
||||
Loading…
Add table
Add a link
Reference in a new issue