Сегодня мы создадим Discord бота на Python, для этого не надо прикладывать каких то фантастических усилий.
Для начала посещаем портал разработчиков и жмём кнопку “New Application” (“Создать приложение”), вводим название нашего будущего бота и жмём “Create” (“Создать”).
Диалоговое окно
Теперь нам нужно создать аккаунт для бота — переходим в категорию “Bot” и жмём “Add Bot” (“Добавить бота”), в появляющемся диалоговом окне подтвердим это — “Yes, do it!”.
Настройки бота
Копируем токен используя соответсвующую кнопку.
Интересный факт: Токен разделён на 3 части с помощью точек. Первая часть — зашифрованый с помощью base64 ID бота, вторая — время создания токена, третья — секретный ключ.
А сейчас нам нужно установить библиотеку discord.py. Для этого нужно использовать утилиту pip.
pip install discord.py
— обратите внимание что на дистрибутивах Linux pip
, python
являются версией 2.х, но нам нужна конкретно 3.5.3 и выше, поэтому pip
нужно будет заменить на pip3
или pip3.x
. Также если у вас появилась ошибка изза отсутсвия прав суперпользователя (администратора) вы можете использовать флаг --user
для установки библиотеки только для вашего пользователя.
“Костяк” программной части бота. Эвенты, команды
После установки библиотеки можем приступать к написанию кода.
import discord # Импортируем библиотеку from discord.ext import commands # Импортируем из фреймворка класс commands bot = commands.Bot(command_prefix='!') # Провозглашаем переменную для бота с префиксом ! # Тут мы размещаем наши команды bot.run(token='TOKEN') # Запускаем бота с вашим токеном
Запускаем бота используя python/python3 main.py
, где main.py — имя файла. Бот запустился и аутентифицировался. Теперь мы сделаем вывод сообщения в терминал при аутентификации и комманду ping.
@bot.event async def on_ready(): print(f'Logged in as {bot.user.name}') @bot.command() async def ping(ctx: commands.Context): await ctx.send('Pong!')
Давайте разбираться что это такое. Для начала — в первой строке мы видим декораторbot.event
, он обозначает программе что следующая функция будет реакцией на действие. Во второй строке мы видим саму функцию — она асинхронна.
Почему она должна быть асинхронна? Потому что возьмём для примера команду которую исполняют одновременно 2 раза разные пользователи. def
может заставить бота повиснуть изза того что она не может быть исполнена вместе с другими процессами, но async def
занимает только один поток вместо того что бы не давать другим процессам программы исполняться.
Мы видим что название функции — on_ready
, её вызывает фреймворк если бот аутентифицировался. Дальше мы печатаем “Logged in as BotName”, где BotName это значение переменной bot.user.name
, если простым языком “Имя пользователя бота”.
Дальше идёт декоратор команды bot.command()
и он уже на отличие от bot.event
может принимать такие аргументы как aliases
, hidden
но про это позже. Имя команды может быть любое кроме занятых названий и алиасов. Наша команда принимает аргумент ctx
типа commands.Context
, что же это?
Этот аргумент хранит информацию про сообщение, автора сообщения, гильдию, канал и т.п. и быть он всегда должен первым аргументом.
И что же мы делаем в ответ на команду? Мы запускаем асинхронную функцию ctx.send
что бы отправить сообщение в тот канал в котором была отправлена команда
Тестируем наш костяк
Для начала нам нужно пригласить бота на сервер — и мы возвращаемся на портал разработки, переходим в категорию OAuth2 и в поле “Scopes” отмечаем только галочку на bot и получаем приглашение.
Запускаем бота, и тестируем работает ли команда
Заключение
Полезные ссылки:
https://discord.com/developers/https://discordpy.readthedocs.io/en/latest
Возможно в следующих туториалах:
Используемые источники:
- https://habr.com/ru/sandbox/140880/