Discord.py как сделать кнопки рядом друг с другом?
Мне нужно, чтобы мои кнопки в дискорде были рядом друг с другом, а не так, чтобы одна была под другой. Как это сделать? Фрагмент кода:
await ctx.send( embed=discord.Embed(title='123', description='456', colour=discord.Color.green()), components=[ Button(style=ButtonStyle.grey, label='text1'), Button(style=ButtonStyle.grey, label='text2') ] )
Отслеживать
задан 12 ноя 2021 в 12:58
user468859 user468859
3 1 1 бронзовый знак
1 ответ 1
Сортировка: Сброс на вариант по умолчанию
Чтобы кнопки находились на одной линии, поместите их во вложенный список.
await ctx.send( embed=discord.Embed(title='123', description='456', colour=discord.Color.green()), components=[ #первая линия [Button(style=ButtonStyle.grey, label='к1 л1'), Button(style=ButtonStyle.grey, label='к2 л1')], #вторая линия [Button(style=ButtonStyle.grey, label='к1 л2'), Button(style=ButtonStyle.grey, label='к2 л2')] ] )
Saved searches
Use saved searches to filter your results more quickly
Cancel Create saved search
You signed in with another tab or window. Reload to refresh your session. You signed out in another tab or window. Reload to refresh your session. You switched accounts on another tab or window. Reload to refresh your session.
Гайд для GitHub по написанию бота c помощью discord.py
MishaSok/discord_bot_quick_start_rus
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Switch branches/tags
Branches Tags
Could not load branches
Nothing to show
Could not load tags
Nothing to show
Name already in use
A tag already exists with the provided branch name. Many Git commands accept both tag and branch names, so creating this branch may cause unexpected behavior. Are you sure you want to create this branch?
Cancel Create
- Local
- Codespaces
HTTPS GitHub CLI
Use Git or checkout with SVN using the web URL.
Work fast with our official CLI. Learn more about the CLI.
Sign In Required
Please sign in to use Codespaces.
Launching GitHub Desktop
If nothing happens, download GitHub Desktop and try again.
Launching GitHub Desktop
If nothing happens, download GitHub Desktop and try again.
Launching Xcode
If nothing happens, download Xcode and try again.
Launching Visual Studio Code
Your codespace will open once ready.
There was a problem preparing your codespace, please try again.
Latest commit
Git stats
Files
Failed to load latest commit information.
Latest commit message
Commit time
README.md
Гайд для GitHub по написанию бота c помощью discord.py
Если есть какие-то вопросы или пожелания писать сюда ==> MishaSok#6723
Дата написания данного гайда 05.02.2021 Библиотека discord.py может обновляться, поэтому после крупных патчей разработка бота может отличаться. В любом случае ближайшие несколько месяцев данный гайд будет актуален.
Что нам потребуется?:
- Стабильное интернет соединение
- Неплохие знания Питона
- Умение «гуглить» и находить нужную информацию
- Среда для написания кода
Я советую для разработки бота создать отдельный сервер в Дискорде, где мы будем проверять нашего бота, потому что почти ни у кого не получается запустить сложный код с первого раза, а спамить другим не очень хочется.
Создание Application’a:
Для начала нам нужно создать Discord Application, для этого мы должны перейти по этой ссылке: https://discord.com/developers/applications. После успешного входа в ваш аккаунт Discord, вам нужно нажать на кнопку New Application и выбрать имя для приложения. ВАЖНО: ИМЯ ДЛЯ САМОГО БОТА ДИСКОРДА МЫ БДЕМ НАСТРАИВАТЬ ПОЗЖЕ.
После создания Application’а мы должны перейти во вкладку Bot, а затем нажать на кнопку Add Bot.
Если у вас появилось зеленая надпись по типу: A wild bot has appeared!, значит вы всё сделали правильно и бот у вас уже создан.
Подключаем нашего бота к серверу:
Для того чтобы подключить бота к вашему серверу Дискорд, нужно следовать простым инструкциям:
- Нужно получить Client_ID вашего бота. Для этого мы переходим во вкладку General Information и копируем его нажав на кнопку Copy.
- Копируем эту ссылку ==>https://discordapp.com/oauth2/authorize?&client_id=(тут)&scope=bot&permissions=8 . В эту ссылку вместо слова «тут» вставляем наш Client_ID. Скобки естественно убираем. Доп. информация: В нашей ссылке bot&permissions=8 означает что наш permissions integer равен 8. Проще говоря, это число отвечает за то, какие права будут выданы боту при подключении. Этот код можно узнать во вкладке Bot (в которой мы создавали бота). Пролистав вниз, вы сможете сами выбрать нужные вам права, но я советую оставить 8, так как если вы будете сами выбирать права, могут произойти казусные ситуации при работе с ботом.
- После создания нашей ссылки мы переходим по ней, выбираем сервер на который хотите пригласить бота и нажимаем кнопку Авторизовать. После прохождения капчи наш бот успешно присоединится к серверу, но будет оффлайн. Не пугайтесь, это нормально, ведь наш бот еще не запущен.
Создание проекта:
Ну вот мы и готовы начать писать код для нашего прекрасного бота. Если вы знаете Python на ОЧЕНЬ низком уровне, я советую воздержаться от создания ботов и заняться чем нибудь более простым.
Для начала я советую создать пустую папку где мы будем хранить все файлы для нашего бота.
Затем если у вас не установлена библиотека discord.py, вам нужно её устновить. Для этого переходим в командную строку и пишем: pip install discord.py
Внимание, для установки библиотек требуется pip, если он у вас не установлен, то гугл в помощь ^_^
После успешной установки библиотеки, переходим в вашу любимую среду разработки, в моём случае это PyCharm. Затем создаем новый файл Python файл с названием «bot» (такое название не даст вам запутаться) и расширением .py и сразу сохраняем его в нашей папке с проектом.
Первые строчки кода: Начинаем писать скрипт для нашего бота.
Для начала подключаем (импортируем) наши библиотеки:
import discord from discord.ext import commands
(можем запустить наш скрипт для проверки работоспособности библиотеки)
Создаем еще один файлик .py названием config, для хранения в нём опасных данных. Почему мы не можем просто создать переменные с этими данными? Всё очень просто. Это самый простой способ защитить себя от злоумышленников. Если кто-то каким-то образом получит ваш код, то не сможет управлять вашим ботом. Все наши токены будут хранится в отдельном файлике.
В файле config.py создаем словарь, к которому мы будем обращаться при работе в ботом:
settings = < 'token': 'Введите ваш токен', 'bot': 'Название вашего бота', 'id': 'id вашего бота (без кавычек)', 'prefix': 'префикс' >
Сохраняем файл config.py и возвращаемся обратно к файлу bot.py
Импортируем наш файлик config.py:
from config import settings
Написание «тела» для бота и первый запуск:
Я буду стараться объяснять подробно каждый шаг и каждую строчку, потому что на первый взгляд это может показаться сложным, хотя таковым не является.
bot = commands.Bot(command_prefix=settings['prefix'])
- Переменная bot — это «тело» нашего бота. Ему мы присваиваем значение commands.Bot с определёнными аргументами.
- command_prefix=settings[‘prefix’] — это аргумент, в который мы вписываем значение нашего префикса. settings[‘prefix’] означает, кто мы обращаемся к словарю settings (который мы импортировали из файла config.py) и обращаемся к ключу prefix, в котором вписано нужное нам значение.
Затем мы можем проверить, запускается наш бот или нет. В библиотеке discord.py есть огромное количество разных ивентов (Event). Одним из них мы сейчас воспользуемся:
@bot.event async def on_ready(): print('Bot connected successfully!')
- @bot.event — говорит нам о том, что ниже будет прописана функция, являющаяся ивентом.
- async def on_ready(): — Асинхронная функция (Очень важно все функции создавать асинхронными, так как бот должен выполнять несколько функций в одно время). Ей присваивается значение on_ready, данная функция срабатывает когда бот полностью подключен и готов к работе. Аргументов у этой функции нет.
- Ну и последняя строка просто выводит в консоль сообщение, по которому мы можем понять работает наш бот или нет.
Создание первой команды:
Настало время создать первую команду для нашего бота:
@bot.command() async def hello(ctx): author = ctx.message.author await ctx.send(f'Hello, author.mention>!')
В отличии от нашей прошлой функции on_ready, эта будет начинаться с @bot.command(), потому что это не ивент, а уже полноценная команда, хоть и простая. Вызов функции происходит точно так же как и с ивентами, но в этот раз мы передаем значение ctx. Затем мы создаем перменную author, в которую передаем значение аккаунта пользователя (@name#0000), который вызвал функцию. Затем с помощью await ctx.send выводим наше сообщение в чат. В скобках у нас написано author.mention, метод mention позволяет «тэгать» пользователя, который написал команду.
Можем запускать нашего бота и проверять команду!
Давайте создадим еще одну команду, но уже с использованием посторонней библиотеки. Я возьму библиотеку random. Для начала её нужно подключить. Переходим в cmd (командную строку) и пишем pip install random, после чего начнется скачка библиотеки. Затем в самом начале кода пишем:
import random
Этой строчкой мы подключаем библиотеку random, которая умеет генерировать случайные числа. Больше о этой библиотеке можно узнать по ссылке: https://ps.readthedocs.io/ru/latest/random.html, специально для вас нашел гайд на русском.
Я создал очень простую команду, которая умеет генерировать случайное число от 0 до числа, которого мы зададим сами:
@bot.command() async def randoms(ctx, arg): try: a = random.randint(0, int(arg)) except: await ctx.send(f'Ошибка') return await ctx.send(f'Ваше случайное число: a>')
Точно так-же говорим о том что ниже будет команда с помощью строчки @bot.command. Напоиманаю, что bot — это перемеенная, которую мы создали в самом начале. Это наше «тело» для бота. Дольше создаем асинхронную функцию randoms. Почему не random? Потому что название функции не может совпадать с названием библиотеки. Дальше мы передаем 2 аргумеента: ctx и arg. В arg поместиться наше число, которое мы будем задавать. Дальше я использую try, вы спросите зачем? Всё просто. Если мы случайно укажем вместо числа какой-то другой символ, бот в чате выдаст ошибку. Затем мы создаем переменную a — это наше сгенерированное число. Как генерировать числа с помощью библиотеки random вы сможете найти выше по ссылке. Дальше с помощью await ctx.send мы выводим наше число.
Есть еще очень классная «фича» в библиотеке discord.py как стили embed. Их обычно используют для красивого вывода какой либо информации на экран. Например команды help обычно делают с использованием этого стиля. Я создал небольшую и довольно простую функцию, которая называется menu. В неё мы например можем записать каждую команду в боте и указать что она делает. Вот что у меня получилось:
@bot.command() async def menu(ctx): embed = discord.Embed(color=0xff9900, title='Help menu') embed.add_field(name='hello', value='bot say you hi!', inline=True) await ctx.send(embed=embed)
Некоторые строчки я буду пропускать, потому что я их свойства и значения я объяснял выше. В любом случае если вы что-то не поняли я оставлял ссылку на доп. информацию в самом конце гайда. Для начала мы задаем переменную embed, в которой мы будем хранить сам «embed», а так-же его значения. Color — цвет, title — текст, который будет являться «названием». В них мы записываем нужны нам значения. Кстати в color мы так-же можем записывать цвет словами, например «yellow», «white» и так далее. Дальше мы прописываем add_field, эта штука добавляет нам новую «строку» для «embed». В значение name мы записываем имя строки, в value — значение ну и в inline указываем True или False, она меняет расположение строки. Советую поиграться и выбрать самый оптимальный для вас вариант. Последней строчкой в значении embed мы просто указываем переменную, которую мы задали в начале функции.
Есть еще несколько вещей, которые я хотел бы разобрать, но это я сделаю в будущем
На этом я закончу свой краткий гайд по созданию бота для дискорда. Дальше только чтение документации, которую вы можете найти по ссылке: https://discordpy.readthedocs.io/en/latest/index.html#getting-started
На моём GitHub вы сможете найти open-code с полным комплектом функций, которые я здесь описал. Если возникли какие-либо вопросы или предложения, меня можно найти в Discord. Мой профиль — MishaSok#6723. Спасибо за то что воспользовались или хотя бы прочли мой гайд.
P.S Возможно, я когда нибудь дополню этот гайд дополнительными интересными командами и ивентами.
Как создать Discord-бота на Python. (Discord.py)
Приветик всем!
С вами я, Данил. Сегодня, мы с вами создадим своего собственного бота на языке программирования Python. Если кто не знает, что такое Python, почитать можно по ссылке:
7.1K открытий
Что ж, если вы все готовы, то начинаем!
Во первых, импортируем библиотеку которая называется Discord (Discord.py).
Для этого напишем вот такой простенький скрипт:
Там нажимаем кнопку New Application.
Ну что, удачи! Всем пока!
10 комментариев
Написать комментарий.
Окей. В следующий раз попробую немного поподробнее рассказать. Всё для вас дорогие читатели. 🙂
Развернуть ветку
Аккаунт удален
Развернуть ветку
Аккаунт удален
Развернуть ветку
а нет инструкции или ссылки, как мне можно, используя, например, URLs из текстового сайта, сохранить все файлы себе на компьютер (на любом диске, это неважно), но при этом сохранив внутреннюю структуру подпапок и файлов?
идеально:
я указываю путь на локально компе к текстовому файлы, содержимое которого, — строки внешних URLs, ведущие к файлам
скрипт должен создать массив всех ссылок, скачать каждый файл и сохранить их, используя относительный адрес, локально, чтобы сохранилась структура
после выполнения скрипта, например, на диске D создать папку site с содержимым:
file1
file4
folder1/file1
folder2/file2
folder3/file3
то есть, это такой себе парсер, используя текстовый файл
—
если есть готовые варианты, когда вместо текстового файла используется браузер, тоже подходит. просто в таком случае, мне кажется, что нужно использовать драйвер браузера типа как для селениума, чтобы эмулировать его работу и сохранять все get запросы в виде url (ибо банально один javascript файл может инициировать другие запросы друг за другом только во время загрузки iframe, например). короче говоря, я не совсем в таком случае понимаю, как, имея одну ссылку после загрузки которой идет обращение к множеству файлов вытащить весь список этих урлов программно. потому я подумал, что текстовик с готовым набором будет попроще для подобного парсера для начала
Бот для Discord API на Python (discord.py) с командами

Сегодня разберём создание бота для популярной соцсети Discord. Эта платформа предназначена для общения посредством голосовых чатов и сообщений и чем-то схожа с телеграмом.
Недавно я столкнулся с задачей написания подобного бота. Поскольку на просторах интернета, нет внятных гайдов, решил сделать свой. Про официальную документацию можно не говорить, там чёрт ногу сломит. В YouTube охватывают лишь самое начало. Я постараюсь более детально погрузиться в discord.py и работу с Discord API.
Структура проекта и установка библиотек
- Компьютер или ноутбук
- Редактор кода (Notepad++ тоже подойдет).
- Python версии 3.9 и выше.
- Соединение с интернетом
Установка для Windows:
pip install discord.py
Установка для MacOS:
pip3 install discord.py
+---discord | +---cogs | | +---everyone.py | | +---logs.py | | \---moder.py | +---config.py | \---main.py
Структура максимально простая, все модули для обработки команд будут храниться в директории cogs. Остальное можно структурировать как угодно.
Создание бота и получение токена
Заходим на этот сайт https://discord.com/developers/docs/intro и нажимаем на «applications». После проходим авторизацию (видео инструкция тут ).

Создаем новое приложение:

Дальше переходим во вкладку Bot и создаем бота. Тут вы сможет создать и скопировать токен:

После всех манипуляций выбираем уровень доступа для бота — administrator.
Как добавить бота на сервер
Переходим во вкладку OAuth2 General, ставим такие настройки и сохраняем:

Потом переходим в URL General, выбираем те же самые настройки и копируем ссылку ниже:

Переходим по ссылке и выбираем на какой сервер хотим добавить бота. Добавлять можно только на тот сервер, который вы администрируете (у вас есть права администратора на нем). Дальше следуем иструкциям Discord.

Разработка бота
Main.py
import asyncio import os import discord from discord.ext import commands import config
Подробнее остановимся на commands и config .
В commands будет инициализироваться и храниться бот. В дальнейшем через этот объект класса будем обращаться к методам.
Config – там будут храниться все глобальные переменные — токены, ID каналов, ID ролей и т д.
discord_intents = discord.Intents.all() discord_intents.members = True
discord_intents – мы наделяем бота полными правами доступа (когда будем добавлять его, то он запросит разрешение для управления)
bot – тут собирается бот. Аргументы: command_prefix — на какой спец символ будет откликаться бот; intents — права доступа.
discord_intents = discord.Intents.all() discord_intents.members = True bot = commands.Bot(command_prefix=config.prefix, intents=discord_intents) bot.remove_command("help") @bot.event @commands.has_any_role(*config.admin_id_role) async def on_ready(): await bot.change_presence(status=discord.Status.idle, activity=discord.Game(config.prefix+"info")) await bot.wait_until_ready() @bot.command() @commands.has_any_role(*config.admin_id_role) async def load(ctx, extension): bot.load_extension(f"cogs.") print(f"load module: cogs.") @bot.command() @commands.has_any_role(*config.admin_id_role) async def unload(ctx, extension): bot.unload_extension(f"cogs.") print(f"unload module: cogs.") @bot.command() @commands.has_any_role(*config.admin_id_role) async def reload(ctx, extension): bot.unload_extension(f"cogs.") bot.load_extension(f"cogs.") print(f"reload module: cogs.") async def load_extensions(): for filename in os.listdir("./cogs"): if filename.endswith(".py"): await bot.load_extension(f"cogs.") async def main(): print('zit goot') await load_extensions() await bot.start(config.token) if __name__ == "__main__": # bot.run(config.token) asyncio.run(main())
Пробежимся по функциям.
On_ready – срабатывает при загрузке бота. bot.change_presence — тут мы устанавливаем активность (Discord может показывать во что вы сейчас играете).
Дальше подгружаются все винтики. Почему пакеты в Discord называют винтики? Потому что в официальной документации разработчики назвали именно так;)
Load и unload — позволяют отключить и подключить винтики. Загрузка происходит с помощью обращения к методам объекта бота.
Reload — по сути вызывает по очереди unload и load.
Цикл for перебирает все файлы и загружает их в первый раз.
Ну и в конце мы запускаем бота, передавая в него токен.
Config.py
token = '12345' prefix = '!' recurring_guild_id = 1234 admin_id_role = '938435735701311538' id_mute_role = '938437343751319613' id_user_role = '938437452920672327'
Этот файл будет хранить в себе только служебные переменные — токены, ID ролей, ID серверов.
Директория cogs
Everyone.py
import discord import time import config from discord.ext import commands class Everyone(commands.Cog): def __init__(self, bot): self.bot = bot @commands.Cog.listener() async def on_ready(self): print('everyone is ready') @commands.command() async def info(self, ctx): embed = discord.Embed(title=f">> Команды ", icon_url=f"") embed.add_field(name=f"***mute*** --- отключить возможность говорить и писать человеку", value=f"Пример: mute @1234", inline=False) embed.add_field(name=f"***unmute*** --- вернуть все возможности человку", value=f"Пример: unmute @1234", inline=False) embed.add_field(name=f"***ban*** --- добавить человека в черный список и выгнать", value=f"Пример: ban @1234", inline=False) embed.add_field(name=f"***unban*** --- убрать человека из чероного списка", value=f"Пример: unban @1234", inline=False) embed.add_field(name=f"***kick*** --- выгрнать человека", value=f"Пример: kick @1234", inline=False) embed.add_field(name=f"***clear*** --- удалить последние сообщения", value=f"Пример: clear 40", inline=False) embed.set_footer(text=f"BOT • ") await ctx.channel.purge(limit=1) await ctx.send(embed=embed) async def setup(bot): await bot.add_cog(Everyone(bot))
В этом файле будут храниться все команды доступные обычному пользователю. Импорты отдельно разбирать не буду, там и так все понятно.
Вероятно, вы спросите что это за класс. Everyone наследуется от commands.Cog . Винтики работают за счёт объектов — когда мы запускаем бота, то перебираем все объекты и собираем всё вместе.
Для отслеживания команд мы используем декоратор commands.command() . Для корректной работы при создании класса мы передаём в него нашего бота. Дальше описываем в методах логику.
Функция info будет высылать пользователю embed (сообщение) с указанием доступных команд. Внутрь функции передаем ctx (полное его название context) — это полученное сообщение.
Мы создаем объект, в который передаем: заголовок, свет линии с краю, подпись автора и ссылку на изображение. Дальше, обращаясь к методу add_field , добавляем строки с именем и значением — можно их назвать заголовок и текст.
Метод set_footer добавляет маленькую подпись в конце сообщения. В завершение мы обращаемся к await ctx.channel.purge(limit=1) , что удаляет одно сообщение (можно указать любое количество в limit). Await позволяет нам дождаться окончания асинхронного метода.
После этого отправляем сообщение с помощью await ctx.send(embed=embed) , передавая внутрь сформированное сообщение. Или можно просто отправить текст await ctx.send(text=”your message”) .
Эта конструкция нужна библиотеке, что бы она могла увидеть и загрузить винтик:
async def setup(bot): await bot.add_cog(Everyone(bot))
Удобный конструктор embed, который сразу выдает python код, находится тут .
Moder.py
import discord import time from discord.ext import commands import config class Moder(commands.Cog): def __init__(self, bot): self.bot = bot @commands.Cog.listener() async def on_ready(self): print('moder is ready') @commands.command() @commands.has_any_role(config.admin_id_role) async def mute(self, ctx, user: discord.Member, reason=None): channel = self.bot.get_channel(config.log_mes_channel_id) guild = self.bot.get_guild(config.recurring_guild_id) role = guild.get_role(config.id_mute_role) embed = discord.Embed(title=f"Пользователя заглушили", color=0xfac400) embed.set_author(name=f"", icon_url=f"") embed.add_field(name="Причина:", value=f"", inline=True) embed.set_footer(text=f"BOT • ") await user.add_roles(role) await channel.send(embed=embed) await ctx.channel.purge(limit=1) await ctx.send(embed=embed, delete_after=30) @commands.command() @commands.has_any_role(config.admin_id_role) async def unmute(self, ctx, user: discord.Member): channel = self.bot.get_channel(config.log_mes_channel_id) guild = self.bot.get_guild(config.recurring_guild_id) role = guild.get_role(config.id_mute_role) embed = discord.Embed(title=f"Пользователя разглушили", color=0xfac400) embed.set_author(name=f"", icon_url=f"") embed.set_footer(text=f"BOT • ") await user.remove_roles(role) await channel.send(embed=embed) await ctx.channel.purge(limit=1) await ctx.send(embed=embed, delete_after=30) @commands.command() @commands.has_any_role(config.admin_id_role) async def ban(self, ctx, user: discord.Member, *, reason=None): channel = self.bot.get_channel(config.log_mes_channel_id) embed = discord.Embed(title=f"Пользователя забанили", color=0xfac400) embed.set_author(name=f"", icon_url=f"") embed.add_field(name="Причина:", value=f"", inline=True) embed.set_footer(text=f"BOT • ") await channel.send(embed=embed) await user.ban(reason=reason) await ctx.channel.purge(limit=1) await ctx.send(embed=embed, delete_after=30) @commands.command() @commands.has_any_role(config.admin_id_role) async def unban(self, ctx, *, member): banned_users = await ctx.guild.bans() channel = self.bot.get_channel(config.log_mes_channel_id) member_name, member_discriminator = member.split("#") for ban_entry in banned_users: user = ban_entry.user if (user.name, user.discriminator) == (member_name, member_discriminator): await ctx.guild.unban(user) embed = discord.Embed(title=f"Пользователя разбанили", color=0xfac400) embed.set_author(name=f"", icon_url=f"") embed.set_footer(text=f"Silence. • ") await channel.send(embed=embed) await ctx.channel.purge(limit=1) await ctx.send(embed=embed, delete_after=30) return @commands.command() @commands.has_any_role(config.admin_id_role) async def kick(self, ctx, user: discord.Member, *, reason=""): channel = self.bot.get_channel(config.log_mes_channel_id) embed = discord.Embed(title=f"Пользователя выгнали из сервера", color=0xfac400) embed.set_author(name=f"", icon_url=f"") embed.add_field(name="Причина:", value=f"", inline=True) embed.set_footer(text=f"BOT • ") await channel.send(embed=embed) await ctx.channel.purge(limit=1) await ctx.send(embed=embed, delete_after=30) await user.kick() @commands.command() @commands.has_any_role(config.admin_id_role) async def clear(self, ctx, amount=20): channel = self.bot.get_channel(config.log_mes_channel_id) if amount < 200: embed = discord.Embed(title=f"Очистил чат \"\" на сообщений(ия)", color=0xfac400) embed.set_author(name=f"", icon_url=f"") embed.set_footer(text=f"BOT • ") await ctx.channel.purge(limit=int(amount)) await channel.send(embed=embed) await ctx.send(embed=discord.Embed(description=f":wheelchair: удалено сообщений(я)"), delete_after=30) else: await ctx.send(embed=discord.Embed(description=f":Вы не можете удалить больше 200 сообщений"), delete_after=30) async def setup(bot): await bot.add_cog(Moder(bot))
Пройдёмся по функциям сверху вниз.
@commands.has_any_role(config.admin_id_role) - это новый декоратор, он проверяет есть ли у пользователя роль (нужен ID роли). Также можно указывать перечень ролей в массиве (для этого распаковывайте массив).
Mute принимает в себя само сообщение, пользователя (пример @user), и причину. Первым делом мы заготавливаем объект чата, в который будем присылать действия администратора. Потом сам сервер (в документации discord.py сервер называется гильдия). И в конце получаем роль, которую будем давать пользователю.
Когда всё готово, собираем сообщение-уведомление (не забывайте пользоваться конструктором embed тут ). Дальше к объекту пользователя добавляем роль. И отправляем сообщение в логи и в чат, откуда пришла команда. Не забываем удалять отправленную команду.
Unmute зеркальна с функций mute, только для пользователя мы используем метод remove role .
Ban - выгоняет пользователя с сервера и добавляет его в черный список (в дальнейшем его не смогут пригласить на сервер пока он в ЧС).
Для работы в переменных нам потребуется только канал для системы логов. Следом проходим процедуру сборки красивого сообщения и отправляем его как в mute.
Unban - не просто зеркальная функция, потому что тут нам потребуется обращаться к списку ЧС. banned_users делает запрос к ЧС сервера. Дальше мы делаем полный перебор всех заблокированных и сравниваем с нашим пользователем. Как только находим его, убираем юзера из списка и выводим сообщение о разблокировке.
Kick - с этой функций дела обстоят намного проще, так как у пользователя есть метод для изгнания user.kick .
Clear - последняя возможность для администрирования. В нее поступает не только сообщение, но и количество сообщений, которое нужно удалить. Дальше идет защита от опечатки.
ctx.channel.purge(limit=int(amount)) отвечает за удаление сообщений, в limit передаем полученное значение.
Заключение
Библиотека discord.py не проста в понимании и требует много времени на разбор. Но лучших аналогов для Python не найти из-за обширности API.
Если захотите разобраться глубже, самостоятельно изучайте новые методы и классы. Производите глубокий анализ, что откуда исходит (какой вы получаете объект в ответе и как его можно получить еще).
Для дальнейшего развития советую попытаться добавить в бота интеграцию с базой данных. Например есть хорошая БД MongoDB - на ней можно простроить мощную многоуровневую систему администрирования сервера.
