Skip to content

Instantly share code, notes, and snippets.

@vyuldashev
Last active June 17, 2017 22:33
Show Gist options
  • Save vyuldashev/d7ab7b3145cd679b149dead3d3d32e4a to your computer and use it in GitHub Desktop.
Save vyuldashev/d7ab7b3145cd679b149dead3d3d32e4a to your computer and use it in GitHub Desktop.
DevConf FondBot

inline 100%

Фреймворк для создания чат-ботов на PHP


Что такое "FondBot"?

  • PHP фреймворк для создания чат-ботов
  • Основан на компонентах "The PHP League", "Symfony" и др.
  • PHP 7.1 с использованием return types

Основные возможности

  • Система диалогов
  • Асинхронная отправка сообщений
  • Драйвера
  • Dependency Injection
  • Filesystem, Cache, Queue
  • Toolbelt

Установка

➜  / composer create-project fondbot/fondbot bot
Installing fondbot/fondbot (v1.0.1)
  - Installing fondbot/fondbot (v1.0.1): Loading from cache
Created project in bot
> php -r "file_exists('.env') || copy('.env.example', '.env');"
Loading composer repositories with package information
Updating dependencies (including require-dev)
Package operations: 63 installs, 0 updates, 0 removals
  - Installing ...

Writing lock file
Generating autoload files

Структура проекта

inline


Конфигурация

  • Service Providers
  • Environment Variables (.env)

Система диалогов

  • Все диалоги поделены на "Intent" и "Interaction"
  • Intent - желание пользователя и реакция бота на него
  • Interaction - взаимодействие с пользователем

Система диалогов (Intent)

➜  bot php bin/toolbelt make:intent Weather


 [OK] Intent created.

Система диалогов (Intent)

class WeatherIntent extends Intent
{
    public function activators(): array
    {
        return [
            $this->exact('/weather'),
        ];
    }

    public function run(ReceivedMessage $message): void
    {
        // Send reply to user, jump to interaction or do something else...
    }
}

Система диалогов (Intent)

class WeatherIntent extends Intent
{
    public function activators(): array
    {
        return [
            $this->exact('погода'),
            $this->exact('погода на сегодня'),
        ];
    }

    public function run(ReceivedMessage $message): void
    {
        // Получаем данные
        $guzzle = new Client;
        $response = $guzzle->get('...');
        $response = json_decode((string)$response->getBody());

        // Отправляем пользователю результат
        $this->sendMessage($response->weather->description);
    }
}

Система диалогов (Intent)

  • Exact - точное совпадение текста
  • Contains - содержит одно из значений (слов)
  • Pattern - регулярное выражение
  • InArray - одно из значений
  • WithAttachment - в сообщении есть файл, возможно с заданным типом

Система диалогов (Interaction)

➜  bot php bin/toolbelt make:interaction AskCity


 [OK] Interaction created.

Система диалогов (Interaction)

class AskCityInteraction extends Interaction
{
    public function run(ReceivedMessage $message): void
    {
        // Здесь можно задать вопрос пользователю, показать клавиатуру или сделать что-то еще…
    }

    public function process(ReceivedMessage $reply): void
    {
        // Обработать ответ пользователя на то, что было задано в методе “run”.
    }
}

Система диалогов (Interaction)

public function run(ReceivedMessage $message): void
{
    $keyboard = (new Keyboard);
    foreach ($this->cities as $city) {
        $button = (new Keyboard\ReplyButton)->setLabel($city);

        $keyboard->addButton($button);
    }

    $this->sendMessage(
        'В каком городе тебя интересует погода?',
        $keyboard
    );
}

Система диалогов (Interaction)

public function process(ReceivedMessage $reply): void
{
    if(!in_array($reply->getText(), $this->cities)) {
        $this->sendMessage('Извини, я не знаю погоду в этом городе.');
        return;
    }

    // Получаем данные
    $guzzle = new Client;
    $response = $guzzle->get('...');
    $response = json_decode((string)$response->getBody());

    // Отправляем пользователю результат
    $this->sendMessage($response->weather->description);
}

Система диалогов

  • Перезапустить Intent или Interaction
    $this->restart();
  • “Прыгнуть” в Interaction
    $this->jump();

Система диалогов

  • Сохранить данные в контекст
    $this->remember('key', 'value');
  • Получить данные из контекста
    $this->context('key');

Драйвера

➜  bot php bin/toolbelt driver:list
+----------------+------------------------+----------+
| Name           | Package                | Official |
+----------------+------------------------+----------+
| telegram       | fondbot/telegram       ||
| facebook       | fondbot/facebook       ||
| vk-communities | fondbot/vk-communities ||
+----------------+------------------------+----------+

Драйвера

➜  bot php bin/toolbelt driver:install telegram
Installing driver...


 [OK] Driver installed.

Каналы

class ChannelServiceProvider extends BaseChannelServiceProvider
{
    public function channels(): array
    {
        return [
            'telegram' => [
                'driver' => 'telegram',
                'token' => env('TELEGRAM_TOKEN'),
            ],
        ];
    }
}

Каналы

➜  bot php bin/toolbelt channel:list
+----------+----------+--------------------+
| Name     | Driver   | Route              |
+----------+----------+--------------------+
| telegram | telegram | /channels/telegram |
+----------+----------+--------------------+

Dependency Injection

  • Constructor Injection
  • Хелпер resolve
    resolve(FondBot\Contracts\Cache::class);

Filesystem, Cache, Queue

  • Файловая система
  • Кэш (Cache)
    • Filesystem
  • Очереди (Queue)
    • Синхронные - SyncAdapter
    • Beanstalkd - BeanstalkdAdapter

Toolbelt

➜  bot php bin/toolbelt
FondBot 1.0.5

Usage:
  command [options] [arguments]

Options:
  ...

Available commands:
  log               Tail log
 channel
  channel:list      List all channels
 driver
  driver:install    Install driver
  driver:list       Get list of all available drivers
 make
  make:intent       Create a new intent class
  make:interaction  Create a new interaction class
 queue
  queue:worker      Run queue worker

——-

FondBot v1.1.0

  • Переработаны драйвера
  • PSR-6 (Caching)
  • PSR-7 (HTTP Message Interfaces)
  • Собственная реализация Asset Discovery

Планы

  • Slack, Viber
  • Система событий (Events)
  • Каталог ботов
  • Аналитика (Chatbase, Botan.io, FondBot Analytics)
  • Конструктор диалогов
  • Хелперы для тестов
  • Интеграция с фреймворками (Laravel, Symfony и др.)

Вопросы (Q&A)

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment