Создание бота на основе discord.py. Часть 1
Это первая статья про создание бота для Discord. В конце статьи находятся ссылки на следующие части, со временем они будут дополняться. Статьи следуют друг за другом, без каких-либо «информационных дыр». Если нашли опечатку или неточность, отпишите о проблеме в комментариях или в личных сообщениях, максимально оперативно всё поправим! А теперь переходим непосредственно к созданию бота.
В данной части
- Создание тестового сервера
- Включение режима разработчика
- Создание приложения и получение токена
- Добавление бота на сервер
- Установка библиотеки discord.py
- Первые строчки кода
Создание сервера
Гайд будет максимально подробный, поэтому и начинать будем с создания тестового сервера. Зачем он нужен? Лишь для вашего удобства и безопасности, если у вас уже есть большой сервер, тем более не стоит сразу добавлять на него разрабатываемого бота. Никто не защищён от багов и дыр в безопасности.

- Заходим в дискорд
- Слева видим список серверов, листаем в самый низ до кнопки «Создать сервер«.
- Создаём сервер по любому из предложенных шаблонов.
Включаем режим разработчика
Это необязательно, но очень желательно. В режиме разработчика появляются некоторые полезные элементы для удобства разработки, например, в меню пользователя появляется пункт, который позволяет скопировать его ID.

Чтобы включить этот режим, заходим в настройки.

В категории «Настройки приложения» ищем «Расширенные«.

И включаем режим разработчика.

Получение токена
Для начала нам нужно зайти на страницу создание приложений и нажать New Application.

После этого вам предложат назвать ваше приложение (Потом можно будет изменить).

После создания, попадаем на страницу настройки приложения. В меню выбираем «Bot«.

На данной странице нажимаем на «Add Bot«. Скопируем токен и сохраним его.

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

Добавление бота на сервер
В меню ищем пункт OAuth2 –> URL Generator.

В поле SCOPES выбираем bot и applications.commands. В появившемся ниже поле выбираем Administrator, это более удобно для тестирования. Но когда бот будет работать в продакшене, лучше выставлять только те права, которые правда нужны, потому что никто не защищён от потери токена, а с правами администратора это может стать очень большой проблемой.

Копируем появившеюся ниже ссылку и вставляем в адресную строку браузера. Если у вас не выполнен вход в браузере, его необходимо произвести. После чего выбираем тестовый сервер из списка и нажимаем «Продолжить» и далее «Авторизовать«.

Ура! Наш бот на тестовом сервере!

Установка библиотеки
Для начала нужно установить python, данный этап не расписан, но желательно установить версию 3.10 (Последняя версия на момент написания 3.10.5). Если у вас Windows, для проверки можете использовать следующую команду
py --version
В ответ получите версию вашего python. Устанавливать будем не стабильную, а разрабатываемую версию, для этого пропишем следующую команду. (Это можно делать уже внутри проекта). Хотя некоторые IDE устанавливаю git вместе с собой, можете скачать его отдельно.
py -m pip install git+https://github.com/rapptz/discord.py
Если всё же хотите установить стабильную, релизную версию, пропишите следующую команду.
py -3 -m pip install -U discord.py py -3 -m pip install -U discord.py[voice]
Подробнее про установку библиотеки и саму библиотеку можно прочитать тут.
Первые строчки кода
Пришло время писать код! Программирование в статьях будет происходить в PyCharm, хоть это и довольно тяжёлая IDEA, она удобная и бесплатная для студентов.
Не советую создавать проект через внутренний интерфейс, может появиться множество ненужных папок и файлов, вместо этого создадим папку проекта вручную и откроем как пустой проект.
Для этого заходим в PyCharm, далее File –> Open.

P.s. Не обращайте внимания на другую тему IDE.
В появившемся окне ищем созданную папку, выбираем её и нажимаем «Ok«. Обратите внимание на то, что нужно просто нажать по папке, а не проваливаться в неё.

Если PyCharm автоматически не создал main.py, создайте его вручную.
Вставляем код ниже и запускаем.
import discord # Подключаем библиотеку from discord.ext import commands intents = discord.Intents.default() # Подключаем "Разрешения" intents.message_content = True # Задаём префикс и интенты bot = commands.Bot(command_prefix='>', intents=intents) # С помощью декоратора создаём первую команду @bot.command() async def ping(ctx): await ctx.send('pong') bot.run('token')

В консоли вы увидите логи запуска бота. Они могут быть красными, не бойтесь, сначала прочитайте сами сообщения, они скорее, всего просто информационные.

Идём в дискорд и используем нашу первую команду.

