From 1ef5cf4e387eb3aada334ae4534293bac35cb599 Mon Sep 17 00:00:00 2001 From: kislovdm Date: Wed, 15 Apr 2026 14:30:45 +0300 Subject: [PATCH] =?UTF-8?q?=D0=98=D0=A1=D0=BF=D1=80=D0=B0=D0=B2=D0=BB?= =?UTF-8?q?=D0=B5=D0=BD=D0=B8=D0=B5=20=D1=81=D0=BF=D0=B8=D1=81=D0=BA=D0=B0?= =?UTF-8?q?=20=D0=BA=D0=B0=D0=BD=D0=B0=D0=BB=D0=BE=D0=B2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/telegram_max_commands.py | 35 +++++++++++++++++++++++++++++++++-- 1 file changed, 33 insertions(+), 2 deletions(-) diff --git a/src/telegram_max_commands.py b/src/telegram_max_commands.py index 985a770..7ddcd87 100644 --- a/src/telegram_max_commands.py +++ b/src/telegram_max_commands.py @@ -90,6 +90,37 @@ def _normalize(value: str) -> str: return str(value or "").strip().casefold() +def _deduplicate_chats(chats: list[Any]) -> list[Any]: + """ + Возвращает уникальные чаты с сохранением исходного порядка. + Сначала пытаемся уникализировать по chat.id, затем по нормализованному title. + """ + unique: list[Any] = [] + seen_ids: set[str] = set() + seen_titles: set[str] = set() + + for chat in chats: + chat_id = getattr(chat, "id", None) + if chat_id is not None: + key_id = str(chat_id).strip() + if key_id in seen_ids: + continue + seen_ids.add(key_id) + unique.append(chat) + continue + + key_title = _normalize(_max_chat_title(chat)) + if not key_title: + unique.append(chat) + continue + if key_title in seen_titles: + continue + seen_titles.add(key_title) + unique.append(chat) + + return unique + + async def _refresh_chats_best_effort(max_client: MaxClient) -> None: # group.py: fetch_chats(marker=None) заполняет max_client.chats try: @@ -104,7 +135,7 @@ def _find_chat_by_title(max_client: MaxClient, title: str) -> Any | None: wanted = _normalize(title) if not wanted: return None - chats = list(getattr(max_client, "chats", []) or []) + chats = _deduplicate_chats(list(getattr(max_client, "chats", []) or [])) for c in chats: if _normalize(_max_chat_title(c)) == wanted: return c @@ -166,7 +197,7 @@ async def handle_control_command( if cmd == "/list": await _refresh_chats_best_effort(max_client) - chats = list(getattr(max_client, "chats", []) or []) + chats = _deduplicate_chats(list(getattr(max_client, "chats", []) or [])) if not chats: return "Список чатов пуст (или клиент MAX ещё не успел их загрузить)."