Untitled

 avatar
unknown
plain_text
a year ago
4.2 kB
10
Indexable
from typing import Dict, Optional, Tuple

from aiogram import F, Bot, Router, types
from aiogram.filters import Command, CommandObject, StateFilter
from aiogram.types import ChatPermissions
from aiogram.exceptions import TelegramBadRequest, TelegramAPIError

import logging
import datetime
import asyncio
from config import config


from utils.misc import format_mute_time, prefix, parse_time, parse_command_arguments
from utils.decorators import bot_permissions_required, not_admin_target
from data.locales.localization import get_string
from filters import GroupChatFilter

logging.basicConfig(level=logging.INFO)

router = Router()

async def ban_user(message: types.Message, user_id: int, user_full_name: str, duration: str = None, reason: str = None):
    """
    Банит пользователя.
    Args:
        message: Объект сообщения Telegram.
        user_id: ID пользователя для бана.
        user_full_name: Полное имя пользователя.
        duration: Длительность бана (строка времени или None для перманентного бана).
        reason: Причина бана (опционально).
    """

    user_link = f'<a href="tg://user?id={user_id}"><b>{user_full_name}</b></a>'
    user_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": user_id, "readble_time": readable_time}
    else:
        ban_key = "ban_forever"
        locale_kwargs = {"user_link": user_link, "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
    await message.answer(locale)


@router.message(Command("ban", prefix=prefix))
async def command_handler(message: types.Message):
    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
    elif len(arguments) >= 2:
        if arguments[1].isdigit():
            try: # Бан пользователя по ID
                user_id = int(arguments[1])
                user = await message.bot.get_chat(user_id)
                user_full_name = user.full_name
            except TelegramAPIError:
                locale = get_string("user_not_found", "errors")
                await message.answer(locale)
                return
        else: # ID должен состоять только из цифр
            locale = get_string("invalid_user_id_format", "errors")
            await message.answer(locale)
            return
    else:
        locale = get_string("missing_target_user", "errors.bans")  # Не указан пользователь для бана
        await message.answer(locale)
        return

    # Извлекаем время и причину, если они есть
    if len(arguments) >= 3:
        duration = parse_time(arguments[2])  # Проверяем, является ли третий аргумент временем
        if duration:
            reason = ' '.join(arguments[3:])  # Если третий аргумент - время, то причина - всё, что после
        else:
            reason = ' '.join(arguments[2:])  # Иначе причина - всё, что со второго аргумента
    elif len(arguments) == 2 and not message.reply_to_message:
        reason = arguments[1]  # Если только два аргумента и нет ответа на сообщение, то второй - причина

    await ban_user(message, user, user_id, user_full_name, duration, reason)
Editor is loading...
Leave a Comment