55from loguru import logger
66
77from database .database import User , create_keywords_model
8- from keyboards .keyboards import ( back_keyboard )
8+ from keyboards .keyboards import back_keyboard
99from locales .locales import get_text
1010from states .states import MyStates
1111from system .dispatcher import router
1212
1313
1414@router .message (F .text == "Ввод ключевого слова" )
15- async def entering_keyword (message : Message , state : FSMContext ):
15+ async def handle_enter_keyword_menu (message : Message , state : FSMContext ):
1616 """Ввод ключевого слова"""
17- user_tg = message .from_user
18- user = User .get (User .user_id == user_tg .id )
17+ telegram_user = message .from_user
18+ user = User .get (User .user_id == telegram_user .id )
1919
2020 logger .info (
21- f"Пользователь { user_tg .id } { user_tg .username } { user_tg .first_name } { user_tg .last_name } перешел в меню Ввод ключевого слова" )
21+ f"Пользователь { telegram_user .id } { telegram_user .username } { telegram_user .first_name } { telegram_user .last_name } перешел в меню Ввод ключевого слова" )
2222
2323 await message .answer (
2424 get_text (user .language , "enter_keyword" ),
@@ -28,35 +28,95 @@ async def entering_keyword(message: Message, state: FSMContext):
2828
2929
3030@router .message (MyStates .entering_keyword )
31- async def handle_keyword (message : Message , state : FSMContext ):
31+ async def handle_keywords_submission (message : Message , state : FSMContext ):
3232 """Обработка введённого ключевого слова, словосочетания"""
3333
34- user_keyword = message .text .strip ()
35- user_tg = message .from_user
36- logger .info (f"Пользователь ввёл ключевое слово: { user_keyword } " )
34+ raw_input = message .text .strip ()
35+ telegram_user = message .from_user
36+ logger .info (f"Пользователь ввёл ключевое слово: { raw_input } " )
37+
38+ keywords_list = [
39+ keyword .strip ()
40+ for keyword in raw_input .split ('\n ' )
41+ if keyword .strip ()
42+ ]
43+
44+ if not keywords_list :
45+ await message .answer ("⚠️ Вы не указали ни одного ключевого слова." )
46+ await state .clear ()
47+ return
3748
3849 # Создаём модель с таблицей, уникальной для конкретного пользователя
39- Keywords = create_keywords_model (user_id = user_tg .id ) # Создаём таблицу для групп / ключевых слов
50+ KeywordsModel = create_keywords_model (user_id = telegram_user .id ) # Создаём таблицу для групп / ключевых слов
4051
4152 # Проверяем, существует ли таблица (если нет — создаём)
42- if not Keywords .table_exists ():
43- Keywords .create_table ()
44- logger .info (f"Создана новая таблица для пользователя { user_tg .id } " )
45-
46- # Добавляем запись в таблицу
47- try :
48- keywords = Keywords .create (user_keyword = user_keyword )
49- await message .answer (f"✅ Слово / словосочетание { user_keyword } добавлено в отслеживание." )
50- logger .info (f"Ключевое слово { user_keyword } добавлено пользователем { user_tg .id } " )
51- except Exception as e :
52- if "UNIQUE constraint failed" in str (e ):
53- await message .answer ("⚠️ Такое слово / словосочетание уже есть в отслеживаемых." )
54- else :
55- await message .answer ("⚠️ Ошибка при добавлении слова / словосочетания." )
56- logger .error (f"Ошибка при добавлении ключевого слова: { e } " )
57- await state .clear () # Очищаем состояние
53+ if not KeywordsModel .table_exists ():
54+ KeywordsModel .create_table ()
55+ logger .info (f"Создана новая таблица для пользователя { telegram_user .id } " )
56+
57+ added_keywords = []
58+ skipped_keywords = []
59+ error_keywords = []
60+
61+ # Add each keyword one by one
62+ for keyword in keywords_list :
63+ try :
64+ KeywordsModel .create (user_keyword = keyword )
65+ added_keywords .append (keyword )
66+ except Exception as e :
67+ if "UNIQUE constraint failed" in str (e ):
68+ skipped_keywords .append (keyword )
69+ else :
70+ error_keywords .append ((keyword , str (e )))
71+ logger .error (f"Error adding keyword { keyword } : { e } " )
72+
73+ # Format response message
74+ response_parts = []
75+
76+ if added_keywords :
77+ keywords_preview = added_keywords [:10 ] # Show first 10
78+ keywords_text = "\n " .join (f"• { kw } " for kw in keywords_preview )
79+ if len (added_keywords ) > 10 :
80+ keywords_text += f"\n ... и ещё { len (added_keywords ) - 10 } "
81+ response_parts .append (
82+ f"✅ Добавлено ключевых слов: { len (added_keywords )} \n { keywords_text } "
83+ )
84+
85+ if skipped_keywords :
86+ skipped_preview = skipped_keywords [:5 ] # Show first 5
87+ skipped_text = "\n " .join (f"• { kw } " for kw in skipped_preview )
88+ if len (skipped_keywords ) > 5 :
89+ skipped_text += f"\n ... и ещё { len (skipped_keywords ) - 5 } "
90+ response_parts .append (
91+ f"⚠️ Уже были добавлены ({ len (skipped_keywords )} ):\n { skipped_text } "
92+ )
93+
94+ if error_keywords :
95+ error_text = "\n " .join (f"• { kw } : { err } " for kw , err in error_keywords [:3 ])
96+ if len (error_keywords ) > 3 :
97+ error_text += f"\n ... и ещё { len (error_keywords ) - 3 } ошибок"
98+ response_parts .append (f"❌ Ошибки при добавлении:\n { error_text } " )
99+
100+ # Summary
101+ summary = (
102+ f"\n 📊 Итого:\n "
103+ f"• Добавлено: { len (added_keywords )} \n "
104+ f"• Пропущено (дубликаты): { len (skipped_keywords )} \n "
105+ f"• Ошибки: { len (error_keywords )} "
106+ )
107+ response_parts .append (summary )
108+
109+ await message .answer ("\n \n " .join (response_parts ))
110+
111+ # Log statistics
112+ logger .info (
113+ f"Keywords import for user { telegram_user .id } : "
114+ f"added={ len (added_keywords )} , skipped={ len (skipped_keywords )} , errors={ len (error_keywords )} "
115+ )
116+
117+ await state .clear ()
58118
59119
60120def register_entering_keyword_handler ():
61121 """Регистрация обработчиков"""
62- router .message .register (entering_keyword ) # Регистрация обработчика
122+ router .message .register (handle_enter_keyword_menu ) # Регистрация обработчика
0 commit comments