fix: поиск broadcast сообщения по forwarded_message_id
- Теперь можно удалять broadcast сообщение, отвечая на его копию (не только на оригинал) - Метод get_message_by_telegram_id ищет в forwarded_message_ids - Админ может ответить на любую копию сообщения для удаления у всех
This commit is contained in:
@@ -1,6 +1,6 @@
|
|||||||
"""Сервисы для системы чата"""
|
"""Сервисы для системы чата"""
|
||||||
from sqlalchemy.ext.asyncio import AsyncSession
|
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 sqlalchemy.orm import selectinload
|
||||||
from typing import Optional, List, Dict, Any
|
from typing import Optional, List, Dict, Any
|
||||||
from datetime import datetime, timezone
|
from datetime import datetime, timezone
|
||||||
@@ -191,7 +191,11 @@ class ChatMessageService:
|
|||||||
telegram_message_id: int,
|
telegram_message_id: int,
|
||||||
user_id: Optional[int] = None
|
user_id: Optional[int] = None
|
||||||
) -> Optional[ChatMessage]:
|
) -> Optional[ChatMessage]:
|
||||||
"""Получить сообщение по telegram_message_id"""
|
"""
|
||||||
|
Получить сообщение по telegram_message_id
|
||||||
|
Ищет как по оригинальному telegram_message_id, так и в forwarded_message_ids
|
||||||
|
"""
|
||||||
|
# Сначала ищем по оригинальному telegram_message_id
|
||||||
query = select(ChatMessage).where(
|
query = select(ChatMessage).where(
|
||||||
ChatMessage.telegram_message_id == telegram_message_id
|
ChatMessage.telegram_message_id == telegram_message_id
|
||||||
)
|
)
|
||||||
@@ -199,6 +203,31 @@ class ChatMessageService:
|
|||||||
if user_id:
|
if user_id:
|
||||||
query = query.where(ChatMessage.user_id == 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)
|
result = await session.execute(query)
|
||||||
return result.scalar_one_or_none()
|
return result.scalar_one_or_none()
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user