fix: Ошибка при изменённом сообщении в чате

This commit is contained in:
Евгений Панков 2025-08-16 12:50:32 +03:00
parent 73925d88f1
commit 5ac5ca176a

16
main.py
View File

@ -11,6 +11,7 @@ import asyncio
from datetime import datetime, timedelta
from dotenv import find_dotenv, load_dotenv
from typing import Optional
from telethon.tl.patched import Dialog
# ==== Настройка логирования ====
log = logging.getLogger(__name__)
@ -35,7 +36,8 @@ target_groups=os.getenv('target_groups').split(',') # Группы, куда п
for i, s in enumerate(target_groups):
if s.isdigit() or s.startswith('-') and s[1:].isdigit():
target_groups[i] = int(s)
target_entities=[]
target_entities: list[Dialog] = list()
target_entities_dict: dict[int: Dialog] = dict()
groups_clean_srv_msgs=os.getenv('groups_clean_srv_msgs') # Группы, где удаляем сообщения о присоединившихся
if groups_clean_srv_msgs:
groups_clean_srv_msgs = groups_clean_srv_msgs.split(',')
@ -98,11 +100,13 @@ async def prepare_entities(target_groups: list) -> list:
# Если это chat_id, преобразуем в Peer
chat_id = int(item)
entity = await client.get_entity(chat_id)
target_entities_dict[int(item)] = entity
target_entities.append(entity)
# Проверяем, является ли элемент username (начинается с @)
elif isinstance(item, str) and item.startswith('@'):
entity = await client.get_entity(item)
target_entities_dict[entity.chat.id] = entity
target_entities.append(entity)
# Проверяем, является ли элемент пригласительной ссылкой
@ -112,6 +116,7 @@ async def prepare_entities(target_groups: list) -> list:
# Проверяем, является ли ссылка на публичный канал/группу (@username)
if re.match(r'^t\.me/@[a-zA-Z0-9_]+$', link):
entity = await client.get_entity(link.replace('t.me/', ''))
target_entities_dict[entity.chat.id] = entity
target_entities.append(entity)
# Проверяем, является ли ссылка на приватный чат/канал (t.me/joinchat/XXXX или t.me/+XXXX)
elif re.match(r'^t\.me/(joinchat/|\+)[a-zA-Z0-9_-]+$', link):
@ -121,6 +126,7 @@ async def prepare_entities(target_groups: list) -> list:
try:
result = await client(ImportChatInviteRequest(hash))
entity = result.chats[0] # Получаем сущность чата
target_entities_dict[entity.chat.id] = entity
target_entities.append(entity)
except Exception as e:
print(f"Ошибка при попытке присоединиться к чату {link}: {e}")
@ -135,8 +141,6 @@ async def prepare_entities(target_groups: list) -> list:
except Exception as e:
print(f"Неизвестная ошибка при обработке {item}: {e}")
# return target_entities
async def forward_to_targets(
message: Message,
@ -146,6 +150,8 @@ async def forward_to_targets(
# Пересылаем сообщения
new_msgs = []
for entity in (targets or target_entities):
if isinstance(entity, (str, int)):
entity = target_entities_dict[int(entity)]
if source_reply_to_msg_id and (forwarded_info:=source_messages.get(str(source_reply_to_msg_id))):
for str_chat_id, target_msg_id in forwarded_info['forwarded_msg_id'].items():
if str_chat_id == entity.chat.id:
@ -161,6 +167,7 @@ async def forward_to_targets(
'timestamp': message.date.timestamp(),
'forwarded_msg_id': {str(msg.chat.id): msg.id for msg in new_msgs}
}
log.info(f"📩 Переслано: {shorten(message.text)}")
# Обновляем последние известные id для канала
for new_msg in new_msgs:
last_known_msg_id[str(new_msg.chat.id)] = new_msg.id
@ -199,7 +206,6 @@ async def handler_NewMessages(event: events.NewMessage.Event):
# Проверяем само сообщение
if check(message_text):
await forward_to_targets(event.message)
log.info(f"📩 Переслано: {shorten(message_text)}")
return
# Проверяем цепочку ответов
@ -227,8 +233,8 @@ async def handler_edited(event: events.MessageEdited.Event):
# Проверяем, является ли наше пересланное сообщение последним
if msg_id == last_msg_id:
# Это последнее сообщение — можно удалить и переслать заново
await client.delete_messages(chat_id, msg_id)
forward_to_targets(event.message, targets=[chat_id])
await client.delete_messages(chat_id, msg_id)
log.info(f"🔁 {chat_id} Сообщение было последним → Заменено")
else:
# Не последнее → отправляем изменённый текст как ответ