diff --git a/main.py b/main.py index c9952dd..24f2b5d 100644 --- a/main.py +++ b/main.py @@ -11,7 +11,6 @@ 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__) @@ -29,6 +28,9 @@ load_dotenv(env) api_id=os.getenv('api_id') api_hash=os.getenv('api_hash') session_name=os.getenv('session_name') or 'userbot' +if not all([api_id, api_hash, session_name]): + log.error('Не получены api_id, api_hash или session_name. Они должны быть в переменных окружения или в файле .evg') + exit(1) # === Настройки === source_channel_username=os.getenv('source_channel_username') # Канал, который слушаем @@ -36,8 +38,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: list[Dialog] = list() -target_entities_dict: dict[int: Dialog] = dict() +target_entities: list[PeerUser|PeerChat|PeerChannel] = list() +target_entities_dict: dict[int: PeerUser|PeerChat|PeerChannel] = 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(',') @@ -47,14 +49,29 @@ if groups_clean_srv_msgs: else: groups_clean_srv_msgs = list(target_groups) filter_keywords=os.getenv('filter_keywords') # Строки или регулярное выражение для поиска -filter_keywords=filter_keywords.split(',') +filter_keywords=filter_keywords.split(',') if filter_keywords else [] filter_negative_keywords=os.getenv('filter_negative_keywords') # Строки или регулярное выражение для поиска -filter_negative_keywords=filter_negative_keywords.split(',') -DATA_FILE=os.getenv('DATA_FILE') # Файл для сохранения сообщений -if not DATA_FILE: - DATA_FILE='messages.json' +filter_negative_keywords=filter_negative_keywords.split(',') if filter_negative_keywords else [] +DATA_FILE=os.getenv('DATA_FILE') or 'messages.json' # Файл для сохранения сообщений MAX_MESSAGES = os.getenv('MAX_MESSAGES') # Количество хранящихся сообщений -MAX_MESSAGES=int(MAX_MESSAGES) if MAX_MESSAGES else 50 +MAX_MESSAGES=int(MAX_MESSAGES) if MAX_MESSAGES and MAX_MESSAGES.isdigit() else 50 +USER_DATA_DIR = os.getenv('USER_DATA_DIR') or 'userdata' # директория для Volume + +session_name = os.path.join(USER_DATA_DIR, session_name) +DATA_FILE = os.path.join(USER_DATA_DIR, DATA_FILE) +if not os.path.exists(USER_DATA_DIR): + os.mkdir(USER_DATA_DIR, mode=666) +required_fields = { + 'source_channel_username':source_channel_username, + 'target_groups':target_groups, + 'filter_keywords':filter_keywords, + } +missing_fields = [field_name for field_name, field_val in required_fields.items() if not field_val] +if missing_fields: + missing_fields = ', '.join(missing_fields) + log.info('api_id, api_hash и session_name успешно загружены.') + log.error(f'Не получены обязательные {missing_fields}. Они должны быть в переменных окружения или в файле .env') + exit(1) # ======================= @@ -154,7 +171,7 @@ async def forward_to_targets( 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: + if str_chat_id == str(entity.id): link = await client.get_message_link(message) text = f'Переслано из [{message.chat.title}]({link})\n{message.text}' new_msg = await client.send_message(str_chat_id, text, reply_to=target_msg_id, parse_mode='markdown') @@ -233,7 +250,7 @@ async def handler_edited(event: events.MessageEdited.Event): # Проверяем, является ли наше пересланное сообщение последним if msg_id == last_msg_id: # Это последнее сообщение — можно удалить и переслать заново - forward_to_targets(event.message, targets=[chat_id]) + await forward_to_targets(event.message, targets=[chat_id]) await client.delete_messages(chat_id, msg_id) log.info(f"🔁 {chat_id} Сообщение было последним → Заменено") else: