fix: Ошибка при изменённом сообщении в чате
This commit is contained in:
parent
73925d88f1
commit
5ac5ca176a
16
main.py
16
main.py
@ -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:
|
||||
# Не последнее → отправляем изменённый текст как ответ
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user