Skip to content

Commit 0f23cdc

Browse files
committed
Рефакторинг кода
1 parent e51af1d commit 0f23cdc

1 file changed

Lines changed: 107 additions & 45 deletions

File tree

src/features/account/parsing.py

Lines changed: 107 additions & 45 deletions
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,41 @@ def __init__(self, page):
4747
expand=True, # Полноразмерное расширение
4848
disabled=True
4949
)
50-
self.limit_active_user = ft.TextField(label="💬 Кол-во сообщений", expand=True, disabled=True)
50+
self.limit_active_user = ft.TextField(
51+
label="💬 Кол-во сообщений",
52+
expand=True,
53+
disabled=True
54+
)
55+
56+
async def load_groups(self, client, dropdown, result_text):
57+
"""
58+
Загружает группы, на которые подписан аккаунт, и сохраняет их в self.group_map.
59+
:param client: Сессия Telethon
60+
:param dropdown: Выпадающий список
61+
:param result_text: Текст
62+
"""
63+
try:
64+
result = await client(GetDialogsRequest(
65+
offset_date=None,
66+
offset_id=0,
67+
offset_peer=InputPeerEmpty(),
68+
limit=200,
69+
hash=0
70+
))
71+
groups = [chat for chat in result.chats if getattr(chat, 'megagroup', False)]
72+
titles = [group.title for group in groups]
73+
74+
# Сохраняем соответствие название → сущность
75+
self.group_map = {group.title: group for group in groups}
76+
77+
dropdown.options = [ft.dropdown.Option(title) for title in titles]
78+
result_text.value = f"🔽 Найдено групп: {len(titles)}"
79+
self.page.update()
80+
except Exception as e:
81+
logger.exception("Ошибка при загрузке групп")
82+
result_text.value = "❌ Ошибка загрузки групп"
83+
dropdown.options = []
84+
self.page.update()
5185

