Небольшое обновление в работе шаблонов.
Захотелось мне реализовать одну интересную возможность, а именно давать условные поручения Алисе человеческим языком. Проще объяснить на примерах (голосовых) команд:
"когда я скажу привет скажи пока"
"когда откроются ворота включи свет в коридоре"
"если пойдёт дождь закрой гараж"
Рассмотрим первый пример "когда я скажу привет скажи пока" -- предложение состоит из двух частей: 1 условие, 2 действие. Это всё можно описать как обычный шаблон поведения с реакцией на ключево слово "привет". Сложности две: первая -- я хочу, чтобы шаблон создавался сам по описанным мной критериям, вторая -- мне нужно выполнить эту задачу единовременно, потому что в следующий раз реакция должна быть другой или её может вообще не нужно.
Ниже пример того, как эта задача может быть сейчас решена.
1. В шаблонах поведения создаём контекст с названием "когда я"
В нём ничего настраивать не нужно, кроме того, что выделить галочку "использовать как контекст"
2. Создаём дочерний шаблон c названием "скажу (.+?) (.+)" (кто не знает -- если не вводить ничего в поле Шаблон, то название используется в качестве Шаблона)
Имеем вот такое дерево:
3. Самое интересное. Прописываем в поле "Выполнить при совпадении" последнего добавленного нами шаблона следующий код:
Код: Выделить всё
$new_pattern=array();
$new_pattern['ONETIME']=1; // флаг того, что шаблон будет одноразовый
$new_pattern['SKIPSYSTEM']=1; // флаг того, что шаблон не будет реагировать на системные уведомления, только пользовательские
$new_pattern['SCRIPT']='say("'.$matches[2].'",0,'.$from_user_id.');'; // код реакции нашего шаблона
addPattern($matches[1],$new_pattern,1); // добавляем описанный шаблон
say("Добавлена реакция на слово \"".$matches[1]."\"",2); // подтверждаем то, что реакция добавлена
Этот код с помощью функции addPattern создаёт новый обработчик, который будет реагировать на указанное нами ключевое слово. Важные нововведения это флаг ONETIME и SKIPSYSTEM. Первый доступен только при программном создании шаблона и указывает, что шаблон будет удалён после первого совпадения, а второй теперь доступен в настройках каждого шаблона -- его можно использовать для исключения ситуации, когда система реагирует сама на себя.
Ещё важный момент -- в реакции созданного шаблона используется функция say, где кроме фразы и приоритета добавился ещё один параметр -- от имени кого будет сказана фраза ($from_user_id в данном случае будет равен идентификатору текущего пользователя). Смысл в том, что б в нужный момент произнести фразу как бы от имени пользователя, чтобы система с помощью тех же шаблонов поведения на неё среагировала.
Возможно, выглядит на первый взгляд сложно, но возможности появляются очень интересные. Можно делать разовые поручения, комбинируя имеющиеся условия и команды. Можно так же создавать не разовые, а постоянные условные реакции (просто убрать флаг ONETIME).
Я немного ещё сам поиграюсь с этим функционалом, возможно что-то подправлю и чуть позже опишу больше способов интересного использования.