ban middleware/ ban users
This commit is contained in:
@@ -9,12 +9,14 @@ from .maintenance import MaintenanceModeMiddleware
|
||||
from .session import SessionMiddleware
|
||||
from .throttling import ThrottlingMiddleware
|
||||
from .user import UserMiddleware
|
||||
from middlewares.ban_checker import BanCheckerMiddleware
|
||||
|
||||
|
||||
def register_middleware(
|
||||
dispatcher: Dispatcher,
|
||||
middlewares: Iterable[BaseMiddleware | type[BaseMiddleware]] | None = None,
|
||||
exclude: Iterable[str] | None = None,
|
||||
pool=None
|
||||
) -> None:
|
||||
"""Регистрирует middleware в диспетчере."""
|
||||
if middlewares is None:
|
||||
@@ -27,6 +29,9 @@ def register_middleware(
|
||||
"user": UserMiddleware(),
|
||||
}
|
||||
|
||||
if pool:
|
||||
available_middlewares["ban_checker"] = BanCheckerMiddleware(pool)
|
||||
|
||||
exclude_set = set(exclude or [])
|
||||
middlewares = [middleware for name, middleware in available_middlewares.items() if name not in exclude_set]
|
||||
|
||||
|
||||
@@ -0,0 +1,59 @@
|
||||
from typing import Callable, Any, Awaitable
|
||||
from aiogram import BaseMiddleware
|
||||
from aiogram.types import Message, CallbackQuery
|
||||
from asyncpg import Pool
|
||||
from pytz import timezone
|
||||
|
||||
from config import SUPPORT_CHAT_URL
|
||||
|
||||
|
||||
TZ = timezone("Europe/Moscow") # или другая зона, если нужно
|
||||
|
||||
class BanCheckerMiddleware(BaseMiddleware):
|
||||
def __init__(self, pool: Pool):
|
||||
self.pool = pool
|
||||
|
||||
async def __call__(
|
||||
self,
|
||||
handler: Callable[[Any, dict[str, Any]], Awaitable[Any]],
|
||||
event: Message | CallbackQuery,
|
||||
data: dict[str, Any],
|
||||
) -> Any:
|
||||
tg_id = (
|
||||
event.from_user.id
|
||||
if isinstance(event, (Message, CallbackQuery))
|
||||
else None
|
||||
)
|
||||
if tg_id is None:
|
||||
return await handler(event, data)
|
||||
|
||||
async with self.pool.acquire() as conn:
|
||||
record = await conn.fetchrow(
|
||||
"""
|
||||
SELECT until FROM manual_bans
|
||||
WHERE tg_id = $1 AND (until IS NULL OR until > NOW())
|
||||
""",
|
||||
tg_id,
|
||||
)
|
||||
|
||||
if record:
|
||||
until = record["until"]
|
||||
if until:
|
||||
until_local = until.astimezone(TZ).strftime("%Y-%m-%d %H:%M")
|
||||
text = (
|
||||
f"🚫 Вы заблокированы до <b>{until_local}</b> по МСК.\n"
|
||||
f"Если вы считаете, что это ошибка, обратитесь в поддержку: {SUPPORT_CHAT_URL}"
|
||||
)
|
||||
else:
|
||||
text = (
|
||||
f"🚫 Вы заблокированы <b>навсегда</b>.\n"
|
||||
f"Если вы считаете, что это ошибка, обратитесь в поддержку: {SUPPORT_CHAT_URL}"
|
||||
)
|
||||
|
||||
if isinstance(event, Message):
|
||||
await event.answer(text, parse_mode="HTML")
|
||||
elif isinstance(event, CallbackQuery):
|
||||
await event.answer(text, show_alert=True)
|
||||
return
|
||||
|
||||
return await handler(event, data)
|
||||
Reference in New Issue
Block a user