5286
async def account_selection_menu(self):
5387
"""
@@ -72,6 +106,7 @@ async def account_selection_menu(self):
72106
)
73107
for phone, session_str in self.account_data
74108
]
109+
75110
# Создаем выпадающий список с названиями групп
76111
account_drop_down_list = ft.Dropdown(
77112
label="📂 Выберите аккаунт", # ✅ Название выпадающего списка
@@ -80,6 +115,16 @@ async def account_selection_menu(self):
80115
autofocus=True # ✅ Автозаполнение
81116
)
82117

118+
# Выпадающий список для выбора группы
119+
dropdown = ft.Dropdown(
120+
label="📋 Выберите группу",
121+
width=WIDTH_WIDE_BUTTON,
122+
options=[],
123+
autofocus=True,
124+
disabled=True
125+
)
126+
result_text = ft.Text(value="📂 Сначала выберите аккаунт")
127+
83128
# Кнопки-переключатели
84129
account_groups_switch = ft.CupertinoSwitch(label="Группы аккаунта", value=False, disabled=True)
85130
admin_switch = ft.CupertinoSwitch(label="Администраторов", value=False, disabled=True)
@@ -92,17 +137,69 @@ async def account_selection_menu(self):
92137
).element_handler(self.page)
93138

94139
async def on_account_change(e):
140+
"""📂 Обработчик изменения аккаунта."""
95141
if account_drop_down_list.value:
96-
client = await self.connect.client_connect_string_session(session_name=account_drop_down_list.value)
97-
98-
await load_groups(client, dropdown, result_text)
99-
await client.disconnect()
142+
# Сбрасываем состояние при смене аккаунта
143+
dropdown.options = []
144+
dropdown.value = None
145+
dropdown.disabled = True
146+
result_text.value = "📂 Аккаунт выбран. Включите 'Выбрать группу' для загрузки групп"
147+
self.group_map = {} # Очищаем предыдущие группы
148+
self.page.update()
100149
else:
101150
dropdown.options = []
151+
dropdown.value = None
152+
dropdown.disabled = True
102153
result_text.value = "📂 Выберите аккаунт"
103154
self.page.update()
104155

156+
async def on_group_selection_switch_change(e):
157+
"""🔄 Обработчик переключателя 'Выбрать группу'"""
158+
if account_group_selection_switch.value:
159+
# Переключатель включен - загружаем группы
160+
if not account_drop_down_list.value:
161+
await self.app_logger.log_and_display("⚠️ Сначала выберите аккаунт")
162+
account_group_selection_switch.value = False
163+
self.page.update()
164+
return
165+
166+
# Загружаем группы выбранного аккаунта
167+
result_text.value = "⏳ Загрузка групп..."
168+
dropdown.disabled = True
169+
self.page.update()
170+
171+
try:
172+
client = await self.connect.client_connect_string_session(
173+
session_name=account_drop_down_list.value
174+
)
175+
176+
if client:
177+
await self.load_groups(client, dropdown, result_text)
178+
dropdown.disabled = False # ✅ Разблокируем dropdown после загрузки
179+
await client.disconnect()
180+
else:
181+
result_text.value = "❌ Не удалось подключиться к аккаунту"
182+
account_group_selection_switch.value = False
183+
dropdown.disabled = True
184+
185+
except Exception as error:
186+
logger.exception(error)
187+
result_text.value = f"❌ Ошибка загрузки групп: {str(error)}"
188+
account_group_selection_switch.value = False
189+
dropdown.disabled = True
190+
191+
self.page.update()
192+
else:
193+
# Переключатель выключен - очищаем список групп
194+
dropdown.options = []
195+
dropdown.value = None
196+
dropdown.disabled = True
197+
result_text.value = "📂 Включите переключатель для загрузки групп"
198+
self.group_map = {}
199+
self.page.update()
200+
105201
account_drop_down_list.on_change = on_account_change
202+
account_group_selection_switch.on_change = on_group_selection_switch_change
106203

107204
async def add_items(_):
108205
"""🚀 Запускает процесс парсинга групп и отображает статус в интерфейсе."""
@@ -207,7 +304,7 @@ async def parse_group(client, groups_wr) -> None:
207304
await self.app_logger.log_and_display(translations["ru"]["errors"]["auth_key_unregistered"])
208305
await asyncio.sleep(2)
209306
break
210-
except sqlite3.DatabaseError: # TODO Обработка ошибок базы данных (придумать универсальнео наименование)
307+
except sqlite3.DatabaseError:
211308
await self.app_logger.log_and_display("Ошибка базы данных аккаунта")
212309
await asyncio.sleep(2)
213310
break
@@ -220,43 +317,10 @@ async def parse_group(client, groups_wr) -> None:
220317

221318
except TypeError as error:
222319
logger.exception(f"❌ Ошибка: {error}")
223-
return [] # Возвращаем пустой список в случае ошибки
320+
return []
224321
except Exception as error:
225322
logger.exception(error)
226323

227-
async def load_groups(client, dropdown, result_text):
228-
"""
229-
Загружает группы, на которые подписан аккаунт, и сохраняет их в self.group_map.
230-
:param client: Сессия Telethon
231-
:param dropdown: Выпадающий список
232-
:param result_text: Текст
233-
"""
234-
try:
235-
result = await client(GetDialogsRequest(
236-
offset_date=None,
237-
offset_id=0,
238-
offset_peer=InputPeerEmpty(),
239-
limit=200,
240-
hash=0
241-
))
242-
groups = [chat for chat in result.chats if getattr(chat, 'megagroup', False)]
243-
titles = [group.title for group in groups]
244-
245-
# Сохраняем соответствие название → сущность
246-
self.group_map = {group.title: group for group in groups}
247-
248-
dropdown.options = [ft.dropdown.Option(title) for title in titles]
249-
result_text.value = f"🔽 Найдено групп: {len(titles)}"
250-
self.page.update()
251-
except Exception as e:
252-
logger.exception("Ошибка при загрузке групп")
253-
result_text.value = "❌ Ошибка загрузки групп"
254-
dropdown.options = []
255-
self.page.update()
256-
257-
# Выпадающий список для выбора группы
258-
dropdown = ft.Dropdown(width=WIDTH_WIDE_BUTTON, options=[], autofocus=True, disabled=True)
259-
result_text = ft.Text(value="📂 Группы не загружены")
260324
parse_button = ft.Button(
261325
content="🔍 Парсить",
262326
width=WIDTH_WIDE_BUTTON,
@@ -271,24 +335,22 @@ async def load_groups(client, dropdown, result_text):
271335
account_groups_switch.disabled = False
272336
account_group_selection_switch.disabled = False
273337
active_switch.disabled = False
274-
self.chat_input.disabled = False # ✅ Включаем поле ввода ссылки на чат
275-
self.limit_active_user.disabled = False # ✅ Включаем поле ввода кол-ва сообщений
276-
dropdown.disabled = False
338+
self.chat_input.disabled = False
339+
self.limit_active_user.disabled = False
277340
parse_button.disabled = False
278341

279342
# Выравнивание элементов управления
280343
admin_switch.expand = True
281344
members_switch.expand = True
282345
account_groups_switch.expand = True
283-
284346
account_group_selection_switch.expand = True
285347
active_switch.expand = True
286348
self.page.update()
287349

288350
self.page.views.append(
289351
ft.View(
290352
route="/parsing",
291-
appbar=await self.gui_program.key_app_bar(), # Кнопка назад
353+
appbar=await self.gui_program.key_app_bar(),
292354
controls=[
293355
await self.gui_program.outputs_text_gradient(),
294356
list_view,

0 commit comments

Comments
 (0)