HOT_FIX_3 add blacklist

fix db init
This commit is contained in:
Andrey
2024-07-16 21:55:22 +03:00
parent 09a071c014
commit 3a30edc1ab
12 changed files with 96 additions and 69 deletions

View File

@@ -13,7 +13,7 @@ class BotDB:
self.conn = None self.conn = None
self.cursor = None self.cursor = None
self.logger = logger self.logger = logger
self.logger.info(f'Подключен к базе данных: {self.db_file}') self.logger.info(f'Инициация базы данных: {self.db_file}')
def connect(self): def connect(self):
"""Создание соединения и курсора.""" """Создание соединения и курсора."""

View File

@@ -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 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 logs.custom_logger import logger
from database.db import BotDB
admin_router = Router() admin_router = Router()
@@ -26,7 +25,7 @@ PREVIEW_LINK = bdf.settings['Telegram']['preview_link']
LOGS = bdf.settings['Settings']['logs'] LOGS = bdf.settings['Settings']['logs']
TEST = bdf.settings['Settings']['test'] TEST = bdf.settings['Settings']['test']
BotDB = BotDB('database/tg-bot-database') BotDB = bdf.get_db()
@admin_router.message( @admin_router.message(

View File

@@ -1,10 +1,9 @@
import traceback import traceback
from aiogram import Router, F, types from aiogram import Router, F
from aiogram.fsm.context import FSMContext from aiogram.fsm.context import FSMContext
from aiogram.types import CallbackQuery from aiogram.types import CallbackQuery
from database.db import BotDB
from helper_bot.keyboards.main import create_keyboard_with_pagination, get_reply_keyboard_admin, \ from helper_bot.keyboards.main import create_keyboard_with_pagination, get_reply_keyboard_admin, \
create_keyboard_for_ban_reason create_keyboard_for_ban_reason
from helper_bot.utils.base_dependency_factory import BaseDependencyFactory 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'] LOGS = bdf.settings['Settings']['logs']
TEST = bdf.settings['Settings']['test'] TEST = bdf.settings['Settings']['test']
BotDB = BotDB('database/tg-bot-database') BotDB = bdf.get_db()
@callback_router.callback_query( @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) await call.answer(text='Что-то пошло не так!', show_alert=True, cache_time=3)
elif call.data == 'publish' and call.message.content_type == 'photo': elif call.data == 'publish' and call.message.content_type == 'photo':
try: 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 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) await call.bot.delete_message(chat_id=GROUP_FOR_POST, message_id=call.message.message_id)
logger.info(f'Пост с фото опубликован в канале {MAIN_PUBLIC}.') logger.info(f'Пост с фото опубликован в канале {MAIN_PUBLIC}.')
@@ -60,7 +58,6 @@ async def post_for_group(call: CallbackQuery, state: FSMContext):
user_data = await state.get_data() user_data = await state.get_data()
media_group_message_id = get_help_message_id(call.message.message_id, user_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_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) 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['media_group_message_id'])
print(user_data['help_message_id']) print(user_data['help_message_id'])
@@ -73,7 +70,7 @@ async def decline_post_for_group(call: CallbackQuery, state: FSMContext):
logger.info( logger.info(
f'Получен callback-запрос с данными: {call.data} от пользователя {call.from_user.full_name} (ID: {call.from_user.id})') f'Получен callback-запрос с данными: {call.data} от пользователя {call.from_user.full_name} (ID: {call.from_user.id})')
try: 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) await call.bot.delete_message(chat_id=GROUP_FOR_POST, message_id=call.message.message_id)
logger.info( logger.info(
f'Сообщение отклонено админом {call.from_user.full_name} (ID: {call.from_user.id}).') 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) date_to_unban=None)
markup = create_keyboard_for_ban_reason() markup = create_keyboard_for_ban_reason()
await call.message.answer( await call.message.answer(
text=f"Выбран пользователь:\nid: {user_id}\nusername:{user_name}. Выбери причину бана из списка или напиши ее в чат", text=f"<b>Выбран пользователь:\nid:</b> {user_id}\n<b>username:</b> {user_name}\nИмя:{call.message.from_user.full_name}\nВыбери причину бана из списка или напиши ее в чат",
reply_markup=markup) reply_markup=markup)
await state.set_state('BAN_2') await state.set_state('BAN_2')
else: else:
@@ -118,7 +115,7 @@ async def process_unlock_user(call: CallbackQuery):
user_id = call.data[7:] user_id = call.data[7:]
user_name = BotDB.get_username(user_id=user_id) user_name = BotDB.get_username(user_id=user_id)
delete_user_blacklist(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) username = BotDB.get_username(user_id)
await call.answer(f'Пользователь разблокирован {username}', show_alert=True) await call.answer(f'Пользователь разблокирован {username}', show_alert=True)

