Untitled

 avatar
unknown
plain_text
a year ago
4.4 kB
4
Indexable
from aiogram import Router, types
from aiogram.filters import Command
from aiogram.exceptions import TelegramAPIError

from utils.misc import delete_messages, format_mute_time, prefix, parse_time, parse_command_arguments
from utils.decorators import bot_permissions_required, cannot_manage_bot, admin_owner_only, not_admin_owner_target
from data.locales.localization import get_string
from filters import GroupChatFilter

router = Router()

async def ban_user(message: types.Message, user_id: int,
                    user_full_name: str, duration: str = None,
                    reason: str = None, silent: bool = False):

    user_link = f'<a href="tg://user?id={user_id}"><b>{user_full_name}</b></a>'
    id = f"[<code>{user_id}</code>]"

    if duration:
        parsed_time = parse_time(duration)
        if parsed_time:
            readable_time = format_mute_time(duration)
            ban_key = "temporary_ban"
            locale_kwargs = {"user_link": user_link, "user_id": id, "readable_time": readable_time}
            await message.chat.ban(user_id=user_id, until_date=parsed_time)
    else:
        ban_key = "ban_forever"
        locale_kwargs = {"user_link": user_link, "user_id": id}
        await message.chat.ban(user_id=user_id)

    locale = get_string(ban_key, "resolved.bans", **locale_kwargs)

    if reason:
        reason_str = get_string("with_reason", "resolved.bans", reason=reason)
        locale += reason_str

    response_message = await message.answer(locale)

    if silent:
        await delete_messages(message, response_message)

async def handle_ban_command(message: types.Message, silent: bool):
    arguments = parse_command_arguments(message.text)

    if message.reply_to_message:
        user = message.reply_to_message.from_user
        user_id = user.id
        user_full_name = user.full_name
        if len(arguments) > 1:
            parsed_time = parse_time(arguments[1])
            if parsed_time:
                duration = arguments[1]
                reason = ' '.join(arguments[2:]) if len(arguments) > 2 else None
            else:
                duration = None
                reason = ' '.join(arguments[1:])
        else:
            duration = None
            reason = None
        await ban_user(message, user_id, user_full_name, duration, reason, silent)

    else:
        if len(arguments) < 2:
            locale = get_string("missing_target_user", "errors.bans")
            response_message = await message.answer(locale)
            if silent:
                await delete_messages(message, response_message)
            return

        if not arguments[1].isdigit():
            locale = get_string("invalid_user_id_format", "errors")
            response_message = await message.answer(locale)
            if silent:
                await delete_messages(message, response_message)
            return

        user_id = int(arguments[1])
        try:
            user = await message.bot.get_chat(user_id)
            user_full_name = user.full_name
        except TelegramAPIError:
            locale = get_string("user_not_found", "errors")
            response_message = await message.answer(locale)
            if silent:
                await delete_messages(message, response_message)
            return

        if len(arguments) > 2:
            parsed_time = parse_time(arguments[2])
            if parsed_time:
                duration = arguments[2]
                reason = ' '.join(arguments[3:]) if len(arguments) > 3 else None
            else:
                duration = None
                reason = ' '.join(arguments[2:])
        else:
            duration = None
            reason = None
        await ban_user(message, user_id, user_full_name, duration, reason, silent)

@router.message(GroupChatFilter(), Command("ban", prefix=prefix))
@admin_owner_only
@bot_permissions_required
@cannot_manage_bot
@not_admin_owner_target
async def ban_handler(message: types.Message):
    await handle_ban_command(message, silent=False)

@router.message(GroupChatFilter(), Command("sban", prefix=prefix))
@admin_owner_only
@bot_permissions_required
@cannot_manage_bot
@not_admin_owner_target
async def sban_handler(message: types.Message):
    await handle_ban_command(message, silent=True)
Editor is loading...
Leave a Comment