Skip to content

Commit 7c9ba63

Browse files
committed
Добавлена запись ссылки на техническую группу.
1 parent c59cf5e commit 7c9ba63

File tree

1 file changed

+113
-5
lines changed

1 file changed

+113
-5
lines changed

parsing/parser.py

Lines changed: 113 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88
from telethon.tl.functions.channels import JoinChannelRequest
99
from telethon.tl.types import Message
1010

11-
from database.database import create_groups_model, create_keywords_model
11+
from database.database import create_groups_model, create_keywords_model, create_group_model
1212
from keyboards.keyboards import menu_launch_tracking_keyboard
1313
from locales.locales import get_text
1414
from system.dispatcher import api_id, api_hash
@@ -22,7 +22,102 @@
2222
forwarded_messages = set()
2323

2424

25-
async def process_message(client, message: Message, chat_id: int, user_id):
25+
async def get_target_group_id(client: TelegramClient, user_id: int):
26+
"""
27+
Получает ID целевой группы для пересылки сообщений из базы данных
28+
:param client: Объект TelegramClient
29+
:param user_id: ID пользователя
30+
:return: ID группы или None
31+
"""
32+
GroupModel = create_group_model(user_id=user_id)
33+
34+
# Создаем таблицу, если не существует
35+
if not GroupModel.table_exists():
36+
GroupModel.create_table()
37+
logger.info(f"Created target group table for user {user_id}")
38+
return None
39+
40+
# Получаем первую группу из базы (можно модифицировать для нескольких групп)
41+
groups = list(GroupModel.select())
42+
if not groups:
43+
logger.warning(f"No target group found for user {user_id}")
44+
return None
45+
46+
target_username = groups[0].user_group
47+
logger.info(f"Target group username: {target_username}")
48+
49+
try:
50+
# Получаем сущность группы/канала
51+
entity = await client.get_entity(target_username)
52+
target_group_id = entity.id
53+
logger.success(f"✅ Target group ID resolved: {target_group_id}")
54+
return target_group_id
55+
except Exception as e:
56+
logger.error(f"❌ Failed to resolve target group {target_username}: {e}")
57+
return None
58+
59+
60+
async def join_target_group(client: TelegramClient, user_id):
61+
"""
62+
Подписывается на целевую группу для пересылки сообщений
63+
:param client: Объект TelegramClient
64+
:param user_id: ID пользователя
65+
:return: ID группы или None
66+
"""
67+
GroupModel = create_group_model(user_id=user_id)
68+
69+
if not GroupModel.table_exists():
70+
GroupModel.create_table()
71+
return None
72+
73+
groups = list(GroupModel.select())
74+
if not groups:
75+
return None
76+
77+
target_username = groups[0].user_group
78+
79+
try:
80+
logger.info(f"🔗 Attempting to join target group {target_username}...")
81+
await client(JoinChannelRequest(target_username))
82+
logger.success(f"✅ Successfully joined target group {target_username}")
83+
84+
# Получаем ID группы
85+
entity = await client.get_entity(target_username)
86+
return entity.id
87+
88+
except UserAlreadyParticipantError:
89+
logger.info(f"ℹ️ Already member of target group {target_username}")
90+
entity = await client.get_entity(target_username)
91+
return entity.id
92+
93+
except FloodWaitError as e:
94+
logger.warning(f"⚠️ FloodWait error. Waiting {e.seconds} seconds...")
95+
await asyncio.sleep(e.seconds)
96+
try:
97+
await client(JoinChannelRequest(target_username))
98+
entity = await client.get_entity(target_username)
99+
return entity.id
100+
except Exception as retry_error:
101+
logger.error(f"❌ Failed to join target group after retry: {retry_error}")
102+
return None
103+
104+
except ValueError:
105+
logger.error(f"❌ Invalid target group username: {target_username}")
106+
return None
107+
108+
except InviteRequestSentError:
109+
logger.error(f"❌ Invite request sent for {target_username}, waiting for approval")
110+
return None
111+
112+
except Exception as e:
113+
logger.exception(f"❌ Failed to join target group {target_username}: {e}")
114+
return None
115+
116+
117+
async def process_message(client, message: Message, chat_id: int, user_id, target_group_id):
118+
"""
119+
Обрабатывает сообщение и пересылает его в целевую группу при наличии ключевых слов
120+
"""
26121
if not message.message:
27122
return
28123

@@ -55,15 +150,16 @@ async def process_message(client, message: Message, chat_id: int, user_id):
55150
logger.info(f"📌 Найдено совпадение. Пересылаю сообщение ID={message.id}")
56151
try:
57152
# Убедитесь, что CONFIG["target_channel_id"] определен
58-
await client.forward_messages(CONFIG["target_channel_id"], message)
153+
# await client.forward_messages(CONFIG["target_channel_id"], message)
154+
await client.forward_messages(target_group_id, message)
59155
forwarded_messages.add(msg_key)
60156
except Exception as e:
61157
logger.exception(f"❌ Ошибка при пересылке: {e}")
62158

63159

64160
async def join_required_channels(client: TelegramClient, user_id):
65161
"""
66-
Подписываемся на обязательные каналы
162+
Подписывается на обязательные каналы (источники сообщений)
67163
:param client: Объект TelegramClient
68164
:param user_id: Объект пользователя Telegram
69165
:return: None
@@ -154,6 +250,18 @@ async def filter_messages(message, user_id, user):
154250

155251
logger.info("✅ Сессия активна, подключение успешно!")
156252

253+
# === Подключаемся к целевой группе для пересылки ===
254+
target_group_id = await join_target_group(client=client, user_id=user_id)
255+
256+
if not target_group_id:
257+
logger.error("❌ Failed to join target group or group not configured")
258+
await message.answer(
259+
get_text(user.language, "target_group_missing"),
260+
reply_markup=menu_launch_tracking_keyboard()
261+
)
262+
await client.disconnect()
263+
return
264+
157265
# === Подключаемся к обязательным каналам ===
158266
await join_required_channels(client=client, user_id=user_id)
159267

@@ -176,7 +284,7 @@ async def filter_messages(message, user_id, user):
176284
# === Обработка новых сообщений ===
177285
@client.on(events.NewMessage(chats=channels))
178286
async def handle_new_message(event: events.NewMessage.Event):
179-
await process_message(client, event.message, event.chat_id, user_id)
287+
await process_message(client, event.message, event.chat_id, user_id, target_group_id)
180288

181289
logger.info("👂 Бот слушает новые сообщения...")
182290
try:

0 commit comments

Comments
 (0)