diff --git a/bozenka/instances/telegram/handlers/chat_admin/__init__.py b/bozenka/instances/telegram/handlers/chat_admin/__init__.py index 940d99a..bee1540 100644 --- a/bozenka/instances/telegram/handlers/chat_admin/__init__.py +++ b/bozenka/instances/telegram/handlers/chat_admin/__init__.py @@ -10,10 +10,7 @@ from bozenka.instances.telegram.handlers.chat_admin.mutes import mute, unmute from bozenka.instances.telegram.handlers.chat_admin.pins import pin, unpin, unpin_all from bozenka.instances.telegram.handlers.chat_admin.topics import * from bozenka.instances.telegram.handlers.chat_admin.bans import ban, unban -from bozenka.instances.telegram.utils.filters import ( - IsAdminFilter, - UserHasPermissions, BotHasPermissions -) +from bozenka.instances.telegram.utils.filters import * def register_admin_cmd(router: Router) -> None: @@ -33,7 +30,9 @@ def register_admin_cmd(router: Router) -> None: router.message.register(help_unpin, Command(commands=["unpin"])) # Ban / Unban commands handler router.message.register(ban, Command(commands="ban"), - IsAdminFilter(True), F.reply_to_message.text or [entity for entity in F.entities if entity.type == 'mention']) + IsAdminFilter(True)) + router.message.register(ban, Command(commands="ban"), + IsAdminFilter(True), F.reply_to_message.text) router.message.register(unban, Command(commands="unban"), IsAdminFilter(True), F.reply_to_message.text) # Mute / Unmute commands handler diff --git a/bozenka/instances/telegram/handlers/errors/__init__.py b/bozenka/instances/telegram/handlers/errors/__init__.py deleted file mode 100644 index 529979d..0000000 --- a/bozenka/instances/telegram/handlers/errors/__init__.py +++ /dev/null @@ -1,22 +0,0 @@ -import logging - -from aiogram import Router, F -from aiogram.filters import Command - - -from bozenka.instances.telegram.utils.filters import ( - IsAdminFilter, - UserHasPermissions, BotHasPermissions -) - - -def register_admin_cmd(router: Router) -> None: - """ - Registers all commands related to administrators in group. - All commands there require access to some group perms. - :param router: - :return: - """ - logging.log(msg="Registering administrator commands", level=logging.INFO) - # Helpig handlers - diff --git a/bozenka/instances/telegram/utils/filters/__init__.py b/bozenka/instances/telegram/utils/filters/__init__.py index a25da3f..0245794 100644 --- a/bozenka/instances/telegram/utils/filters/__init__.py +++ b/bozenka/instances/telegram/utils/filters/__init__.py @@ -1 +1,2 @@ from .permissions import * +from .message_entities import * diff --git a/bozenka/instances/telegram/utils/filters/chat_type.py b/bozenka/instances/telegram/utils/filters/chat_type.py deleted file mode 100644 index 1393308..0000000 --- a/bozenka/instances/telegram/utils/filters/chat_type.py +++ /dev/null @@ -1,8 +0,0 @@ -from aiogram.filters import Filter - - -class IsChatType(Filter): - """ - - """ - diff --git a/bozenka/instances/telegram/utils/filters/permissions.py b/bozenka/instances/telegram/utils/filters/permissions.py index c555730..1b2cccd 100644 --- a/bozenka/instances/telegram/utils/filters/permissions.py +++ b/bozenka/instances/telegram/utils/filters/permissions.py @@ -45,7 +45,8 @@ class UserHasPermissions(Filter): :return: """ if permission.count(False) > 0 or permission.count(None) > 0: - await msg.answer(ru_cmds["no_perms"]) + await msg.answer("Ошибка ❌\n" + "У вас нет прав на использование этой комманды 🚫") return False return True diff --git a/bozenka/instances/telegram/utils/middleware/__init__.py b/bozenka/instances/telegram/utils/middleware/__init__.py index fab8e1f..f584ee4 100644 --- a/bozenka/instances/telegram/utils/middleware/__init__.py +++ b/bozenka/instances/telegram/utils/middleware/__init__.py @@ -1,5 +1,3 @@ -__all__ = ["registration"] - import logging from aiogram import Router, Dispatcher @@ -12,4 +10,4 @@ def register_middlewares(dp: Dispatcher): :return: """ logging.log(msg=f"Registering middlewares of bot", level=logging.INFO) - # dp.message.middleware(Registration) + # SOON diff --git a/bozenka/instances/telegram/utils/middleware/antispam.py b/bozenka/instances/telegram/utils/middleware/antispam.py deleted file mode 100644 index 4858748..0000000 --- a/bozenka/instances/telegram/utils/middleware/antispam.py +++ /dev/null @@ -1 +0,0 @@ -# Will be added soon diff --git a/bozenka/instances/telegram/utils/middleware/registration.py b/bozenka/instances/telegram/utils/middleware/registration.py deleted file mode 100644 index 6b0e5f0..0000000 --- a/bozenka/instances/telegram/utils/middleware/registration.py +++ /dev/null @@ -1,39 +0,0 @@ - -''' -import logging -from typing import Callable, Dict, Any, Awaitable - -from aiogram import BaseMiddleware -from aiogram.types import Message, ContentType -from sqlalchemy import select -from sqlalchemy.orm import sessionmaker - -from bozenka.db import Users - -class Registration(BaseMiddleware): - """ - Checks, is user & group registered. - """ - async def __call__( - self, - handler: Callable[[Message, Dict[str, Any]], Awaitable[Any]], - event: Message, - data: Dict[str, Any] - ) -> Any: - session_maker: sessionmaker = data["session_maker"] - async with session_maker() as session: - async with session.begin(): - result = await session.execute(select(Users).where(Users.user_id == event.from_user.id and Users.chat_id == event.chat.id)) - user = result.one_or_none() - logging.log(msg=f"Checking user registration with id={event.from_user.id}", level=logging.INFO) - if user is None: - logging.log(msg=f"Registering user into database with id={event.from_user.id}", level=logging.INFO) - user = Users( - user_id=event.from_user.id, - chat_id=event.chat.id - ) - await session.merge(user) - - if not data: - return await handler(event, None) -''' \ No newline at end of file diff --git a/bozenka/instances/telegram/utils/middleware/retry.py b/bozenka/instances/telegram/utils/middleware/retry.py new file mode 100644 index 0000000..17d6b56 --- /dev/null +++ b/bozenka/instances/telegram/utils/middleware/retry.py @@ -0,0 +1,40 @@ +import time +from typing import Callable, Dict, Awaitable, Any + +from aiogram import BaseMiddleware +from aiogram.exceptions import TelegramRetryAfter +from aiogram.types import Message, ErrorEvent, Update, CallbackQuery + + +class RetryMessageMiddleware(BaseMiddleware): + """ + Protects from user don't get update by message + """ + def __init__(self) -> None: + self.counter = 0 + + async def __call__( + self, + handler: Callable[[Message, Dict[str, Any]], Awaitable[Any]], + event: ErrorEvent[TelegramRetryAfter, Update], + data: Dict[str, Any] + ) -> Any: + time.sleep(event.exception.retry_after) + return await handler(event.update.message, data) + + +class RetryCallbackMiddleware(BaseMiddleware): + """ + Protects from user don't get update by callbackquery + """ + def __init__(self) -> None: + self.counter = 0 + + async def __call__( + self, + handler: Callable[[CallbackQuery, Dict[str, Any]], Awaitable[Any]], + event: ErrorEvent[TelegramRetryAfter, Update], + data: Dict[str, Any] + ) -> Any: + time.sleep(event.exception.retry_after) + return await handler(event.update.callback_query, data) diff --git a/bozenka/instances/telegram/utils/simpler/solution_simpler.py b/bozenka/instances/telegram/utils/simpler/solution_simpler.py index 5f3476a..c830015 100644 --- a/bozenka/instances/telegram/utils/simpler/solution_simpler.py +++ b/bozenka/instances/telegram/utils/simpler/solution_simpler.py @@ -132,9 +132,6 @@ class SolutionSimpler: config["ban_time"] = datetime.utcfromtimestamp(count_time(item)).strftime('%Y-%m-%d %H:%M:%S') else: config["reason"] += item + " " - if msg.entities and (mentions := [entity for entity in msg.entities if entity.type == 'mention']): - for banned in mentions: - await basic_ban(msg, banned.user, config, session) if msg.reply_to_message.text: await basic_ban(msg, msg.reply_to_message.from_user, config, session) return config @@ -151,13 +148,14 @@ class SolutionSimpler: logging.log( msg=f"Unbanned user @{msg.reply_to_message.from_user.full_name} id={msg.reply_to_message.from_user.id}", level=logging.INFO) - async with session() as session: - async with session.begin(): - await session.execute( - Update(Users) - .values(is_banned=False, ban_reason=None) - .where(Users.user_id == msg.from_user.id and Users.chat_id == msg.chat.id) - ) + if await get_user(user_id=msg.from_user.id, chat_id=msg.chat.id, session=session): + async with session() as session: + async with session.begin(): + await session.execute( + Update(Users) + .values(is_banned=False, ban_reason=None) + .where(Users.user_id == msg.from_user.id and Users.chat_id == msg.chat.id) + ) @staticmethod async def get_status(msg: types.Message, session: async_sessionmaker) -> dict[str, bool | None | Any]: diff --git a/images/header.png b/images/header.png index e971992..c86c3f1 100644 Binary files a/images/header.png and b/images/header.png differ