diff --git a/adapter/telegram/handlers/commands.py b/adapter/telegram/handlers/commands.py index 65efead..3933826 100644 --- a/adapter/telegram/handlers/commands.py +++ b/adapter/telegram/handlers/commands.py @@ -54,6 +54,7 @@ async def cmd_archive(message: Message) -> None: except TelegramBadRequest as e: logger.warning("cmd_archive_bot_error", error=str(e)) db.archive_chat(user_id=user_id, thread_id=thread_id) + await message.answer("Чат архивирован.") logger.info("cmd_archive", user_id=user_id, thread_id=thread_id) diff --git a/adapter/telegram/handlers/topic_events.py b/adapter/telegram/handlers/topic_events.py index 4f899d1..3ad8750 100644 --- a/adapter/telegram/handlers/topic_events.py +++ b/adapter/telegram/handlers/topic_events.py @@ -13,7 +13,13 @@ router = Router(name="topic_events") @router.message(F.forum_topic_created) async def on_topic_created(message: Message) -> None: - """User created a topic via Telegram UI — register it as a new chat.""" + """User created a topic via Telegram UI — register it as a new chat. + + Skip topics created by the bot itself — those are already registered + by cmd_new at the time create_forum_topic() is called. + """ + if message.from_user is None or message.from_user.id == message.bot.id: + return user_id = message.from_user.id thread_id = message.message_thread_id name = message.forum_topic_created.name diff --git a/sdk/mock.py b/sdk/mock.py index 353a774..105b715 100644 --- a/sdk/mock.py +++ b/sdk/mock.py @@ -99,23 +99,19 @@ class MockPlatformClient: attachments: list[Attachment] | None = None, ) -> AsyncIterator[MessageChunk]: """ - Сейчас: один чанк с полным ответом (sync под капотом). - При реальном SDK: заменить на SSE/WebSocket итератор в platform/mock.py. + Сейчас: один чанк с полным ответом. + При реальном SDK: заменить на SSE/WebSocket итератор. Адаптеры переписывать не нужно. """ await self._latency(200, 600) message_id, response, tokens = self._build_response(user_id, chat_id, text, attachments) logger.info("stream_message", user_id=user_id, chat_id=chat_id, message_id=message_id) - - async def _gen() -> AsyncIterator[MessageChunk]: - yield MessageChunk( - message_id=message_id, - delta=response, - finished=True, - tokens_used=tokens, - ) - - return _gen() + yield MessageChunk( + message_id=message_id, + delta=response, + finished=True, + tokens_used=tokens, + ) # --------------------------------------------------------------- settings diff --git a/tests/adapter/telegram/test_topic_events.py b/tests/adapter/telegram/test_topic_events.py index 3de9a78..fb490af 100644 --- a/tests/adapter/telegram/test_topic_events.py +++ b/tests/adapter/telegram/test_topic_events.py @@ -16,6 +16,9 @@ def fresh_db(tmp_path, monkeypatch): return db_mod +BOT_ID = 9999 # distinct from any test user_id + + def make_service_message(*, user_id=1, thread_id=42, topic_name="Мой чат"): m = SimpleNamespace() m.message_thread_id = thread_id @@ -25,6 +28,7 @@ def make_service_message(*, user_id=1, thread_id=42, topic_name="Мой чат") m.forum_topic_edited = SimpleNamespace(name="Новое имя") m.forum_topic_closed = SimpleNamespace() m.answer = AsyncMock() + m.bot = SimpleNamespace(id=BOT_ID) return m