Untitled
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