From 0704e6b3fe1577286760fbda8095158474c6670c Mon Sep 17 00:00:00 2001 From: KatykhinAA Date: Sat, 20 Jul 2024 22:41:48 +0300 Subject: [PATCH] all type message can process --- database/db.py | 14 +- .../handlers/callback/callback_handlers.py | 49 +++++- .../handlers/private/private_handlers.py | 80 +++++++-- .../__pycache__/helper_func.cpython-312.pyc | Bin 12738 -> 17877 bytes helper_bot/utils/helper_func.py | 164 ++++++++++++++---- logs/custom_logger.py | 3 +- migrations/002_create_tables_media_group.py | 3 +- 7 files changed, 257 insertions(+), 56 deletions(-) diff --git a/database/db.py b/database/db.py index 76f4b12..9948499 100644 --- a/database/db.py +++ b/database/db.py @@ -5,10 +5,6 @@ from datetime import datetime from logs.custom_logger import logger -# Получение абсолютного пути к текущей директории -# current_dir = os.getcwd() - - class BotDB: def __init__(self, current_dir, name): self.db_file = os.path.join(current_dir, name) @@ -828,7 +824,7 @@ class BotDB: try: self.connect() result = self.cursor.execute(""" - SELECT cpft.content_name + SELECT cpft.content_name, cpft.content_type FROM post_from_telegram_suggest pft JOIN message_link_to_content mltc ON pft.message_id = mltc.post_id @@ -878,10 +874,10 @@ class BotDB: 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): + def add_post_content_in_db(self, post_id: int, message_id: int, content_name: str, type_content: str): self.logger.info( f"Запуск функции add_post_content_in_db: post_id={post_id}, message_id={message_id}, " - f"content_name={content_name}") + f"content_name={content_name}, content_type={type_content}") try: self.connect() self.cursor.execute( @@ -889,8 +885,8 @@ class BotDB: "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)) + "INSERT INTO content_post_from_telegram (message_id, content_name, content_type)" + "VALUES (?, ?, ?)", (message_id, content_name, type_content)) self.conn.commit() self.logger.info(f"Функция add_post_content_in_db отработала успешно") return True diff --git a/helper_bot/handlers/callback/callback_handlers.py b/helper_bot/handlers/callback/callback_handlers.py index 354f638..761867e 100644 --- a/helper_bot/handlers/callback/callback_handlers.py +++ b/helper_bot/handlers/callback/callback_handlers.py @@ -8,7 +8,8 @@ from helper_bot.keyboards.main import create_keyboard_with_pagination, get_reply create_keyboard_for_ban_reason from helper_bot.utils.base_dependency_factory import BaseDependencyFactory from helper_bot.utils.helper_func import send_text_message, send_photo_message, get_banned_users_list, \ - get_banned_users_buttons, delete_user_blacklist, get_help_message_id, send_media_group_to_channel + get_banned_users_buttons, delete_user_blacklist, send_media_group_to_channel, \ + send_video_message, send_video_note_message, send_audio_message, send_voice_message from logs.custom_logger import logger callback_router = Router() @@ -54,6 +55,50 @@ async def post_for_group(call: CallbackQuery, state: FSMContext): text=f"Произошла ошибка: {str(e)}\n\nTraceback:\n{traceback.format_exc()}") logger.error(f'Ошибка при публикации фотографии в канал {MAIN_PUBLIC}: {str(e)}') await call.answer(text='Что-то пошло не так!', show_alert=True, cache_time=3) + elif call.message.content_type == 'video': + try: + await send_video_message(MAIN_PUBLIC, call.message, call.message.video.file_id, call.message.caption) + await call.bot.delete_message(chat_id=GROUP_FOR_POST, message_id=call.message.message_id) + logger.info(f'Пост с видео опубликован в канале {MAIN_PUBLIC}.') + await call.answer(text='Выложено!', show_alert=True, cache_time=3) + except Exception as e: + await call.bot.send_message(chat_id=IMPORTANT_LOGS, + text=f"Произошла ошибка: {str(e)}\n\nTraceback:\n{traceback.format_exc()}") + logger.error(f'Ошибка при публикации видео в канал {MAIN_PUBLIC}: {str(e)}') + await call.answer(text='Что-то пошло не так!', show_alert=True, cache_time=3) + elif call.message.content_type == 'video_note': + try: + await send_video_note_message(MAIN_PUBLIC, call.message, call.message.video_note.file_id) + await call.bot.delete_message(chat_id=GROUP_FOR_POST, message_id=call.message.message_id) + logger.info(f'Пост с кружком опубликован в канале {MAIN_PUBLIC}.') + await call.answer(text='Выложено!', show_alert=True, cache_time=3) + except Exception as e: + await call.bot.send_message(chat_id=IMPORTANT_LOGS, + text=f"Произошла ошибка: {str(e)}\n\nTraceback:\n{traceback.format_exc()}") + logger.error(f'Ошибка при публикации кружка в канал {MAIN_PUBLIC}: {str(e)}') + await call.answer(text='Что-то пошло не так!', show_alert=True, cache_time=3) + elif call.message.content_type == 'audio': + try: + await send_audio_message(MAIN_PUBLIC, call.message, call.message.audio.file_id, call.message.caption) + await call.bot.delete_message(chat_id=GROUP_FOR_POST, message_id=call.message.message_id) + logger.info(f'Пост с аудио опубликован в канале {MAIN_PUBLIC}.') + await call.answer(text='Выложено!', show_alert=True, cache_time=3) + except Exception as e: + await call.bot.send_message(chat_id=IMPORTANT_LOGS, + text=f"Произошла ошибка: {str(e)}\n\nTraceback:\n{traceback.format_exc()}") + logger.error(f'Ошибка при публикации аудио в канал {MAIN_PUBLIC}: {str(e)}') + await call.answer(text='Что-то пошло не так!', show_alert=True, cache_time=3) + elif call.message.content_type == 'voice': + try: + await send_voice_message(MAIN_PUBLIC, call.message, call.message.voice.file_id) + await call.bot.delete_message(chat_id=GROUP_FOR_POST, message_id=call.message.message_id) + logger.info(f'Пост с войсом опубликован в канале {MAIN_PUBLIC}.') + await call.answer(text='Выложено!', show_alert=True, cache_time=3) + except Exception as e: + await call.bot.send_message(chat_id=IMPORTANT_LOGS, + text=f"Произошла ошибка: {str(e)}\n\nTraceback:\n{traceback.format_exc()}") + logger.error(f'Ошибка при публикации войса в канал {MAIN_PUBLIC}: {str(e)}') + await call.answer(text='Что-то пошло не так!', show_alert=True, cache_time=3) elif call.message.text == "^": # Получаем контент медиагруппы и текст для публикации post_content = BotDB.get_post_content_from_telegram_by_last_id(call.message.message_id) @@ -151,7 +196,7 @@ async def change_page(call: CallbackQuery): logger.info(f"Переход на страницу {page_number}") if call.message.text == 'Список пользователей которые последними обращались к боту': list_users = BotDB.get_last_users_from_db() - #TODO: Здесь где-то надо добавить обработку ошибки IndexError: list index out of range + # TODO: Здесь где-то надо добавить обработку ошибки IndexError: list index out of range keyboard = create_keyboard_with_pagination(int(page_number), len(list_users), list_users, 'ban') diff --git a/helper_bot/handlers/private/private_handlers.py b/helper_bot/handlers/private/private_handlers.py index 4f4060b..e0a75e4 100644 --- a/helper_bot/handlers/private/private_handlers.py +++ b/helper_bot/handlers/private/private_handlers.py @@ -17,7 +17,8 @@ from helper_bot.middlewares.blacklist_middleware import BlacklistMiddleware from helper_bot.utils import messages from helper_bot.utils.base_dependency_factory import BaseDependencyFactory from helper_bot.utils.helper_func import get_first_name, get_text_message, send_text_message, send_photo_message, \ - send_media_group_message_to_private_chat, prepare_media_group_from_middlewares, check_username_and_full_name + send_media_group_message_to_private_chat, prepare_media_group_from_middlewares, check_username_and_full_name, \ + send_video_message, send_video_note_message, send_audio_message, send_voice_message from logs.custom_logger import logger private_router = Router() @@ -129,6 +130,7 @@ async def suggest_post(message: types.Message, state: FSMContext): ) async def end_message(message: types.Message, state: FSMContext): try: + await message.forward(chat_id=GROUP_FOR_LOGS) logger.info( f"Вызов функции end_message. Пользователь: {message.from_user.id} Имя автора сообщения: {message.from_user.full_name}") name_stick_bye = list(Path('Stick').rglob('Universal_*')) @@ -160,8 +162,8 @@ async def suggest_router(message: types.Message, state: FSMContext, album: list logger.info( f"Вызов функции suggest_router. Пользователь: {message.from_user.id} Имя автора сообщения: {message.from_user.full_name}") try: + post_caption = '' 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, @@ -180,7 +182,6 @@ 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,12 +198,69 @@ 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") + elif message.content_type == 'video' and message.media_group_id is None: + if message.caption: + lower_caption = message.caption.lower() + post_caption = get_text_message(lower_caption, message.from_user.full_name, + message.from_user.username) + markup = get_reply_keyboard_for_post() + # Получаем текст сообщения и преобразовываем его по правилам + + # Отправляем видео и текст в приватный канал + await send_video_message(GROUP_FOR_POST, message, + message.video.file_id, post_caption, markup) + + # Отправляем юзеру ответ и возвращаем его в меню + markup_for_user = get_reply_keyboard(BotDB, message.from_user.id) + success_send_message = messages.get_message(get_first_name(message), 'SUCCESS_SEND_MESSAGE') + await message.answer(success_send_message, reply_markup=markup_for_user) + await state.set_state("START") + + elif message.content_type == 'video_note' and message.media_group_id is None: + markup = get_reply_keyboard_for_post() + + # Отправляем видеокружок в приватный канал + await send_video_note_message(GROUP_FOR_POST, message, + message.video_note.file_id, markup) + + # Отправляем юзеру ответ и возвращаем его в меню + markup_for_user = get_reply_keyboard(BotDB, message.from_user.id) + success_send_message = messages.get_message(get_first_name(message), 'SUCCESS_SEND_MESSAGE') + await message.answer(success_send_message, reply_markup=markup_for_user) + await state.set_state("START") + + elif message.content_type == 'audio' and message.media_group_id is None: + lower_caption = message.caption.lower() + markup = get_reply_keyboard_for_post() + # Получаем текст сообщения и преобразовываем его по правилам + post_caption = get_text_message(lower_caption, message.from_user.full_name, + message.from_user.username) + + # Отправляем видео и текст в приватный канал + await send_audio_message(GROUP_FOR_POST, message, + message.audio.file_id, post_caption, markup) + + # Отправляем юзеру ответ и возвращаем его в меню + markup_for_user = get_reply_keyboard(BotDB, message.from_user.id) + success_send_message = messages.get_message(get_first_name(message), 'SUCCESS_SEND_MESSAGE') + await message.answer(success_send_message, reply_markup=markup_for_user) + await state.set_state("START") + + elif message.content_type == 'voice' and message.media_group_id is None: + markup = get_reply_keyboard_for_post() + + # Отправляем видео и текст в приватный канал + await send_voice_message(GROUP_FOR_POST, message, + message.voice.file_id, markup) + + # Отправляем юзеру ответ и возвращаем его в меню + markup_for_user = get_reply_keyboard(BotDB, message.from_user.id) + success_send_message = messages.get_message(get_first_name(message), 'SUCCESS_SEND_MESSAGE') + await message.answer(success_send_message, reply_markup=markup_for_user) + await state.set_state("START") + elif message.media_group_id is not None: post_caption = " " - if message.content_type != 'photo': - await message.bot.send_message(message.chat.id, - 'Я пока не умею работать с таким сообщением. ' - 'Пришли текст и фото/фоты(ы)') # Получаем сообщение и проверяем есть ли подпись. Если подпись есть, то преобразуем ее через функцию if album[0].caption: @@ -214,7 +272,8 @@ async def suggest_router(message: types.Message, state: FSMContext, album: list media_group = await prepare_media_group_from_middlewares(album, post_caption) # Отправляем медиагруппу в секретный чат - media_group_message_id = await send_media_group_message_to_private_chat(GROUP_FOR_POST, message, media_group) + media_group_message_id = await send_media_group_message_to_private_chat(GROUP_FOR_POST, message, + media_group) sleep(0.2) # Получаем клавиатуру и отправляем еще одно текстовое сообщение с кнопками @@ -230,9 +289,10 @@ 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, - 'Я пока не умею работать с таким сообщением. Пришли текст и фото/фоты(ы)') + 'Я пока не умею работать с таким сообщением. ' + 'Пришли текст и фото/фоты(ы). А лучше перешли это сообщение админу @kerrad1\n' + 'Мы добавим его к обработке если необходимо') except Exception as e: await message.bot.send_message(chat_id=IMPORTANT_LOGS, text=f"Произошла ошибка: {str(e)}\n\nTraceback:\n{traceback.format_exc()}") diff --git a/helper_bot/utils/__pycache__/helper_func.cpython-312.pyc b/helper_bot/utils/__pycache__/helper_func.cpython-312.pyc index 5ed8989adb5c0dbb6b478f0455effe59de240cf8..b84c58aa27bbb011e7a396de310f68c508ea5868 100644 GIT binary patch delta 6582 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 D_`3#k delta 3260 zcmai04Qv$06`r}>J@5JKyYv0{?rh_~JO3OQ%V4`02fOxxNkfQ9Vw%L)pzGPYHV5~Y z**gKL!Gt;$2oyx7DrpHVq*9xTR3&oNQmKL%MO9F%)+ivzHWiWDN=;QELlh}Ot=jkI zY~!{{yVAaW`@Nr;dGp?zxp|yk9e4b?yu6gaQ}xp`6E8?_*}bkVdnrHx3*ey!kEi`uhr@W z-vE4_)(C5_*Fv!Nu-*W%^}!UHX4cEG#zpgHPzxcCLDpKt3R?jSYY{MQI^d7AeTy6!e5ta`G?XOTFUp!V@d@G9Q=;FmO5w4l`B%G2LR?o;ss(zKVp3;*fZhC`YKFRb#@6Vlp@ck6D5Rc^Oc8!K=;c3Y^{t{80LSO+kdR*k zpWl*BOW#lwa?mnm;SDaIBrR%hD)m)JQ_@?O3y{D|7Tjg`O>WpgPN*T0SBp3yVZs^@ z%6a?J|DLiX?%`LHrsOl^tYv9@N=9J@2jxTZ0b2a-qx;ByX_V}vKbH2y^vb zkIY}5ecPU)d`J1{bcrdAW%H(r%b!T5bXEl;nB`h_UnZ4JXaX~BL;J_|Tt1o2FdK>$ zov|#7C=4r;1rU-S8dKd+0D{mi1=q3cF1I_I&$1ARTj4bhl>_|?`Rp)R2$U#Zo_6@V zZ+io$hffV3wcU33PVPOn_m-pOx})V{<%9ih=OI#WAXOWvS^Rr2>cfSdEs!5Vqas~{glg}Ew(NUzEYAXjZtw2W_eHqBn}Stu>=XWS3EKE}6t=WXNkOSD#gVH_<4`77eq=THC9NoFesXKVIQAl*+R~w$%lb7tRNPlTTIL_5BS4Y zwjSVqzSVzr_KBMPmhNU8jf&6@GfXGef{1FCE~alhsj)SPw;{nTVj+I1Dx|DMJ^oQu zYwtP)mv>NX{C|z^OlVp>nTcy-P#3Ubwh@e;QMrn!bxX0gDFwqQ|go)0~>=N@}Aaen&^&$^>qZkJV@+%LpT_Upm+i#u-wdvBIKvQPpB_uSlQ`N}{i_&cITE9vpB!HDHb7`V9*je6y|u!4Lf z9Ia5UmP^22by4IiWZ;KQYdXR97IOSvMc1p>TX!#Y&%WHf*+O^m zYa8CB-TalFwuW6GHI;&)GedM7Qx?1oFb0&l`0snFt-Im(UBds~GXqENOB-L^83$lR zcaxY{OaRZSu|y`LYjNQwKEbkSXi=glV1FlYG!;eA1r0U{zYh<4KG|DqO#$=);m3Qo zTirND&+H$1KcK-%;9-Ay5K03vu(OKk{ccmxnuDLe5q@`52&U)m+o3)U0H}BKWM6eP z{ut1F7Q@O6U`y&v^SNj{41AtQgi~b%6 z+e|NBP}>8ms7;JGg7Gx=P$` z9EA)7ES|~clM_ieypMpbl@AS`a^mtM)Fcc~;z%>UKe&#sjjqY6@N2qL*-4{)ykO)Z zzQDt+sCWU8#@jSy#D8?4!Bo@MO+ZZlHT;(39o6=dW zkkb3vDZp?`jBf*7kSL{hNb8?T@DBL`&uxA(8vQ~x`g zKOykB-^D-Oyt>Ix`z~%?0HE)k{Ch+5Pk;H^w(E~RD}Z@z5;gnob@44*M)_BVUXXDn F{{m*c;0gc$ diff --git a/helper_bot/utils/helper_func.py b/helper_bot/utils/helper_func.py index b062cdc..e47146f 100644 --- a/helper_bot/utils/helper_func.py +++ b/helper_bot/utils/helper_func.py @@ -1,7 +1,8 @@ +import os from datetime import datetime, timedelta from aiogram import types -from aiogram.types import InputMediaPhoto, FSInputFile +from aiogram.types import InputMediaPhoto, FSInputFile, InputMediaVideo, InputMediaAudio from helper_bot.utils.base_dependency_factory import BaseDependencyFactory from logs.custom_logger import logger @@ -37,9 +38,9 @@ def get_text_message(post_text: str, first_name: str, username: str): return f'Пост из ТГ:\n{post_text}\n\nАвтор поста: {first_name} @{username}' -async def download_photo(message: types.Message, file_id: str): +async def download_file(message: types.Message, file_id: str): """ - Скачивает фото по file_id из Telegram. + Скачивает файл по file_id из Telegram. Args: message: сообщение @@ -50,9 +51,12 @@ async def download_photo(message: types.Message, file_id: str): Путь к сохраненному файлу, если файл был скачан успешно, иначе None """ try: + os.makedirs("files", exist_ok=True) + os.makedirs("files/photos", exist_ok=True) + os.makedirs("files/videos", exist_ok=True) file = await message.bot.get_file(file_id) - file_path = file.file_path - await message.bot.download_file(file_path=file_path, destination=file_path) + file_path = os.path.join("files", file.file_path) + await message.bot.download_file(file_path=file.file_path, destination=file_path) return file_path except Exception as e: logger.error(f"Ошибка скачивания фотографии: {e}") @@ -71,17 +75,37 @@ async def prepare_media_group_from_middlewares(album, post_caption: str = ''): Список InputMediaPhoto (MediaGroup). """ media_group = [] - # Циклом проходимся по собранному миддлварью объекту album for i, message in enumerate(album): - file_id = message.photo[-1].file_id - - # Если это последняя фото в массиве, то добавляем подпись. Остальные фото просто преобразуем в InputMediaPhoto - # и формируем объект MediaGroup - if i == len(album) - 1: - media_group.append(InputMediaPhoto(media=file_id, caption=post_caption)) + if message.photo: + file_id = message.photo[-1].file_id + media_type = 'photo' + elif message.video: + file_id = message.video.file_id + media_type = 'video' + elif message.audio: + file_id = message.audio.file_id + media_type = 'audio' else: - media_group.append(InputMediaPhoto(media=file_id)) + # Если нет фото, видео или аудио, пропускаем сообщение + continue + + # Формируем объект MediaGroup с учетом типа медиа + if i == len(album) - 1: + if media_type == 'photo': + media_group.append(InputMediaPhoto(media=file_id, caption=post_caption)) + elif media_type == 'video': + media_group.append(InputMediaVideo(media=file_id, caption=post_caption)) + elif media_type == 'audio': + media_group.append(InputMediaAudio(media=file_id, caption=post_caption)) + else: + if media_type == 'photo': + media_group.append(InputMediaPhoto(media=file_id)) + elif media_type == 'video': + media_group.append(InputMediaVideo(media=file_id)) + elif media_type == 'audio': + media_group.append(InputMediaAudio(media=file_id)) + return media_group # Возвращаем MediaGroup @@ -89,6 +113,31 @@ async def add_in_db_media(sent_message): """ Идентификатор медиа-группы + Args: + sent_message: sent_message объект из Telegram API + + Returns: + Список InputFile (FSInputFile). + """ + media_group_message_id = sent_message[-1].message_id # Получаем идентификатор медиа-группы + for i, message in enumerate(sent_message): + if message.photo: + file_id = message.photo[-1].file_id + file_path = await download_file(message, file_id=file_id) + BotDB.add_post_content_in_db(media_group_message_id, message.message_id, file_path, 'photo') + elif message.video: + file_id = message.video.file_id + file_path = await download_file(message, file_id=file_id) + BotDB.add_post_content_in_db(media_group_message_id, message.message_id, file_path, 'video') + else: + # Если нет фото, видео или аудио, или другой контент, пропускаем сообщение + continue + + +async def add_in_db_media_old(sent_message): + """ + Идентификатор медиа-группы + Args: sent_message: sent_message объект из Telegram API @@ -98,7 +147,7 @@ async def add_in_db_media(sent_message): media_group_message_id = sent_message[-1].message_id # Получаем идентификатор медиа-группы for i, message in enumerate(sent_message): file_id = message.photo[-1].file_id - file_path = await download_photo(message, file_id=file_id) + file_path = await download_file(message, file_id=file_id) if i == 0: BotDB.add_post_content_in_db(media_group_message_id, message.message_id, file_path) elif i == len(sent_message) - 1: @@ -133,7 +182,11 @@ async def send_media_group_to_channel(bot, chat_id: int, post_content: list[tupl for file_path in post_content: try: file = FSInputFile(path=file_path[0]) - media.append(types.InputMediaPhoto(media=file)) + type = file_path[1] + if type == 'video': + media.append(types.InputMediaVideo(media=file)) + if type == 'photo': + media.append(types.InputMediaPhoto(media=file)) except FileNotFoundError: logger.error(f"Файл не найден: {file_path[0]}") return @@ -180,6 +233,70 @@ async def send_photo_message(chat_id, message: types.Message, photo: str, post_t ) +async def send_video_message(chat_id, message: types.Message, video: str, post_text: str = "", + markup: types.ReplyKeyboardMarkup = None): + if markup is None: + await message.bot.send_video( + chat_id=chat_id, + caption=post_text, + video=video + ) + else: + await message.bot.send_video( + chat_id=chat_id, + caption=post_text, + video=video, + reply_markup=markup + ) + + +async def send_video_note_message(chat_id, message: types.Message, video_note: str, + markup: types.ReplyKeyboardMarkup = None): + if markup is None: + await message.bot.send_video_note( + chat_id=chat_id, + video_note=video_note + ) + else: + await message.bot.send_video_note( + chat_id=chat_id, + video_note=video_note, + reply_markup=markup + ) + + +async def send_audio_message(chat_id, message: types.Message, audio: str, post_text: str, + markup: types.ReplyKeyboardMarkup = None): + if markup is None: + await message.bot.send_audio( + chat_id=chat_id, + caption=post_text, + audio=audio + ) + else: + await message.bot.send_audio( + chat_id=chat_id, + caption=post_text, + audio=audio, + reply_markup=markup + ) + + +async def send_voice_message(chat_id, message: types.Message, voice: str, + markup: types.ReplyKeyboardMarkup = None): + if markup is None: + await message.bot.send_voice( + chat_id=chat_id, + voice=voice + ) + else: + await message.bot.send_voice( + chat_id=chat_id, + voice=voice, + reply_markup=markup + ) + + def check_access(user_id: int): """Проверка прав на совершение действий""" return BotDB.is_admin(user_id) @@ -233,23 +350,6 @@ def get_banned_users_buttons(): return user_ids -def get_help_message_id(media_group_message_id: int, data: dict) -> int: - """ - Получает идентификатор текстового сообщения по идентификатору сообщения группы. - - Args: - media_group_message_id: Идентификатор сообщения группы - data: Словарь с данными. - - Returns: - Идентификатор сообщения помощи. - """ - if 'help_message_id' in data: - return data['help_message_id'] # Возвращаем help_message_id - else: - return 0 - - def delete_user_blacklist(user_id: int): return BotDB.delete_user_blacklist(user_id=user_id) diff --git a/logs/custom_logger.py b/logs/custom_logger.py index 438e6fc..dd31621 100644 --- a/logs/custom_logger.py +++ b/logs/custom_logger.py @@ -1,7 +1,7 @@ import datetime import os -from loguru import logger +from loguru import logger logger = logger.bind(name='main_log') @@ -20,6 +20,5 @@ logger.add( filename, rotation="00:00", retention="5 days", - compression="zip", format="{time:YYYY-MM-DD at HH:mm:ss} | {level} | {name} | {line} | {message}", ) diff --git a/migrations/002_create_tables_media_group.py b/migrations/002_create_tables_media_group.py index 2c4e382..b87f5aa 100644 --- a/migrations/002_create_tables_media_group.py +++ b/migrations/002_create_tables_media_group.py @@ -44,7 +44,8 @@ def main(): create_table_sql_3 = """ CREATE TABLE IF NOT EXISTS content_post_from_telegram ( message_id INTEGER NOT NULL, - content_name TEXT NOT NULL + content_name TEXT NOT NULL, + content_type TEXT ); """ # Применение миграции