View File

@@ -1,12 +1,11 @@
from aiogram import Router, types from aiogram import Router, types
from aiogram.fsm.context import FSMContext from aiogram.fsm.context import FSMContext
from database.db import BotDB
from helper_bot.filters.main import ChatTypeFilter from helper_bot.filters.main import ChatTypeFilter
from helper_bot.keyboards.main import get_reply_keyboard_leave_chat from helper_bot.keyboards.main import get_reply_keyboard_leave_chat
from helper_bot.utils.base_dependency_factory import BaseDependencyFactory from helper_bot.utils.base_dependency_factory import BaseDependencyFactory
from helper_bot.utils.helper_func import send_text_message from helper_bot.utils.helper_func import send_text_message
from logs.custom_logger import logger
group_router = Router() group_router = Router()
@@ -21,7 +20,7 @@ PREVIEW_LINK = bdf.settings['Telegram']['preview_link']
LOGS = bdf.settings['Settings']['logs'] LOGS = bdf.settings['Settings']['logs']
TEST = bdf.settings['Settings']['test'] TEST = bdf.settings['Settings']['test']
BotDB = BotDB('database/tg-bot-database') BotDB = bdf.get_db()
@group_router.message( @group_router.message(

View File

@@ -12,19 +12,18 @@ from aiogram.types import FSInputFile
from helper_bot.filters.main import ChatTypeFilter from helper_bot.filters.main import ChatTypeFilter
from helper_bot.keyboards import get_reply_keyboard, get_reply_keyboard_for_post 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.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 import messages
from helper_bot.utils.base_dependency_factory import BaseDependencyFactory 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, \ 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 process_photo_album, send_media_group_message, check_username_and_full_name
from logs.custom_logger import logger from logs.custom_logger import logger
from database.db import BotDB
private_router = Router() private_router = Router()
private_router.message.middleware(AlbumMiddleware()) private_router.message.middleware(AlbumMiddleware())
private_router.message.middleware(BlacklistMiddleware())
bdf = BaseDependencyFactory() bdf = BaseDependencyFactory()
GROUP_FOR_POST = bdf.settings['Telegram']['group_for_posts'] 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'] LOGS = bdf.settings['Settings']['logs']
TEST = bdf.settings['Settings']['test'] TEST = bdf.settings['Settings']['test']
BotDB = BotDB('database/tg-bot-database') BotDB = bdf.get_db()
@private_router.message( @private_router.message(

View File

@@ -1,16 +1,31 @@
import asyncio import asyncio
from collections import defaultdict
from typing import Any, Dict, Union from typing import Any, Dict, Union
from aiogram import BaseMiddleware from aiogram import BaseMiddleware
from aiogram.types import Message from aiogram.types import Message
class BulkTextMiddleware(BaseMiddleware): class AlbumMiddleware(BaseMiddleware):
def __init__(self, latency: Union[int, float] = 0.1): def __init__(self, latency: Union[int, float] = 0.1):
# Initialize latency and album_data dictionary # Initialize latency and album_data dictionary
self.latency = latency 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: async def __call__(self, handler, event: Message, data: Dict[str, Any]) -> Any:
@@ -18,29 +33,29 @@ class BulkTextMiddleware(BaseMiddleware):
Main middleware logic. Main middleware logic.
""" """
# # If the event has no media_group_id, pass it to the handler immediately # # 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.media_group_id:
if not event.text:
return await handler(event, data) return await handler(event, data)
#
self.texts[key].append(event) # # Collect messages of the same media group
total_before = len(self.texts[key]) total_before = self.collect_album_messages(event)
#
# # Wait for a specified latency period # # Wait for a specified latency period
await asyncio.sleep(self.latency) await asyncio.sleep(self.latency)
# #
# # Check the total number of messages after the 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 new messages were added during the latency, exit
if total_before != total_after: if total_before != total_after:
return return
# #
# # Sort the album messages by message_id and add to data # # Sort the album messages by message_id and add to data
msg_texts = self.texts[key] album_messages = self.album_data[event.media_group_id]["messages"]
msg_texts.sort(key=lambda x: x.message_id) album_messages.sort(key=lambda x: x.message_id)
data["texts"] = ''.join([msg.text for msg in msg_texts]) data["album"] = album_messages
# #
# Remove the media group from tracking to free up memory # # Remove the media group from tracking to free up memory
del self.texts[key] del self.album_data[event.media_group_id]
# # Call the original event handler # # Call the original event handler
return await handler(event, data) return await handler(event, data)
# #

View File

@@ -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"<b>Ты заблокирован.</b>\n<b>Причина блокировки:</b> {user_info[2]}\n<b>Дата разбана:</b> {user_info[3]}")
return False
logger.info(f'BlacklistMiddleware результат для пользователя: {event.from_user.username} доступ разрешен')
return await handler(event, data)

View File

@@ -1,61 +1,46 @@
import asyncio import asyncio
from collections import defaultdict
from typing import Any, Dict, Union from typing import Any, Dict, Union
from aiogram import BaseMiddleware from aiogram import BaseMiddleware
from aiogram.types import Message from aiogram.types import Message
class AlbumMiddleware(BaseMiddleware): class BulkTextMiddleware(BaseMiddleware):
def __init__(self, latency: Union[int, float] = 0.1): def __init__(self, latency: Union[int, float] = 0.1):
# Initialize latency and album_data dictionary # Initialize latency and album_data dictionary
self.latency = latency 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: async def __call__(self, handler, event: Message, data: Dict[str, Any]) -> Any:
""" """
Main middleware logic. Main middleware logic.
""" """
# # If the event has no media_group_id, pass it to the handler immediately # # 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) return await handler(event, data)
#
# # Collect messages of the same media group self.texts[key].append(event)
total_before = self.collect_album_messages(event) total_before = len(self.texts[key])
#
# # Wait for a specified latency period # # Wait for a specified latency period
await asyncio.sleep(self.latency) await asyncio.sleep(self.latency)
# #
# # Check the total number of messages after the 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 new messages were added during the latency, exit
if total_before != total_after: if total_before != total_after:
return return
# #
# # Sort the album messages by message_id and add to data # # Sort the album messages by message_id and add to data
album_messages = self.album_data[event.media_group_id]["messages"] msg_texts = self.texts[key]
album_messages.sort(key=lambda x: x.message_id) msg_texts.sort(key=lambda x: x.message_id)
data["album"] = album_messages data["texts"] = ''.join([msg.text for msg in msg_texts])
# #
# # Remove the media group from tracking to free up memory # Remove the media group from tracking to free up memory
del self.album_data[event.media_group_id] del self.texts[key]
# # Call the original event handler # # Call the original event handler
return await handler(event, data) return await handler(event, data)
#

View File

@@ -2,6 +2,8 @@ import configparser
import os import os
import sys import sys
from database.db import BotDB
class BaseDependencyFactory: class BaseDependencyFactory:
def __init__(self): def __init__(self):
@@ -10,6 +12,8 @@ class BaseDependencyFactory:
self.config = configparser.ConfigParser() self.config = configparser.ConfigParser()
self.config.read(config_path) self.config.read(config_path)
self.settings = {} self.settings = {}
self.database = BotDB('database/tg-bot-database')
for section in self.config.sections(): for section in self.config.sections():
self.settings[section] = {} self.settings[section] = {}
for key in self.config[section]: for key in self.config[section]:
@@ -23,3 +27,7 @@ class BaseDependencyFactory:
def get_settings(self): def get_settings(self):
return self.settings return self.settings
def get_db(self) -> BotDB:
"""Возвращает подключение к базе данных."""
return self.database

View File

@@ -3,9 +3,11 @@ from datetime import datetime, timedelta
from aiogram import types from aiogram import types
from aiogram.types import InputMediaPhoto 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: def get_first_name(message: types.Message) -> str:

View File

@@ -1,5 +1,5 @@
import os 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__)) 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") 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(): def get_filename():

View File

@@ -1,7 +1,8 @@
import os 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(): def get_filename():