From 88889fe87c5d5cdb865c9a2fecc402f5f4892404 Mon Sep 17 00:00:00 2001 From: KatykhinAA Date: Tue, 16 Jul 2024 22:25:32 +0300 Subject: [PATCH 1/8] mediaGroup start work --- .../__pycache__/__init__.cpython-312.pyc | Bin 217 -> 227 bytes .../admin/__pycache__/main.cpython-312.pyc | Bin 11097 -> 0 bytes helper_bot/handlers/admin/admin_handlers.py | 278 ++++----- .../__pycache__/__init__.cpython-312.pyc | Bin 223 -> 236 bytes .../callback/__pycache__/main.cpython-312.pyc | Bin 15197 -> 0 bytes .../handlers/callback/callback_handlers.py | 320 +++++----- .../__pycache__/__init__.cpython-312.pyc | Bin 217 -> 227 bytes .../group/__pycache__/main.cpython-312.pyc | Bin 4958 -> 0 bytes helper_bot/handlers/group/group_handlers.py | 100 ++-- .../__pycache__/__init__.cpython-312.pyc | Bin 221 -> 233 bytes .../private/__pycache__/main.cpython-312.pyc | Bin 23916 -> 0 bytes .../handlers/private/private_handlers.py | 566 +++++++++--------- .../__pycache__/__init__.cpython-312.pyc | Bin 259 -> 259 bytes .../__pycache__/main.cpython-312.pyc | Bin 6436 -> 6436 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 170 -> 170 bytes .../text_middleware.cpython-312.pyc | Bin 2735 -> 2735 bytes .../middlewares/blacklist_middleware.py | 42 +- .../__pycache__/__init__.cpython-312.pyc | Bin 206 -> 206 bytes .../base_dependency_factory.cpython-312.pyc | Bin 1802 -> 2187 bytes .../__pycache__/helper_func.cpython-312.pyc | Bin 9186 -> 9425 bytes .../__pycache__/messages.cpython-312.pyc | Bin 5461 -> 5461 bytes .../utils/__pycache__/state.cpython-312.pyc | Bin 673 -> 673 bytes helper_bot/utils/helper_func.py | 3 + logs/custom_logger.py | 50 +- requirements.txt | 42 +- 25 files changed, 705 insertions(+), 696 deletions(-) delete mode 100644 helper_bot/handlers/admin/__pycache__/main.cpython-312.pyc delete mode 100644 helper_bot/handlers/callback/__pycache__/main.cpython-312.pyc delete mode 100644 helper_bot/handlers/group/__pycache__/main.cpython-312.pyc delete mode 100644 helper_bot/handlers/private/__pycache__/main.cpython-312.pyc diff --git a/helper_bot/handlers/admin/__pycache__/__init__.cpython-312.pyc b/helper_bot/handlers/admin/__pycache__/__init__.cpython-312.pyc index 9ab05eda4048a9895f89bc09bc718bfc9039fea5..6c6f3148d7c76b44511038f65d2b802a47ceae87 100644 GIT binary patch delta 47 zcmcb~_?VIRG%qg~0}%9dPEFI8$m_w+mza{9nHQgtn3s~1T2wqSs*+8khz+O$08v2= Axc~qF delta 37 qcmaFNc$1O$G%qg~0}$B%o|Gmxk=KKjB{wlMZ(>R%n_LkaP#gfqlnJQ- diff --git a/helper_bot/handlers/admin/__pycache__/main.cpython-312.pyc b/helper_bot/handlers/admin/__pycache__/main.cpython-312.pyc deleted file mode 100644 index b9ab95a0f82e3c06ed4237824e134db711820077..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 11097 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 V>}K{HRKu9o`>hs9;dxNF{{kl_yJr9Z diff --git a/helper_bot/handlers/callback/callback_handlers.py b/helper_bot/handlers/callback/callback_handlers.py index 068cb79..c3136aa 100644 --- a/helper_bot/handlers/callback/callback_handlers.py +++ b/helper_bot/handlers/callback/callback_handlers.py @@ -1,158 +1,162 @@ -import traceback - -from aiogram import Router, F -from aiogram.fsm.context import FSMContext -from aiogram.types import CallbackQuery - -from helper_bot.keyboards.main import create_keyboard_with_pagination, get_reply_keyboard_admin, \ - 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_message -from logs.custom_logger import logger - -callback_router = Router() - -bdf = BaseDependencyFactory() -GROUP_FOR_POST = bdf.settings['Telegram']['group_for_posts'] -GROUP_FOR_MESSAGE = bdf.settings['Telegram']['group_for_message'] -MAIN_PUBLIC = bdf.settings['Telegram']['main_public'] -GROUP_FOR_LOGS = bdf.settings['Telegram']['group_for_logs'] -IMPORTANT_LOGS = bdf.settings['Telegram']['important_logs'] -PREVIEW_LINK = bdf.settings['Telegram']['preview_link'] -LOGS = bdf.settings['Settings']['logs'] -TEST = bdf.settings['Settings']['test'] - -BotDB = bdf.get_db() - - -@callback_router.callback_query( - F.data == "publish" -) -async def post_for_group(call: CallbackQuery, state: FSMContext): - logger.info( - f'Получен callback-запрос с данными: {call.data} от пользователя {call.from_user.full_name} (ID: {call.from_user.id})') - if call.data == 'publish' and call.message.content_type == 'text' and call.message.text != "^": - try: - await send_text_message(MAIN_PUBLIC, call.message, call.message.text) - 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.data == 'publish' and call.message.content_type == 'photo': - try: - await send_photo_message(MAIN_PUBLIC, call.message, call.message.photo[-1].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.data == 'publish' and 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.copy_message(chat_id=MAIN_PUBLIC, from_chat_id=GROUP_FOR_POST,message_id=media_group_message_id, reply_markup=None) - await call.bot.delete_message(chat_id=MAIN_PUBLIC, message_id=media_group_message_id) - print(user_data['media_group_message_id']) - print(user_data['help_message_id']) - await call.answer(text='Выложено!', show_alert=True, cache_time=3) - -@callback_router.callback_query( - F.data == "decline" -) -async def decline_post_for_group(call: CallbackQuery, state: FSMContext): - logger.info( - f'Получен callback-запрос с данными: {call.data} от пользователя {call.from_user.full_name} (ID: {call.from_user.id})') - try: - if call.message.content_type == 'text' and call.message.text != "^" or call.message.content_type == 'photo': - await call.bot.delete_message(chat_id=GROUP_FOR_POST, message_id=call.message.message_id) - logger.info( - 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) - except Exception as e: - await call.bot.send_message(IMPORTANT_LOGS, - f"Произошла ошибка: {str(e)}\n\nTraceback:\n{traceback.format_exc()}") - logger.error(f'Ошибка при удалении сообщения в группе {GROUP_FOR_POST}: {str(e)}') - await call.answer(text='Что-то пошло не так!', show_alert=True, cache_time=3) - - -@callback_router.callback_query( - F.data.contains('ban') -) -async def process_ban_user(call: CallbackQuery, state: FSMContext): - user_id = call.data[4:] - logger.info( - f"Вызов функции process_ban_user. Данные callback: {call.data} пользователь: {user_id}") - user_name = BotDB.get_username(user_id=user_id) - if user_name: - await state.update_data(user_id=user_id, user_name=user_name, message_for_user=None, - date_to_unban=None) - markup = create_keyboard_for_ban_reason() - await call.message.answer( - text=f"Выбран пользователь:\nid: {user_id}\nusername: {user_name}\nИмя:{call.message.from_user.full_name}\nВыбери причину бана из списка или напиши ее в чат", - reply_markup=markup) - await state.set_state('BAN_2') - else: - markup = get_reply_keyboard_admin() - await call.message.answer(text='Пользователь с таким ID не найден в базе', markup=markup) - await state.set_state('ADMIN') - - -@callback_router.callback_query( - F.data.contains('unlock') -) -async def process_unlock_user(call: CallbackQuery): - user_id = call.data[7:] - user_name = BotDB.get_username(user_id=user_id) - delete_user_blacklist(user_id) - logger.info(f"Разблокирован пользователь с ID: {user_id} username:{user_name}") - username = BotDB.get_username(user_id) - await call.answer(f'Пользователь разблокирован {username}', show_alert=True) - - -@callback_router.callback_query( - F.data == 'return' -) -async def return_to_main_menu(call: CallbackQuery): - await call.message.delete() - logger.info(f"Запуск админ панели для пользователя: {call.message.from_user.id}") - markup = get_reply_keyboard_admin() - await call.message.answer("Добро пожаловать в админку. Выбери что хочешь:", - reply_markup=markup) - - -@callback_router.callback_query( - F.data.contains('page') -) -async def change_page(call: CallbackQuery): - page_number = int(call.data[5:]) - logger.info(f"Переход на страницу {page_number}") - if call.message.text == 'Список пользователей которые последними обращались к боту': - list_users = BotDB.get_last_users_from_db() - #TODO: Здесь где-то надо добавить обработку ошибки IndexError: list index out of range - keyboard = create_keyboard_with_pagination(int(page_number), len(list_users), list_users, - 'ban') - - await call.bot.edit_message_reply_markup(chat_id=call.message.chat.id, message_id=call.message.message_id, - reply_markup=keyboard) - else: - #Готовим сообщения - message_user = get_banned_users_list(int(page_number) * 7 - 7) - await call.bot.edit_message_text(chat_id=call.message.chat.id, message_id=call.message.message_id, - text=message_user) - - #Готовим клавиатуру - buttons = get_banned_users_buttons() - keyboard = create_keyboard_with_pagination(int(call.data[5:]), len(buttons), buttons, 'unlock') - await call.bot.edit_message_reply_markup(chat_id=call.message.chat.id, message_id=call.message.message_id, - reply_markup=keyboard) +import traceback + +from aiogram import Router, F +from aiogram.fsm.context import FSMContext +from aiogram.types import CallbackQuery + +from helper_bot.keyboards.main import create_keyboard_with_pagination, get_reply_keyboard_admin, \ + 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_message +from logs.custom_logger import logger + +callback_router = Router() + +bdf = BaseDependencyFactory() +GROUP_FOR_POST = bdf.settings['Telegram']['group_for_posts'] +GROUP_FOR_MESSAGE = bdf.settings['Telegram']['group_for_message'] +MAIN_PUBLIC = bdf.settings['Telegram']['main_public'] +GROUP_FOR_LOGS = bdf.settings['Telegram']['group_for_logs'] +IMPORTANT_LOGS = bdf.settings['Telegram']['important_logs'] +PREVIEW_LINK = bdf.settings['Telegram']['preview_link'] +LOGS = bdf.settings['Settings']['logs'] +TEST = bdf.settings['Settings']['test'] + +BotDB = bdf.get_db() + + +@callback_router.callback_query( + F.data == "publish" +) +async def post_for_group(call: CallbackQuery, state: FSMContext): + logger.info( + f'Получен callback-запрос с данными: {call.data} от пользователя {call.from_user.full_name} (ID: {call.from_user.id})') + if call.data == 'publish' and call.message.content_type == 'text' and call.message.text != "^": + try: + await send_text_message(MAIN_PUBLIC, call.message, call.message.text) + 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.data == 'publish' and call.message.content_type == 'photo': + try: + await send_photo_message(MAIN_PUBLIC, call.message, call.message.photo[-1].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.data == 'publish' and call.message.text == "^": + print('Попали куда надо') + user_data = await state.get_data() + print(f'В CALLBACK ГЕТ ДАТА: {user_data}') + media_group_message_id = get_help_message_id(call.message.message_id, user_data) + print(f'ПОЛУЧАЮ МЕССАГ ГРУПП АЙДИ ИЗ ГЕТ ДАТЫ: {media_group_message_id}') + print(f'ИДЕНТИФИКАТОР СООБЩЕНИЯ У КОТОРОГО ЖМУ КОЛЛБЭК: {call.message.message_id}') + await call.bot.copy_message(chat_id=MAIN_PUBLIC, from_chat_id=GROUP_FOR_POST, message_id=media_group_message_id, reply_markup=None) + await call.bot.delete_message(chat_id=MAIN_PUBLIC, message_id=media_group_message_id) + await call.answer(text='Выложено!', show_alert=True, cache_time=3) + + +@callback_router.callback_query( + F.data == "decline" +) +async def decline_post_for_group(call: CallbackQuery, state: FSMContext): + + logger.info( + f'Получен callback-запрос с данными: {call.data} от пользователя {call.from_user.full_name} (ID: {call.from_user.id})') + try: + if call.message.content_type == 'text' and call.message.text != "^" or call.message.content_type == 'photo': + await call.bot.delete_message(chat_id=GROUP_FOR_POST, message_id=call.message.message_id) + logger.info( + 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) + except Exception as e: + await call.bot.send_message(IMPORTANT_LOGS, + f"Произошла ошибка: {str(e)}\n\nTraceback:\n{traceback.format_exc()}") + logger.error(f'Ошибка при удалении сообщения в группе {GROUP_FOR_POST}: {str(e)}') + await call.answer(text='Что-то пошло не так!', show_alert=True, cache_time=3) + + +@callback_router.callback_query( + F.data.contains('ban') +) +async def process_ban_user(call: CallbackQuery, state: FSMContext): + user_id = call.data[4:] + logger.info( + f"Вызов функции process_ban_user. Данные callback: {call.data} пользователь: {user_id}") + user_name = BotDB.get_username(user_id=user_id) + if user_name: + await state.update_data(user_id=user_id, user_name=user_name, message_for_user=None, + date_to_unban=None) + markup = create_keyboard_for_ban_reason() + await call.message.answer( + text=f"Выбран пользователь:\nid: {user_id}\nusername: {user_name}\nИмя:{call.message.from_user.full_name}\nВыбери причину бана из списка или напиши ее в чат", + reply_markup=markup) + await state.set_state('BAN_2') + else: + markup = get_reply_keyboard_admin() + await call.message.answer(text='Пользователь с таким ID не найден в базе', markup=markup) + await state.set_state('ADMIN') + + +@callback_router.callback_query( + F.data.contains('unlock') +) +async def process_unlock_user(call: CallbackQuery): + user_id = call.data[7:] + user_name = BotDB.get_username(user_id=user_id) + delete_user_blacklist(user_id) + logger.info(f"Разблокирован пользователь с ID: {user_id} username:{user_name}") + username = BotDB.get_username(user_id) + await call.answer(f'Пользователь разблокирован {username}', show_alert=True) + + +@callback_router.callback_query( + F.data == 'return' +) +async def return_to_main_menu(call: CallbackQuery): + await call.message.delete() + logger.info(f"Запуск админ панели для пользователя: {call.message.from_user.id}") + markup = get_reply_keyboard_admin() + await call.message.answer("Добро пожаловать в админку. Выбери что хочешь:", + reply_markup=markup) + + +@callback_router.callback_query( + F.data.contains('page') +) +async def change_page(call: CallbackQuery): + page_number = int(call.data[5:]) + logger.info(f"Переход на страницу {page_number}") + if call.message.text == 'Список пользователей которые последними обращались к боту': + list_users = BotDB.get_last_users_from_db() + #TODO: Здесь где-то надо добавить обработку ошибки IndexError: list index out of range + keyboard = create_keyboard_with_pagination(int(page_number), len(list_users), list_users, + 'ban') + + await call.bot.edit_message_reply_markup(chat_id=call.message.chat.id, message_id=call.message.message_id, + reply_markup=keyboard) + else: + #Готовим сообщения + message_user = get_banned_users_list(int(page_number) * 7 - 7) + await call.bot.edit_message_text(chat_id=call.message.chat.id, message_id=call.message.message_id, + text=message_user) + + #Готовим клавиатуру + buttons = get_banned_users_buttons() + keyboard = create_keyboard_with_pagination(int(call.data[5:]), len(buttons), buttons, 'unlock') + await call.bot.edit_message_reply_markup(chat_id=call.message.chat.id, message_id=call.message.message_id, + reply_markup=keyboard) diff --git a/helper_bot/handlers/group/__pycache__/__init__.cpython-312.pyc b/helper_bot/handlers/group/__pycache__/__init__.cpython-312.pyc index 995ec3a8369b0fdbf3b61746ba0ff73b7c901217..dec0978b52bb088fa0f3111adbacdd4674356bf8 100644 GIT binary patch delta 47 zcmcb~_?VIRG%qg~0}%9dPEFIA$m_w+mtK@#S`eR+n3s~1T2wqSs*+8khz+O$092n1 A-v9sr delta 37 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 CxDLqx delta 37 qcmaFKc$bm)G%qg~0}$A?O-fUm$m_+*lAD;BH!-7{O`(VlC=LL>6$wiK diff --git a/helper_bot/handlers/private/__pycache__/main.cpython-312.pyc b/helper_bot/handlers/private/__pycache__/main.cpython-312.pyc deleted file mode 100644 index e8705518b88f28b712e78c509894caed0d96a6f3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 23916 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 HxBCA9KFgWn diff --git a/helper_bot/handlers/private/private_handlers.py b/helper_bot/handlers/private/private_handlers.py index a6c41ed..f4695ba 100644 --- a/helper_bot/handlers/private/private_handlers.py +++ b/helper_bot/handlers/private/private_handlers.py @@ -1,282 +1,284 @@ -import random -import traceback -from datetime import datetime -from pathlib import Path -from time import sleep - -from aiogram import types, Router, F -from aiogram.filters import Command, StateFilter -from aiogram.fsm.context import FSMContext -from aiogram.types import FSInputFile - -from helper_bot.filters.main import ChatTypeFilter -from helper_bot.keyboards import get_reply_keyboard, get_reply_keyboard_for_post -from helper_bot.keyboards.main import get_reply_keyboard_leave_chat -from helper_bot.middlewares.album_middleware import AlbumMiddleware -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, \ - process_photo_album, send_media_group_message, check_username_and_full_name -from logs.custom_logger import logger - -private_router = Router() - -private_router.message.middleware(AlbumMiddleware()) -private_router.message.middleware(BlacklistMiddleware()) - -bdf = BaseDependencyFactory() -GROUP_FOR_POST = bdf.settings['Telegram']['group_for_posts'] -GROUP_FOR_MESSAGE = bdf.settings['Telegram']['group_for_message'] -MAIN_PUBLIC = bdf.settings['Telegram']['main_public'] -GROUP_FOR_LOGS = bdf.settings['Telegram']['group_for_logs'] -IMPORTANT_LOGS = bdf.settings['Telegram']['important_logs'] -PREVIEW_LINK = bdf.settings['Telegram']['preview_link'] -LOGS = bdf.settings['Settings']['logs'] -TEST = bdf.settings['Settings']['test'] - -BotDB = bdf.get_db() - - -@private_router.message( - ChatTypeFilter(chat_type=["private"]), - Command("start") -) -@private_router.message( - ChatTypeFilter(chat_type=["private"]), - F.text == 'Вернуться в бота' -) -async def handle_start_message(message: types.Message, state: FSMContext): - try: - await message.forward(chat_id=GROUP_FOR_LOGS) - full_name = message.from_user.full_name - username = message.from_user.username - first_name = message.from_user.first_name - is_bot = message.from_user.is_bot - language_code = message.from_user.language_code - user_id = message.from_user.id - current_date = datetime.now() - date = current_date.strftime("%Y-%m-%d %H:%M:%S") - if not BotDB.user_exists(user_id): - BotDB.add_new_user_in_db(user_id, first_name, full_name, username, is_bot, language_code, date, - date) - else: - is_need_update = check_username_and_full_name(user_id, username, full_name) - if is_need_update: - BotDB.update_username_and_full_name(user_id, username, full_name) - await message.answer(f"Давно не виделись! Вижу что ты изменился;) Теперь буду звать тебя: {full_name} и ник @{username}") - await message.bot.send_message(chat_id=GROUP_FOR_LOGS, text=f'Для пользователя: {user_id} обновлены данные в БД.\nНовое имя: {full_name}\nНовый ник:{username}') - sleep(1) - BotDB.update_date_for_user(date, user_id) - await state.set_state("START") - logger.info( - f"Формирование приветственного сообщения для пользователя. Сообщение: {message.text} " - f"Имя автора сообщения: {message.from_user.full_name})") - name_stick_hello = list(Path('Stick').rglob('Hello_*')) - random_stick_hello = random.choice(name_stick_hello) - random_stick_hello = FSInputFile(path=random_stick_hello) - logger.info(f"Стикер успешно получен из БД") - await message.answer_sticker(random_stick_hello) - sleep(0.3) - except Exception as e: - logger.error(f"Произошла ошибка handle_start_message при получении стикеров. Ошибка:{str(e)}") - await message.bot.send_message(chat_id=IMPORTANT_LOGS, - text=f"Произошла ошибка при получении стикеров: {str(e)}\n\nTraceback:\n{traceback.format_exc()}") - try: - - markup = get_reply_keyboard(BotDB, message.from_user.id) - hello_message = messages.get_message(get_first_name(message), 'HELLO_MESSAGE') - await message.answer(hello_message, reply_markup=markup) - except Exception as e: - logger.error( - f"Произошла ошибка при отправке приветственного сообщения для пользователя {message.from_user.id} Имя: {message.from_user.full_name}. Ошибка: {str(e)}") - await message.bot.send_message(IMPORTANT_LOGS, - f"Произошла ошибка: {str(e)}\n\nTraceback:\n{traceback.format_exc()}") - - -@private_router.message( - StateFilter("START"), - ChatTypeFilter(chat_type=["private"]), - F.text == '📢Предложить свой пост' -) -async def suggest_post(message: types.Message, state: FSMContext): - try: - await message.forward(chat_id=GROUP_FOR_LOGS) - await state.set_state("SUGGEST") - current_state = await state.get_state() - logger.info( - f"Вызов функции suggest_post. Сообщение: {message.text} Имя автора сообщения: {message.from_user.full_name} Идентификатор сообщения: {message.message_id}. State - {current_state}") - markup = types.ReplyKeyboardRemove() - suggest_news = messages.get_message(get_first_name(message), 'SUGGEST_NEWS') - await message.answer(suggest_news) - sleep(0.3) - suggest_news_2 = messages.get_message(get_first_name(message), 'SUGGEST_NEWS_2') - await message.answer(suggest_news_2, reply_markup=markup) - except Exception as e: - await message.bot.send_message(IMPORTANT_LOGS, - f"Произошла ошибка: {str(e)}\n\nTraceback:\n{traceback.format_exc()}") - - -@private_router.message( - ChatTypeFilter(chat_type=["private"]), - F.text == '👋🏼Сказать пока!' -) -@private_router.message( - ChatTypeFilter(chat_type=["private"]), - F.text == 'Выйти из чата' -) -async def end_message(message: types.Message, state: FSMContext): - try: - logger.info( - f"Вызов функции end_message. Пользователь: {message.from_user.id} Имя автора сообщения: {message.from_user.full_name}") - name_stick_bye = list(Path('Stick').rglob('Universal_*')) - random_stick_bye = random.choice(name_stick_bye) - random_stick_bye = FSInputFile(path=random_stick_bye) - await message.answer_sticker(random_stick_bye) - except Exception as e: - logger.error( - f"Ошибка в функции end_message при получении стикера: {str(e)} Пользователь: {message.from_user.id} Имя автора сообщения: {message.from_user.full_name}") - await message.bot.send_message(chat_id=IMPORTANT_LOGS, - text=f"Произошла ошибка: {str(e)}\n\nTraceback:\n{traceback.format_exc()}") - try: - markup = types.ReplyKeyboardRemove() - bye_message = messages.get_message(get_first_name(message), 'BYE_MESSAGE') - await message.answer(bye_message, reply_markup=markup) - await state.set_state("START") - except Exception as e: - logger.error( - f"Ошибка в функции stickers при получении сообщения: {str(e)} Пользователь: {message.from_user.id} Имя автора сообщения: {message.from_user.full_name}") - await message.bot.send_message(chat_id=IMPORTANT_LOGS, - text=f"Произошла ошибка: {str(e)}\n\nTraceback:\n{traceback.format_exc()}") - - -@private_router.message( - StateFilter("SUGGEST"), - ChatTypeFilter(chat_type=["private"]), -) -async def suggest_router(message: types.Message, state: FSMContext, album: list = None): - logger.info( - f"Вызов функции suggest_router. Пользователь: {message.from_user.id} Имя автора сообщения: {message.from_user.full_name}") - try: - if message.content_type == 'text': - lower_text = message.text.lower() - post_text, is_anonymous = get_text_message(lower_text, message.from_user.full_name, - message.from_user.username) - markup = get_reply_keyboard_for_post() - if is_anonymous: - await send_text_message(GROUP_FOR_POST, message, post_text, markup) - else: - await send_text_message(GROUP_FOR_POST, message, post_text, 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 == 'photo' and message.media_group_id is None: - lower_caption = message.caption.lower() - markup = get_reply_keyboard_for_post() - post_caption, is_anonymous = get_text_message(lower_caption, message.from_user.full_name, - message.from_user.username) - #TODO: тут какая-то шляпа - if is_anonymous: - await send_photo_message(GROUP_FOR_POST, message, - message.photo[-1].file_id, post_caption, markup) - else: - await send_photo_message(GROUP_FOR_POST, message, - message.photo[-1].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.media_group_id is not None: - post_caption = " " - if album[0].caption: - lower_caption = album[0].caption.lower() - post_caption, is_anonymous = get_text_message(lower_caption, message.from_user.full_name, - message.from_user.username) - media_group = process_photo_album(album, post_caption) - media_group_message_id = await send_media_group_message(GROUP_FOR_POST, message, - media_group) - sleep(0.2) - markup = get_reply_keyboard_for_post() - help_message_id = await send_text_message(GROUP_FOR_POST, message, "^", markup) - await state.update_data(media_group_message_id=media_group_message_id, help_message_id=help_message_id) - - 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") - else: - await message.bot.send_message(message.chat.id, - 'Я пока не умею работать с таким сообщением. Пришли текст и фото/фоты(ы)') - except Exception as e: - await message.bot.send_message(chat_id=IMPORTANT_LOGS, - text=f"Произошла ошибка: {str(e)}\n\nTraceback:\n{traceback.format_exc()}") - - -@private_router.message( - ChatTypeFilter(chat_type=["private"]), - F.text == '🤪Хочу стикеры' -) -async def stickers(message: types.Message, state: FSMContext): - logger.info( - f"Вызов функции stickers. Пользователь: {message.from_user.id} Имя автора сообщения: {message.from_user.full_name}") - markup = get_reply_keyboard(BotDB, message.from_user.id) - try: - BotDB.update_info_about_stickers(user_id=message.from_user.id) - await message.forward(chat_id=GROUP_FOR_LOGS) - await message.answer(text='Хорошо, лови, добавить можно отсюда: https://t.me/addstickers/love_biysk', - reply_markup=markup) - await state.set_state("START") - except Exception as e: - await message.bot.send_message(chat_id=IMPORTANT_LOGS, - text=f"Произошла ошибка: {str(e)}\n\nTraceback:\n{traceback.format_exc()}") - logger.error( - f"Ошибка функции stickers. Ошибка: {str(e)} Пользователь: {message.from_user.id} Имя автора сообщения: {message.from_user.full_name}") - - -@private_router.message( - StateFilter("START"), - ChatTypeFilter(chat_type=["private"]), - F.text == '📩Связаться с админами' -) -async def connect_with_admin(message: types.Message, state: FSMContext): - logger.info( - f"Вызов функции connect_with_admin. Пользователь: {message.from_user.id} Имя автора сообщения: {message.from_user.full_name}") - admin_message = messages.get_message(get_first_name(message), 'CONNECT_WITH_ADMIN') - await message.answer(admin_message, parse_mode="html") - await message.forward(chat_id=GROUP_FOR_LOGS) - await state.set_state("PRE_CHAT") - - -@private_router.message( - StateFilter("PRE_CHAT"), - ChatTypeFilter(chat_type=["private"]), -) -@private_router.message( - StateFilter("CHAT"), - ChatTypeFilter(chat_type=["private"]), -) -async def resend_message_in_group_for_message(message: types.Message, state: FSMContext): - logger.info( - f"Попытка пересылки сообщения в связь с админами. Сообщение: {message.text} Имя автора сообщения: {message.from_user.full_name} Идентификатор сообщения: {message.message_id})") - await message.forward(chat_id=GROUP_FOR_MESSAGE) - current_date = datetime.now() - date = current_date.strftime("%Y-%m-%d %H:%M:%S") - BotDB.add_new_message_in_db(message.text, message.from_user.id, message.message_id + 1, date) - question = messages.get_message(get_first_name(message), 'QUESTION') - user_state = await state.get_state() - if user_state == "PRE_CHAT": - markup = get_reply_keyboard(BotDB, message.from_user.id) - await message.answer(question, reply_markup=markup) - await state.set_state("START") - elif user_state == "CHAT": - markup = get_reply_keyboard_leave_chat() - await message.answer(question, reply_markup=markup) - -# @private_router.message( -# ChatTypeFilter(chat_type=["private"]) -# ) -# async def default(message: types.Message, state: FSMContext): -# markup = get_reply_keyboard(BotDB, message.from_user.id) -# await message.answer('Кажется ты заблудился. Держи клавиатуру, твое состояние сброшено на начало', reply_markup=markup) -# await state.set_state("START") +import random +import traceback +from datetime import datetime +from pathlib import Path +from time import sleep + +from aiogram import types, Router, F +from aiogram.filters import Command, StateFilter +from aiogram.fsm.context import FSMContext +from aiogram.types import FSInputFile + +from helper_bot.filters.main import ChatTypeFilter +from helper_bot.keyboards import get_reply_keyboard, get_reply_keyboard_for_post +from helper_bot.keyboards.main import get_reply_keyboard_leave_chat +from helper_bot.middlewares.album_middleware import AlbumMiddleware +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, \ + process_photo_album, send_media_group_message, check_username_and_full_name +from logs.custom_logger import logger + +private_router = Router() + +private_router.message.middleware(AlbumMiddleware()) +private_router.message.middleware(BlacklistMiddleware()) + +bdf = BaseDependencyFactory() +GROUP_FOR_POST = bdf.settings['Telegram']['group_for_posts'] +GROUP_FOR_MESSAGE = bdf.settings['Telegram']['group_for_message'] +MAIN_PUBLIC = bdf.settings['Telegram']['main_public'] +GROUP_FOR_LOGS = bdf.settings['Telegram']['group_for_logs'] +IMPORTANT_LOGS = bdf.settings['Telegram']['important_logs'] +PREVIEW_LINK = bdf.settings['Telegram']['preview_link'] +LOGS = bdf.settings['Settings']['logs'] +TEST = bdf.settings['Settings']['test'] + +BotDB = bdf.get_db() + + +@private_router.message( + ChatTypeFilter(chat_type=["private"]), + Command("start") +) +@private_router.message( + ChatTypeFilter(chat_type=["private"]), + F.text == 'Вернуться в бота' +) +async def handle_start_message(message: types.Message, state: FSMContext): + try: + await message.forward(chat_id=GROUP_FOR_LOGS) + full_name = message.from_user.full_name + username = message.from_user.username + first_name = message.from_user.first_name + is_bot = message.from_user.is_bot + language_code = message.from_user.language_code + user_id = message.from_user.id + current_date = datetime.now() + date = current_date.strftime("%Y-%m-%d %H:%M:%S") + if not BotDB.user_exists(user_id): + BotDB.add_new_user_in_db(user_id, first_name, full_name, username, is_bot, language_code, date, + date) + else: + is_need_update = check_username_and_full_name(user_id, username, full_name) + if is_need_update: + BotDB.update_username_and_full_name(user_id, username, full_name) + await message.answer(f"Давно не виделись! Вижу что ты изменился;) Теперь буду звать тебя: {full_name} и ник @{username}") + await message.bot.send_message(chat_id=GROUP_FOR_LOGS, text=f'Для пользователя: {user_id} обновлены данные в БД.\nНовое имя: {full_name}\nНовый ник:{username}') + sleep(1) + BotDB.update_date_for_user(date, user_id) + await state.set_state("START") + logger.info( + f"Формирование приветственного сообщения для пользователя. Сообщение: {message.text} " + f"Имя автора сообщения: {message.from_user.full_name})") + name_stick_hello = list(Path('Stick').rglob('Hello_*')) + random_stick_hello = random.choice(name_stick_hello) + random_stick_hello = FSInputFile(path=random_stick_hello) + logger.info(f"Стикер успешно получен из БД") + await message.answer_sticker(random_stick_hello) + sleep(0.3) + except Exception as e: + logger.error(f"Произошла ошибка handle_start_message при получении стикеров. Ошибка:{str(e)}") + await message.bot.send_message(chat_id=IMPORTANT_LOGS, + text=f"Произошла ошибка при получении стикеров: {str(e)}\n\nTraceback:\n{traceback.format_exc()}") + try: + + markup = get_reply_keyboard(BotDB, message.from_user.id) + hello_message = messages.get_message(get_first_name(message), 'HELLO_MESSAGE') + await message.answer(hello_message, reply_markup=markup) + except Exception as e: + logger.error( + f"Произошла ошибка при отправке приветственного сообщения для пользователя {message.from_user.id} Имя: {message.from_user.full_name}. Ошибка: {str(e)}") + await message.bot.send_message(IMPORTANT_LOGS, + f"Произошла ошибка: {str(e)}\n\nTraceback:\n{traceback.format_exc()}") + + +@private_router.message( + StateFilter("START"), + ChatTypeFilter(chat_type=["private"]), + F.text == '📢Предложить свой пост' +) +async def suggest_post(message: types.Message, state: FSMContext): + try: + await message.forward(chat_id=GROUP_FOR_LOGS) + await state.set_state("SUGGEST") + current_state = await state.get_state() + logger.info( + f"Вызов функции suggest_post. Сообщение: {message.text} Имя автора сообщения: {message.from_user.full_name} Идентификатор сообщения: {message.message_id}. State - {current_state}") + markup = types.ReplyKeyboardRemove() + suggest_news = messages.get_message(get_first_name(message), 'SUGGEST_NEWS') + await message.answer(suggest_news) + sleep(0.3) + suggest_news_2 = messages.get_message(get_first_name(message), 'SUGGEST_NEWS_2') + await message.answer(suggest_news_2, reply_markup=markup) + except Exception as e: + await message.bot.send_message(IMPORTANT_LOGS, + f"Произошла ошибка: {str(e)}\n\nTraceback:\n{traceback.format_exc()}") + + +@private_router.message( + ChatTypeFilter(chat_type=["private"]), + F.text == '👋🏼Сказать пока!' +) +@private_router.message( + ChatTypeFilter(chat_type=["private"]), + F.text == 'Выйти из чата' +) +async def end_message(message: types.Message, state: FSMContext): + try: + logger.info( + f"Вызов функции end_message. Пользователь: {message.from_user.id} Имя автора сообщения: {message.from_user.full_name}") + name_stick_bye = list(Path('Stick').rglob('Universal_*')) + random_stick_bye = random.choice(name_stick_bye) + random_stick_bye = FSInputFile(path=random_stick_bye) + await message.answer_sticker(random_stick_bye) + except Exception as e: + logger.error( + f"Ошибка в функции end_message при получении стикера: {str(e)} Пользователь: {message.from_user.id} Имя автора сообщения: {message.from_user.full_name}") + await message.bot.send_message(chat_id=IMPORTANT_LOGS, + text=f"Произошла ошибка: {str(e)}\n\nTraceback:\n{traceback.format_exc()}") + try: + markup = types.ReplyKeyboardRemove() + bye_message = messages.get_message(get_first_name(message), 'BYE_MESSAGE') + await message.answer(bye_message, reply_markup=markup) + await state.set_state("START") + except Exception as e: + logger.error( + f"Ошибка в функции stickers при получении сообщения: {str(e)} Пользователь: {message.from_user.id} Имя автора сообщения: {message.from_user.full_name}") + await message.bot.send_message(chat_id=IMPORTANT_LOGS, + text=f"Произошла ошибка: {str(e)}\n\nTraceback:\n{traceback.format_exc()}") + + +@private_router.message( + StateFilter("SUGGEST"), + ChatTypeFilter(chat_type=["private"]), +) +async def suggest_router(message: types.Message, state: FSMContext, album: list = None): + logger.info( + f"Вызов функции suggest_router. Пользователь: {message.from_user.id} Имя автора сообщения: {message.from_user.full_name}") + try: + if message.content_type == 'text': + lower_text = message.text.lower() + post_text, is_anonymous = get_text_message(lower_text, message.from_user.full_name, + message.from_user.username) + markup = get_reply_keyboard_for_post() + if is_anonymous: + await send_text_message(GROUP_FOR_POST, message, post_text, markup) + else: + await send_text_message(GROUP_FOR_POST, message, post_text, 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 == 'photo' and message.media_group_id is None: + lower_caption = message.caption.lower() + markup = get_reply_keyboard_for_post() + post_caption, is_anonymous = get_text_message(lower_caption, message.from_user.full_name, + message.from_user.username) + #TODO: тут какая-то шляпа + if is_anonymous: + await send_photo_message(GROUP_FOR_POST, message, + message.photo[-1].file_id, post_caption, markup) + else: + await send_photo_message(GROUP_FOR_POST, message, + message.photo[-1].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.media_group_id is not None: + post_caption = " " + if album[0].caption: + lower_caption = album[0].caption.lower() + post_caption, is_anonymous = get_text_message(lower_caption, message.from_user.full_name, + message.from_user.username) + media_group = process_photo_album(album, post_caption) + media_group_message_id = await send_media_group_message(GROUP_FOR_POST, message, + media_group) + print(f'Отправил в чат предложки сообщения, media_group_message_id:{media_group_message_id}\n\n') + sleep(0.2) + markup = get_reply_keyboard_for_post() + help_message_id = await send_text_message(GROUP_FOR_POST, message, "^", markup) + await state.update_data(media_group_message_id=media_group_message_id, help_message_id=help_message_id) + d = await state.get_data() + print(f'ЗАПИСАЛ В state.update_data {d}') + 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") + else: + await message.bot.send_message(message.chat.id, + 'Я пока не умею работать с таким сообщением. Пришли текст и фото/фоты(ы)') + except Exception as e: + await message.bot.send_message(chat_id=IMPORTANT_LOGS, + text=f"Произошла ошибка: {str(e)}\n\nTraceback:\n{traceback.format_exc()}") + + +@private_router.message( + ChatTypeFilter(chat_type=["private"]), + F.text == '🤪Хочу стикеры' +) +async def stickers(message: types.Message, state: FSMContext): + logger.info( + f"Вызов функции stickers. Пользователь: {message.from_user.id} Имя автора сообщения: {message.from_user.full_name}") + markup = get_reply_keyboard(BotDB, message.from_user.id) + try: + BotDB.update_info_about_stickers(user_id=message.from_user.id) + await message.forward(chat_id=GROUP_FOR_LOGS) + await message.answer(text='Хорошо, лови, добавить можно отсюда: https://t.me/addstickers/love_biysk', + reply_markup=markup) + await state.set_state("START") + except Exception as e: + await message.bot.send_message(chat_id=IMPORTANT_LOGS, + text=f"Произошла ошибка: {str(e)}\n\nTraceback:\n{traceback.format_exc()}") + logger.error( + f"Ошибка функции stickers. Ошибка: {str(e)} Пользователь: {message.from_user.id} Имя автора сообщения: {message.from_user.full_name}") + + +@private_router.message( + StateFilter("START"), + ChatTypeFilter(chat_type=["private"]), + F.text == '📩Связаться с админами' +) +async def connect_with_admin(message: types.Message, state: FSMContext): + logger.info( + f"Вызов функции connect_with_admin. Пользователь: {message.from_user.id} Имя автора сообщения: {message.from_user.full_name}") + admin_message = messages.get_message(get_first_name(message), 'CONNECT_WITH_ADMIN') + await message.answer(admin_message, parse_mode="html") + await message.forward(chat_id=GROUP_FOR_LOGS) + await state.set_state("PRE_CHAT") + + +@private_router.message( + StateFilter("PRE_CHAT"), + ChatTypeFilter(chat_type=["private"]), +) +@private_router.message( + StateFilter("CHAT"), + ChatTypeFilter(chat_type=["private"]), +) +async def resend_message_in_group_for_message(message: types.Message, state: FSMContext): + logger.info( + f"Попытка пересылки сообщения в связь с админами. Сообщение: {message.text} Имя автора сообщения: {message.from_user.full_name} Идентификатор сообщения: {message.message_id})") + await message.forward(chat_id=GROUP_FOR_MESSAGE) + current_date = datetime.now() + date = current_date.strftime("%Y-%m-%d %H:%M:%S") + BotDB.add_new_message_in_db(message.text, message.from_user.id, message.message_id + 1, date) + question = messages.get_message(get_first_name(message), 'QUESTION') + user_state = await state.get_state() + if user_state == "PRE_CHAT": + markup = get_reply_keyboard(BotDB, message.from_user.id) + await message.answer(question, reply_markup=markup) + await state.set_state("START") + elif user_state == "CHAT": + markup = get_reply_keyboard_leave_chat() + await message.answer(question, reply_markup=markup) + +# @private_router.message( +# ChatTypeFilter(chat_type=["private"]) +# ) +# async def default(message: types.Message, state: FSMContext): +# markup = get_reply_keyboard(BotDB, message.from_user.id) +# await message.answer('Кажется ты заблудился. Держи клавиатуру, твое состояние сброшено на начало', reply_markup=markup) +# await state.set_state("START") diff --git a/helper_bot/keyboards/__pycache__/__init__.cpython-312.pyc b/helper_bot/keyboards/__pycache__/__init__.cpython-312.pyc index 128ff0f8f6ee49df0f5d3d35b7f75308a8355369..79d58fdd278ef5ab44f7bb325376d3d4e11a7daf 100644 GIT binary patch delta 19 ZcmZo>YG&d-&CAQh00jH$r%vSl0RSvH1#18R delta 19 ZcmZo>YG&d-&CAQh00iRwlO}Ti001bH1knHh diff --git a/helper_bot/keyboards/__pycache__/main.cpython-312.pyc b/helper_bot/keyboards/__pycache__/main.cpython-312.pyc index b6287884b32cb00cd0e1e2f2705caf0c07c56041..08b8286aab727a0450bbe3b5ad1413cc0a2bba62 100644 GIT binary patch delta 20 acmZ2tw8V(}G%qg~0}$-1pSqD-QW5|>B?V^y delta 20 acmZ2tw8V(}G%qg~0}y;WK6xXzq$B`8Qw8M! diff --git a/helper_bot/middlewares/__pycache__/__init__.cpython-312.pyc b/helper_bot/middlewares/__pycache__/__init__.cpython-312.pyc index dfd7fe02881f82060f8cae8d9caf002f78fba8ca..2edfe166637333e31e3d6944600406656363d3ef 100644 GIT binary patch delta 19 ZcmZ3*xQdbcG%qg~0}$-1pE{9yJ^(Q~1zrFE delta 19 ZcmZ3*xQdbcG%qg~0}yncn>>+wJ^(R)1$F=c diff --git a/helper_bot/middlewares/__pycache__/text_middleware.cpython-312.pyc b/helper_bot/middlewares/__pycache__/text_middleware.cpython-312.pyc index f9fecc1b01178e092c5a2fc2f32ab99889bb9742..6cc57890965f16f18fb91b0bdc8ede1598836b7c 100644 GIT binary patch delta 20 acmZ24x?Ys~G%qg~0}$-1pSqEI2^Ro5x&^-g delta 20 acmZ24x?Ys~G%qg~0}xc6pS+QK2^Ro5tp&&c diff --git a/helper_bot/middlewares/blacklist_middleware.py b/helper_bot/middlewares/blacklist_middleware.py index 4f7eeb2..8b22e00 100644 --- a/helper_bot/middlewares/blacklist_middleware.py +++ b/helper_bot/middlewares/blacklist_middleware.py @@ -1,21 +1,21 @@ -from typing import Dict, Any - -from aiogram import BaseMiddleware, types -from helper_bot.utils.base_dependency_factory import BaseDependencyFactory -from logs.custom_logger import logger - -bdf = BaseDependencyFactory() -BotDB = bdf.get_db() - - -class BlacklistMiddleware(BaseMiddleware): - async def __call__(self, handler, event: types.Message, data: Dict[str, Any]) -> Any: - logger.info(f'Вызов BlacklistMiddleware для пользователя {event.from_user.username}') - if BotDB.check_user_in_blacklist(user_id=event.from_user.id): - logger.info(f'BlacklistMiddleware результат для пользователя: {event.from_user.username} заблокирован!') - user_info = BotDB.get_blacklist_users_by_id(event.from_user.id) - await event.answer( - f"Ты заблокирован.\nПричина блокировки: {user_info[2]}\nДата разбана: {user_info[3]}") - return False - logger.info(f'BlacklistMiddleware результат для пользователя: {event.from_user.username} доступ разрешен') - return await handler(event, data) +from typing import Dict, Any + +from aiogram import BaseMiddleware, types +from helper_bot.utils.base_dependency_factory import BaseDependencyFactory +from logs.custom_logger import logger + +bdf = BaseDependencyFactory() +BotDB = bdf.get_db() + + +class BlacklistMiddleware(BaseMiddleware): + async def __call__(self, handler, event: types.Message, data: Dict[str, Any]) -> Any: + logger.info(f'Вызов BlacklistMiddleware для пользователя {event.from_user.username}') + if BotDB.check_user_in_blacklist(user_id=event.from_user.id): + logger.info(f'BlacklistMiddleware результат для пользователя: {event.from_user.username} заблокирован!') + user_info = BotDB.get_blacklist_users_by_id(event.from_user.id) + await event.answer( + f"Ты заблокирован.\nПричина блокировки: {user_info[2]}\nДата разбана: {user_info[3]}") + return False + logger.info(f'BlacklistMiddleware результат для пользователя: {event.from_user.username} доступ разрешен') + return await handler(event, data) diff --git a/helper_bot/utils/__pycache__/__init__.cpython-312.pyc b/helper_bot/utils/__pycache__/__init__.cpython-312.pyc index d401561b5fe0ad79549b6786018751dc00359b35..a6736fa8c39f96942264d547cc0da5ff277361d7 100644 GIT binary patch delta 19 ZcmX@dc#e_#G%qg~0}$-1pE{BIFaS1g1F|9R9tTdE=@(E4E3y?M|-r$L64Q=^sc3aS>BCNh{ckxV=$CUE|GoP!y#$ z%8X)rkaew-NnoWYigoH_hc|Q^J6I6WCByW`|ZnAIMS(1NV6L=|V z%zz8|Kk@wcm53WI)+Xv4+T&x;RmPs7YNo4UwvMhMjnyb7in1^0Ad9JWY*Nw6asNpG z2al;l|1bJeiJ;iN_grg9ipr@+gO2UGec4{8zAxK18X?_ocSa0$%I&So47qj1yB}=7 zlDyWEyx!H;l4|v}w#&^OzSf!S=(IxYw%SrbRZ-0k6#eX@`av%hk`rSy+NIFvh{=zf z{}j1!PkUf&zWu6U6h0urvxpv&F8Ra+jj>&P2F2NFy((x5#n-9r4$~}qh0pd6CxyZv z^LKoSzwsvdyf?+?`J#6#!QTsUfv@mY@1b{>FY-0M%oh`UCBa_{%aY^^f~@g1Z`!+4 zZy_qzOREJGI~Th3+HM!gjK-OvAFd{uLOduUldxG4el$Kc&I55O2TNHctW7^Y5f_{$ zB*^E}qXK53;Gi)n;35PBaiRipu&q?$cC>v0VRK7Yu=y1K2JzX;k_nbhLo!ePsMHYP zmlxMsPcnO*3WaOsM*el%4Kxf6k>LURBDF+7uGEoJY^eyL4G3>Q=?0X219L}@B6AxA H6q5e}uL#mL delta 462 zcmX|*KP*F06voea_rBLZ`ZUc;qoq%f2ydX4T8PBZG^Hs)2#Z0H1{L?!P|@hnMG2`p zh*d0NG)Tm1vUHR-G1zRvAUe6X#TmYQ`JMaS^Bwt0t@@L$yFpCs>THdc^&k$F`^<;} zF-R#zNRb;wZUL4^4lVj7ZE{8G-{7zL43tlTG)F92z8i3sMC=^0z&kO-op{e*u?-Dg z$8{vUqL}FC1tr=-H~Il=b)Tfve>%>?B*4GXI3wYa3kt^%6mno`NhYi8dF<6}Hl10w z2h*8!)iXU4osUNsmJ{*hWR)hSVzX5`7oDB6Jp6^k`7nLd93p17a#Sbq`F2rN(eMdk zA@j?H?BB(Ld`F9z0SP=p3h?YTPV+jYqbXUVE$MC6tWmlo>m)KV?SpA$Q@d4~G)3EfT#raZR;F%~T512-=zc6erk(p7 zLe#2%_N066`99~JbMC!=f4X?c{YST3Mev>c{ddPdzTmFIzq!!3&$A?0@C`c+=cJ#7 zgWKkZRiYTuWS}f~7!tdojmyMwS{`;2r=gJwSSs-B#05MLd4y;{*@*kJGF(YKhWB$l zRT@4+sRQR=>jm2?(r{mQ{^5ugZiT9Xl;WQe33ERLtA1eq85L3uNs44Y&x4cHfQK3q zFuag@?Te62fCMd~4)9vC&B8-~2TAxe8m=P|__OWCHmHXe5{QB%bl+SDJS=cg7ZS5- zQxCid*#VZ@=X{Ac`xEXA)byrI|S9> z7g&W;pFfMxaT`LfNUz8_Y4Z;WF36MeCbhL+M#OeSTEb-xMg@sTQ#%o&PZVsEjxD`S zELX9Kfj?_RHtF(CWV>k8q{hA;_Rr&+$`Yg^zO4}FUig1qmpzyLJq&N!H@$D}7@d1f zM)rbj03{sD)fGP6nco8@8N)PFCyZp8==|q;@pSQ3{yzV8@tb^wujsQhI|lOP>_j$~ zO{S(t^O+9)o=sI*gBpD#1m+1xslu4aXAGLk86{m#;;1kIH` z)m&NBkiF=vo`>n!QdSD`Wpu^1Rlb5efZEWxJwKLC;)MNZ!bTgxkcuMYp8>$X&)?>k z`4zszzo!Fwf&YkKRc2v?pI|tgx5mDTdoHI`45>mO+j|q-OjoInBWF|$Y^0Ocj zV`Zf(e(Zj#z)IN5HrDU>fI(XXXc8dG4tN@sy?`EOS_}*H(_FT7|R@g(#dbvH}T9T8_q!cpH^gppUat-rup8-BC8|d%mrt^k#DhdrQu= znM{#PdgcbEZJ=d}>qe&@fF*5g!Wf%MrpCn4qg}w7UjEoOi19ww<=+Kx!hcM864+m5 z@A(P1jx6u1{x8N)v97@T71s1XqU{XVHUY1twzIw;l;>cX1po`^lK^s8t!b@At#zgU zgRgO|b(Ni|Ju5u1mf+yi&wv&cm()K*R#4=2*h;|@MlLy;nwc?3GH)8xOpeoRCP_xA zUe-D$w46c&mx)Qg$o>%Ar3?Y{+spTY9k$x%0kz!HYGGib7UKoh7iv&OfOC!IL(hsz z1#jZbV>f_q*pAZ9vVJ@JPbjok5D%4$eg$X?EDM2nb{EiHmv_w-FS_E3C%G%W$_|F> z*)Cs&;|NIKL^-P+7sFMt0xn2XQ2$fdRN$t!6=XpTAo^ucw2F8#67@ijfs1IB07mg_yMdVf)lEcBfZ-*NfRzg%?H|Jl`jHT~1BV!WHn z-OKsy^B8xte@DL*?gR6LO2wl@djzmfGgF_h{Hq0bX(&|#V}GaWK^`fB$M=5 zj*6C+n&Zw?AHmYZnJL5Nzv@I&om}z&e6$rQx^DziPHn@kWeH7Kf%bgy5e67TR$wZo@rz ZamP9m`-;E3-|}x*^oFY8PU?j`{s&X=dfNa1 delta 2275 zcmb7GdrVtZ7{90Y-coK`Xelk_(HD%umB%(Sm^>!S2Ag}Z$#9!1#-{AtVSxgkTjY^W zQ2ApsBr;D-NTvzK7iOChiHb%u6aR40n6w)Sq?uVXVw``W><_a)oZq>n8)~-1o1E`_ z=l4C%cfRwTuTAXxX|MS^vsvQcJ2v#%sUzpi`Do@`*^V(RUO)`xxIhNhD}1*lwc1E= zhLU+oz=jDSAmL0U6H73Rfa$RbFe5I-W?1QP)`S=^;cUfxUr!b#OA+(IIoMjkb}SqF z@2kwVvO!4RjlraNFwcd}tPilZgY|9i?!U809JrEfo0)Hj$C$=MK0@-1{{hi z(QrgbW=6yG4)S}&UH#GKU87DAggQg2vN_sS)!84dO0Q{y?glc>7xMcAlueb4Pm!Lw z4Bol{j(bYSai{syLX5|#r<~)+wwSJ)|8KscVj7DH-FiCZ$>re|=!YJAV+>v7FMu2N zrE39klTH8Ek^7>MHc!vsh6r3t*Urh}d?3?`=)01~S^yi#Vlq?d8;mFfl0k1u%EKjq z!T~sS1jsnI>fmhl@dMW#o*D6)!~X{-h;8VsbOxQ-zHBs2p_gly>1AUf{n%KUk;!DM z68+U!EeT-#5{$J`>NT~GL0)vM+`1Y5uMe^&v~%0JN&6*!2+8~*Sw}X34q*WjW+n4U z9xftjQI$R%j3_u93U-nH!GWX{QB*b5r3AxR7E@LRW>pF#X#({qsH>_7DnzDN%vDka zNE%_Nd+8l>W%a6o%W+S4Cak_CYh}V(Ilh0{Xpal_RU@CPzpa`;^F?0+dJEMFZ#x?1 zU&zWr9W1z{5LJewGN0PBnjt2l4D^l!BO%f=H~^9|4O|adi;~Cy$@&d(S^*%Hj6B4M zOn=KR6So4}LLHV*kehyQSvssGqmaqnKx83he-|K|8LCU|Cu#c)JkuZT|3^ZYB}wf@ z*Q{mYHdr60o}8~~+~%Tpa!%Mt20%$eSPh17B;5BtA~iH(bBT2Tcg??IJBm;}UCFHg zYPBC0cLCf>6+31Q=6|vOh0t!glJ})yR3}LgO$NQ-tORJ;+2A<@x=|SGHFe9unRAv* zwFy)0Lfco*Ez+9&v*5)~f6hOc*8+NkJ%gL9A3_?nu$*+x>2wlT3OWc=(lDqh1nylW zt#qiMLTm@{?EHHL^}4(#fYp4ETxOsn8gP{USyU=M3CQcT*wv~XeA1P5T-F^TkEHap zz3f=&Ria8z^WWJUI@!}3R->AV%3|`8ETANiCLaK!+JKC6*Nv7Xqd#Hv&kilpTdrbB z4=`&3YhTcBZ6$QlWuk}OhOv8X0PAAtJcs$1?mYL#-G_^~4I0o?KtqfP_tS`>7|)u{ zFd`y?XC4#S>fYl|%S~yGwsjTg2l~|6M|tp6R8KO3h);g0sWFRSM6~kIh(sqP(g#*e+XMc#`R;@V@_QJ_FM%e2j>@5-YNC+$9 zq=3UGql6V|s>oRO2-{yPXTts&XeD^t&=~2*gT2b5WDu|tR-Eb{psPGW=muB5!sY+K z$t#@eM}s+@ResGN)0vXGtyYvb+rGxZv|6r5j@jL-983$Pm#aRj(%AU1K)juUSl}K@03}bs!A| diff --git a/helper_bot/utils/__pycache__/messages.cpython-312.pyc b/helper_bot/utils/__pycache__/messages.cpython-312.pyc index fd1fdd4b9928802d5e790763b73c55ba2a10d493..177f9a624fdf0db4a0f450f88dedbeeb396f824d 100644 GIT binary patch delta 20 acmcbrbybV|G%qg~0}$-1pSqFTOB4V?sRiZ$ delta 20 acmcbrbybV|G%qg~0}$LW?A*xhB? Date: Wed, 17 Jul 2024 00:15:15 +0300 Subject: [PATCH 2/8] add mediaGroup func --- .gitignore | 3 + database/db.py | 72 +++++++++++-- .../callback/__pycache__/main.cpython-312.pyc | Bin 0 -> 15306 bytes .../handlers/callback/callback_handlers.py | 24 ++--- .../private/__pycache__/main.cpython-312.pyc | Bin 0 -> 23314 bytes .../handlers/private/private_handlers.py | 23 ++-- .../__pycache__/helper_func.cpython-312.pyc | Bin 9425 -> 13527 bytes helper_bot/utils/helper_func.py | 98 +++++++++++++++--- run_helper.py | 2 +- 9 files changed, 183 insertions(+), 39 deletions(-) create mode 100644 helper_bot/handlers/callback/__pycache__/main.cpython-312.pyc create mode 100644 helper_bot/handlers/private/__pycache__/main.cpython-312.pyc diff --git a/.gitignore b/.gitignore index 8cf4112..851f65f 100644 --- a/.gitignore +++ b/.gitignore @@ -1 +1,4 @@ /database/tg-bot-database +/settings.ini +/myenv/ +/venv/ diff --git a/database/db.py b/database/db.py index d38600a..d5923bf 100644 --- a/database/db.py +++ b/database/db.py @@ -605,9 +605,11 @@ class BotDB: f"Запуск функции update_username_and_full_name: user_id={user_id}, username={username}, full_name={full_name}") try: self.connect() - self.cursor.execute("UPDATE our_users SET username = ?, full_name = ? WHERE user_id = ?", (username, full_name, user_id,)) + self.cursor.execute("UPDATE our_users SET username = ?, full_name = ? WHERE user_id = ?", + (username, full_name, user_id,)) self.conn.commit() - self.logger.info(f"Функция update_username_and_full_name. Данные пользователя: user_id={user_id} успешно обновлены") + self.logger.info( + f"Функция update_username_and_full_name. Данные пользователя: user_id={user_id} успешно обновлены") return True except sqlite3.Error as error: self.logger.error(f"Ошибка в функции update_username_and_full_name: {error}") @@ -823,18 +825,69 @@ 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,)) + post_content = result.fetchall() + self.logger.info(f"Функция get_post_content_from_telegram_by_last_id получила текст поста: {post_content}") + return post_content + finally: + self.close() + + def get_post_text_from_telegram_by_last_id(self, last_post_id: int): + self.logger.info(f"Запуск функции get_post_text_from_telegram_by_last_id, идентификатор поста {last_post_id}") + try: + self.connect() + result = self.cursor.execute("SELECT text " + "FROM posts_from_telegram WHERE 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_audio_record(self, file_name, author_id, date_added, listen_count, file_id): """Добавляет информацию о войсе юзера в БД""" self.logger.info( - f"Запуск функции add_audio_record (file_name = {file_name}, author_id = {author_id}, date_added = {date_added}") + f"Запуск функции add_audio_record (file_name = {file_name}, author_id = {author_id}," + f" date_added = {date_added}") try: self.connect() result = self.cursor.execute( - "INSERT INTO `audio_message_reference` (file_name, author_id, date_added, listen_count, file_id) VALUES (?, ?, ?, ?, ?)", + "INSERT INTO `audio_message_reference` (file_name, author_id, date_added, listen_count, file_id) " + "VALUES (?, ?, ?, ?, ?)", (file_name, author_id, date_added, listen_count, file_id)) self.conn.commit() self.logger.info( - f"Аудио успешно добавлено в БД (file_name = {file_name}, author_id = {author_id}, date_added = {date_added}") + f"Аудио успешно добавлено в БД (file_name = {file_name}, author_id = {author_id}, " + f"date_added = {date_added}") return None except sqlite3.Error as error: print(error) @@ -871,7 +924,8 @@ class BotDB: try: self.connect() result = self.cursor.execute( - "SELECT `file_id` FROM `audio_message_reference` WHERE `author_id` = ? ORDER BY date_added DESC LIMIT 1", + "SELECT `file_id` FROM `audio_message_reference` WHERE `author_id` = ? " + "ORDER BY date_added DESC LIMIT 1", (user_id,)) return result.fetchone()[0] except sqlite3.Error as error: @@ -884,7 +938,11 @@ class BotDB: try: self.connect() result = self.cursor.execute( - "SELECT `file_name` FROM `audio_message_reference` WHERE `author_id` = ? ORDER BY date_added DESC LIMIT 1", + "SELECT `file_name` " + "FROM `audio_message_reference` " + "WHERE `author_id` = ? " + "ORDER BY date_added " + "DESC LIMIT 1", (user_id,)) return result.fetchone()[0] except sqlite3.Error as error: diff --git a/helper_bot/handlers/callback/__pycache__/main.cpython-312.pyc b/helper_bot/handlers/callback/__pycache__/main.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..b532bc4adf2807275d1de05cbd8b92eaee9b775a GIT binary patch literal 15306 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 literal 0 HcmV?d00001 diff --git a/helper_bot/handlers/private/private_handlers.py b/helper_bot/handlers/private/private_handlers.py index f4695ba..7821d27 100644 --- a/helper_bot/handlers/private/private_handlers.py +++ b/helper_bot/handlers/private/private_handlers.py @@ -17,9 +17,10 @@ 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, \ - process_photo_album, send_media_group_message, check_username_and_full_name + send_media_group_message, process_photo_album, check_username_and_full_name from logs.custom_logger import logger + private_router = Router() private_router.message.middleware(AlbumMiddleware()) @@ -189,20 +190,28 @@ async def suggest_router(message: types.Message, state: FSMContext, album: list await state.set_state("START") elif message.media_group_id is not None: post_caption = " " + + # Получаем сообщение и проверяем есть ли подпись. Если подпись есть, то преобразуем ее через функцию if album[0].caption: lower_caption = album[0].caption.lower() post_caption, is_anonymous = get_text_message(lower_caption, message.from_user.full_name, message.from_user.username) - media_group = process_photo_album(album, post_caption) - media_group_message_id = await send_media_group_message(GROUP_FOR_POST, message, - media_group) - print(f'Отправил в чат предложки сообщения, media_group_message_id:{media_group_message_id}\n\n') + + #Иначе обрабатываем фото и получаем медиагруппу + media_group = await process_photo_album(album, post_caption) + + #Отправляем медиагруппу в секретный чат + media_group_message_id = await send_media_group_message(GROUP_FOR_POST, message, media_group) sleep(0.2) + + #Получаем клавиатуру и отправляем еще одно текстовое сообщение с кнопками markup = get_reply_keyboard_for_post() 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) - d = await state.get_data() - print(f'ЗАПИСАЛ В state.update_data {d}') + + #Получаем клавиатуру для пользователя, благодарим за пост, и возвращаем в дефолтное сообщение 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) diff --git a/helper_bot/utils/__pycache__/helper_func.cpython-312.pyc b/helper_bot/utils/__pycache__/helper_func.cpython-312.pyc index 1ed1cd0d81e2e2a7e48d451ffa0152073f60f092..229091afe3cfe694a3ba90c467751560242d136d 100644 GIT binary patch delta 6276 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 HxUK&KBK7lX delta 2534 zcmZ`5ZERat^=)bdN9;IuoH|L9v~g-@X<98y*RiEvTbre6o2?AD?8(l3X`T3s z`<^#aQYAv&j{#x}SFo`%1llGI4Mar{41~sh0IJ{z4oqtFRK(CU1QJNu`Ug!yaL#qw zWuRUu=bn4M-uZTJ6xWXje%IRSC2*ep%{S)$x??pEcfCbd2ZwqnVT7qAciEHkP~sw{ z=M5BtlhaLoJ|dpGr*k>yWtyqX$C`}okhx9&oXR{`)LbjmO+RaaKQGYS%m=gp>t}v= zxmfEJEf-_~Gjvx=K{IS>2`~=2A<%7O16#5pPov9z)&?%@+Wzq-4&o6o9=#*}eb6!^P!A0^_S{#4>wLe7K0W#zJJBSRiWmsHVcjdoro%=NPJ z25pilSyGs?FbJOP7w`7P0(Q%m0$Eb$z2aNp1oaC#5)tpW#^@7w7da5v?fJ4wmRvJr ztrmz-(G@+ojBft@KXB46M=N7i9M4t=Y08tpO?#Xcvr;dcJa3zhR^!Er?RdB1H;T-0 z=W8{y!nhlRfsaXbJafg83Cy(SX!%m1UgjOh^+_%y55Gf;T%QE0r2*){!)1~qHC~;C z^cqd!raJcE5DE(bD`Yc9BJC@aH)Gx3(f%0Q^&!!;(_*T9r^n}io_^`x4e|3(Qd|pV z+I+yEn||W&Xs9ucbrNH-Ov{e}nIx3FApVlNM_i2^$U%}-9E5oc<9`lR34N4@X-n!= z^0I4NdDIy)M!quo1LbL&cAreU_->GtxvM_{nD~0faUYuIodD{G#OZieti%&%R7WXP zZ6{D;g7oyWwxhJ{5zg%&jRs5WRw8>jr?nc zY$STbXku{svBu;1#$$y>VXoo5@Q!+MBfR6q!g{#(MmVz`&a9lcskSuyC$C?+UTS#H zy`!Gr@U=J8_RXLYb$?_9!P*ylC*t%KIuTP}-8T_mJDCd5WenC)aVXMC)7ufG__ua^#7{E>^xr`53S*9N;al{j(R%*##p%i;c|>0;42yeVsJ4R_{AN z=>y_g{~mxh`|s;&E}A@J2Fov6hFyi*Hu+J|`J5OTxF2*%1BYGon7Fq4Egky`LKzoN z4Q3{e!Nbw&mdP!SE#s&XR{_NoHpiDeWx0zAE_86xjW3 zG%2nRb@gL^zd&H$(WeM+VJ>-VOO&}VoEfsHq}3noS*3lShNpCbM*)L4CE*FcEp!b- z5^u&ut);&Fqfd}4>t`8jD2u2#w%z7}}(6jFbLp&rt%uMU| zgS1TE@oX}Qk8LI6Pr_S*H6oU?DRBSW*}DGO+bYT7oj$BGZ$n^+M~2fhAo%c3Hv_^? ziFj#v3`+Hf;medhC{B%hrVDpn+RHIL{2>H#%qI{V7r!1EWH=&x6o3tl_T@)B_Ks z>-65Jy9|_H5V5fLn?c-&Y3dN}L!?_oMl<5b=$>U%g7w7a95?n0RD2vMo~h>SItsK5 z$CbeG9~6%3*-`M9L6zNvJIINg!4)uRE*7eJ&Zguhkh98hdgK(ywwAreu~8hA6=!XJ zjzA|j3xLVw=&$Smxxi%`f21EQS6RJeeu`fLF7~K(65ysnDg84Ue4ix#MAG8KzR7(b zjJDB^*Jo}KxHgA$8hiclCV}hCfnR2SmX&DZY_4%`e*NsiEo6KU6QTWI=nT^EHD!~) X_2zzgy?yu=zBc>CYx{>)%-nwgI1E`u diff --git a/helper_bot/utils/helper_func.py b/helper_bot/utils/helper_func.py index 768b6e9..9dbd94b 100644 --- a/helper_bot/utils/helper_func.py +++ b/helper_bot/utils/helper_func.py @@ -1,9 +1,10 @@ from datetime import datetime, timedelta from aiogram import types -from aiogram.types import InputMediaPhoto +from aiogram.types import InputMediaPhoto, FSInputFile from helper_bot.utils.base_dependency_factory import BaseDependencyFactory +from logs.custom_logger import logger bdf = BaseDependencyFactory() @@ -39,7 +40,29 @@ def get_text_message(post_text: str, first_name: str, username: str): return f'Пост из ТГ:\n{post_text}\n\nАвтор поста: {first_name} @{username}', is_anonymous -def process_photo_album(album, post_caption: str = ''): +async def download_photo(message: types.Message, file_id: str): + """ + Скачивает фото по file_id из Telegram. + + Args: + message: сообщение + file_id: File ID фотографии. + filename: Имя файла, под которым будет сохранено фото. + + Returns: + Путь к сохраненному файлу, если файл был скачан успешно, иначе None. + """ + try: + 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) + return file_path + except Exception as e: + logger.error(f"Ошибка скачивания фотографии: {e}") + return None + + +async def process_photo_album(album, post_caption: str = ''): """ Создает список InputMediaPhoto для альбома. @@ -51,13 +74,41 @@ def process_photo_album(album, post_caption: str = ''): Список InputMediaPhoto. """ photo_media = [] + #Циклом проходимся по собранному миддлварью объекту album for i, message in enumerate(album): - print(f'message_id в функции process_photo_album: {message.message_id}\n\n') - if i == 0: + file_id = message.photo[-1].file_id + file_path = await download_photo(message, file_id=file_id) + # Если это последняя фото в массиве, то добавляем подпись. Остальные фото просто преобразуем в InputMediaPhoto + # и формируем объект MediaGroup + if i == len(album) - 1: photo_media.append(InputMediaPhoto(media=message.photo[-1].file_id, caption=post_caption)) else: photo_media.append(InputMediaPhoto(media=message.photo[-1].file_id)) - return photo_media + return photo_media # Возвращаем идентификатор медиа-группы + + +async def add_in_db_media(sent_message, post_caption: str = ''): + """ + Идентификатор медиа-группы + + Args: + sent_message: sent_message объект из Telegram API. + post_caption: Текст подписи к первому фото. + + Returns: + Список InputMediaPhoto. + """ + media_group_message_id = sent_message[0].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) + if i == 0: + BotDB.add_post_from_telegram_in_db(media_group_message_id, message.message_id, 0, file_path, post_caption) + elif i == len(sent_message) - 1: + BotDB.add_post_from_telegram_in_db(media_group_message_id, message.message_id, 1, file_path, post_caption) + else: + BotDB.add_post_from_telegram_in_db(media_group_message_id, message.message_id, 0, file_path, post_caption) + return media_group_message_id async def send_media_group_message(chat_id: int, message: types.Message, media_group: list[InputMediaPhoto]): @@ -65,12 +116,37 @@ async def send_media_group_message(chat_id: int, message: types.Message, media_g chat_id=chat_id, media=media_group, ) - print(f'ПОЛНЫЙ ОБЪЕКТ ОТПРАВЛЕННЫХ СООБЩЕНИЙ : {sent_message}\n\n') + await add_in_db_media(sent_message, post_caption=sent_message[-1].caption) message_id = sent_message[-1].message_id - print(f'ИДЕНТИФИКАТОР ПОСЛЕДНГО СООБЩЕНИЯ: {message_id}') return message_id +async def send_media_group_with_caption(bot, chat_id: int, post_content: list[tuple[str]], post_text: str): + """ + Отправляет медиа-группу с подписью к последнему файлу. + + Args: + bot: Экземпляр бота aiogram. + chat_id: ID чата для отправки. + post_content: Список кортежей с путями к файлам. + post_text: Текст подписи. + """ + media = [] + for file_path in post_content: + try: + file = FSInputFile(path=file_path[0]) + media.append(types.InputMediaPhoto(media=file)) + except FileNotFoundError: + logger.error(f"Файл не найден: {file_path[0]}") + return + + # Добавляем подпись к последнему файлу + if media: + media[-1].caption = post_text + + await bot.send_media_group(chat_id=chat_id, media=media) + + async def send_text_message(chat_id, message: types.Message, post_text: str, markup: types.ReplyKeyboardMarkup = None): if markup is None: sent_message = await message.bot.send_message( @@ -160,7 +236,7 @@ def get_banned_users_buttons(): def get_help_message_id(media_group_message_id: int, data: dict) -> int: """ - Получает идентификатор сообщения помощи по идентификатору сообщения группы. + Получает идентификатор текстового сообщения по идентификатору сообщения группы. Args: media_group_message_id: Идентификатор сообщения группы @@ -169,9 +245,8 @@ def get_help_message_id(media_group_message_id: int, data: dict) -> int: Returns: Идентификатор сообщения помощи. """ - - if 'help_message_id' in data and 'media_group_message_id' in data: - return data['media_group_message_id'] + if 'help_message_id' in data: + return data['help_message_id'] # Возвращаем help_message_id else: return 0 @@ -188,7 +263,6 @@ def check_username_and_full_name(user_id: int, username: str, full_name: str): def unban_notifier(self): # Получение сегодняшней даты в формате DD-MM-YYYY current_date = datetime.now() - print('Мы в функции unban_notifier') today = current_date.strftime("%d-%m-%Y") # Получение списка разблокированных пользователей unblocked_users = self.BotDB.get_users_for_unblock_today(today) diff --git a/run_helper.py b/run_helper.py index ad7b9df..efa1bb1 100644 --- a/run_helper.py +++ b/run_helper.py @@ -4,4 +4,4 @@ from helper_bot.utils.base_dependency_factory import BaseDependencyFactory if __name__ == '__main__': - asyncio.run(start_bot(BaseDependencyFactory())) + asyncio.run(start_bot(BaseDependencyFactory())) \ No newline at end of file From 095e0398d017ee2a1a2943e31818d4129ca1ff2c Mon Sep 17 00:00:00 2001 From: KatykhinAA Date: Thu, 18 Jul 2024 23:30:41 +0300 Subject: [PATCH 3/8] some fix --- database/db.py | 22 +++++- .../handlers/callback/callback_handlers.py | 30 ++++++-- .../handlers/private/private_handlers.py | 71 +++++++++--------- .../__pycache__/main.cpython-312.pyc | Bin 6436 -> 6480 bytes helper_bot/keyboards/main.py | 7 +- .../__pycache__/helper_func.cpython-312.pyc | Bin 13527 -> 12712 bytes helper_bot/utils/helper_func.py | 46 ++++++------ 7 files changed, 105 insertions(+), 71 deletions(-) diff --git a/database/db.py b/database/db.py index d5923bf..bd3c13c 100644 --- a/database/db.py +++ b/database/db.py @@ -856,11 +856,31 @@ class BotDB: result = self.cursor.execute("SELECT content_name " "FROM posts_from_telegram WHERE group_message_id = ?", (main_post,)) 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() + def get_post_ids_from_telegram_by_last_id(self, last_post_id: int): + self.logger.info( + 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] + 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() + def get_post_text_from_telegram_by_last_id(self, last_post_id: int): self.logger.info(f"Запуск функции get_post_text_from_telegram_by_last_id, идентификатор поста {last_post_id}") try: diff --git a/helper_bot/handlers/callback/callback_handlers.py b/helper_bot/handlers/callback/callback_handlers.py index 888b4e9..66003a2 100644 --- a/helper_bot/handlers/callback/callback_handlers.py +++ b/helper_bot/handlers/callback/callback_handlers.py @@ -8,7 +8,7 @@ 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_with_caption + get_banned_users_buttons, delete_user_blacklist, get_help_message_id, send_media_group_to_channel from logs.custom_logger import logger callback_router = Router() @@ -56,21 +56,35 @@ async def post_for_group(call: CallbackQuery, state: FSMContext): await call.answer(text='Что-то пошло не так!', show_alert=True, cache_time=3) elif call.message.text == "^": user_data = await state.get_data() - # Получил идентификатор последнего предложенного сообщения из кэша + + # Получаем идентификатор последнего предложенного сообщения из кэша help_message = get_help_message_id(call.message.message_id, user_data) - media_group_id = help_message-1 + + # Получаем идентификатор медиагруппы + 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) - await send_media_group_with_caption(bot=call.bot, chat_id=MAIN_PUBLIC, post_content=post_content, post_text=post_text) - await call.answer(text='Выложено!', show_alert=True, cache_time=3) + post_ids = BotDB.get_post_ids_from_telegram_by_last_id(media_group_id) + # Преобразуем результат в список + message_ids = [row[0] for row in post_ids] + + # Добавляем help_message в список + message_ids.append(help_message) + + # Выкладываем пост в канал + await send_media_group_to_channel(bot=call.bot, chat_id=MAIN_PUBLIC, post_content=post_content, + post_text=post_text) + await call.bot.delete_messages(chat_id=GROUP_FOR_POST, message_ids=message_ids) + await call.answer(text='Выложено!', show_alert=True, cache_time=3) @callback_router.callback_query( F.data == "decline" ) async def decline_post_for_group(call: CallbackQuery, state: FSMContext): - logger.info( f'Получен callback-запрос с данными: {call.data} от пользователя {call.from_user.full_name} (ID: {call.from_user.id})') try: @@ -150,12 +164,12 @@ async def change_page(call: CallbackQuery): await call.bot.edit_message_reply_markup(chat_id=call.message.chat.id, message_id=call.message.message_id, reply_markup=keyboard) else: - #Готовим сообщения + # Готовим сообщения message_user = get_banned_users_list(int(page_number) * 7 - 7) await call.bot.edit_message_text(chat_id=call.message.chat.id, message_id=call.message.message_id, text=message_user) - #Готовим клавиатуру + # Готовим клавиатуру buttons = get_banned_users_buttons() keyboard = create_keyboard_with_pagination(int(call.data[5:]), len(buttons), buttons, 'unlock') await call.bot.edit_message_reply_markup(chat_id=call.message.chat.id, message_id=call.message.message_id, diff --git a/helper_bot/handlers/private/private_handlers.py b/helper_bot/handlers/private/private_handlers.py index 7821d27..b3e51fa 100644 --- a/helper_bot/handlers/private/private_handlers.py +++ b/helper_bot/handlers/private/private_handlers.py @@ -17,10 +17,9 @@ 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, process_photo_album, check_username_and_full_name + send_media_group_message_to_private_chat, prepare_media_group_from_middlewares, check_username_and_full_name from logs.custom_logger import logger - private_router = Router() private_router.message.middleware(AlbumMiddleware()) @@ -65,8 +64,10 @@ async def handle_start_message(message: types.Message, state: FSMContext): is_need_update = check_username_and_full_name(user_id, username, full_name) if is_need_update: BotDB.update_username_and_full_name(user_id, username, full_name) - await message.answer(f"Давно не виделись! Вижу что ты изменился;) Теперь буду звать тебя: {full_name} и ник @{username}") - await message.bot.send_message(chat_id=GROUP_FOR_LOGS, text=f'Для пользователя: {user_id} обновлены данные в БД.\nНовое имя: {full_name}\nНовый ник:{username}') + await message.answer( + f"Давно не виделись! Вижу что ты изменился;) Теперь буду звать тебя: {full_name} и ник @{username}") + await message.bot.send_message(chat_id=GROUP_FOR_LOGS, + text=f'Для пользователя: {user_id} обновлены данные в БД.\nНовое имя: {full_name}\nНовый ник:{username}') sleep(1) BotDB.update_date_for_user(date, user_id) await state.set_state("START") @@ -161,57 +162,63 @@ async def suggest_router(message: types.Message, state: FSMContext, album: list try: if message.content_type == 'text': lower_text = message.text.lower() - post_text, is_anonymous = get_text_message(lower_text, message.from_user.full_name, - message.from_user.username) + # Получаем текст сообщения и преобразовываем его по правилам + post_text = get_text_message(lower_text, message.from_user.full_name, + message.from_user.username) + + # Получаем клавиатуру для поста markup = get_reply_keyboard_for_post() - if is_anonymous: - await send_text_message(GROUP_FOR_POST, message, post_text, markup) - else: - await send_text_message(GROUP_FOR_POST, message, post_text, markup) + + # Отправляем сообщение в приватный канал + await send_text_message(GROUP_FOR_POST, message, post_text, 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 == 'photo' and message.media_group_id is None: lower_caption = message.caption.lower() markup = get_reply_keyboard_for_post() - post_caption, is_anonymous = get_text_message(lower_caption, message.from_user.full_name, - message.from_user.username) - #TODO: тут какая-то шляпа - if is_anonymous: - await send_photo_message(GROUP_FOR_POST, message, - message.photo[-1].file_id, post_caption, markup) - else: - await send_photo_message(GROUP_FOR_POST, message, - message.photo[-1].file_id, post_caption, markup) + # Получаем текст сообщения и преобразовываем его по правилам + post_caption = get_text_message(lower_caption, message.from_user.full_name, + message.from_user.username) + + # Отправляем фото и текст в приватный канал + await send_photo_message(GROUP_FOR_POST, message, + message.photo[-1].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.media_group_id is not None: post_caption = " " # Получаем сообщение и проверяем есть ли подпись. Если подпись есть, то преобразуем ее через функцию if album[0].caption: lower_caption = album[0].caption.lower() - post_caption, is_anonymous = get_text_message(lower_caption, message.from_user.full_name, - message.from_user.username) + post_caption = get_text_message(lower_caption, message.from_user.full_name, + message.from_user.username) - #Иначе обрабатываем фото и получаем медиагруппу - media_group = await process_photo_album(album, post_caption) + # Иначе обрабатываем фото и получаем медиагруппу + media_group = await prepare_media_group_from_middlewares(album, post_caption) - #Отправляем медиагруппу в секретный чат - media_group_message_id = await send_media_group_message(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) - #Получаем клавиатуру и отправляем еще одно текстовое сообщение с кнопками + # Получаем клавиатуру и отправляем еще одно текстовое сообщение с кнопками markup = get_reply_keyboard_for_post() help_message_id = await send_text_message(GROUP_FOR_POST, message, "^", markup) - #Записываем в state идентификаторы текстового сообщения И последнего сообщения медиагруппы + # Записываем в state идентификаторы текстового сообщения И последнего сообщения медиагруппы await state.update_data(media_group_message_id=media_group_message_id, help_message_id=help_message_id) - #Получаем клавиатуру для пользователя, благодарим за пост, и возвращаем в дефолтное сообщение + # Получаем клавиатуру для пользователя, благодарим за пост, и возвращаем в дефолтное сообщение 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) @@ -283,11 +290,3 @@ async def resend_message_in_group_for_message(message: types.Message, state: FSM elif user_state == "CHAT": markup = get_reply_keyboard_leave_chat() await message.answer(question, reply_markup=markup) - -# @private_router.message( -# ChatTypeFilter(chat_type=["private"]) -# ) -# async def default(message: types.Message, state: FSMContext): -# markup = get_reply_keyboard(BotDB, message.from_user.id) -# await message.answer('Кажется ты заблудился. Держи клавиатуру, твое состояние сброшено на начало', reply_markup=markup) -# await state.set_state("START") diff --git a/helper_bot/keyboards/__pycache__/main.cpython-312.pyc b/helper_bot/keyboards/__pycache__/main.cpython-312.pyc index 08b8286aab727a0450bbe3b5ad1413cc0a2bba62..7c259e9328c3f4ea90d6fe5b137dc0b862a6895d 100644 GIT binary patch delta 195 zcmZ2tbis)CG%qg~0}z}po0)cGBJXW3HXw%?h(F($tS98pmcq1#c{S7IMj_Y9IgEUh zJA`;92e6Aw_7@e~yn)e%kui1hTPAh&FAPkqY#-PdSb5sL8@;EnUKh~1D4=zNS8;>n z7iLC58>swdeP%`=ce5eeK}I$ipe4mNlh29DEEeHlVp9fjb3ok9W?akI7ZlY1F? z8JQ**vdd4d78TokfzgJMF>*35v%1_94&Lh=N*6hlZV0Mwi2TCL$mziNg_VVs?E@DB zpXg*m3GvOP%+Hw^1vbaB9b{yb-Yn0d$i%3$*^%ow8>9ASPQgV?jNzNt2zxNG#RIJ_ lZk)VPSa!0WnD}NrvAv9pnVa8;b274WFbaJVoBT^63;?_OGfe;h diff --git a/helper_bot/keyboards/main.py b/helper_bot/keyboards/main.py index 41e238a..9318b99 100644 --- a/helper_bot/keyboards/main.py +++ b/helper_bot/keyboards/main.py @@ -5,9 +5,10 @@ from aiogram.utils.keyboard import ReplyKeyboardBuilder, InlineKeyboardBuilder def get_reply_keyboard_for_post(): builder = InlineKeyboardBuilder() builder.row(types.InlineKeyboardButton( - text="Опубликовать", callback_data="publish"), - types.InlineKeyboardButton( - text="Отклонить", callback_data="decline") + text="Опубликовать", callback_data="publish") + ) + builder.row(types.InlineKeyboardButton( + text="Отклонить", callback_data="decline") ) markup = builder.as_markup(resize_keyboard=True, one_time_keyboard=True) return markup diff --git a/helper_bot/utils/__pycache__/helper_func.cpython-312.pyc b/helper_bot/utils/__pycache__/helper_func.cpython-312.pyc index 229091afe3cfe694a3ba90c467751560242d136d..ca8051095e7ec670e013514f47cf4bb5307fe2c4 100644 GIT binary patch delta 4120 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 E3*oHrPXGV_ diff --git a/helper_bot/utils/helper_func.py b/helper_bot/utils/helper_func.py index 9dbd94b..2d800cb 100644 --- a/helper_bot/utils/helper_func.py +++ b/helper_bot/utils/helper_func.py @@ -27,17 +27,14 @@ def get_text_message(post_text: str, first_name: str, username: str): Returns: Кортеж из двух элементов: - Сформированный текст сообщения. - - Флаг, указывающий, является ли пост анонимным (True - анонимный, False - не анонимный). + - Флаг, указывающий, является ли пост анонимным (True - анонимный, False - не анонимный) """ if "неанон" in post_text or "не анон" in post_text: - is_anonymous = False - return f'Пост из ТГ:\n{post_text}\n\nАвтор поста: {first_name} @{username}', is_anonymous + return f'Пост из ТГ:\n{post_text}\n\nАвтор поста: {first_name} @{username}' elif "анон" in post_text: - is_anonymous = True - return f'Пост из ТГ:\n{post_text}\n\nПост опубликован анонимно', is_anonymous + return f'Пост из ТГ:\n{post_text}\n\nПост опубликован анонимно' else: - is_anonymous = False - return f'Пост из ТГ:\n{post_text}\n\nАвтор поста: {first_name} @{username}', is_anonymous + return f'Пост из ТГ:\n{post_text}\n\nАвтор поста: {first_name} @{username}' async def download_photo(message: types.Message, file_id: str): @@ -46,11 +43,11 @@ async def download_photo(message: types.Message, file_id: str): Args: message: сообщение - file_id: File ID фотографии. - filename: Имя файла, под которым будет сохранено фото. + file_id: File ID фотографии + filename: Имя файла, под которым будет сохранено фото Returns: - Путь к сохраненному файлу, если файл был скачан успешно, иначе None. + Путь к сохраненному файлу, если файл был скачан успешно, иначе None """ try: file = await message.bot.get_file(file_id) @@ -62,29 +59,30 @@ async def download_photo(message: types.Message, file_id: str): return None -async def process_photo_album(album, post_caption: str = ''): +async def prepare_media_group_from_middlewares(album, post_caption: str = ''): """ - Создает список InputMediaPhoto для альбома. + Создает MediaGroup. Args: album: Album объект из Telegram API. post_caption: Текст подписи к первому фото. Returns: - Список InputMediaPhoto. + Список InputMediaPhoto (MediaGroup). """ - photo_media = [] - #Циклом проходимся по собранному миддлварью объекту album + media_group = [] + # Циклом проходимся по собранному миддлварью объекту album + for i, message in enumerate(album): file_id = message.photo[-1].file_id - file_path = await download_photo(message, file_id=file_id) + # Если это последняя фото в массиве, то добавляем подпись. Остальные фото просто преобразуем в InputMediaPhoto # и формируем объект MediaGroup if i == len(album) - 1: - photo_media.append(InputMediaPhoto(media=message.photo[-1].file_id, caption=post_caption)) + media_group.append(InputMediaPhoto(media=file_id, caption=post_caption)) else: - photo_media.append(InputMediaPhoto(media=message.photo[-1].file_id)) - return photo_media # Возвращаем идентификатор медиа-группы + media_group.append(InputMediaPhoto(media=file_id)) + return media_group # Возвращаем MediaGroup async def add_in_db_media(sent_message, post_caption: str = ''): @@ -111,7 +109,8 @@ async def add_in_db_media(sent_message, post_caption: str = ''): return media_group_message_id -async def send_media_group_message(chat_id: int, message: types.Message, media_group: list[InputMediaPhoto]): +async def send_media_group_message_to_private_chat(chat_id: int, message: types.Message, + media_group: list[InputMediaPhoto]): sent_message = await message.bot.send_media_group( chat_id=chat_id, media=media_group, @@ -121,7 +120,7 @@ async def send_media_group_message(chat_id: int, message: types.Message, media_g return message_id -async def send_media_group_with_caption(bot, chat_id: int, post_content: list[tuple[str]], post_text: str): +async def send_media_group_to_channel(bot, chat_id: int, post_content: list[tuple[str]], post_text: str): """ Отправляет медиа-группу с подписью к последнему файлу. @@ -165,7 +164,8 @@ async def send_text_message(chat_id, message: types.Message, post_text: str, mar return message_id -async def send_photo_message(chat_id, message: types.Message, photo: str, post_text: str, markup: types.ReplyKeyboardMarkup = None): +async def send_photo_message(chat_id, message: types.Message, photo: str, post_text: str, + markup: types.ReplyKeyboardMarkup = None): if markup is None: await message.bot.send_photo( chat_id=chat_id, @@ -271,4 +271,4 @@ def unban_notifier(self): message += f"ID: {user_id}, Имя: {user_name}\n" # Отправка сообщения в канал - self.bot.send_message(self.GROUP_FOR_MESSAGE, message) \ No newline at end of file + self.bot.send_message(self.GROUP_FOR_MESSAGE, message) From 54234e59ec23fd261dbd3f7b1e7641c91ba1f64b Mon Sep 17 00:00:00 2001 From: KatykhinAA Date: Sat, 20 Jul 2024 14:18:58 +0300 Subject: [PATCH 4/8] some fix --- .../handlers/callback/callback_handlers.py | 2 ++ .../handlers/private/private_handlers.py | 1 + .../__pycache__/main.cpython-312.pyc | Bin 6480 -> 6478 bytes helper_bot/keyboards/main.py | 1 - 4 files changed, 3 insertions(+), 1 deletion(-) diff --git a/helper_bot/handlers/callback/callback_handlers.py b/helper_bot/handlers/callback/callback_handlers.py index 66003a2..417daa7 100644 --- a/helper_bot/handlers/callback/callback_handlers.py +++ b/helper_bot/handlers/callback/callback_handlers.py @@ -77,6 +77,8 @@ async def post_for_group(call: CallbackQuery, state: FSMContext): # Выкладываем пост в канал await send_media_group_to_channel(bot=call.bot, chat_id=MAIN_PUBLIC, post_content=post_content, post_text=post_text) + # TODO: Удалить фотки с локалки + # TODO: Поменять чтобы записывалось не в FSM await call.bot.delete_messages(chat_id=GROUP_FOR_POST, message_ids=message_ids) await call.answer(text='Выложено!', show_alert=True, cache_time=3) diff --git a/helper_bot/handlers/private/private_handlers.py b/helper_bot/handlers/private/private_handlers.py index b3e51fa..1dffc69 100644 --- a/helper_bot/handlers/private/private_handlers.py +++ b/helper_bot/handlers/private/private_handlers.py @@ -197,6 +197,7 @@ 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 album[0].caption: diff --git a/helper_bot/keyboards/__pycache__/main.cpython-312.pyc b/helper_bot/keyboards/__pycache__/main.cpython-312.pyc index 7c259e9328c3f4ea90d6fe5b137dc0b862a6895d..5c642c6728e28ec1ffeb5ae787bf378434c019e6 100644 GIT binary patch delta 142 zcmca$bk2zPG%qg~0}!ay&rS~H{!C4?i!4|E0jMl0I40$VCqE5h2V$_kuewI5-&t1UJOpU i=$8zZxR77;8Kmx07$YmA&?f4&5Se%} kIO(EaGFak5e$i);x=#^|tc*gR1lSpcK8pZZMdCoy0V=;M9{>OV diff --git a/helper_bot/keyboards/main.py b/helper_bot/keyboards/main.py index 9318b99..1bf7ed6 100644 --- a/helper_bot/keyboards/main.py +++ b/helper_bot/keyboards/main.py @@ -60,7 +60,6 @@ def create_keyboard_with_pagination(page: int, total_items: int, array_items: li # Создаем билдер для клавиатуры keyboard = InlineKeyboardBuilder() - # TODO: Тут поправить на 9 объектов, а не 7. Клавиатуру переделал # Вычисляем стартовый номер для текущей страницы start_index = (page - 1) * 9 From 0b7f718f8aa1b272370f0b8339e16f05211ca8f0 Mon Sep 17 00:00:00 2001 From: KatykhinAA Date: Sat, 20 Jul 2024 16:54:43 +0300 Subject: [PATCH 5/8] 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 Date: Sat, 20 Jul 2024 22:41:48 +0300 Subject: [PATCH 6/8] 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 ); """ # Применение миграции From 33fa84943d199817b00bec551b5067149eef041d Mon Sep 17 00:00:00 2001 From: Andrey Date: Sun, 21 Jul 2024 13:24:18 +0300 Subject: [PATCH 7/8] add answer for user --- database/db.py | 27 +++ helper_bot/handlers/admin/admin_handlers.py | 4 +- .../handlers/callback/callback_handlers.py | 54 ++++- helper_bot/handlers/group/group_handlers.py | 3 +- .../handlers/private/private_handlers.py | 74 ++++-- helper_bot/keyboards/__init__.py | 2 +- .../keyboards/{main.py => keyboards.py} | 220 +++++++++--------- helper_bot/utils/helper_func.py | 72 +++--- tests/test_db.py | 16 +- 9 files changed, 296 insertions(+), 176 deletions(-) rename helper_bot/keyboards/{main.py => keyboards.py} (97%) diff --git a/database/db.py b/database/db.py index 9948499..5924137 100644 --- a/database/db.py +++ b/database/db.py @@ -874,6 +874,33 @@ class BotDB: except Exception as e: self.logger.error(f"Ошибка в функции get_post_text_from_telegram_by_last_id {str(e)}") + def get_author_id_by_message_id(self, message_id: int): + self.logger.info(f"Запуск функции get_author_id_by_message_id, идентификатор поста {message_id}") + try: + self.connect() + result = self.cursor.execute("SELECT author_id " + "FROM post_from_telegram_suggest WHERE message_id = ?", + (message_id,)) + author_id = result.fetchone()[0] + self.logger.info(f"Функция get_author_id_by_message_id получила author_id {author_id}") + return author_id + except Exception as e: + self.logger.error(f"Ошибка в функции get_author_id_by_message_id {str(e)}") + + def get_author_id_by_helper_message_id(self, helper_text_message_id: int): + self.logger.info(f"Запуск функции get_author_id_by_helper_message_id, идентификатор поста " + f"{helper_text_message_id}") + try: + self.connect() + result = self.cursor.execute("SELECT author_id " + "FROM post_from_telegram_suggest WHERE helper_text_message_id = ?", + (helper_text_message_id,)) + author_id = result.fetchone()[0] + self.logger.info(f"Функция get_author_id_by_helper_message_id получила author_id {author_id}") + return author_id + except Exception as e: + self.logger.error(f"Ошибка в функции get_author_id_by_helper_message_id {str(e)}") + 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}, " diff --git a/helper_bot/handlers/admin/admin_handlers.py b/helper_bot/handlers/admin/admin_handlers.py index 917ce95..e83e545 100644 --- a/helper_bot/handlers/admin/admin_handlers.py +++ b/helper_bot/handlers/admin/admin_handlers.py @@ -5,16 +5,14 @@ from aiogram.filters import Command, StateFilter from aiogram.fsm.context import FSMContext from helper_bot.filters.main import ChatTypeFilter -from helper_bot.keyboards.main import get_reply_keyboard_admin, create_keyboard_with_pagination, \ +from helper_bot.keyboards.keyboards import get_reply_keyboard_admin, create_keyboard_with_pagination, \ create_keyboard_for_ban_days, create_keyboard_for_approve_ban from helper_bot.utils.base_dependency_factory import BaseDependencyFactory from helper_bot.utils.helper_func import check_access, add_days_to_date, get_banned_users_buttons, get_banned_users_list from logs.custom_logger import logger - admin_router = Router() - bdf = BaseDependencyFactory() GROUP_FOR_POST = bdf.settings['Telegram']['group_for_posts'] GROUP_FOR_MESSAGE = bdf.settings['Telegram']['group_for_message'] diff --git a/helper_bot/handlers/callback/callback_handlers.py b/helper_bot/handlers/callback/callback_handlers.py index 761867e..2004810 100644 --- a/helper_bot/handlers/callback/callback_handlers.py +++ b/helper_bot/handlers/callback/callback_handlers.py @@ -4,7 +4,7 @@ from aiogram import Router, F from aiogram.fsm.context import FSMContext from aiogram.types import CallbackQuery -from helper_bot.keyboards.main import create_keyboard_with_pagination, get_reply_keyboard_admin, \ +from helper_bot.keyboards.keyboards import create_keyboard_with_pagination, get_reply_keyboard_admin, \ 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, \ @@ -35,7 +35,14 @@ async def post_for_group(call: CallbackQuery, state: FSMContext): f'Получен callback-запрос с действием: {call.data} от пользователя {call.from_user.full_name} (ID сообщения: {call.message.message_id})') if call.message.content_type == 'text' and call.message.text != "^": try: + # Пересылаем сообщение в канал await send_text_message(MAIN_PUBLIC, call.message, call.message.text) + + # Получаем из базы автора + отправляем сообщение + удаляем сообщение из предложки + author_id = BotDB.get_author_id_by_message_id(call.message.message_id) + await send_text_message(author_id, call.message, 'Твой пост был выложен🥰') + + # Очищаем предложку и удаляем оттуда пост 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) @@ -47,6 +54,12 @@ async def post_for_group(call: CallbackQuery, state: FSMContext): elif call.message.content_type == 'photo': try: await send_photo_message(MAIN_PUBLIC, call.message, call.message.photo[-1].file_id, call.message.caption) + + # Получаем из базы автора + отправляем сообщение + удаляем сообщение из предложки + author_id = BotDB.get_author_id_by_message_id(call.message.message_id) + await send_text_message(author_id, call.message, 'Твой пост был выложен🥰') + + # Удаляем пост из предложки 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) @@ -58,6 +71,11 @@ async def post_for_group(call: CallbackQuery, state: FSMContext): elif call.message.content_type == 'video': try: await send_video_message(MAIN_PUBLIC, call.message, call.message.video.file_id, call.message.caption) + + # Получаем из базы автора + отправляем сообщение + удаляем сообщение из предложки + author_id = BotDB.get_author_id_by_message_id(call.message.message_id) + await send_text_message(author_id, call.message, 'Твой пост был выложен🥰') + 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) @@ -69,6 +87,11 @@ async def post_for_group(call: CallbackQuery, state: FSMContext): elif call.message.content_type == 'video_note': try: await send_video_note_message(MAIN_PUBLIC, call.message, call.message.video_note.file_id) + + # Получаем из базы автора + отправляем сообщение + удаляем сообщение из предложки + author_id = BotDB.get_author_id_by_message_id(call.message.message_id) + await send_text_message(author_id, call.message, 'Твой пост был выложен🥰') + 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) @@ -80,6 +103,11 @@ async def post_for_group(call: CallbackQuery, state: FSMContext): elif call.message.content_type == 'audio': try: await send_audio_message(MAIN_PUBLIC, call.message, call.message.audio.file_id, call.message.caption) + + # Получаем из базы автора + отправляем сообщение + удаляем сообщение из предложки + author_id = BotDB.get_author_id_by_message_id(call.message.message_id) + await send_text_message(author_id, call.message, 'Твой пост был выложен🥰') + 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) @@ -91,6 +119,11 @@ async def post_for_group(call: CallbackQuery, state: FSMContext): elif call.message.content_type == 'voice': try: await send_voice_message(MAIN_PUBLIC, call.message, call.message.voice.file_id) + + # Получаем из базы автора + отправляем сообщение + удаляем сообщение из предложки + author_id = BotDB.get_author_id_by_message_id(call.message.message_id) + await send_text_message(author_id, call.message, 'Твой пост был выложен🥰') + 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) @@ -112,6 +145,11 @@ async def post_for_group(call: CallbackQuery, state: FSMContext): # Выкладываем пост в канал await send_media_group_to_channel(bot=call.bot, chat_id=MAIN_PUBLIC, post_content=post_content, post_text=post_text) + + # Получаем из базы автора + отправляем сообщение + удаляем сообщение из предложки + author_id = BotDB.get_author_id_by_helper_message_id(call.message.message_id) + await send_text_message(author_id, call.message, 'Твой пост был выложен🥰') + # 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) @@ -124,8 +162,15 @@ async def decline_post_for_group(call: CallbackQuery, state: FSMContext): logger.info( f'Получен callback-запрос с данными: {call.data} от пользователя {call.from_user.full_name} (ID: {call.from_user.id})') try: - if call.message.content_type == 'text' and call.message.text != "^" or call.message.content_type == 'photo': + if call.message.content_type == 'text' and call.message.text != "^" or call.message.content_type == 'photo' \ + or call.message.content_type == 'audio' or call.message.content_type == 'voice' \ + or call.message.content_type == 'video' or call.message.content_type == 'video_note': await call.bot.delete_message(chat_id=GROUP_FOR_POST, message_id=call.message.message_id) + + # Получаем из базы автора + отправляем сообщение + удаляем сообщение из предложки + author_id = BotDB.get_author_id_by_message_id(call.message.message_id) + await send_text_message(author_id, call.message, 'Твой пост был отклонен😔') + logger.info( f'Сообщение отклонено админом {call.from_user.full_name} (ID: {call.from_user.id}).') await call.answer(text='Отклонено!', show_alert=True, cache_time=3) @@ -135,6 +180,11 @@ async def decline_post_for_group(call: CallbackQuery, state: FSMContext): message_ids.append(call.message.message_id) await call.bot.delete_messages(chat_id=GROUP_FOR_POST, message_ids=message_ids) + + # Получаем из базы автора + отправляем сообщение + удаляем сообщение из предложки + author_id = BotDB.get_author_id_by_helper_message_id(call.message.message_id) + await send_text_message(author_id, call.message, 'Твой пост был отклонен😔') + await call.answer(text='Удалено!', show_alert=True, cache_time=3) except Exception as e: await call.bot.send_message(IMPORTANT_LOGS, diff --git a/helper_bot/handlers/group/group_handlers.py b/helper_bot/handlers/group/group_handlers.py index 3ab82c3..6028d83 100644 --- a/helper_bot/handlers/group/group_handlers.py +++ b/helper_bot/handlers/group/group_handlers.py @@ -2,14 +2,13 @@ from aiogram import Router, types from aiogram.fsm.context import FSMContext from helper_bot.filters.main import ChatTypeFilter -from helper_bot.keyboards.main import get_reply_keyboard_leave_chat +from helper_bot.keyboards.keyboards import get_reply_keyboard_leave_chat from helper_bot.utils.base_dependency_factory import BaseDependencyFactory from helper_bot.utils.helper_func import send_text_message from logs.custom_logger import logger group_router = Router() - bdf = BaseDependencyFactory() GROUP_FOR_POST = bdf.settings['Telegram']['group_for_posts'] GROUP_FOR_MESSAGE = bdf.settings['Telegram']['group_for_message'] diff --git a/helper_bot/handlers/private/private_handlers.py b/helper_bot/handlers/private/private_handlers.py index e0a75e4..fd70cad 100644 --- a/helper_bot/handlers/private/private_handlers.py +++ b/helper_bot/handlers/private/private_handlers.py @@ -11,14 +11,14 @@ from aiogram.types import FSInputFile from helper_bot.filters.main import ChatTypeFilter from helper_bot.keyboards import get_reply_keyboard, get_reply_keyboard_for_post -from helper_bot.keyboards.main import get_reply_keyboard_leave_chat +from helper_bot.keyboards.keyboards import get_reply_keyboard_leave_chat from helper_bot.middlewares.album_middleware import AlbumMiddleware 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_video_message, send_video_note_message, send_audio_message, send_voice_message + send_video_message, send_video_note_message, send_audio_message, send_voice_message, add_in_db_media from logs.custom_logger import logger private_router = Router() @@ -173,7 +173,10 @@ async def suggest_router(message: types.Message, state: FSMContext, album: list markup = get_reply_keyboard_for_post() # Отправляем сообщение в приватный канал - await send_text_message(GROUP_FOR_POST, message, post_text, markup) + sent_message_id = await send_text_message(GROUP_FOR_POST, message, post_text, markup) + + # Записываем в базу пост + BotDB.add_post_in_db(sent_message_id, message.text, message.from_user.id) # Отправляем юзеру ответ, что сообщение отравлено и возвращаем его в меню markup_for_user = get_reply_keyboard(BotDB, message.from_user.id) @@ -182,15 +185,19 @@ 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: - lower_caption = message.caption.lower() + 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() - # Получаем текст сообщения и преобразовываем его по правилам - post_caption = get_text_message(lower_caption, message.from_user.full_name, - message.from_user.username) # Отправляем фото и текст в приватный канал - await send_photo_message(GROUP_FOR_POST, message, - message.photo[-1].file_id, post_caption, markup) + sent_message = await send_photo_message(GROUP_FOR_POST, message, + message.photo[-1].file_id, post_caption, markup) + # Записываем в базу пост и контент + BotDB.add_post_in_db(sent_message.message_id, sent_message.caption, message.from_user.id) + await add_in_db_media(sent_message) # Отправляем юзеру ответ и возвращаем его в меню markup_for_user = get_reply_keyboard(BotDB, message.from_user.id) @@ -207,8 +214,16 @@ async def suggest_router(message: types.Message, state: FSMContext, album: list # Получаем текст сообщения и преобразовываем его по правилам # Отправляем видео и текст в приватный канал - await send_video_message(GROUP_FOR_POST, message, - message.video.file_id, post_caption, markup) + sent_message = await send_video_message(GROUP_FOR_POST, message, + message.video.file_id, post_caption, markup) + + # Записываем в базу пост и контент + BotDB.add_post_in_db(sent_message.message_id, sent_message.caption, message.from_user.id) + await add_in_db_media(sent_message) + + # Записываем в базу пост и контент + BotDB.add_post_in_db(sent_message.message_id, sent_message.caption, message.from_user.id) + await add_in_db_media(sent_message) # Отправляем юзеру ответ и возвращаем его в меню markup_for_user = get_reply_keyboard(BotDB, message.from_user.id) @@ -220,8 +235,12 @@ async def suggest_router(message: types.Message, state: FSMContext, album: list markup = get_reply_keyboard_for_post() # Отправляем видеокружок в приватный канал - await send_video_note_message(GROUP_FOR_POST, message, - message.video_note.file_id, markup) + sent_message = await send_video_note_message(GROUP_FOR_POST, message, + message.video_note.file_id, markup) + + # Записываем в базу пост и контент + BotDB.add_post_in_db(sent_message.message_id, sent_message.caption, message.from_user.id) + await add_in_db_media(sent_message) # Отправляем юзеру ответ и возвращаем его в меню markup_for_user = get_reply_keyboard(BotDB, message.from_user.id) @@ -230,15 +249,20 @@ async def suggest_router(message: types.Message, state: FSMContext, album: list await state.set_state("START") elif message.content_type == 'audio' and message.media_group_id is None: - lower_caption = message.caption.lower() + 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() - # Получаем текст сообщения и преобразовываем его по правилам - 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) + # Отправляем аудио и текст в приватный канал + sent_message = await send_audio_message(GROUP_FOR_POST, message, + message.audio.file_id, post_caption, markup) + + # Записываем в базу пост и контент + BotDB.add_post_in_db(sent_message.message_id, sent_message.caption, message.from_user.id) + await add_in_db_media(sent_message) # Отправляем юзеру ответ и возвращаем его в меню markup_for_user = get_reply_keyboard(BotDB, message.from_user.id) @@ -249,9 +273,13 @@ async def suggest_router(message: types.Message, state: FSMContext, album: list 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) + # Отправляем войс и текст в приватный канал + sent_message = await send_voice_message(GROUP_FOR_POST, message, + message.voice.file_id, markup) + + # Записываем в базу пост и контент + BotDB.add_post_in_db(sent_message.message_id, sent_message.caption, message.from_user.id) + await add_in_db_media(sent_message) # Отправляем юзеру ответ и возвращаем его в меню markup_for_user = get_reply_keyboard(BotDB, message.from_user.id) diff --git a/helper_bot/keyboards/__init__.py b/helper_bot/keyboards/__init__.py index 734fb54..4810ecf 100644 --- a/helper_bot/keyboards/__init__.py +++ b/helper_bot/keyboards/__init__.py @@ -1 +1 @@ -from .main import get_reply_keyboard_for_post, get_reply_keyboard \ No newline at end of file +from .keyboards import get_reply_keyboard_for_post, get_reply_keyboard diff --git a/helper_bot/keyboards/main.py b/helper_bot/keyboards/keyboards.py similarity index 97% rename from helper_bot/keyboards/main.py rename to helper_bot/keyboards/keyboards.py index 1bf7ed6..d2318eb 100644 --- a/helper_bot/keyboards/main.py +++ b/helper_bot/keyboards/keyboards.py @@ -1,110 +1,110 @@ -from aiogram import types -from aiogram.utils.keyboard import ReplyKeyboardBuilder, InlineKeyboardBuilder - - -def get_reply_keyboard_for_post(): - builder = InlineKeyboardBuilder() - builder.row(types.InlineKeyboardButton( - text="Опубликовать", callback_data="publish") - ) - builder.row(types.InlineKeyboardButton( - text="Отклонить", callback_data="decline") - ) - markup = builder.as_markup(resize_keyboard=True, one_time_keyboard=True) - return markup - - -def get_reply_keyboard(BotDB, user_id): - builder = ReplyKeyboardBuilder() - builder.add(types.KeyboardButton(text="📢Предложить свой пост")) - builder.add(types.KeyboardButton(text="📩Связаться с админами")) - builder.add(types.KeyboardButton(text="👋🏼Сказать пока!")) - if not BotDB.get_info_about_stickers(user_id=user_id): - builder.add(types.KeyboardButton(text="🤪Хочу стикеры")) - markup = builder.as_markup(resize_keyboard=True, one_time_keyboard=True) - return markup - - -def get_reply_keyboard_leave_chat(): - builder = ReplyKeyboardBuilder() - builder.add(types.KeyboardButton(text="Выйти из чата")) - markup = builder.as_markup(resize_keyboard=True, one_time_keyboard=True) - return markup - - -def get_reply_keyboard_admin(): - builder = ReplyKeyboardBuilder() - builder.add(types.KeyboardButton(text="Бан (Список)")) - builder.add(types.KeyboardButton(text="Разбан (список)")) - builder.add(types.KeyboardButton(text="Вернуться в бота")) - markup = builder.as_markup(resize_keyboard=True, one_time_keyboard=True) - return markup - - -def create_keyboard_with_pagination(page: int, total_items: int, array_items: list[tuple[any, any]], callback: str): - """ - Создает клавиатуру с пагинацией для заданного набора элементов и устанавливает необходимый callback - - Args: - page: Номер текущей страницы. - total_items: Общее количество элементов. - array_items: Лист кортежей. Содержит в себе user_name: user_id - callback: Действие в коллбеке. Вернет callback вида ({callback}_{user_id}) - - Returns: - InlineKeyboardMarkup: Клавиатура с кнопками пагинации. - """ - - # Определяем общее количество страниц - total_pages = (total_items + 9 - 1) // 9 - - # Создаем билдер для клавиатуры - keyboard = InlineKeyboardBuilder() - # Вычисляем стартовый номер для текущей страницы - start_index = (page - 1) * 9 - - # Кнопки с номерами страниц - for i in range(start_index, min(start_index + 9, len(array_items))): - keyboard.add(types.InlineKeyboardButton( - text=f"{array_items[i][0]}", callback_data=f"{callback}_{array_items[i][1]}" - )) - keyboard.adjust(3) - - next_button = types.InlineKeyboardButton( - text="➡️ Следующая", callback_data=f"page_{page + 1}" - ) - prev_button = types.InlineKeyboardButton( - text="⬅️ Предыдущая", callback_data=f"page_{page - 1}" - ) - keyboard.row(prev_button, next_button) - home_button = types.InlineKeyboardButton( - text="🏠 Назад", callback_data="return") - keyboard.row(home_button) - k = keyboard.as_markup() - return k - - -def create_keyboard_for_ban_reason(): - builder = ReplyKeyboardBuilder() - builder.add(types.KeyboardButton(text="Спам")) - builder.add(types.KeyboardButton(text="Заебал стикерами")) - markup = builder.as_markup(resize_keyboard=True, one_time_keyboard=True) - return markup - - -def create_keyboard_for_ban_days(): - builder = ReplyKeyboardBuilder() - builder.add(types.KeyboardButton(text="1")) - builder.add(types.KeyboardButton(text="7")) - builder.add(types.KeyboardButton(text="30")) - builder.add(types.KeyboardButton(text="Навсегда")) - markup = builder.as_markup(resize_keyboard=True, one_time_keyboard=True) - return markup - - -def create_keyboard_for_approve_ban(): - builder = ReplyKeyboardBuilder() - builder.add(types.KeyboardButton(text="Подтвердить")) - builder.add(types.KeyboardButton(text="Отменить")) - markup = builder.as_markup(resize_keyboard=True, one_time_keyboard=True) - return markup +from aiogram import types +from aiogram.utils.keyboard import ReplyKeyboardBuilder, InlineKeyboardBuilder + + +def get_reply_keyboard_for_post(): + builder = InlineKeyboardBuilder() + builder.row(types.InlineKeyboardButton( + text="Опубликовать", callback_data="publish") + ) + builder.row(types.InlineKeyboardButton( + text="Отклонить", callback_data="decline") + ) + markup = builder.as_markup(resize_keyboard=True, one_time_keyboard=True) + return markup + + +def get_reply_keyboard(BotDB, user_id): + builder = ReplyKeyboardBuilder() + builder.add(types.KeyboardButton(text="📢Предложить свой пост")) + builder.add(types.KeyboardButton(text="📩Связаться с админами")) + builder.add(types.KeyboardButton(text="👋🏼Сказать пока!")) + if not BotDB.get_info_about_stickers(user_id=user_id): + builder.add(types.KeyboardButton(text="🤪Хочу стикеры")) + markup = builder.as_markup(resize_keyboard=True, one_time_keyboard=True) + return markup + + +def get_reply_keyboard_leave_chat(): + builder = ReplyKeyboardBuilder() + builder.add(types.KeyboardButton(text="Выйти из чата")) + markup = builder.as_markup(resize_keyboard=True, one_time_keyboard=True) + return markup + + +def get_reply_keyboard_admin(): + builder = ReplyKeyboardBuilder() + builder.add(types.KeyboardButton(text="Бан (Список)")) + builder.add(types.KeyboardButton(text="Разбан (список)")) + builder.add(types.KeyboardButton(text="Вернуться в бота")) + markup = builder.as_markup(resize_keyboard=True, one_time_keyboard=True) + return markup + + +def create_keyboard_with_pagination(page: int, total_items: int, array_items: list[tuple[any, any]], callback: str): + """ + Создает клавиатуру с пагинацией для заданного набора элементов и устанавливает необходимый callback + + Args: + page: Номер текущей страницы. + total_items: Общее количество элементов. + array_items: Лист кортежей. Содержит в себе user_name: user_id + callback: Действие в коллбеке. Вернет callback вида ({callback}_{user_id}) + + Returns: + InlineKeyboardMarkup: Клавиатура с кнопками пагинации. + """ + + # Определяем общее количество страниц + total_pages = (total_items + 9 - 1) // 9 + + # Создаем билдер для клавиатуры + keyboard = InlineKeyboardBuilder() + # Вычисляем стартовый номер для текущей страницы + start_index = (page - 1) * 9 + + # Кнопки с номерами страниц + for i in range(start_index, min(start_index + 9, len(array_items))): + keyboard.add(types.InlineKeyboardButton( + text=f"{array_items[i][0]}", callback_data=f"{callback}_{array_items[i][1]}" + )) + keyboard.adjust(3) + + next_button = types.InlineKeyboardButton( + text="➡️ Следующая", callback_data=f"page_{page + 1}" + ) + prev_button = types.InlineKeyboardButton( + text="⬅️ Предыдущая", callback_data=f"page_{page - 1}" + ) + keyboard.row(prev_button, next_button) + home_button = types.InlineKeyboardButton( + text="🏠 Назад", callback_data="return") + keyboard.row(home_button) + k = keyboard.as_markup() + return k + + +def create_keyboard_for_ban_reason(): + builder = ReplyKeyboardBuilder() + builder.add(types.KeyboardButton(text="Спам")) + builder.add(types.KeyboardButton(text="Заебал стикерами")) + markup = builder.as_markup(resize_keyboard=True, one_time_keyboard=True) + return markup + + +def create_keyboard_for_ban_days(): + builder = ReplyKeyboardBuilder() + builder.add(types.KeyboardButton(text="1")) + builder.add(types.KeyboardButton(text="7")) + builder.add(types.KeyboardButton(text="30")) + builder.add(types.KeyboardButton(text="Навсегда")) + markup = builder.as_markup(resize_keyboard=True, one_time_keyboard=True) + return markup + + +def create_keyboard_for_approve_ban(): + builder = ReplyKeyboardBuilder() + builder.add(types.KeyboardButton(text="Подтвердить")) + builder.add(types.KeyboardButton(text="Отменить")) + markup = builder.as_markup(resize_keyboard=True, one_time_keyboard=True) + return markup diff --git a/helper_bot/utils/helper_func.py b/helper_bot/utils/helper_func.py index e47146f..db5c44a 100644 --- a/helper_bot/utils/helper_func.py +++ b/helper_bot/utils/helper_func.py @@ -26,9 +26,7 @@ def get_text_message(post_text: str, first_name: str, username: str): username: Юзернейм автора поста Returns: - Кортеж из двух элементов: - - Сформированный текст сообщения. - - Флаг, указывающий, является ли пост анонимным (True - анонимный, False - не анонимный) + str: - Сформированный текст сообщения. """ if "неанон" in post_text or "не анон" in post_text: return f'Пост из ТГ:\n{post_text}\n\nАвтор поста: {first_name} @{username}' @@ -54,6 +52,9 @@ async def download_file(message: types.Message, file_id: str): os.makedirs("files", exist_ok=True) os.makedirs("files/photos", exist_ok=True) os.makedirs("files/videos", exist_ok=True) + os.makedirs("files/music", exist_ok=True) + os.makedirs("files/voice", exist_ok=True) + os.makedirs("files/video_notes", exist_ok=True) file = await message.bot.get_file(file_id) file_path = os.path.join("files", file.file_path) await message.bot.download_file(file_path=file.file_path, destination=file_path) @@ -109,7 +110,7 @@ async def prepare_media_group_from_middlewares(album, post_caption: str = ''): return media_group # Возвращаем MediaGroup -async def add_in_db_media(sent_message): +async def add_in_db_media_mediagroup(sent_message): """ Идентификатор медиа-группы @@ -134,26 +135,34 @@ async def add_in_db_media(sent_message): continue -async def add_in_db_media_old(sent_message): +async def add_in_db_media(sent_message): """ - Идентификатор медиа-группы - Args: sent_message: sent_message объект из Telegram API Returns: - Список InputMediaPhoto. + Список InputFile (FSInputFile). """ - 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_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: - BotDB.add_post_content_in_db(media_group_message_id, message.message_id, file_path) - else: - BotDB.add_post_content_in_db(media_group_message_id, message.message_id, file_path) + if sent_message.photo: + file_id = sent_message.photo[-1].file_id + file_path = await download_file(sent_message, file_id=file_id) + BotDB.add_post_content_in_db(sent_message.message_id, sent_message.message_id, file_path, 'photo') + elif sent_message.video: + file_id = sent_message.video.file_id + file_path = await download_file(sent_message, file_id=file_id) + BotDB.add_post_content_in_db(sent_message.message_id, sent_message.message_id, file_path, 'video') + elif sent_message.voice: + file_id = sent_message.voice.file_id + file_path = await download_file(sent_message, file_id=file_id) + BotDB.add_post_content_in_db(sent_message.message_id, sent_message.message_id, file_path, 'voice') + elif sent_message.audio: + file_id = sent_message.audio.file_id + file_path = await download_file(sent_message, file_id=file_id) + BotDB.add_post_content_in_db(sent_message.message_id, sent_message.message_id, file_path, 'audio') + elif sent_message.video_note: + file_id = sent_message.video_note.file_id + file_path = await download_file(sent_message, file_id=file_id) + BotDB.add_post_content_in_db(sent_message.message_id, sent_message.message_id, file_path, 'video_note') async def send_media_group_message_to_private_chat(chat_id: int, message: types.Message, @@ -163,7 +172,7 @@ async def send_media_group_message_to_private_chat(chat_id: int, message: types. media=media_group, ) BotDB.add_post_in_db(sent_message[-1].message_id, sent_message[-1].caption, message.from_user.id) - await add_in_db_media(sent_message) + await add_in_db_media_mediagroup(sent_message) message_id = sent_message[-1].message_id return message_id @@ -219,82 +228,87 @@ async def send_text_message(chat_id, message: types.Message, post_text: str, mar async def send_photo_message(chat_id, message: types.Message, photo: str, post_text: str, markup: types.ReplyKeyboardMarkup = None): if markup is None: - await message.bot.send_photo( + sent_message = await message.bot.send_photo( chat_id=chat_id, caption=post_text, photo=photo ) else: - await message.bot.send_photo( + sent_message = await message.bot.send_photo( chat_id=chat_id, caption=post_text, photo=photo, reply_markup=markup ) + return sent_message 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( + sent_message = await message.bot.send_video( chat_id=chat_id, caption=post_text, video=video ) else: - await message.bot.send_video( + sent_message = await message.bot.send_video( chat_id=chat_id, caption=post_text, video=video, reply_markup=markup ) + return sent_message 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( + sent_message = await message.bot.send_video_note( chat_id=chat_id, video_note=video_note ) else: - await message.bot.send_video_note( + sent_message = await message.bot.send_video_note( chat_id=chat_id, video_note=video_note, reply_markup=markup ) + return sent_message 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( + sent_message = await message.bot.send_audio( chat_id=chat_id, caption=post_text, audio=audio ) else: - await message.bot.send_audio( + sent_message = await message.bot.send_audio( chat_id=chat_id, caption=post_text, audio=audio, reply_markup=markup ) + return sent_message 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( + sent_message = await message.bot.send_voice( chat_id=chat_id, voice=voice ) else: - await message.bot.send_voice( + sent_message = await message.bot.send_voice( chat_id=chat_id, voice=voice, reply_markup=markup ) + return sent_message def check_access(user_id: int): diff --git a/tests/test_db.py b/tests/test_db.py index ff0eba5..56489a8 100644 --- a/tests/test_db.py +++ b/tests/test_db.py @@ -1,13 +1,17 @@ -from datetime import datetime import os import sqlite3 +from datetime import datetime + import pytest + from database.db import BotDB + @pytest.fixture def bot(): """Фикстура для создания объекта BotDB.""" - return BotDB("test.db") + current_dir = os.getcwd() + return BotDB(current_dir, "test.db") @pytest.fixture(autouse=True, ) @@ -104,12 +108,12 @@ def setup_db(): ); """) - #blacklist mock data + # blacklist mock data cursor.execute("INSERT INTO blacklist (user_id, user_name, message_for_user, date_to_unban) VALUES (?, ?, ?, ?)", (user_id, username, message_for_user, next_date)) cursor.execute("INSERT INTO blacklist (user_id, user_name, message_for_user, date_to_unban) VALUES (?, ?, ?, ?)", (user_id_2, username_2, message_for_user_2, date)) - #our_users mock data + # our_users mock data cursor.execute( "INSERT INTO our_users (user_id, first_name, full_name, username, date_added, date_changed, has_stickers)" " VALUES (?, ?, ?, ?, ?, ?, ?)", (user_id, first_name, full_name, username, date, date, has_stickers) @@ -118,7 +122,7 @@ def setup_db(): "INSERT INTO our_users (user_id, first_name, full_name, username, date_added, date_changed, has_stickers)" " VALUES (?, ?, ?, ?, ?, ?, ?)", (user_id_2, first_name_2, full_name_2, username_2, date, date, has_stickers_2) ) - #messages mock data + # messages mock data cursor.execute( "INSERT INTO user_messages (message_text, user_id, message_id, date) " "VALUES (?, ?, ?, ?)", @@ -127,7 +131,7 @@ def setup_db(): "INSERT INTO user_messages (message_text, user_id, message_id, date) " "VALUES (?, ?, ?, ?)", (message_text_2, user_id_2, message_id_2, date)) - #mock admins + # mock admins cursor.execute( "INSERT INTO admins (user_id, role) " "VALUES (?, ?)", From 5050767b60e20289da0a9074156695fa84e6cafd Mon Sep 17 00:00:00 2001 From: Andrey Date: Sun, 21 Jul 2024 21:22:45 +0300 Subject: [PATCH 8/8] add new func for ban --- database/db.py | 62 ++++++++++++++++ helper_bot/handlers/admin/admin_handlers.py | 74 +++++++++++++++---- .../handlers/private/private_handlers.py | 16 ++++ helper_bot/keyboards/keyboards.py | 7 +- helper_bot/utils/state.py | 1 + 5 files changed, 143 insertions(+), 17 deletions(-) diff --git a/database/db.py b/database/db.py index 5924137..8378e75 100644 --- a/database/db.py +++ b/database/db.py @@ -239,6 +239,68 @@ class BotDB: finally: self.close() + def get_user_id_by_username(self, username: str): + """ + Возвращает user_id пользователя из базы данных по его user_name в Telegram. + + Args: + username (str): Username пользователя. + + Returns: + user_id (int): Идентификатор пользователя в Telegram. + None: Если пользователь не найден. + + Raises: + sqlite3.Error: Если произошла ошибка при выполнении запроса. + """ + try: + self.connect() + self.cursor.execute("SELECT user_id FROM our_users WHERE username = ?", (username,)) + result = self.cursor.fetchone() + if result: + user_id = result[0] + self.logger.info(f"User_id пользователя найден: username={username}, user_id={user_id}") + return user_id + else: + self.logger.info(f"Пользователь с username={username} не найден в базе данных.") + return None + except sqlite3.Error as error: + self.logger.error(f"Ошибка при получении username из базы данных: {error}") + raise + finally: + self.close() + + def get_full_name_by_id(self, user_id: str): + """ + Возвращает full_name пользователя из базы данных по его username в Telegram. + + Args: + user_id (int): Идентификатор пользователя в Telegram. + + Returns: + full_name (str): Username пользователя. + None: Если пользователь не найден. + + Raises: + sqlite3.Error: Если произошла ошибка при выполнении запроса. + """ + try: + self.connect() + self.cursor.execute("SELECT full_name FROM our_users WHERE user_id = ?", (user_id,)) + result = self.cursor.fetchone() + if result: + full_name = result[0] + self.logger.info(f"Username пользователя найден: user_id={user_id}, full_name={full_name}") + return full_name + else: + self.logger.info(f"Пользователь с user_id={user_id} не найден в базе данных.") + return None + except sqlite3.Error as error: + self.logger.error(f"Ошибка при получении username из базы данных: {error}") + raise + finally: + self.close() + def get_all_user_id(self): """ Возвращает список всех user_id из базы данных. diff --git a/helper_bot/handlers/admin/admin_handlers.py b/helper_bot/handlers/admin/admin_handlers.py index e83e545..3f64ed7 100644 --- a/helper_bot/handlers/admin/admin_handlers.py +++ b/helper_bot/handlers/admin/admin_handlers.py @@ -6,7 +6,7 @@ from aiogram.fsm.context import FSMContext from helper_bot.filters.main import ChatTypeFilter from helper_bot.keyboards.keyboards import get_reply_keyboard_admin, create_keyboard_with_pagination, \ - create_keyboard_for_ban_days, create_keyboard_for_approve_ban + create_keyboard_for_ban_days, create_keyboard_for_approve_ban, create_keyboard_for_ban_reason from helper_bot.utils.base_dependency_factory import BaseDependencyFactory from helper_bot.utils.helper_func import check_access, add_days_to_date, get_banned_users_buttons, get_banned_users_list from logs.custom_logger import logger @@ -60,6 +60,48 @@ async def get_last_users(message: types.Message): reply_markup=keyboard) +@admin_router.message( + ChatTypeFilter(chat_type=["private"]), + StateFilter("ADMIN"), + F.text == 'Бан по нику' +) +async def ban_by_nickname(message: types.Message, state: FSMContext): + await message.answer('Пришли мне username блокируемого пользователя') + await state.set_state('PRE_BAN') + + +@admin_router.message( + ChatTypeFilter(chat_type=["private"]), + F.text == 'Отменить' +) +async def decline_ban(message: types.Message, state: FSMContext): + await state.set_data({}) + await state.set_state("ADMIN") + logger.info(f"Отмена процедуры блокировки") + markup = get_reply_keyboard_admin() + await message.answer('Вернулись в меню', reply_markup=markup) + + +@admin_router.message( + ChatTypeFilter(chat_type=["private"]), + StateFilter("PRE_BAN") +) +async def ban_by_nickname_step_2(message: types.Message, state: FSMContext): + logger.info( + f"Функция ban_by_nickname_2. Получен никнейм пользователя: {message.text}") + user_name = message.text + user_id = BotDB.get_user_id_by_username(user_name) + await state.update_data(user_id=user_id, user_name=user_name, message_for_user=None, + date_to_unban=None) + full_name = BotDB.get_full_name_by_id(user_id) + markup = create_keyboard_for_ban_reason() + await message.answer( + text=f"Выбран пользователь:\nid: {user_id}\nusername: {user_name}\n" + f"Имя:{full_name}\nВыбери причину бана из списка или напиши ее в чат", + reply_markup=markup) + await state.set_state('BAN_2') + + @admin_router.message( ChatTypeFilter(chat_type=["private"]), StateFilter("ADMIN"), @@ -114,24 +156,24 @@ async def ban_user_step_3(message: types.Message, state: FSMContext): @admin_router.message( ChatTypeFilter(chat_type=["private"]), - StateFilter("BAN_FINAL") + StateFilter("BAN_FINAL"), + F.text == 'Подтвердить' ) async def approve_ban(message: types.Message, state: FSMContext): user_data = await state.get_data() logger.info(f"Переход на финальный шаг бана пользователя. Словарь с данными для бана: {user_data})") - if message.text == 'Подтвердить': - exists = BotDB.check_user_in_blacklist(user_data['user_id']) - if exists: - await message.reply(f"Пользователь уже был заблокирован ранее.") - logger.info(f"Пользователь: {user_data['user_id']} был заблокирован ранее)") - await state.set_state('ADMIN') - else: - BotDB.set_user_blacklist(user_data['user_id'], - user_data['user_name'], - user_data['message_for_user'], - user_data['date_to_unban']) - await message.reply(f"Пользователь {user_data['user_name']} успешно заблокирован.") - logger.info(f"Пользователь: {user_data['user_id']} успешно заблокирован)") - await state.set_state('ADMIN') + exists = BotDB.check_user_in_blacklist(user_data['user_id']) + if exists: + await message.reply(f"Пользователь уже был заблокирован ранее.") + logger.info(f"Пользователь: {user_data['user_id']} был заблокирован ранее)") + await state.set_state('ADMIN') + else: + BotDB.set_user_blacklist(user_data['user_id'], + user_data['user_name'], + user_data['message_for_user'], + user_data['date_to_unban']) + await message.reply(f"Пользователь {user_data['user_name']} успешно заблокирован.") + logger.info(f"Пользователь: {user_data['user_id']} успешно заблокирован)") + await state.set_state('ADMIN') markup = get_reply_keyboard_admin() await message.answer('Вернулись в меню', reply_markup=markup) diff --git a/helper_bot/handlers/private/private_handlers.py b/helper_bot/handlers/private/private_handlers.py index fd70cad..43bc111 100644 --- a/helper_bot/handlers/private/private_handlers.py +++ b/helper_bot/handlers/private/private_handlers.py @@ -104,6 +104,10 @@ async def handle_start_message(message: types.Message, state: FSMContext): ) async def suggest_post(message: types.Message, state: FSMContext): try: + user_id = message.from_user.id + current_date = datetime.now() + date = current_date.strftime("%Y-%m-%d %H:%M:%S") + BotDB.update_date_for_user(date, user_id) await message.forward(chat_id=GROUP_FOR_LOGS) await state.set_state("SUGGEST") current_state = await state.get_state() @@ -130,6 +134,10 @@ async def suggest_post(message: types.Message, state: FSMContext): ) async def end_message(message: types.Message, state: FSMContext): try: + user_id = message.from_user.id + current_date = datetime.now() + date = current_date.strftime("%Y-%m-%d %H:%M:%S") + BotDB.update_date_for_user(date, user_id) await message.forward(chat_id=GROUP_FOR_LOGS) logger.info( f"Вызов функции end_message. Пользователь: {message.from_user.id} Имя автора сообщения: {message.from_user.full_name}") @@ -355,6 +363,10 @@ async def stickers(message: types.Message, state: FSMContext): async def connect_with_admin(message: types.Message, state: FSMContext): logger.info( f"Вызов функции connect_with_admin. Пользователь: {message.from_user.id} Имя автора сообщения: {message.from_user.full_name}") + user_id = message.from_user.id + current_date = datetime.now() + date = current_date.strftime("%Y-%m-%d %H:%M:%S") + BotDB.update_date_for_user(date, user_id) admin_message = messages.get_message(get_first_name(message), 'CONNECT_WITH_ADMIN') await message.answer(admin_message, parse_mode="html") await message.forward(chat_id=GROUP_FOR_LOGS) @@ -370,6 +382,10 @@ async def connect_with_admin(message: types.Message, state: FSMContext): ChatTypeFilter(chat_type=["private"]), ) async def resend_message_in_group_for_message(message: types.Message, state: FSMContext): + user_id = message.from_user.id + current_date = datetime.now() + date = current_date.strftime("%Y-%m-%d %H:%M:%S") + BotDB.update_date_for_user(date, user_id) logger.info( f"Попытка пересылки сообщения в связь с админами. Сообщение: {message.text} Имя автора сообщения: {message.from_user.full_name} Идентификатор сообщения: {message.message_id})") await message.forward(chat_id=GROUP_FOR_MESSAGE) diff --git a/helper_bot/keyboards/keyboards.py b/helper_bot/keyboards/keyboards.py index d2318eb..42a19a2 100644 --- a/helper_bot/keyboards/keyboards.py +++ b/helper_bot/keyboards/keyboards.py @@ -35,6 +35,7 @@ def get_reply_keyboard_leave_chat(): def get_reply_keyboard_admin(): builder = ReplyKeyboardBuilder() builder.add(types.KeyboardButton(text="Бан (Список)")) + builder.add(types.KeyboardButton(text="Бан по нику")) builder.add(types.KeyboardButton(text="Разбан (список)")) builder.add(types.KeyboardButton(text="Вернуться в бота")) markup = builder.as_markup(resize_keyboard=True, one_time_keyboard=True) @@ -88,6 +89,9 @@ def create_keyboard_for_ban_reason(): builder = ReplyKeyboardBuilder() builder.add(types.KeyboardButton(text="Спам")) builder.add(types.KeyboardButton(text="Заебал стикерами")) + builder.row(types.KeyboardButton(text="Реклама здесь: @kerrad1 ")) + builder.row(types.KeyboardButton(text="Тема с лагерями: https://vk.com/topic-75343895_50049913")) + builder.row(types.KeyboardButton(text="Отменить")) markup = builder.as_markup(resize_keyboard=True, one_time_keyboard=True) return markup @@ -97,7 +101,8 @@ def create_keyboard_for_ban_days(): builder.add(types.KeyboardButton(text="1")) builder.add(types.KeyboardButton(text="7")) builder.add(types.KeyboardButton(text="30")) - builder.add(types.KeyboardButton(text="Навсегда")) + builder.row(types.KeyboardButton(text="Навсегда")) + builder.row(types.KeyboardButton(text="Отменить")) markup = builder.as_markup(resize_keyboard=True, one_time_keyboard=True) return markup diff --git a/helper_bot/utils/state.py b/helper_bot/utils/state.py index 6d4e320..92f1fda 100644 --- a/helper_bot/utils/state.py +++ b/helper_bot/utils/state.py @@ -7,6 +7,7 @@ class StateUser(StatesGroup): ADMIN = State() CHAT = State() PRE_CHAT = State() + PRE_BAN = State() BAN_2 = State() BAN_3 = State() BAN_4 = State()