@@ -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