Давно хотел написать статью про дискорд-ботов, но всё никак не мог определиться с конкретной тематикой, ведь подобных туториалов и уроков в интернете полно, и в основном для этих целей используют Python и Node.JS. А вот какой-либо документации и примеров написания ботов для дискорда на PHP почти нет, и уж тем более на русском языке. Поэтому в этой статье будем разбирать основы написания ботов на библиотеке Discord-PHP.
Шаг 1: Подготовка бота
1. Переходим по ссылке и создаём новое приложение:
2. Во вкладке Bot добавляем бота, подтверждаем выбор в появившемся окне:
3. Во вкладке OAuth2 -> URL Generator ставим галочку напротив пункта bot, ниже выбираем необходимые права доступа и копируем появившуюся внизу ссылку на инвайт бота:
4. Переходим по скопированной ссылке и приглашаем бота в нужный нам сервер.
5. Генерируем токен бота и сохраняем его у себя:
6. Включаем SERVER MEMBERS INTENT, дабы отслеживать события пользователей (например, вход на сервер):
Шаг 2: Скрипт
Подключаем библиотеку через composer:
composer require team-reflex/discord-php
В этот раз много всего делать не будем, разберём только базовые вещи. В будущих уроках, возможно, напишем ещё что-нибудь. А, возможно, и сделаем бота на питоне. Впрочем, пока загадывать не буду.
Начинаем с подключения библиотеки, импортируем необходимые для работы классы:
<?php
require __DIR__ . '/vendor/autoload.php';
use Discord\Discord;
use Discord\WebSockets\Event;
use Discord\WebSockets\Intents;
use Discord\Parts\User\Member;
use Discord\Parts\Channel\Message;
Создаём экземпляр класса Discord:
$ds = new Discord( [
'token' => '*****************', // Токен, который мы сгенерировали ранее
'intents' => Intents::getDefaultIntents() | Intents::GUILD_MEMBERS, // Понадобится для отслеживания событий участников
] );
Далее вставляем конструкцию, внутри которой будем прописывать конкретные события для отслеживания. В конец сразу добавил $ds->run() для запуска бота:
$ds->on( 'ready', function( $ds )
{
// Тут продолжим писать код
} );
$ds->run();
И первое событие, которое мы обработаем - так это входящие сообщения:
$ds->on( Event::MESSAGE_CREATE, function( Message $msg, Discord $ds )
{
// Тут будем обрабатывать входящие
} );
Добавим тестовую команду:
if ( $msg->content == '/бот' )
{
$msg->reply( 'Привет, ' . $msg->author->username );
}
Да, бот пока не запущен и не готов к работе, но я забегу наперёд и покажу, как это будет работать:
С помощью метода ban() можно заблокировать участника. В первом параметре можно указать, за какой промежуток времени нужно удалить сообщения этого пользователя (я для примера удалю сообщения за последние сутки), а во втором - причину бана:
else if ( str_contains( $msg->content, 'админ лох' ) )
{
$msg->member->ban( 1, 'reason' );
}
Такое условие на практике, конечно, использоваться никогда не будет, да и в принципе банить людей по ключевым словам - решение не шибко надёжное. Но сейчас я просто показываю, как можно банить юзеров средствами библиотеки.
В первом шаге мы включили Members Intent, поэтому теперь можем отслеживать вход новых участников на наш сервер:
$ds->on( Event::GUILD_MEMBER_ADD, function( Member $member, Discord $ds )
{
// Тут продолжим писать код
} );
Давайте выдадим новым участникам какую-нибудь роль, а для этого нам понадобится получить ID этой самой роли. Чтобы его получить - включаем режим разработчика (Настройки -> Настройки приложения -> Расширенное):
Ну, и теперь копируем ID нужной роли:
Теперь мы можем воспользоваться методом addRole(), передав в него скопированный айдишник (в виде строки):
$member->addRole( '1007995229674156102' );
Ну, и ещё поменяем никнейм присоединившегося участника на сервере методом setNickname():
$member->setNickname( 'Новый никнейм' );
Весь код:
<?php
require __DIR__ . '/vendor/autoload.php';
use Discord\Discord;
use Discord\WebSockets\Event;
use Discord\WebSockets\Intents;
use Discord\Parts\User\Member;
use Discord\Parts\Channel\Message;
$ds = new Discord( [
'token' => '******************',
'intents' => Intents::getDefaultIntents() | Intents::GUILD_MEMBERS,
] );
$ds->on( 'ready', function( $ds )
{
$ds->on( Event::MESSAGE_CREATE, function( Message $msg, Discord $ds )
{
if ( $msg->content == '/бот' )
{
$msg->reply( 'Привет, ' . $msg->author->username );
}
else if ( str_contains( $msg->content, 'админ лох' ) )
{
$msg->member->ban( 1, 'reason' );
}
} );
$ds->on( Event::GUILD_MEMBER_ADD, function( Member $member, Discord $ds )
{
$member->addRole( '1007995229674156102' );
$member->setNickname( 'Новый никнейм' );
} );
} );
$ds->run();
Шаг 3: Запуск бота
Запустить бота можно на OpenServer. Для этого нужно перейти в консоль:
И ввести следующую команду (путь, естественно, указывать нужно свой):
php "D:\DiscordBOT\bot.php"
Если же у вас есть купленный хост, который предоставляет возможность юзать консоль, то запустить бота можно там. Покажу на примере ISPManager принцип:
1. Переходим во вкладку Shell-клиент:
2. Вводим следующую команду:
/opt/php/8.1/bin/php www/site.ru/bot.php
Путь и версию PHP меняем под себя.
Чтобы быстро вставить команду в консоли - нажмите ПКМ -> Paste from browser:
На этом всё!
Перед публикацией, советую ознакомится с правилами!
Нашли ошибку?
Вы можете сообщить об этом администрации.
Выделив текст нажмите CTRL+Enter