From 698c945cefdb8298a0f99ed1f327554fc9c75aa4 Mon Sep 17 00:00:00 2001 From: "Andrew K. Choi" Date: Mon, 17 Nov 2025 14:56:18 +0900 Subject: [PATCH] =?UTF-8?q?fix:=20=D0=BF=D0=BE=D0=B8=D1=81=D0=BA=20broadca?= =?UTF-8?q?st=20=D1=81=D0=BE=D0=BE=D0=B1=D1=89=D0=B5=D0=BD=D0=B8=D1=8F=20?= =?UTF-8?q?=D0=BF=D0=BE=20forwarded=5Fmessage=5Fid?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Теперь можно удалять broadcast сообщение, отвечая на его копию (не только на оригинал) - Метод get_message_by_telegram_id ищет в forwarded_message_ids - Админ может ответить на любую копию сообщения для удаления у всех --- .bot.pid | 2 +- src/core/chat_services.py | 33 +++++++++++++++++++++++++++++++-- 2 files changed, 32 insertions(+), 3 deletions(-) diff --git a/.bot.pid b/.bot.pid index df91274..22c10cc 100644 --- a/.bot.pid +++ b/.bot.pid @@ -1 +1 @@ -1014690 +1025432 diff --git a/src/core/chat_services.py b/src/core/chat_services.py index c8a74ee..6542517 100644 --- a/src/core/chat_services.py +++ b/src/core/chat_services.py @@ -1,6 +1,6 @@ """Сервисы для системы чата""" from sqlalchemy.ext.asyncio import AsyncSession -from sqlalchemy import select, and_, or_, update, delete +from sqlalchemy import select, and_, or_, update, delete, text from sqlalchemy.orm import selectinload from typing import Optional, List, Dict, Any from datetime import datetime, timezone @@ -191,7 +191,11 @@ class ChatMessageService: telegram_message_id: int, user_id: Optional[int] = None ) -> Optional[ChatMessage]: - """Получить сообщение по telegram_message_id""" + """ + Получить сообщение по telegram_message_id + Ищет как по оригинальному telegram_message_id, так и в forwarded_message_ids + """ + # Сначала ищем по оригинальному telegram_message_id query = select(ChatMessage).where( ChatMessage.telegram_message_id == telegram_message_id ) @@ -199,6 +203,31 @@ class ChatMessageService: if user_id: query = query.where(ChatMessage.user_id == user_id) + result = await session.execute(query) + message = result.scalar_one_or_none() + + # Если нашли - возвращаем + if message: + return message + + # Если не нашли - ищем в forwarded_message_ids + # Загружаем все недавние сообщения и ищем в них + query = select(ChatMessage).where( + ChatMessage.forwarded_message_ids.isnot(None) + ).order_by(ChatMessage.created_at.desc()).limit(100) + + result = await session.execute(query) + messages = result.scalars().all() + + # Ищем сообщение, где telegram_message_id есть в forwarded_message_ids + for msg in messages: + if msg.forwarded_message_ids: + for user_tid, fwd_msg_id in msg.forwarded_message_ids.items(): + if fwd_msg_id == telegram_message_id: + return msg + + return None + result = await session.execute(query) return result.scalar_one_or_none()