Пишем бота для Discord на Laravel
Регистрируем Бота в Дискорде
На сайте дискода регистрируем приложение - делаем его ботов и получаем bot token - он нас потребуется для работы далее.
Установка Laravel
Подробную инструкцию по установке можно найти на нашем сайте
Устанавливаем нужный пакет
Для взаимодействия с Дискордом нам потребуется пакет - discord-php/DiscordPHP. В командной строке пишем:
composer require team-reflex/discord-php
после чего получаем доступ к основным функциям Дискорда и взаимодействию с сообщениями.
Делаем демона для постоянной работы в фоновом режиме
В этот момент и начинается самый важный процесс в разработке - создание команды для работы с ботом и взаимодействия с самим приложением.
Базовый пример бота будет раздавать Промокоды по 1 на пользователя, хотя это можно легко реализовать расширив функционал бота и сделав подобие раутера для работы с различными событиями.
Наш бот будет просто отвечать людям (на это будет проверка) и только в приватных чатах - не в групповых или на сервере.
Для создания команды набираем в консоли:
php artisan make:command RunBotCommand
После чего получаем файл app/Console/Commands/RunBotCommand.php, где мы внесем несколько изменений: Поменяем вызов и запустим бота.
namespace App\Console\Commands;
use App\Models\Code;
use Illuminate\Console\Command;
use Discord\Discord;
use Discord\Parts\Channel\Message;
use Discord\WebSockets\Intents;
use Discord\WebSockets\Event;
class RunBotCommand extends Command
{
protected $signature = 'app:run-bot';
Пишем самого бота
Пример ниже - рабочий код с базовым функционалом. В релизе стоит сделать несколько изменений, таких как перенос токена в .env файл
public function handle()
{
$discord = new Discord([
'token' => '',
'intents' => Intents::getDefaultIntents()
]);
$discord->on('ready', function (Discord $discord) {
echo "Bot is ready!", PHP_EOL;
// Listen for messages.
$discord->on(Event::MESSAGE_CREATE, function (Message $message, Discord $discord) {
echo "{$message->author->username}: {$message->content}", PHP_EOL;
if ($message->author->bot) {
echo $message->author;
}
echo "type:" . $message->channel->type;
if ($message->channel->type == 1) {
if ($message->author->bot) {
return;
}
if(!Code::query()->where('username', $message->author->username)->exists()) {
$code = Code::query()->whereNull('username')->first();
if($code) {
$code->update(['username' => $message->author->username]);
$message->reply('Your Code: ' . $code->code);
} else {
$message->reply('We don\'t have any more codes, come back later');
}
} else {
$code = Code::query()->where('username', $message->author->username)->first();
$message->reply('Your Code: '.$code->code);
}
}
});
});
$discord->run();
}
$message->channel->type = 1 - это приват чаты, для групп код будет 0.
Важно! Проверяйте от кого сообщение - игнорируйте сообщения от самого бота, иначе будет бесконечное общение бота с самим собой!
Запускаем бота
Главный вопрос - как запустить бота. И тут на помощь к нам приходит сам Laravel -
php artisan app:run-bot
И наш бот будет работать и будет в он-лайне, кто будет отражено в его статусе.
Запуск на сервере
Чтобы запустить бота на сервере с Линуксом нам потребуется Supervisor. Процесс установки отличается от системы к системе, но настройка всегда одинаковая и есть на сайте Laravel.