fix(telegram): preserve topic metadata on overflow edits

This commit is contained in:
Maxim Esipov
2026-05-17 19:10:13 +03:00
committed by Teknium
parent c66efcff32
commit 3ec28f34ca
5 changed files with 172 additions and 30 deletions

View File

@@ -16,6 +16,7 @@ Credit: jobless0x (#774, #1312), OutThisLife (#798), clicksingh (#697).
from __future__ import annotations
import asyncio
import inspect
import logging
import queue
import re
@@ -197,6 +198,35 @@ class GatewayStreamConsumer:
the subsequent cosmetic edit (cursor removal) failed."""
return self._final_content_delivered
async def _edit_message(
self,
*,
message_id: str,
content: str,
finalize: bool = False,
):
"""Edit via the adapter, passing routing metadata when supported."""
kwargs = {
"chat_id": self.chat_id,
"message_id": message_id,
"content": content,
}
# Keep the long-standing stream-consumer contract: concrete adapters
# must accept finalize= even when it is False (guarded by tests).
kwargs["finalize"] = finalize
if self.metadata:
try:
params = inspect.signature(self.adapter.edit_message).parameters
if "metadata" in params or any(
param.kind is inspect.Parameter.VAR_KEYWORD
for param in params.values()
):
kwargs["metadata"] = self.metadata
except (TypeError, ValueError):
pass
return await self.adapter.edit_message(**kwargs)
def on_segment_break(self) -> None:
"""Finalize the current stream segment and start a fresh message."""
self._queue.put(_NEW_SEGMENT)
@@ -733,8 +763,7 @@ class GatewayStreamConsumer:
):
clean_text = self._last_sent_text[:-len(self.cfg.cursor)]
try:
result = await self.adapter.edit_message(
chat_id=self.chat_id,
result = await self._edit_message(
message_id=self._message_id,
content=clean_text,
)
@@ -959,8 +988,7 @@ class GatewayStreamConsumer:
if not prefix or not prefix.strip():
return
try:
await self.adapter.edit_message(
chat_id=self.chat_id,
await self._edit_message(
message_id=self._message_id,
content=prefix,
)
@@ -1167,8 +1195,7 @@ class GatewayStreamConsumer:
):
return True
# Edit existing message
result = await self.adapter.edit_message(
chat_id=self.chat_id,
result = await self._edit_message(
message_id=self._message_id,
content=text,
finalize=finalize,