Создаем бот в Discord на PHP

бот в Discord

Иметь свой сервер в Discord уже не является чем-то необычным, сейчас сервера есть у всех – от простых руководителей гильдий, до авторов крупных игровых проектов. И не только игровых. У всех владельцев серверов в Discord есть одна необходимость – поддерживать порядок и безопасность на сервере, а также предоставлять участникам возможности, необходимые в рамках тематики. Сейчас в Discord существует множество ботов, которые могут модерировать сообщения, контролировать соблюдение правил участникам, включать музыку, выполнять различные команды и прочее. Но в этой статье мы остановимся на том, как сделать свой бот в Discord, который будет выполнять определенные действия на вашем сервере.

Создаем приложение в Discord Developer Portal

Перед написанием кода для бота, создадим приложение и бота в самом Discord. Для этого сначала переходим по этой ссылке, авторизуемся, нажимаем “New Application”. В появившемся окошке вы заполняете название вашего будущего приложения, ставите галочку соглашения и нажимаете “Create”. Дальше вы можете установить иконку для приложения и указать описание. Обратите внимание, что указанное здесь описание – станет описанием в профиле будущего бота. А вот иконка у бота отдельная, так что здесь ее можно пока не ставить. Далее переходим на вкладку “Bot”:

discord bot

Здесь вы увидите автоматически созданный юзернейм, который вы можете поменять на свой. Система новых юзернеймов пока не дошла до ботов, поэтому пока что юзернейм и имя бота, это одно и то же. Вы можете установить иконку для бота, а также выполнить некоторые настройки. Если ваш бот будет только для вашего сервера, снимите галочку “Public Bot”. Если функционал вашего бота будет связан с чтением сообщений в каких-либо чатах сервера и работой с пользователями, лучше сразу установите 2 галочки: “Server Members Intent” и “Message Content Intent”. После этого нажмите “Reset Token” и сохраните куда нибудь полученный токен, он нам понадобится чуть позже.

Добавляем бот на ваш сервер

Переходим на вкладку OAuth2 и выбираем URL Generator.

В “Scopes” выбираем только одно – bot. После выбора появится раздел “Bot Permissions”, там вы должны выбрать необходимые разрешения для своего бота, в соответствии с тем, что он в будущем должен будет делать. Если не уверены, что выбрать – выберите “Administrator”.

Настройка бота Discord

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

Подготавливаем библиотеку и 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, которые описаны на сайте библиотеки.