Немного объясним данную структуру. Поскольку это обычная команда, вся информация хранится в ctx(Переменная одноимённого класса). Она имеет следующие поля:
['args', 'author', 'bot', 'channel', 'cog', 'command', 'command_failed', 'guild', 'invoked_parents', 'invoked_subcommand', 'invoked_with', 'kwargs', 'me', 'message', 'prefix', 'subcommand_passed', 'valid', 'voice_client']
И следующие команды:
['fetch_message', 'history', 'invoke', 'pins', 'reinvoke', 'reply', 'send', 'send_help', 'trigger_typing', 'typing']
Если вы знакомы с синтаксисом языка, то данный список можно получить с помощью встроенной функции dir.
print(dir(ctx))
На более правильно прочитать документацию про Context.
Заключение
Сразу отвечу всем комментаторам. Да — подобных статей море, в том числе есть официальная документация. Но поскольку в моих планах есть создать серию статей, я хотел бы, что бы в них было описано всё, начиная с самых азов.
И небольшое примечание. Статьи строятся на основании того, что у вас есть опыт и знания программирования на python.
Создаём Discord-бота на Python
Сегодня мы напишем Discord-бота с помощью Python и discord.py. А также посмотрим на примеры ботов.
Всем привет, сегодня мы напишем Discord-бота на Python и discord.py + бонусом посмотрим на примеры ботов. Приступим ?
Перед работой
Перед тем, как начать, вам нужны:
- Python 3;
- discord.py;
- Discord-аккаунт и свой сервер.
Для установки discord.py воспользуйтесь пакетным менеджером:
pip3 install discord.py
Создаём нашего бота
Перейдите на Developer Portal и нажмите на New application.
Вы создали своё приложение, на странице приложение перейдите в Bot >> Add Bot и создайте своего Discord-бота.
Сохраните токен бота! Дальше он нам понадобится!
Если всё прошло успешно, поздравляю, половина дела сделана ?
Добавление бота на сервер
Теперь можно добавить бота на сервер.
Перейдите в OAuth2 >> URL Generator, в Scopes выбираем Bot и ниже — права бота, копируем сгенерированный URL. Вставляем в браузер, и добавляем на наш сервер.
Эхо-бот
Напишем традиционного эхо-бота, и разберём каждую строчку кода.
import discord from discord.ext import commands config = < 'token': 'your-token', 'prefix': 'prefix', >bot = commands.Bot(command_prefix=config['prefix']) @bot.event async def on_message(ctx): if ctx.author != bot.user: await ctx.reply(ctx.content) bot.run(config['token'])
import discord from discord.ext import commands
Нужные нам импорты.
config =
Вспомогательный словарь config в котором храним токен и префикс команд (далее расскажу зачем нужен префикс команд).
bot = commands.Bot(command_prefix=config['prefix'])
Создаём нашего бота, в аргументе передаём префикс.
@bot.event
Декоратор, предназначенный для обработки событий, подробнее здесь.
async def on_message(ctx):
Создаём асинхронную функцию, с параметром ctx, представляет из себя сообщение.
if ctx.author != bot.user:
Проверка, не является ли автор сообщения нашим Discord-ботом. Дело в том, что если бот отправит сообщение, это будет новым событием, и тогда получается цикл.
await ctx.reply(ctx.content)
Отвечаем на сообщение (ctx.reply), в аргументы передаём сообщение (ctx.content).
bot.run(config['token'])
Запускаем нашего бота, в аргументы передаём токен бота.
Надеюсь вы разобрались с кодом, и мы можем переходить далее.
Обработка команд
Перед тем, как обрабатывать команды, нам пригодится наш префикс.
import random import discord from discord.ext import commands config = < 'token': 'your-token', 'prefix': '$', >bot = commands.Bot(command_prefix=config['prefix']) @bot.command() async def rand(ctx, *arg): await ctx.reply(random.randint(0, 100)) bot.run(config['token'])
@bot.command()
Декоратор обработки команд
async def rand(ctx, *arg):
Асинхронная функция rand
await ctx.reply(random.randint(0, 100))
Отвечаем на сообщение, в аргументы передаём случайное число от 0 до 100
Бонус
import random import discord from discord.ext import commands config = < 'token': 'your-token', 'prefix': '$', >bot = commands.Bot(command_prefix=config['prefix']) @bot.command() @commands.has_role("Хозяин") async def rand(ctx, *arg): await ctx.reply(random.randint(0, 100)) bot.run(config['token'])
import discord from discord.ext import commands config = < 'token': 'your-token', 'prefix': '$', >bot = commands.Bot(command_prefix=config['prefix']) @bot.command() async def kick(ctx, user : discord.User(), *arg, reason='Причина не указана'): await bot.kick(user) await ctx.send('Пользователь был изгнан по причине ""') bot.run(config['token'])

Следите за новыми постами по любимым темам
Подпишитесь на интересующие вас теги, чтобы следить за новыми постами и быть в курсе событий.
Создание discord-ботов на Python
В этой статье мы создаем своего дискорд-бота на боксе с нуля.
Подготовка
Предварительные действия на боксе такие же, как и в нашей статье про Telegram:
- выбираем бокс
- создаем пользователя
- настраиваем окружение
Регистрация бота
Создание бота происходит в два этапа на сайте мессенджера. Сначала создаем приложение: «Разработчикам»(в футере) → «Applications», нажимаем кнопку «New Application» в правой верхней части страницы:

Выбираем имя приложения (выбирайте мудро, хоть его и можно изменить позже):

