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():