From 88889fe87c5d5cdb865c9a2fecc402f5f4892404 Mon Sep 17 00:00:00 2001 From: KatykhinAA Date: Tue, 16 Jul 2024 22:25:32 +0300 Subject: [PATCH] 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?