Бот-модератор для чатов Telegram. Действия администратора


Что мы будем делать? 😊

В этой части не будет сложной информации по программированию, но мы рассмотрим функционал ботов.

Давайте напишем код 🖊️.

Да, мы сразу перейдем к написанию кода, а именно некоторых важных обработчиков. Ведь все необходимые знания мы уже получили в предыдущих постах.

Итак, давайте откроем папку handlers и зальем несколько файлов:

from aiogram.types import Message, ChatType

from datetime import timedelta

from loader import dp


@dp.message_handler(is_admin=True, commands=['ban'], commands_prefix='!/',
                    chat_type=[ChatType.GROUP, ChatType.SUPERGROUP])
async def ban_user(message: Message):
    if not message.reply_to_message:
        await message.reply('This command needs to be as a reply to message')
        return
    await message.delete()

    await message.bot.ban_chat_member(chat_id=message.chat.id, user_id=message.reply_to_message.from_user.id,
                                      until_date=timedelta(seconds=29))
    return await message.reply_to_message.reply('User has been banned')


@dp.message_handler(is_admin=True, commands=['unban'], commands_prefix='!/')
async def unban_user(message: Message):
    if not message.reply_to_message:
        await message.reply('This command needs to be as a reply to message')
        return
    await message.delete()

    await message.bot.unban_chat_member(chat_id=message.chat.id, user_id=message.reply_to_message.from_user.id,
                                        only_if_banned=True)
    username = message.reply_to_message.from_user.username
    return await message.reply_to_message.reply(f'User @{username} has been unbanned')
Вход в полноэкранный режим Выход из полноэкранного режима

Давайте разберемся, что здесь написано. В декораторе мы пишем фильтры: свой, какая команда, префикс к команде и тип чата. Далее, в теле функции, мы проверяем, является ли сообщение ответом на другое. Затем самое интересное: баним пользователя методом aiogram. И здесь может возникнуть вопрос: «Почему существует временная дельта в 29 секунд?». Для этого нам нужно обратиться к документации Telegram API:

Дата, когда пользователь будет разбанен, время unix. Если пользователь забанен более чем на 366 дней или менее чем на 30 секунд от текущего времени, он считается забаненным навсегда. Применяется только для супергрупп и каналов.

В нашем случае запрет на 29 секунд означает запрет пользователя навсегда.

from aiogram.types import Message, ChatType

from loader import dp

from datetime import timedelta


@dp.message_handler(is_admin=True, commands=['kick'], commands_prefix='!/',
                    chat_type=[ChatType.GROUP, ChatType.SUPERGROUP])
async def kick_user(message: Message):
    if not message.reply_to_message:
        return await message.reply('This command needs to be as a reply to message')
    await message.delete()

    user_id = message.reply_to_message.from_user.id
    seconds = 60
    await message.bot.ban_chat_member(chat_id=message.chat.id, user_id=user_id, until_date=timedelta(seconds=seconds))
    return await message.reply_to_message.reply(f'User has been kicked for the {seconds} seconds')
Войти в полноэкранный режим Выход из полноэкранного режима

Здесь все то же самое, но кик отличается от бана тем, что пользователь может вернуться.

from aiogram.types import Message, chat_permissions, ChatType

from datetime import timedelta

from loader import dp


@dp.message_handler(is_admin=True, commands=['mute'], commands_prefix='!/',
                    chat_type=[ChatType.GROUP, ChatType.SUPERGROUP])
async def mute_user(message: Message):
    if not message.reply_to_message:
        return await message.reply('This command needs to be as a reply on message')
    await message.delete()

    user_id = message.reply_to_message.from_user.id
    seconds = 30

    await message.bot.restrict_chat_member(chat_id=message.chat.id, user_id=user_id,
                                           until_date=timedelta(seconds=seconds),
                                           permissions=chat_permissions.ChatPermissions(can_send_messages=False,
                                                                                        can_send_polls=False,
                                                                                        can_send_other_messages=False,
                                                                                        can_send_media_messages=False))
    return await message.reply_to_message.reply(f'User has been muted for the {seconds} seconds')


@dp.message_handler(is_admin=True, commands=['unmute'], commands_prefix='!/',
                    chat_type=[ChatType.GROUP, ChatType.SUPERGROUP])
async def unmute_user(message: Message):
    if not message.reply_to_message:
        return await message.reply('This command needs to be as a reply on message')
    await message.delete()

    user_id = message.reply_to_message.from_user.id
    await message.bot.restrict_chat_member(chat_id=message.chat.id, user_id=user_id,
                                           permissions=chat_permissions.ChatPermissions(can_send_messages=True,
                                                                                        can_send_polls=True,
                                                                                        can_send_other_messages=True,
                                                                                        can_send_media_messages=True))
    return await message.reply_to_message.reply('User has been unmuted')
Вход в полноэкранный режим Выход из полноэкранного режима

Здесь все аналогично, единственное отличие — метод, который мы используем.

from aiogram.types import Message, ChatType

from loader import dp


@dp.message_handler(commands=['admins'], chat_type=[ChatType.GROUP, ChatType.SUPERGROUP])
async def admins_command(message: Message) -> Message:
    chat_id = message.chat.id
    admins = await message.bot.get_chat_administrators(chat_id)
    text = ''
    for admin in admins:
        text += f'@{admin.user.username} '
    return await message.answer(text, disable_notification=True)
Вход в полноэкранный режим Выход из полноэкранного режима

Здесь мы получаем только список администраторов групп. Любой пользователь может вызвать эту команду.

Что дальше? ❓

Далее мы сделаем несколько проверок новых участников чата и рассмотрим конечную машину состояний.

Ссылки 🔗

  • Структура файлов второй части

Спасибо за прочтение! ❤️ ❤️ ❤️

Оцените статью
devanswers.ru
Добавить комментарий