From 0b7f718f8aa1b272370f0b8339e16f05211ca8f0 Mon Sep 17 00:00:00 2001 From: KatykhinAA Date: Sat, 20 Jul 2024 16:54:43 +0300 Subject: [PATCH] refactor MediaGroup. Add database --- database/db.py | 128 ++++++++++++------ .../handlers/callback/callback_handlers.py | 34 ++--- .../handlers/private/private_handlers.py | 10 +- .../base_dependency_factory.cpython-312.pyc | Bin 2187 -> 2272 bytes .../__pycache__/helper_func.cpython-312.pyc | Bin 12712 -> 12738 bytes helper_bot/utils/base_dependency_factory.py | 4 +- helper_bot/utils/helper_func.py | 17 ++- migrations/000_migrations_init.py | 16 +-- migrations/001_create_new_tables.py | 12 +- migrations/002_create_tables_media_group.py | 60 ++++++++ run_helper.py | 4 +- 11 files changed, 193 insertions(+), 92 deletions(-) create mode 100644 migrations/002_create_tables_media_group.py diff --git a/database/db.py b/database/db.py index bd3c13c..76f4b12 100644 --- a/database/db.py +++ b/database/db.py @@ -1,14 +1,16 @@ -import sqlite3 import os +import sqlite3 from datetime import datetime + from logs.custom_logger import logger + # Получение абсолютного пути к текущей директории -current_dir = os.getcwd() +# current_dir = os.getcwd() class BotDB: - def __init__(self, name): + def __init__(self, current_dir, name): self.db_file = os.path.join(current_dir, name) self.conn = None self.cursor = None @@ -59,7 +61,7 @@ class BotDB: self.logger.info(f'Получена текущая версия миграции: {version}') return version except Exception as e: - self.logger.error(f'Ошибка при получении текущей версии миграции: {e}') + self.logger.error(f'Ошибка при получении текущей версии миграции: {str(e)}') raise finally: self.close() @@ -298,11 +300,6 @@ class BotDB: finally: self.close() - def change_name(self, user_id): - #TODO: реализовать функцию изменения имени пользователя по которому к нему обращается бот. Обновляем поля first_name, date_changed - #result = self.cursor.execute("UPDATE 'our_users' SET (?) WHERE user_id = (?)", (new_user_name), ) - pass - def get_info_about_stickers(self, user_id: int): """ Проверяет, получил ли пользователь стикеры. @@ -825,38 +822,23 @@ class BotDB: finally: self.close() - def add_post_from_telegram_in_db(self, group_message_id, message_id, is_last_message_id, content_name, text): - self.logger.info( - f"Запуск функции add_post_from_telegram_in_db: group_message_id={group_message_id}, message_id={message_id}" - f", is_last_message_id={is_last_message_id}, content_name={content_name}, text={text}") - try: - self.connect() - self.cursor.execute( - "INSERT INTO posts_from_telegram (group_message_id, message_id, is_last_message_id, content_name, text)" - "VALUES (?, ?, ?, ?, ?)", (group_message_id, message_id, is_last_message_id, content_name, text)) - self.conn.commit() - self.logger.info(f"Функция add_post_from_telegram_in_db отработала успешно") - return True - except Exception as e: - self.logger.error(f"Ошибка в функции add_post_from_telegram_in_db при добавлении поста в базу данных: {e}") - return False - def get_post_content_from_telegram_by_last_id(self, last_post_id: int): self.logger.info( f"Запуск функции get_post_content_from_telegram_by_last_id, идентификатор поста {last_post_id}") try: self.connect() - main_post_sql = self.cursor.execute("SELECT group_message_id " - "FROM posts_from_telegram WHERE message_id = ?", (last_post_id,)) - main_post = main_post_sql.fetchone()[0] - except Exception as e: - self.logger.error(f"Ошибка в функции get_post_content_from_telegram_by_last_id {str(e)}") - return False - try: - result = self.cursor.execute("SELECT content_name " - "FROM posts_from_telegram WHERE group_message_id = ?", (main_post,)) + result = self.cursor.execute(""" + SELECT cpft.content_name + FROM post_from_telegram_suggest pft + JOIN message_link_to_content mltc + ON pft.message_id = mltc.post_id + JOIN content_post_from_telegram cpft + ON cpft.message_id = mltc.message_id + WHERE pft.helper_text_message_id = ? + """, (last_post_id,)) post_content = result.fetchall() - self.logger.info(f"Функция get_post_content_from_telegram_by_last_id получила список контента: {post_content}") + self.logger.info( + f"Функция get_post_content_from_telegram_by_last_id получила список контента: {post_content}") return post_content finally: self.close() @@ -866,18 +848,20 @@ class BotDB: f"Запуск функции get_post_ids_from_telegram_by_last_id, идентификатор поста {last_post_id}") try: self.connect() - main_post_sql = self.cursor.execute("SELECT group_message_id " - "FROM posts_from_telegram WHERE message_id = ?", (last_post_id,)) - main_post = main_post_sql.fetchone()[0] + result = self.cursor.execute(""" + SELECT mltc.message_id + FROM post_from_telegram_suggest pft + JOIN message_link_to_content mltc + ON pft.message_id = mltc.post_id + WHERE pft.helper_text_message_id = ? + """, (last_post_id,)) + post_ids = result.fetchall() + self.logger.info(f"Функция get_post_ids_from_telegram_by_last_id " + f"получила идентификаторы сообщений: {post_ids}") + return post_ids except Exception as e: self.logger.error(f"Ошибка в функции get_post_ids_from_telegram_by_last_id {str(e)}") return False - try: - result = self.cursor.execute("SELECT message_id " - "FROM posts_from_telegram WHERE group_message_id = ?", (main_post,)) - post_ids = result.fetchall() - self.logger.info(f"Функция get_post_ids_from_telegram_by_last_id получила идентификаторы сообщений: {post_ids}") - return post_ids finally: self.close() @@ -886,13 +870,67 @@ class BotDB: try: self.connect() result = self.cursor.execute("SELECT text " - "FROM posts_from_telegram WHERE message_id = ?", (last_post_id,)) + "FROM post_from_telegram_suggest WHERE helper_text_message_id = ?", + (last_post_id,)) text = result.fetchone()[0] self.logger.info(f"Функция get_post_text_from_telegram_by_last_id получила text") return text except Exception as e: self.logger.error(f"Ошибка в функции get_post_text_from_telegram_by_last_id {str(e)}") + def add_post_content_in_db(self, post_id: int, message_id: int, content_name: str): + self.logger.info( + f"Запуск функции add_post_content_in_db: post_id={post_id}, message_id={message_id}, " + f"content_name={content_name}") + try: + self.connect() + self.cursor.execute( + "INSERT INTO message_link_to_content (post_id, message_id)" + "VALUES (?, ?)", (post_id, message_id)) + self.conn.commit() + self.cursor.execute( + "INSERT INTO content_post_from_telegram (message_id, content_name)" + "VALUES (?, ?)", (message_id, content_name)) + self.conn.commit() + self.logger.info(f"Функция add_post_content_in_db отработала успешно") + return True + except Exception as e: + self.logger.error(f"Ошибка в функции add_post_content_in_db при добавлении поста в базу данных: {e}") + return False + + def add_post_in_db(self, message_id: int, text: str, author_id: int): + self.logger.info( + f"Запуск функции add_post_in_db: message_id={message_id}, " + f"author_id={author_id}") + try: + today = datetime.now().strftime("%d-%m-%Y %H:%M:%S") + self.connect() + self.cursor.execute( + "INSERT INTO post_from_telegram_suggest (message_id, text, author_id, created_at)" + "VALUES (?, ?, ?, ?)", (message_id, text, author_id, today)) + self.conn.commit() + self.logger.info(f"Функция add_post_in_db отработала успешно") + return True + except Exception as e: + self.logger.error(f"Ошибка в функции add_post_in_db при добавлении поста в базу данных: {e}") + return False + + def update_helper_message_in_db(self, message_id: int, helper_message_id: int): + self.logger.info( + f"Запуск функции update_helper_message_in_db: message_id={message_id}, " + f"helper_message_id={helper_message_id}") + try: + self.connect() + self.cursor.execute( + "UPDATE post_from_telegram_suggest SET helper_text_message_id = ? WHERE message_id = ?", + (helper_message_id, message_id,)) + self.conn.commit() + self.logger.info(f"Функция update_helper_message_in_db отработала успешно") + return True + except Exception as e: + self.logger.error(f"Ошибка в функции update_helper_message_in_db при добавлении поста в базу данных: {e}") + return False + def add_audio_record(self, file_name, author_id, date_added, listen_count, file_id): """Добавляет информацию о войсе юзера в БД""" self.logger.info( diff --git a/helper_bot/handlers/callback/callback_handlers.py b/helper_bot/handlers/callback/callback_handlers.py index 417daa7..354f638 100644 --- a/helper_bot/handlers/callback/callback_handlers.py +++ b/helper_bot/handlers/callback/callback_handlers.py @@ -55,30 +55,19 @@ async def post_for_group(call: CallbackQuery, state: FSMContext): logger.error(f'Ошибка при публикации фотографии в канал {MAIN_PUBLIC}: {str(e)}') await call.answer(text='Что-то пошло не так!', show_alert=True, cache_time=3) elif call.message.text == "^": - user_data = await state.get_data() + # Получаем контент медиагруппы и текст для публикации + post_content = BotDB.get_post_content_from_telegram_by_last_id(call.message.message_id) + post_text = BotDB.get_post_text_from_telegram_by_last_id(call.message.message_id) - # Получаем идентификатор последнего предложенного сообщения из кэша - help_message = get_help_message_id(call.message.message_id, user_data) - - # Получаем идентификатор медиагруппы - media_group_id = help_message - 1 - - # Получаем контент медиагруппы и текст - post_content = BotDB.get_post_content_from_telegram_by_last_id(media_group_id) - post_text = BotDB.get_post_text_from_telegram_by_last_id(media_group_id) - post_ids = BotDB.get_post_ids_from_telegram_by_last_id(media_group_id) - - # Преобразуем результат в список + # Готовим список для удаления + post_ids = BotDB.get_post_ids_from_telegram_by_last_id(call.message.message_id) message_ids = [row[0] for row in post_ids] - - # Добавляем help_message в список - message_ids.append(help_message) + message_ids.append(call.message.message_id) # Выкладываем пост в канал await send_media_group_to_channel(bot=call.bot, chat_id=MAIN_PUBLIC, post_content=post_content, post_text=post_text) - # TODO: Удалить фотки с локалки - # TODO: Поменять чтобы записывалось не в FSM + # TODO: Удалить фотки с локалки после выкладки? await call.bot.delete_messages(chat_id=GROUP_FOR_POST, message_ids=message_ids) await call.answer(text='Выложено!', show_alert=True, cache_time=3) @@ -96,9 +85,12 @@ async def decline_post_for_group(call: CallbackQuery, state: FSMContext): f'Сообщение отклонено админом {call.from_user.full_name} (ID: {call.from_user.id}).') await call.answer(text='Отклонено!', show_alert=True, cache_time=3) if call.message.text == '^': - user_data = await state.get_data() - media_group_message_id = get_help_message_id(call.message.message_id, user_data) - await call.bot.delete_message(chat_id=MAIN_PUBLIC, message_id=media_group_message_id) + post_ids = BotDB.get_post_ids_from_telegram_by_last_id(call.message.message_id) + message_ids = [row[0] for row in post_ids] + message_ids.append(call.message.message_id) + + await call.bot.delete_messages(chat_id=GROUP_FOR_POST, message_ids=message_ids) + await call.answer(text='Удалено!', show_alert=True, cache_time=3) except Exception as e: await call.bot.send_message(IMPORTANT_LOGS, f"Произошла ошибка: {str(e)}\n\nTraceback:\n{traceback.format_exc()}") diff --git a/helper_bot/handlers/private/private_handlers.py b/helper_bot/handlers/private/private_handlers.py index 1dffc69..4f4060b 100644 --- a/helper_bot/handlers/private/private_handlers.py +++ b/helper_bot/handlers/private/private_handlers.py @@ -161,6 +161,7 @@ async def suggest_router(message: types.Message, state: FSMContext, album: list f"Вызов функции suggest_router. Пользователь: {message.from_user.id} Имя автора сообщения: {message.from_user.full_name}") try: if message.content_type == 'text': + print(message.content_type) lower_text = message.text.lower() # Получаем текст сообщения и преобразовываем его по правилам post_text = get_text_message(lower_text, message.from_user.full_name, @@ -179,6 +180,7 @@ async def suggest_router(message: types.Message, state: FSMContext, album: list await state.set_state("START") elif message.content_type == 'photo' and message.media_group_id is None: + print(message.content_type) lower_caption = message.caption.lower() markup = get_reply_keyboard_for_post() # Получаем текст сообщения и преобразовываем его по правилам @@ -197,7 +199,10 @@ async def suggest_router(message: types.Message, state: FSMContext, album: list elif message.media_group_id is not None: post_caption = " " - #TODO: Поставить запрет на обработку любых типов кроме photo. Запретить работать с forward message + if message.content_type != 'photo': + await message.bot.send_message(message.chat.id, + 'Я пока не умею работать с таким сообщением. ' + 'Пришли текст и фото/фоты(ы)') # Получаем сообщение и проверяем есть ли подпись. Если подпись есть, то преобразуем ее через функцию if album[0].caption: @@ -217,7 +222,7 @@ async def suggest_router(message: types.Message, state: FSMContext, album: list help_message_id = await send_text_message(GROUP_FOR_POST, message, "^", markup) # Записываем в state идентификаторы текстового сообщения И последнего сообщения медиагруппы - await state.update_data(media_group_message_id=media_group_message_id, help_message_id=help_message_id) + BotDB.update_helper_message_in_db(message_id=media_group_message_id, helper_message_id=help_message_id) # Получаем клавиатуру для пользователя, благодарим за пост, и возвращаем в дефолтное сообщение markup_for_user = get_reply_keyboard(BotDB, message.from_user.id) @@ -225,6 +230,7 @@ async def suggest_router(message: types.Message, state: FSMContext, album: list await message.answer(success_send_message, reply_markup=markup_for_user) await state.set_state("START") else: + print(f'Тип: {message.content_type}') await message.bot.send_message(message.chat.id, 'Я пока не умею работать с таким сообщением. Пришли текст и фото/фоты(ы)') except Exception as e: diff --git a/helper_bot/utils/__pycache__/base_dependency_factory.cpython-312.pyc b/helper_bot/utils/__pycache__/base_dependency_factory.cpython-312.pyc index 6701f6cfdf3b8491fd112930ec4d1ea18c2986af..f818b5d967f5539a5897150c30006f228865ebd0 100644 GIT binary patch delta 451 zcmeAcd?3honwOW00SJ!mpPi=2I+0I;F>a!|HcKjF7T4roj8bAzY)lO93@OYl3@I$D znLsKT7^2uGrZjMD0rI9ZlrT(|W0aZ9!FWWXLUlN*>ECwDT3F!E2n$L!C;om^T}l$uu(pORTLS%>938#mC< zV%f=ztiBv`vM*@6UY2m%9KtHd$Rh!gU<48hMKY5M*-XXdKmt5KqJiNCzi@wTXYBJ!O!6z$f03)Suaz*`3|M{hdvcQT7u9kN}$m07;8u AWB>pF delta 360 zcmaDL*e%F+nwOW00SFfFn3ndPWg?#hqs>HhZ6SAt6y_F&6qeOYAV~&>DAtK>4IHb0 zyy*-j43ixgWhQGe9^p%2Ud;$mP{R< k*yQG?l;)(`6=?z`KsE#Yv4KN`|2vx`qwFUJAOThl0Mar`ga7~l diff --git a/helper_bot/utils/__pycache__/helper_func.cpython-312.pyc b/helper_bot/utils/__pycache__/helper_func.cpython-312.pyc index ca8051095e7ec670e013514f47cf4bb5307fe2c4..5ed8989adb5c0dbb6b478f0455effe59de240cf8 100644 GIT binary patch delta 1367 zcmZuxZA@Eb6n@|P(LgDsmwwO|N}&--X)oZ$7>Z_42GOyUW{BH#Tlu&h7WvA1i#k^_ z(&^%lX(X?17!yN+Au}jhQonv^gvB4~Ozd@Pp)OGufA~X98Gq&y6VE%qiP=f+Ip=-O zIqyB^Il1@J;FUq+)xttO0&%|o=E)a*Ge$dh&UkO+OD~`&EJ|_II`ftzwHyCnv|*OD zB|5NY;n`TAZc}v&j`Q1*1X|om+>eegA#{vGXo{QS6a28SopaYJm`6W~fQ~_AQrW+IqCM zo^!U?~aTGxDoJ${6k$S(o5S{Iex^TQx%m$u@nvgjWo>y-2rG806a}x@4&` z)WJHt5JneK0yC=VpQUy>S6a&Rae;o8S58N*PJMz`I0xJ@tfyM7na9Hh`isTvHv;rO zxx1#gv>i(DiIF7-izDiqc^=CwVMzCvweYR|FKy&yq zjz-PVczI-bm)6voX$omgp>+6gCfu)u`!iuh3oG9V(d&B0Y~Y&Sn-RQe!MiHCW(PE> zG9v{vDKLFtwZNJdthplIqPvyTBeCYT>VfwqD}z=%kAsr%c3TO!D=j!^77A7#vcchs z83(PYuWbi;+(sSFPO$?jo}X8o9DamG%O1v^biV9r$%ME83A;s}6isUdGOhezq0uS%Q%;CK3!FOCn< zeYGCvAvmk-2T(ywpozMz{-&pEU&n+>eqTX111(I&X@~!ycnVycy5N5XCe6)A~ z0AD^~Uo<())DileybB+oi?SOZrB~%jnDGy}K}6=K}fI j_Hla-f%&598~IE5j=S2re>tMH_HOWi=j`-@hK+v!K!sf^ delta 1358 zcmah|ZA_b06u$R;-&f(`H}oyL6y&tq#pmCXA!v5 z+QL196)|_?v3l>DE4TEwHP6-!{K1xRF$wFWtDmJ z#@VaJ9GRy_D*-&17J~?}OU62XNtddIqsL?Ma4$VR7>-8BR=cUf-E$W7 zvB*$7JQ#_^y80rt97wigR7ege4(2MXtXc%^C$ut-vKCZYJ>|R{&e;5En?EI47cKTH z`g<1TKFTGd>_p-AQ?+S*ZK`h1%xI>iBi+)GI@Fmu(wFKV{z^YGZ^(PQ?EJtzW7(Ci zw9);A!M&)LGy4CC_~C!nvoaiuvqq$Mr6gxIADOK|{2*2c7oG@cgT;7OkAoJ?tf3JM zR%WUYZX>qWbiljTM}!h0^ndN)K-7l8-wpGbcUJnL2SuwrkU}2{^a=2z@MiulIj@?B zu=D0(-40HBIQUrF{E~JTs8N`)e)gE9u3KlFthv!S<4QN|$uzX38`{3qhB8tpC57f? z+hliIc4p+7v|Ka3cV1^sN#?9UG-+0{xrpq8%$%^%gfn2rS8-sA^gh>S2@cq#S&fD3 zHXN`gf3>uV_$ju-+DwArfAZ=XtALx?*^-^QCa|fWgO6>^H?i+Z3du8IUQGT`@-fCO zY^qejP3-GZH)#d>gQQ@87UMP+a@fdoKujm2j&_WnXLp=l!28a97Y{pYT zhJg5u{p^Y3{VZJVvhD{v29F*&XaOKSu?~N-cdIYrDBJ4w=-N1G;y_u%+e$`36_U5S zBN)HH6s5!X3J{)66#hM;?HpcYlgc*yG@DcG_#pd5aYBxU+Ilh$i#f^0+9TM&`?f&h z!_k2V4YKQXn|-`cl$V9_Qc#{a