Команда unban discord py

Обновлено: 03.07.2024

screenshot_1

Как создать команду «ban»/«unban» в discord.py

Если бот уже подготовлен к работе и добавлен на сервер в Discord (подробные инструкции, связанные с инсталляцией и авторизацией представлены в официальной документации), то следующий этап – подготовка кода Python, необходимого для взаимодействия с потенциальными нарушителями.

screenshot_2

Работают команды на основе библиотеки Discord.py, а потому и начинать предстоит с импорта уже заготовленных скриптов и commands в построчном режиме:

Следом добавляется источник для импорта:

from discord.ext import commands

Заданная основа для кода открывает простор для творчества и экономит время. Дальше предстоит подготовить код следующего формата:

После ввести конструкцию через async

async def ban(ctx, user: discord.Member, *, reason=None):

Функция разделяется на несколько строк с сохранением синтаксиса.

await ctx.send(f" пользователь успешно заблокирован")

Важно помнить о структуре: на следующей строчке после функции async для await понадобится отступ в 4 пробела.

screenshot_3

Снимается блокировка с помощью дополнительного кода. Основа уже знакомая.

Далее – уже знакомый набор дополнительных команд (важно сохранить структуру)

async def unban(ctx, *, member):

Обязательно 4 пробела впереди!

banned_users = await ctx.guild.bans()

И следом сразу строка для отсеивания лишней аудитории.

После задается For.

for ban_entry in banned_users:

Обязательно 4 пробела впереди!

И условие через if.

if (user.name, user.discriminator) == (member_name, member_discriminator):

await ctx.send(f" пользователь успешно разблокирован")

Как и в случае с командой ban отступ важен: иначе Python не разберется, когда начинается и заканчивается функция. Дополнительные подробности на скриншоте ниже.

screenshot_4

После подготовки кода в чате сервера станут доступны команды !ban и !unban (префикс – восклицательный знак), сочетаемые с никнеймом нарушителя (!ban @nickname).

Почему команда может не работать

Тот же Visual Code способен сразу предупредить, в каком месте коду требуется доработка.

Alexandre888

mark_edinoroglove,
не нужно использовать такую схему кода, есть же варианты намного проще:
зайдите в основной файл (bot.js, или как он у вас там называется), добавьте посередине кода это:

mark_edinoroglove

Александр, вставил, но выходит ошибка и проблема.
ошибка такая PS C:\Users\Марк Ешкилев\Desktop\Metrostroi Bot> node bot.js
C:\Users\Марк Ешкилев\Desktop\Metrostroi Bot\bot.js:42
if (message.content.startsWith(prefix + "unban")


SyntaxError: Unexpected token '

Alexandre888

mark_edinoroglove, пардон, немного просчитался, замените текущий код на этот:

mark_edinoroglove

Александр, теперь выводит другую ошибку если я пишу к примеру !unban @Mark228

Alexandre888

mark_edinoroglove

Alexandre888

mark_edinoroglove, и снова я ошибся.
код не будет работать из-за того, что забаненного пользователя упомянуть невозможно.
единственный способ сделать команду unban - указывать id забаненного пользователя:

чтобы скопировать id:
настройки сервера > баны > ПКМ > копировать ID
команда будет выглядеть примерно так:
!unban 46854646868

Здравствуйте, нужна помощь уже два дня не могу сделать функцию для того чтобы по истечению времени пользователя разбанивало.
Данные хранятся в базе данных SQLite3, дата бана в формате 21-11-2021
Вставил код кмд бана, библиотеки, sqlite3, tasks разбана.
Вот код:

619a98c4620fa302043049.jpg


как выглядит база:
Таблица: bans

619a98f08e915294207688.jpg

Таблица: users (мб пригодится)

Прошу помогите, функция автоматического разбана после истечения срока бана.

зачем вызов await client.wait_until_ready() в цикле for bans в функции ban_loop()? Это затормозит цикл чёрт знает насколько. Аналогично с вызовом того же в начале ban_loop() - у тебя же есть обработчик on_ready(), ты запускаешь ban_loop() там, это гарантирует, что цикл начнётся когда бот уже готов работать.

Далее, зачем выбирать все баны и пролистывать их, когда можно настроить SELECT чтобы он выбирал только истёкшие баны?

nosemka

Далее, зачем выбирать все баны и пролистывать их, когда можно настроить SELECT чтобы он выбирал только истёкшие баны?

У меня именно с этим проблема, я не понимаю как это сделать, чтобы выбирало только один бан истёкший, если он истёк, разбанивать, не истёк выбрать следующий. Объясните пожалуйста

Денис, ещё раз, зачем выбирать один бан?
Создаёшь в базе колонку ban_until типа INT, где хранишь метку времени, когда бан должен быть снят. У тебя почему-то хранятся дни, но не хранится дата выдачи бана. Так что эту метку времени нужно вычислить, когда вносишь бан - просто к текущему времени (полученному через time.time()) приплюсовываешь нужное число дней в секундах.
А потом при проверке делаешь запрос вида
sql.execute("SELECT * FROM bans WHERE ban_until < ?", (time.time(),))
И он вернёт тебе все истекшие баны. Их нужно будет снять и удалить из базы - или отметить как снятые. Тогда потребуется еще одно поле, хранящее признак "бан снят".

И да, НИКОГДА не формируй SQL запросы через форматирование строк. Налететь на SQL инъекцию можно как нефиг делать.

Читайте также: