From 3a30edc1ab4e50a9d215a626b997424b11aaea4c Mon Sep 17 00:00:00 2001 From: Andrey Date: Tue, 16 Jul 2024 21:55:22 +0300 Subject: [PATCH] HOT_FIX_3 add blacklist fix db init --- database/db.py | 2 +- helper_bot/handlers/admin/admin_handlers.py | 3 +- .../handlers/callback/callback_handlers.py | 13 +++--- helper_bot/handlers/group/group_handlers.py | 5 +-- .../handlers/private/private_handlers.py | 9 ++-- helper_bot/middlewares/album_middleware.py | 43 ++++++++++++------ .../middlewares/blacklist_middleware.py | 21 +++++++++ helper_bot/middlewares/text_middleware.py | 45 +++++++------------ helper_bot/utils/base_dependency_factory.py | 8 ++++ helper_bot/utils/helper_func.py | 6 ++- migrations/000_migrations_init.py | 5 ++- migrations/001_create_new_tables.py | 5 ++- 12 files changed, 96 insertions(+), 69 deletions(-) create mode 100644 helper_bot/middlewares/blacklist_middleware.py diff --git a/database/db.py b/database/db.py index db2f4a6..d38600a 100644 --- a/database/db.py +++ b/database/db.py @@ -13,7 +13,7 @@ class BotDB: self.conn = None self.cursor = None self.logger = logger - self.logger.info(f'Подключен к базе данных: {self.db_file}') + self.logger.info(f'Инициация базы данных: {self.db_file}') def connect(self): """Создание соединения и курсора.""" diff --git a/helper_bot/handlers/admin/admin_handlers.py b/helper_bot/handlers/admin/admin_handlers.py index dcaabd1..accdd7d 100644 --- a/helper_bot/handlers/admin/admin_handlers.py +++ b/helper_bot/handlers/admin/admin_handlers.py @@ -11,7 +11,6 @@ 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 -from database.db import BotDB admin_router = Router() @@ -26,7 +25,7 @@ PREVIEW_LINK = bdf.settings['Telegram']['preview_link'] LOGS = bdf.settings['Settings']['logs'] TEST = bdf.settings['Settings']['test'] -BotDB = BotDB('database/tg-bot-database') +BotDB = bdf.get_db() @admin_router.message( diff --git a/helper_bot/handlers/callback/callback_handlers.py b/helper_bot/handlers/callback/callback_handlers.py index cf584ec..068cb79 100644 --- a/helper_bot/handlers/callback/callback_handlers.py +++ b/helper_bot/handlers/callback/callback_handlers.py @@ -1,10 +1,9 @@ import traceback -from aiogram import Router, F, types +from aiogram import Router, F from aiogram.fsm.context import FSMContext from aiogram.types import CallbackQuery -from database.db import BotDB 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 @@ -24,7 +23,7 @@ PREVIEW_LINK = bdf.settings['Telegram']['preview_link'] LOGS = bdf.settings['Settings']['logs'] TEST = bdf.settings['Settings']['test'] -BotDB = BotDB('database/tg-bot-database') +BotDB = bdf.get_db() @callback_router.callback_query( @@ -46,7 +45,6 @@ async def post_for_group(call: CallbackQuery, state: FSMContext): await call.answer(text='Что-то пошло не так!', show_alert=True, cache_time=3) elif call.data == 'publish' and call.message.content_type == 'photo': try: - print(f'CALLMESSAGE - {call.message.text}') 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}.') @@ -60,7 +58,6 @@ async def post_for_group(call: CallbackQuery, state: FSMContext): 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.copy_messages(chat_id=MAIN_PUBLIC, from_chat_id=GROUP_FOR_POST, message_ids=[media_group_message_id, media_group_message_id-1]) 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']) @@ -73,7 +70,7 @@ 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 != "^": + 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}).') @@ -102,7 +99,7 @@ async def process_ban_user(call: CallbackQuery, state: FSMContext): date_to_unban=None) markup = create_keyboard_for_ban_reason() await call.message.answer( - text=f"Выбран пользователь:\nid: {user_id}\nusername:{user_name}. Выбери причину бана из списка или напиши ее в чат", + 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: @@ -118,7 +115,7 @@ 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}\nusername:{user_name}") + logger.info(f"Разблокирован пользователь с ID: {user_id} username:{user_name}") username = BotDB.get_username(user_id) await call.answer(f'Пользователь разблокирован {username}', show_alert=True) diff --git a/helper_bot/handlers/group/group_handlers.py b/helper_bot/handlers/group/group_handlers.py index b19c33b..e70a4fe 100644 --- a/helper_bot/handlers/group/group_handlers.py +++ b/helper_bot/handlers/group/group_handlers.py @@ -1,12 +1,11 @@ from aiogram import Router, types from aiogram.fsm.context import FSMContext -from database.db import BotDB from helper_bot.filters.main import ChatTypeFilter from helper_bot.keyboards.main 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() @@ -21,7 +20,7 @@ PREVIEW_LINK = bdf.settings['Telegram']['preview_link'] LOGS = bdf.settings['Settings']['logs'] TEST = bdf.settings['Settings']['test'] -BotDB = BotDB('database/tg-bot-database') +BotDB = bdf.get_db() @group_router.message( diff --git a/helper_bot/handlers/private/private_handlers.py b/helper_bot/handlers/private/private_handlers.py index 34da14e..a6c41ed 100644 --- a/helper_bot/handlers/private/private_handlers.py +++ b/helper_bot/handlers/private/private_handlers.py @@ -12,19 +12,18 @@ 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.text_middleware import AlbumMiddleware +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 -from database.db import BotDB - private_router = Router() private_router.message.middleware(AlbumMiddleware()) - +private_router.message.middleware(BlacklistMiddleware()) bdf = BaseDependencyFactory() GROUP_FOR_POST = bdf.settings['Telegram']['group_for_posts'] @@ -36,7 +35,7 @@ PREVIEW_LINK = bdf.settings['Telegram']['preview_link'] LOGS = bdf.settings['Settings']['logs'] TEST = bdf.settings['Settings']['test'] -BotDB = BotDB('database/tg-bot-database') +BotDB = bdf.get_db() @private_router.message( diff --git a/helper_bot/middlewares/album_middleware.py b/helper_bot/middlewares/album_middleware.py index b2bc72a..627d2bd 100644 --- a/helper_bot/middlewares/album_middleware.py +++ b/helper_bot/middlewares/album_middleware.py @@ -1,16 +1,31 @@ import asyncio -from collections import defaultdict from typing import Any, Dict, Union from aiogram import BaseMiddleware from aiogram.types import Message -class BulkTextMiddleware(BaseMiddleware): +class AlbumMiddleware(BaseMiddleware): def __init__(self, latency: Union[int, float] = 0.1): # Initialize latency and album_data dictionary self.latency = latency - self.texts = defaultdict(list) + self.album_data = {} + + # + def collect_album_messages(self, event: Message): + """ + Collect messages of the same media group. + """ + # # Check if media_group_id exists in album_data + if event.media_group_id not in self.album_data: + # # Create a new entry for the media group + self.album_data[event.media_group_id] = {"messages": []} + # + # # Append the new message to the media group + self.album_data[event.media_group_id]["messages"].append(event) + # + # # Return the total number of messages in the current media group + return len(self.album_data[event.media_group_id]["messages"]) # async def __call__(self, handler, event: Message, data: Dict[str, Any]) -> Any: @@ -18,29 +33,29 @@ class BulkTextMiddleware(BaseMiddleware): Main middleware logic. """ # # If the event has no media_group_id, pass it to the handler immediately - key = (event.chat.id, event.from_user.id) - if not event.text: + if not event.media_group_id: return await handler(event, data) - - self.texts[key].append(event) - total_before = len(self.texts[key]) + # + # # Collect messages of the same media group + total_before = self.collect_album_messages(event) + # # # Wait for a specified latency period await asyncio.sleep(self.latency) # # # Check the total number of messages after the latency - total_after = len(self.texts[key]) + total_after = len(self.album_data[event.media_group_id]["messages"]) # # # If new messages were added during the latency, exit if total_before != total_after: return # # # Sort the album messages by message_id and add to data - msg_texts = self.texts[key] - msg_texts.sort(key=lambda x: x.message_id) - data["texts"] = ''.join([msg.text for msg in msg_texts]) + album_messages = self.album_data[event.media_group_id]["messages"] + album_messages.sort(key=lambda x: x.message_id) + data["album"] = album_messages # - # Remove the media group from tracking to free up memory - del self.texts[key] + # # Remove the media group from tracking to free up memory + del self.album_data[event.media_group_id] # # Call the original event handler return await handler(event, data) # diff --git a/helper_bot/middlewares/blacklist_middleware.py b/helper_bot/middlewares/blacklist_middleware.py new file mode 100644 index 0000000..4f7eeb2 --- /dev/null +++ b/helper_bot/middlewares/blacklist_middleware.py @@ -0,0 +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) diff --git a/helper_bot/middlewares/text_middleware.py b/helper_bot/middlewares/text_middleware.py index 627d2bd..e41da8d 100644 --- a/helper_bot/middlewares/text_middleware.py +++ b/helper_bot/middlewares/text_middleware.py @@ -1,61 +1,46 @@ import asyncio +from collections import defaultdict from typing import Any, Dict, Union from aiogram import BaseMiddleware from aiogram.types import Message -class AlbumMiddleware(BaseMiddleware): +class BulkTextMiddleware(BaseMiddleware): def __init__(self, latency: Union[int, float] = 0.1): # Initialize latency and album_data dictionary self.latency = latency - self.album_data = {} + self.texts = defaultdict(list) - # - def collect_album_messages(self, event: Message): - """ - Collect messages of the same media group. - """ - # # Check if media_group_id exists in album_data - if event.media_group_id not in self.album_data: - # # Create a new entry for the media group - self.album_data[event.media_group_id] = {"messages": []} - # - # # Append the new message to the media group - self.album_data[event.media_group_id]["messages"].append(event) - # - # # Return the total number of messages in the current media group - return len(self.album_data[event.media_group_id]["messages"]) - # async def __call__(self, handler, event: Message, data: Dict[str, Any]) -> Any: """ Main middleware logic. """ # # If the event has no media_group_id, pass it to the handler immediately - if not event.media_group_id: + key = (event.chat.id, event.from_user.id) + if not event.text: return await handler(event, data) - # - # # Collect messages of the same media group - total_before = self.collect_album_messages(event) - # + + self.texts[key].append(event) + total_before = len(self.texts[key]) # # Wait for a specified latency period await asyncio.sleep(self.latency) # # # Check the total number of messages after the latency - total_after = len(self.album_data[event.media_group_id]["messages"]) + total_after = len(self.texts[key]) # # # If new messages were added during the latency, exit if total_before != total_after: return # # # Sort the album messages by message_id and add to data - album_messages = self.album_data[event.media_group_id]["messages"] - album_messages.sort(key=lambda x: x.message_id) - data["album"] = album_messages + msg_texts = self.texts[key] + msg_texts.sort(key=lambda x: x.message_id) + data["texts"] = ''.join([msg.text for msg in msg_texts]) # - # # Remove the media group from tracking to free up memory - del self.album_data[event.media_group_id] + # Remove the media group from tracking to free up memory + del self.texts[key] # # Call the original event handler return await handler(event, data) -# + diff --git a/helper_bot/utils/base_dependency_factory.py b/helper_bot/utils/base_dependency_factory.py index 283d00d..392ac95 100644 --- a/helper_bot/utils/base_dependency_factory.py +++ b/helper_bot/utils/base_dependency_factory.py @@ -2,6 +2,8 @@ import configparser import os import sys +from database.db import BotDB + class BaseDependencyFactory: def __init__(self): @@ -10,6 +12,8 @@ class BaseDependencyFactory: self.config = configparser.ConfigParser() self.config.read(config_path) self.settings = {} + self.database = BotDB('database/tg-bot-database') + for section in self.config.sections(): self.settings[section] = {} for key in self.config[section]: @@ -23,3 +27,7 @@ class BaseDependencyFactory: def get_settings(self): return self.settings + + def get_db(self) -> BotDB: + """Возвращает подключение к базе данных.""" + return self.database diff --git a/helper_bot/utils/helper_func.py b/helper_bot/utils/helper_func.py index f0ec88c..7ba7d4c 100644 --- a/helper_bot/utils/helper_func.py +++ b/helper_bot/utils/helper_func.py @@ -3,9 +3,11 @@ from datetime import datetime, timedelta from aiogram import types from aiogram.types import InputMediaPhoto -from database.db import BotDB +from helper_bot.utils.base_dependency_factory import BaseDependencyFactory -BotDB = BotDB('database/tg-bot-database') +bdf = BaseDependencyFactory() + +BotDB = bdf.get_db() def get_first_name(message: types.Message) -> str: diff --git a/migrations/000_migrations_init.py b/migrations/000_migrations_init.py index a83e7ab..db2a995 100644 --- a/migrations/000_migrations_init.py +++ b/migrations/000_migrations_init.py @@ -1,5 +1,5 @@ import os -from database.db import BotDB +from helper_bot.utils.base_dependency_factory import BaseDependencyFactory # Получаем текущий рабочий каталог current_dir = os.path.dirname(os.path.abspath(__file__)) @@ -10,7 +10,8 @@ parent_dir = os.path.dirname(current_dir) # Строим путь до файла tg_bot_database_path = os.path.join(parent_dir, "tg-bot-database") -BotDB = BotDB(f'{tg_bot_database_path}') +bdf = BaseDependencyFactory() +BotDB = bdf.get_db() def get_filename(): diff --git a/migrations/001_create_new_tables.py b/migrations/001_create_new_tables.py index f1a1d4e..c367ba3 100644 --- a/migrations/001_create_new_tables.py +++ b/migrations/001_create_new_tables.py @@ -1,7 +1,8 @@ import os -from database.db import BotDB +from helper_bot.utils.base_dependency_factory import BaseDependencyFactory -BotDB = BotDB('tg-bot-database') +bdf = BaseDependencyFactory() +BotDB = bdf.get_db() def get_filename():