Иметь свой сервер в Discord уже не является чем-то необычным, сейчас сервера есть у всех – от простых руководителей гильдий, до авторов крупных игровых проектов. И не только игровых. У всех владельцев серверов в Discord есть одна необходимость – поддерживать порядок и безопасность на сервере, а также предоставлять участникам возможности, необходимые в рамках тематики. Сейчас в Discord существует множество ботов, которые могут модерировать сообщения, контролировать соблюдение правил участникам, включать музыку, выполнять различные команды и прочее. Но в этой статье мы остановимся на том, как сделать свой бот в Discord, который будет выполнять определенные действия на вашем сервере.
Создаем приложение в Discord Developer Portal
Перед написанием кода для бота, создадим приложение и бота в самом Discord. Для этого сначала переходим по этой ссылке, авторизуемся, нажимаем “New Application”. В появившемся окошке вы заполняете название вашего будущего приложения, ставите галочку соглашения и нажимаете “Create”. Дальше вы можете установить иконку для приложения и указать описание. Обратите внимание, что указанное здесь описание – станет описанием в профиле будущего бота. А вот иконка у бота отдельная, так что здесь ее можно пока не ставить. Далее переходим на вкладку “Bot”:
Здесь вы увидите автоматически созданный юзернейм, который вы можете поменять на свой. Система новых юзернеймов пока не дошла до ботов, поэтому пока что юзернейм и имя бота, это одно и то же. Вы можете установить иконку для бота, а также выполнить некоторые настройки. Если ваш бот будет только для вашего сервера, снимите галочку “Public Bot”. Если функционал вашего бота будет связан с чтением сообщений в каких-либо чатах сервера и работой с пользователями, лучше сразу установите 2 галочки: “Server Members Intent” и “Message Content Intent”. После этого нажмите “Reset Token” и сохраните куда нибудь полученный токен, он нам понадобится чуть позже.
Добавляем бот на ваш сервер
Переходим на вкладку OAuth2 и выбираем URL Generator.
В “Scopes” выбираем только одно – bot. После выбора появится раздел “Bot Permissions”, там вы должны выбрать необходимые разрешения для своего бота, в соответствии с тем, что он в будущем должен будет делать. Если не уверены, что выбрать – выберите “Administrator”.
Теперь скопируйте внизу страницы полученную ссылку, перейдите по ней и у вас появится окно, где вы сможете выбрать, на какой из ваших серверов добавить бота.
Подготавливаем библиотеку и PHP скрипт
Для создания ботов в Discord на PHP, я использую RestCord. С этой библиотекой все довольно таки просто и понятно. Для установки нам потребуется PHP 7+ и Composer. Выполните следующую команду, находясь в директории вашего проекта:
composer require restcord/restcord
Далее, создайте тестовый PHP скрипт и подключите скрипт автозагрузки:
<?php
require __DIR__ . '/vendor/autoload.php'; // измените путь в соответствии с вашим
Я написал “тестовый скрипт”, потому что считаю это наиболее удобным. Вы создаете тестовый скрипт, изучаете и пробуете что-то новое и только когда уже во всем разберетесь, интегрируете нововведения в ваши рабочие скрипты. Так обычно делаю я сам.
Затем создаем переменную с токеном, который получили:
$bot_token = 'вставьте токен сюда';
Дальше нам понадобится ID вашего Discord сервера. Чтобы видеть ID всего и вся в Discord, нужно включить режим разработчика в клиенте. Для этого переходим в Настройки => Расширенные и ставим галочку “Режим разработчика”. Теперь вы можете скопировать ID вашего сервера, просто нажав правой кнопкой мыши по его иконке в списке серверов и выбрав последний пункт “Копировать ID сервера”. Этот метод вы также сможете использовать для копирования ID пользователей, сообщений, чатов на вашем сервере и т.д.
Добавляем ID сервера в ваш скрипт:
$guild_id = ID_СЕРВЕРА;
Теперь подключаем библиотеку и создаем клиент:
use RestCord\DiscordClient;
$client = new DiscordClient(['token' => $bot_token]);
Обратите внимание, при создании клиента, мы указали переменную с токеном вашего бота.
Возможности библиотеки
Далее я покажу основные возможности, которые понадобятся вашему боту в Discord в первую очередь.
Пишем сообщение в какой-либо канал:
$client->channel->createMessage(['channel.id' => ID_канала, 'content' => 'текст сообщения']);
Редактируем уже существующее сообщение. Обратите внимание, что бот может редактировать только те сообщения, которые отправлял сам.
$client->channel->editMessage(['channel.id' => ID_канала, 'message.id' => ID_сообщения, 'content' => 'текст сообщения']);
Это одна из самых полезных возможностей. С помощью нее, можно например выводить статус вашего игрового сервера. Подготовили сообщение со статусом, отправили его один раз в чат, там скопировали ID и дальше скрипт висит в cron и раз в минуту обновляет статус вашего игрового сервера и изменяет одно сообщение, не засоряя чат.
Удаляем сообщение в канале:
$client->channel->deleteMessage(['channel.id' => ID_канала, 'message.id' => ID_сообщения]);
Получаем информацию об участнике сервера:
$discord_user = $client->guild->getGuildMember(['guild.id' => $guild_id, 'user.id' => ID_пользователя]);
var_dump($discord_user);
Обратите внимание, что здесь мы используем переменную с ID вашего сервера. По результатам, в $discord_user
будет объект, из которого можно получить полезную информацию об участнике сервера, включая все его роли. Например роли находятся в $discord_user->roles
и легко обходятся в цикле:
foreach ($dis_user->roles as $role) {
// тут ваш код
}
Меняем ник участника на сервере:
$client->guild->modifyGuildMember(['guild.id' => $guild_id, 'user.id' => ID_пользователя, 'nick' => 'новый ник']);
Добавляем роль:
$client->guild->addGuildMemberRole(['guild.id' => $guild_id, 'user.id' => ID_пользователя, 'role.id' => ID_роли]);
ID ролей вы можете скопировать в разделе Настройки сервера => Роли (нажимаете ПКМ по названию роли и выбираете “Копировать ID роли”).
Удаляем роль:
$client->guild->removeGuildMemberRole(['guild.id' => $guild_id, 'user.id' => ID_пользователя, 'role.id' => ID_роли]);
Это были лишь некоторые возможности, которыми я пользуюсь сам. Если разберетесь с ними, то без проблем сможете опробовать все остальные возможности RestCord, которые описаны на сайте библиотеки.