Готово. Здесь можно переименовать приложение, дать описание, загрузить аватарку:

Теперь добавим к нему бота. В меню слева вкладка «Bot» → «Add Bot» → «Yes, do it!».
Токен бота можно получить по кнопке Copy:

Если вдруг токен попал не только в ваши руки, его всегда можно заменить кнопкой Regenerate.
Добавление бота на сервер
Переходим на вкладку «OAuth2» и создаем для него свой URL для приглашения:

Чуть ниже выбираем права для бота. Если это бот для администрирования сервера, то можно, конечно, выбрать «Administrator», но нужно быть осторожными с этим.
Выдаем права, действительно нужные боту для администрирования сервера:

Теперь бота можно добавить на сервер. Копируем ссылку и открываем её в браузере. В диалоговом окне выбираем сервер:

Проверяем его привилегии:

Всё, бот на сервере:

Код бота
Активируем виртуальное окружение и ставим нужную библиотеку:
bot@box-48639:~$ source python/bin/activate (python) bot@box-48639:~$ pip install discord
Добавляем директорию для бота, не выходя виртуального окружения:
(python) bot@box-48639:~$ mkdir discobot
Создаем конфиг бота:
(python) bot@box-48639:~$ vim discobot/config.py
Наполняем его содержимым
settings =
- token — токен бота
- bot — имя бота
- id — application ID: он находится под описанием приложения, в разделе «General Information»
- prefix — если сообщение на сервере начинается с этого символа, бот воспримет его как свою команду.
Дальше код бота. Создаем bot.py и сразу редактируем его vim’ом:
(python) bot@box-48639:~$ vim discobot/bot.py
Первыми строками активируем виртуальное окружение и импортируем нужные модули:
import os, sys activate_this = '/home/bot/python/bin/activate_this.py' with open(activate_this) as f: exec(f.read(), ) import discord from discord.ext import commands from config import settings
Обозначаем боту, с какого символа начинаются его команды:
bot = commands.Bot(command_prefix = settings['prefix'])
И создаем первую команду — бот будет отправлять реплай с текстом “I’M ALIVE!” на сообщение “!status”:
@bot.command() async def status(ctx): await ctx.reply('I\’M ALIVE!')
Добавляем в код функцию запуска:
bot.run(settings['token'])
Закрываем редактор и запускаем бота:
(python) bot@box-48639:~$ python discobot/bot.py
Отправим сообщение в Discord:

Код бота целиком:
import os, sys activate_this = '/home/bot/python/bin/activate_this.py' with open(activate_this) as f: exec(f.read(), ) import discord from discord.ext import commands from config import settings bot = commands.Bot(command_prefix = settings['prefix']) @bot.command() async def status(ctx): author = ctx.message.author await ctx.reply('I\'M ALIVE!') bot.run(settings['token'])
Запуск бота
Создаем Linux-демона — он будет следить, что бот работает. Открываем файл (mlg, если нужно, меняем на своё имя сервиса):
root@box-48639:~# vim /etc/systemd/system/mlg.service
Добавляем в него строки:
[Unit] Description=Noscope Bot After=syslog.target After=network.target [Service] Type=simple User=bot WorkingDirectory=/home/bot/discobot ExecStart=/usr/bin/python3 /home/bot/discobot/bot.py Restart=always [Install] WantedBy=multi-user.target
И запускаем демона:
root@box-48639:~# systemctl daemon-reload root@box-48639:~# systemctl enable mlg root@box-48639:~# systemctl start mlg
Проверить, что всё работает, можно так:
root@box-48639:~# systemctl status mlg
● mlg.service - Noscope Bot Loaded: loaded (/etc/systemd/system/mlg.service; enabled; vendor preset: enabled) Active: active (running) since Wed 2021-05-05 16:34:46 MSK; 7s ago Main PID: 307021 (python3) Tasks: 3 (limit: 2344) Memory: 21.4M CGroup: /system.slice/mlg.service └─307021 /usr/bin/python3 /home/bot/discobot/bot.py
Дополнение кода бота
Бот улучшается в два этапа:
- добавляем код в файл бота
- перезапускаем бота
Для примера добавим в бота какое-нибудь рандомное API. Открываем файл бота:
bot@box-48639:~$ vim ~/discobot/bot.py
И добавляем в него пару библиотек и ещё одну функцию обработки команд:
import json import requests @bot.command() async def meme(ctx): response = requests.get('https://some-random-api.ml/meme') json_data = response.json() embed = discord.Embed(title = json_data['caption']) embed.set_image(url = json_data ['image']) await ctx.send(embed = embed)
Закрываем файл и перезапускаем демона, чтобы изменения вступили в силу:
root@box-48639:~# systemctl restart mlg
Результатом будет рандомный мем:

Готово! Боты в Discord умеют многое, и мы можем и дальше расширять его возможности, изучая документацию.
Полезные ссылки
- Официальная документация Discord
- Документация discord.py
- GitHub разработчиков модуля
Бот для 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 - на ней можно простроить мощную многоуровневую систему администрирования сервера.