Рабочий пример многоуровневого шаблона (Включи|Выключи)
Добавлено: Чт авг 04, 2022 4:20 pm
Раз уж много мы много говорили про эту тему, покажу свой вариант многоуровнего шаблона (Включи|Выключи)
Обратите внимание, Название и Шаблон у меня разные. Дело в том, что название видно в панели управления, и не режет глаз закорючками. К тому же название читается при команде "Помощь". Очень надеюсь, что этот момент не будет изменен в системе в будущем. Если поле "Шаблон" пустое, то значение берется из "Названия".
Вариант работает с диалогами разных пользователей одновременно. Посмотреть значения временных переменных можно в cached_values по SQL запросу SELECT * FROM `cached_values` WHERE KEYWORD LIKE '%original%'
Единственный момент, если пользователь ведет диалог частями, и долго не продолжает, то срабатывает код "По истечении времени выполнить:". Тут бы неплохо очищать временную переменную этого пользователя, но $from_user_id тут не сработает т.к. на момент выполнения кода, контекст уже сброшен. Поэтому текст не законченного диалога так и будет висеть в переменной. В принципе, это не страшно, т.к. текст будет затерт при новом диалоге на первом уровне. Вторые (и до последнего) уровни должны уже дополнять текст. Последний уровень его стирает.
Очень бы хотелось получить полный текст истории диалога штатными средствами. Но об этом я писал ранее. Дубли в SQL таблице, при переходах сразу на несколько уровней, я нашел как устранить. Об этом писал ранее. Но сделать возврат без исправления кода файлов не получится.
В идеале я вижу это так:
По массиву $matches[] у меня нет предложений
$original содержит последнюю фразу пользователя без изменений
$history - всю историю диалога в контексте.
Возможно, путаница и отсутствие этого сильно понижает внимание народа к Шаблонам поведения. А штука классная. Мне нравится. Все свои голосовые приблуды я использую только для передачи текста в чат МД.
1 уровеньПоказать
Название: Включи или Выключи
Шаблон: (Включи|Выключи)
использовать как контекс: Да
Выполнить при совпадении:
По истечении времени выполнить:
Шаблон: (Включи|Выключи)
использовать как контекс: Да
Выполнить при совпадении:
Код: Выделить всё
saveToCache('VAR:original'.$from_user_id, $original);
say('Что именно '.$original.'ть?');
Код: Выделить всё
say('Попробуем в другой раз');
2 уровеньПоказать
Название: Свет Освещение
Шаблон: (свет|освещение)
использовать как контекс: Да
Выполнить при совпадении:
По истечении времени выполнить:
Дополнение для реакции без указания места
Шаблон: (свет|освещение)
использовать как контекс: Да
Выполнить при совпадении:
Код: Выделить всё
$ss = trim(checkFromCache('VAR:original'.$from_user_id).' '.mb_strtolower($original));
saveToCache('VAR:original'.$from_user_id, $ss);
say('Где именно?');
Код: Выделить всё
say('Разговор про свет закончен');
3 уровеньПоказать
Название: кухня
Шаблон: кухн
использовать как контекс: Нет
Выполнить при совпадении:
Шаблон: кухн
использовать как контекс: Нет
Выполнить при совпадении:
Код: Выделить всё
$ss = trim(checkFromCache('VAR:original'.$from_user_id).' '.mb_strtolower($original));
if (preg_match('/включи/isu',$ss)) {
cm('RelayX.turnOn');
say('Включаю свет на кухне');
} elseif (preg_match('/выключи/isu',$ss)) {
cm('RelayX.turnOff');
say('Выключаю свет на кухне');
} else {
say("Непонятно: $ss");
}
saveToCache('VAR:original'.$from_user_id, '');
Вариант работает с диалогами разных пользователей одновременно. Посмотреть значения временных переменных можно в cached_values по SQL запросу SELECT * FROM `cached_values` WHERE KEYWORD LIKE '%original%'
Единственный момент, если пользователь ведет диалог частями, и долго не продолжает, то срабатывает код "По истечении времени выполнить:". Тут бы неплохо очищать временную переменную этого пользователя, но $from_user_id тут не сработает т.к. на момент выполнения кода, контекст уже сброшен. Поэтому текст не законченного диалога так и будет висеть в переменной. В принципе, это не страшно, т.к. текст будет затерт при новом диалоге на первом уровне. Вторые (и до последнего) уровни должны уже дополнять текст. Последний уровень его стирает.
Очень бы хотелось получить полный текст истории диалога штатными средствами. Но об этом я писал ранее. Дубли в SQL таблице, при переходах сразу на несколько уровней, я нашел как устранить. Об этом писал ранее. Но сделать возврат без исправления кода файлов не получится.
В идеале я вижу это так:
По массиву $matches[] у меня нет предложений
$original содержит последнюю фразу пользователя без изменений
$history - всю историю диалога в контексте.
Возможно, путаница и отсутствие этого сильно понижает внимание народа к Шаблонам поведения. А штука классная. Мне нравится. Все свои голосовые приблуды я использую только для передачи текста в чат МД.