Команда unban discord py
Обновлено: 03.07.2024
Как создать команду «ban»/«unban» в discord.py
Если бот уже подготовлен к работе и добавлен на сервер в Discord (подробные инструкции, связанные с инсталляцией и авторизацией представлены в официальной документации), то следующий этап – подготовка кода Python, необходимого для взаимодействия с потенциальными нарушителями.
Работают команды на основе библиотеки 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 пробела.
Снимается блокировка с помощью дополнительного кода. Основа уже знакомая.
Далее – уже знакомый набор дополнительных команд (важно сохранить структуру)
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 не разберется, когда начинается и заканчивается функция. Дополнительные подробности на скриншоте ниже.
После подготовки кода в чате сервера станут доступны команды !ban и !unban (префикс – восклицательный знак), сочетаемые с никнеймом нарушителя (!ban @nickname).
Почему команда может не работать
Тот же Visual Code способен сразу предупредить, в каком месте коду требуется доработка.
mark_edinoroglove,
не нужно использовать такую схему кода, есть же варианты намного проще:
зайдите в основной файл (bot.js, или как он у вас там называется), добавьте посередине кода это:
Александр, вставил, но выходит ошибка и проблема.
ошибка такая 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 '
mark_edinoroglove, и снова я ошибся.
код не будет работать из-за того, что забаненного пользователя упомянуть невозможно.
единственный способ сделать команду unban - указывать id забаненного пользователя:
чтобы скопировать id:
настройки сервера > баны > ПКМ > копировать ID
команда будет выглядеть примерно так:
!unban 46854646868
Здравствуйте, нужна помощь уже два дня не могу сделать функцию для того чтобы по истечению времени пользователя разбанивало.
Данные хранятся в базе данных SQLite3, дата бана в формате 21-11-2021
Вставил код кмд бана, библиотеки, sqlite3, tasks разбана.
Вот код:
как выглядит база:
Таблица: bans
Таблица: users (мб пригодится)
Прошу помогите, функция автоматического разбана после истечения срока бана.
зачем вызов await client.wait_until_ready() в цикле for bans в функции ban_loop()? Это затормозит цикл чёрт знает насколько. Аналогично с вызовом того же в начале ban_loop() - у тебя же есть обработчик on_ready(), ты запускаешь ban_loop() там, это гарантирует, что цикл начнётся когда бот уже готов работать.
Далее, зачем выбирать все баны и пролистывать их, когда можно настроить SELECT чтобы он выбирал только истёкшие баны?
Далее, зачем выбирать все баны и пролистывать их, когда можно настроить SELECT чтобы он выбирал только истёкшие баны?
У меня именно с этим проблема, я не понимаю как это сделать, чтобы выбирало только один бан истёкший, если он истёк, разбанивать, не истёк выбрать следующий. Объясните пожалуйста
Денис, ещё раз, зачем выбирать один бан?
Создаёшь в базе колонку ban_until типа INT, где хранишь метку времени, когда бан должен быть снят. У тебя почему-то хранятся дни, но не хранится дата выдачи бана. Так что эту метку времени нужно вычислить, когда вносишь бан - просто к текущему времени (полученному через time.time()) приплюсовываешь нужное число дней в секундах.
А потом при проверке делаешь запрос вида
sql.execute("SELECT * FROM bans WHERE ban_until < ?", (time.time(),))
И он вернёт тебе все истекшие баны. Их нужно будет снять и удалить из базы - или отметить как снятые. Тогда потребуется еще одно поле, хранящее признак "бан снят".
И да, НИКОГДА не формируй SQL запросы через форматирование строк. Налететь на SQL инъекцию можно как нефиг делать.
Читайте также: