alisa/alisa

Разрабатывайте навыки для Алисы без боли с любовью <3

3.0.10-beta 2024-12-19 06:26 UTC

README

Библиотека для разработки навыков голосового помощника Яндекс Алиса (Диалоги).

Установка

composer require alisa/alisa

Примеры

Пример навыка, который повторяет все что скажет пользователь.

use Alisa\Alisa;
use Alisa\Context;

$alisa = new Alisa;

$alisa->onStart(function (Context $ctx) {
    $ctx->reply('Привет, я буду повторять за тобой.');
});

$alisa->onAny(function (Context $ctx) {
    $command = $ctx->request('command');
    $ctx->reply($command);
});

$alisa->run();

Документация (WIP)

События

С помощью событий можно удобно отлавливать и обрабатывать входящие запросы от Диалогов.

on()

on(Closure|array $pattern, Closure|array|string $handler, int $priority = 0): Event

Это самый базовый и универсальный способ отлова событий, на нем строятся все методы событий, такие как onStart, onCommand и другие.

Событие можно отловить разным способом:

  • on('request.command') - ловим все события где есть ключ request.command;
  • on(['request.command' => 'привет']) - ловим события где команда === привет;
  • on(['request.command' => '/прив/iu']) - regex, ловим события где может быть привет, приветствую, привееет и т.п.;
  • on('request.command' => 'привет {name}']) - ловим событие где в комманде есть привет вася или любое другое слово вместо вася.
  • on('request.command' => 'привет {name?}']) - работает как пример выше, но в данном случае мы поймаем как привет вася, так и просто привет, потому что {name?} - это опциональное слово.
  • on(fn (Context $ctx) => ...) - если результат функции true - есть мэтч, если false - мэтча нет соответсвенно, это самый гибкий вариант отлова если нужно что-то нестандартное;

Примеры использования ниже:

$alisa->on('request.command', function (Context $ctx) { ... });

В примере ниже мы обработаем событие если это request.command ИЛИ session.new.

$alisa->on(['request.command', 'session.new'], function (Context $ctx) { ... });
$alisa->on(['request.command' => 'привет'], function (Context $ctx) { ... });
$alisa->on(['request.command' => '/прив/iu'], function (Context $ctx) { ... });

В примере ниже, в функцию обработчик {name} мы принимаем вторым параметром.

$alisa->on(['request.command' => 'привет {name}'], function (Context $ctx, string $name) { ... });
$alisa->on(['request.command' => 'привет {name?}'], function (Context $ctx, ?string $name = null) { ... });

Мы можем добавить {user} {time?} столько, сколько нам нужно, но главное, опциональное слово всегда должно быть после обязательного.

  • /ban {user} {time?} - OK;
  • /ban {user?} {time?} - OK;
  • /ban {user?} {time} - НЕ ОК;

Как работает пример ниже:

  • Если сообщение /ban vasya 30 - поймает $name = vasya, $time = 30.
  • Если сообщение /ban vasya 13 37 - поймает $name = vasya, $time = 13 37.
$alisa->on(
    ['request.command' => '/ban {user} {time?}'],
    function (Context $ctx, string $user, ?string $time = null) {
        //
    }
);

Вы также можете ловить слова с помощью regex:

$alisa->on(
    ['request.command' => '/привет (.+?)/iu'],
    function (Context $ctx, string $name) {
        //
    }
);

А еще, вы можете комбинировать разные варианты в одном событии.

Каждое перечисление раценивается как ИЛИ.

$alisa->on([
    'request.command' => ['/прив/iu', 'привет {name?}', 'hello', 'hola'],
    function (Context $ctx, ?string $name = null) {
        //
    }
])

Так тоже можно:

$patterns = [
    'request.command' => ['/прив/iu', 'привет {name?}', 'hello', 'hola'],
    'state.session.foo' => ['bar'],
    'state.session.lorem',
    fn (Context $ctx) => 2 + 2 === 4,
    // и т.п. и т.д.
];

$alisa->on($patterns, function (Context $ctx, ?string $name = null) {
        //
})