Все шутки намерены. Все отсылки не случайны.
Мы прекрасно понимаем, что всему этому есть рабочие аналоги, но наша цель не изобрести варп-двигатель, а показать, как собирать велосипед.
p.s. варп-двигатель нам все-таки пригодился бы.
Дискорд-боты, боты, боты...
Ботов становится все больше и больше. Их создают под разные нужды ради автоматизации нудной и повторяющейся работы. В основном боты в Discord выполняют роль модератора сервера, но к ним можно прикрутить разные функции, например, по команде присылать мем дня или прогноз погоды в Шанхае.
В этой статье разберем создание бота на сервере Спринтбокс.
EXEC.START()
Подготовительные действия на боксе такие же, как и в нашей статье про Telegram из Базы знаний. Почитайте на досуге, там расписано начало работы на сервере.
Как и шо делать-то?
Расскажем как заполучить своего бота.
Делается это на сайте Discord на странице приложения. Если хочется найти путь самостоятельно, то вот вам небольшая путеводная подсказка: Главная discord.com → «Разработчикам» (в футере) → «Applications».
Далее выбираем имя нашему боту (выбирай мудро, мой юный падаван):
Наше замечательное приложение готово:
Затем вкладка «Bot» → «Add Bot» → «Yes, do it!».
А токен где?
Токен бота можно получить по кнопке «Copy».
Токен — это уникальный набор символов бота. Никому не показывайте его, иначе кто-нибудь злой и плохой получит доступ к вашему творению.
Если вдруг токен попал не только в ваши руки, его всегда можно заменить кнопкой «Regenerate». Пока что токен вам не нужен, отложите его в сторону. Давайте сначала добавим бота на сервер.
Двигайтесь сюда, милорд
Чтобы бота можно было добавить на свой прекрасный сервер, нужно перейти на вкладку «OAuth2» и создать для него свой URL для приглашения
Чуть ниже можно настроить права для бота. Если это бот для администрирования сервера, то можно, конечно, выбрать «Administrator», но будьте осторожны с этим!
Лучше выдать только нужные для администрирования сервера права, как тут например:
После того, как права будут заданы, бота можно добавить на сервер.
Скопируйте ссылку и откройте её в браузере, после чего нужно будет выбрать сервер, на который добавить бота:
Также нужно будет проверить его привилегии:
Всё, бот на сервере:
На этом с вводной частью мы закончили. Время накодить чего-нибудь.
А как кодить?
Отточенным движением руки активируем виртуальное окружение и ставим нужную библиотеку:
bot@box-48639:~$ source venv/bin/activate
(venv) bot@box-48639:~$ pip install discord
Не лишним будет создать директорию для бота. Сделать это можно из-под виртуального окружения:
(venv) bot@box-48639:~$ mkdir discobot
Теперь нам нужен конфиг:
(venv) bot@box-48639:~$ vim discobot/config.py
Редактируем файл:
settings = {
'token': ‘Тут должен быть токен',
'bot': 'My Awesome Bot',
'id': тут ID приложения без(!) кавычек,
'prefix': '!'
}
Теперь немного пояснений, что же у нас находится в настройках:
token — собственно токен бота
bot — имя нашего бота
id — это application ID, где он находится можно посмотреть на скриншоте выше, сразу после создания приложения (на самом деле он может и не пригодиться при работе бота, но лучше иметь его под рукой)
Ну и код бота, традиционно создаём bot.py или же сразу редактируем его vim’ом:
(venv) bot@box-48639:~$ vim discobot/bot.py
Для начала активируем виртуальное окружение и импортируем всё, что нам нужно:
import os, sys
activate_this = '/home/bot/venv/bin/activate_this.py'
with open(activate_this) as f:
exec(f.read(), {'__file__': activate_this})
import discord
from discord.ext import commands
from config import settings
Обозначим боту, с какого символа начинаются его команды:
bot = commands.Bot(command_prefix = settings['prefix'])
И теперь обработаем нашу первую команду:
@bot.command()
async def status(ctx):
await ctx.reply('I\’M ALIVE!')
Несложно догадаться, что бот будет отправлять реплай с текстом “I’M ALIVE!” на сообщение “!status”.
До запуска бота остался всего один(два) шаг(а) — собственно, запуск бота. Добавим в код функцию запуска:
bot.run(settings['token'])
Ну и запустим его уже наконец (во имя дискорд-ботов!):
(venv) bot@box-48639:~$ python discobot/bot.py
IT’S ALIVE!
Полный код бота можно посмотреть тут.
Чёрная магия
Теперь призовём Linux-демона для того, чтобы тот следил, что бот работает. Ритуал призыва начинается так:
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. Нужно будет импортировать ещё пару библиотек и добавить ещё одну функцию обработки команд:
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.py, их GitHub и официальная документация Discord.
Еще больше инструкций можно найти в Базе знаний Спринтбокс. Там же можно взять себе VPS/VDS под любые нужды и желания, хоть сервер Майнкрафта установить.