Администрировать серверы в Discord без помощи ботов не слишком удобно: приходится вручную блокировать нарушителей порядка, следить за добавленными в чат сообщениями и помнить, в какой момент снимать выданные ограничения. Команды «ban»/«unban», добавляемые на сервер с помощью Discord.py, не избавят от необходимости следить за активностью пользователей, но разрешат всего за пару секунд наказать тех, кто нарушает правила.
Как создать команду «ban»/«unban» в discord.py
Если бот уже подготовлен к работе и добавлен на сервер в Discord (подробные инструкции, связанные с инсталляцией и авторизацией представлены в официальной документации), то следующий этап – подготовка кода Python, необходимого для взаимодействия с потенциальными нарушителями.
Работают команды на основе библиотеки Discord.py, а потому и начинать предстоит с импорта уже заготовленных скриптов и commands в построчном режиме:
import discord
Следом добавляется источник для импорта:
from discord.ext import commands
Заданная основа для кода открывает простор для творчества и экономит время. Дальше предстоит подготовить код следующего формата:
@client.command()
@commands.has_permissions(ban_members=True)
После ввести конструкцию через async
async def ban(ctx, user: discord.Member, *, reason=None):
Функция разделяется на несколько строк с сохранением синтаксиса.
await user.ban(reason=reason)
await ctx.send(f”{user} пользователь успешно заблокирован”)
Важно помнить о структуре: на следующей строчке после функции async для await понадобится отступ в 4 пробела.
Снимается блокировка с помощью дополнительного кода. Основа уже знакомая.
@client.command()
Далее – уже знакомый набор дополнительных команд (важно сохранить структуру)
async def unban(ctx, *, member):
Обязательно 4 пробела впереди!
banned_users = await ctx.guild.bans()
И следом сразу строка для отсеивания лишней аудитории.
member_name, member_discriminator = member.split(‘#’)
После задается For.
for ban_entry in banned_users:
Обязательно 4 пробела впереди!
user = ban_entry.user
И условие через if.
if (user.name, user.discriminator) == (member_name, member_discriminator):
await ctx.guild.unban(user)
await ctx.send(f”{user} пользователь успешно разблокирован”)
return
Как и в случае с командой ban отступ важен: иначе Python не разберется, когда начинается и заканчивается функция. Дополнительные подробности на скриншоте ниже.
После подготовки кода в чате сервера станут доступны команды !ban и !unban (префикс – восклицательный знак), сочетаемые с никнеймом нарушителя (!ban @nickname).
Почему команда может не работать
Проблемы с подготовленными для бота командами в 99 % возникают из-за допущенных ошибок в коде Python: пропущенные буквы, не проставленные префиксы, нарушенный синтаксис. Справиться с появившимися проблемами вполне реально с помощью системы валидации кода (после прохождения специальной проверки появится предупреждение о найденных ошибках, незакрытых скобках или пропущенных кавычках).
Тот же Visual Code способен сразу предупредить, в каком месте коду требуется доработка.