diff --git a/main.py b/main.py index 21c4731..c9952dd 100644 --- a/main.py +++ b/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}") @@ -134,8 +140,6 @@ async def prepare_entities(target_groups: list) -> list: print(f"Ошибка при обработке {item}: {e}") except Exception as e: print(f"Неизвестная ошибка при обработке {item}: {e}") - - # return target_entities async def forward_to_targets( @@ -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: # Не последнее → отправляем изменённый текст как ответ