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