Пишем бота для Discord на Laravel

22.11.2024

Регистрируем Бота в Дискорде

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

Всё, ваш бот работает и можно расширять его функционал!

>