Контексты в шаблонах поведения
Модератор: immortal
-
- Сообщения: 20
- Зарегистрирован: Чт июл 04, 2019 8:05 am
- Благодарил (а): 1 раз
- Поблагодарили: 2 раза
Re: Контексты в шаблонах поведения
Добрый день. Подскажите. При не корректной команде, Алиса не говорит, неизвестная команда, раньше это нравилось, теперь немного напрягает, когда при голосовом вводе она просто молчит. Куда копать? Хочется сделать типа: Я Вас не поняла, или что-то подобное.
- tarasfrompir
- Сообщения: 3216
- Зарегистрирован: Ср мар 02, 2016 8:18 pm
- Откуда: Украина Пирятин
- Благодарил (а): 223 раза
- Поблагодарили: 815 раз
Re: Контексты в шаблонах поведения
Спасибо нам ПОМОЖЕТ..!
-
- Сообщения: 2084
- Зарегистрирован: Пт апр 07, 2017 12:20 pm
- Благодарил (а): 313 раз
- Поблагодарили: 457 раз
Re: Контексты в шаблонах поведения
это ПУ, а команды после них еще в шаблоны поведения передаютсяtarasfrompir писал(а): ↑Чт авг 05, 2021 7:50 pmhttps://github.com/sergejey/majordomo/b ... nd.inc.php
вот ТУТ НАДО ВСТАВЛЯТЬ в конце где то
Telegram | Блог
Raspberry Pi3, с образа от Сергея 3.31, PHP 7, флешка 16 Гб работает с 10.09.2017
Почти всё время уходит на исправление ошибок, оставшееся - на их повторение. (с) ))) Спасибо
Raspberry Pi3, с образа от Сергея 3.31, PHP 7, флешка 16 Гб работает с 10.09.2017
Почти всё время уходит на исправление ошибок, оставшееся - на их повторение. (с) ))) Спасибо
- nick7zmail
- Сообщения: 7573
- Зарегистрирован: Пн окт 28, 2013 8:14 am
- Откуда: Екатеринбург
- Благодарил (а): 121 раз
- Поблагодарили: 2010 раз
Re: Контексты в шаблонах поведения
Можно приоритет выставить, чтоб пу в конце обрабатывались. А вообще то что вы говорите (неизвестная команда) было в методе thiscomputer-commandrecieved
Отправлено с моего Xperia XZ1 Compact через Tapatalk
Отправлено с моего Xperia XZ1 Compact через Tapatalk
Raspberry Pi3+Broadlink+esp8266 (blynk)+AMS
Если вам помогло какое-либо сообщение - не забывайте пользоваться кнопкой "СПАСИБО".
Услуги в профиле коннект
>>>>>Мой новый канал на ютутбе, подписывайтесь!<<<<<
Если вам помогло какое-либо сообщение - не забывайте пользоваться кнопкой "СПАСИБО".
Услуги в профиле коннект
>>>>>Мой новый канал на ютутбе, подписывайтесь!<<<<<
-
- Сообщения: 2084
- Зарегистрирован: Пт апр 07, 2017 12:20 pm
- Благодарил (а): 313 раз
- Поблагодарили: 457 раз
Re: Контексты в шаблонах поведения
как плохо когда по разным норкам, вызов метода закоментирован и в тлг что сделать тс описал, правда сомневаюсь что он понял (nick7zmail писал(а): ↑Чт авг 05, 2021 10:04 pmМожно приоритет выставить, чтоб пу в конце обрабатывались. А вообще то что вы говорите (неизвестная команда) было в методе thiscomputer-commandrecieved
Отправлено с моего Xperia XZ1 Compact через Tapatalk
Telegram | Блог
Raspberry Pi3, с образа от Сергея 3.31, PHP 7, флешка 16 Гб работает с 10.09.2017
Почти всё время уходит на исправление ошибок, оставшееся - на их повторение. (с) ))) Спасибо
Raspberry Pi3, с образа от Сергея 3.31, PHP 7, флешка 16 Гб работает с 10.09.2017
Почти всё время уходит на исправление ошибок, оставшееся - на их повторение. (с) ))) Спасибо
- Bagir
- Сообщения: 1613
- Зарегистрирован: Вт сен 17, 2013 6:46 pm
- Откуда: Ярославская область город Углич
- Благодарил (а): 212 раз
- Поблагодарили: 375 раз
Re: Контексты в шаблонах поведения
Ну что, сдуем пыль с довольно интересной темы? Так уж получилось, что я часто пишу тут не только для всех, но и для себя тоже. А спустя годы перечитываю. Пока никто не жаловался
Ох уж эти пляски с $original вплоть до голосования на эту тему. Надо бы устаканить это дело раз и навсегда. Обновился по последней Альфы.
Сделал в шаблонах тестовый контекстУ уровня 4 не стоит галка использовать как контекст. Он в примере последний.
Файл patterns.class.php после обновления я не редактировал.
Вот что получилось:
Как мы видим, $original содержит текст последней команды целиком. А было время, когда там собиралась история, хоть и дублировалась странным образом. Последние исправления файла patterns.class.php как раз и убирают дубли, но убирают и историю. Которая была мне так нужна для шаблона (Включи|Выключи). Не готов я отказаться от этой конструкции и разбивать на разные ветки Включи и Выключи, дублируя практически одинаковый код в них. Я ранее оставлял много примеров с $original и шаблоном (Включи|Выключи). Теперь это уже давно не работает без правки файла patterns.class.php Ну да и ладно, не сторонник я править код в файлах.
Какие теперь есть альтернативы, давайте посмотрим на функцию context_get_history() которая могла бы заменить нам $original.
И всё вроде хорошо, но вот на последнем уровне ответ context_get_history() пустой. Всё дело в том, что у уровня 4 не стоит галка использовать как контекст. Это последний уровень, но на нем как раз и нужна история, чтобы понять включать нужно или выключать. По моему это как то не правильно. Буду разбираться почему так. А пока на этом всё, как найду решение, отпишусь. Тема шаблонов снова очень актуальна для меня. Прицепил Я.колонку. Теперь управлять голосом стало удобно.
Ох уж эти пляски с $original вплоть до голосования на эту тему. Надо бы устаканить это дело раз и навсегда. Обновился по последней Альфы.
Сделал в шаблонах тестовый контекст
Код: Выделить всё
Уровень 1
Уровень 2
Уровень 3
Уровень 4
Файл patterns.class.php после обновления я не редактировал.
Сейчас там склейка истории закоментированаПоказать
Код: Выделить всё
/*
if (context_getcurrent()) {
$history = context_get_history() . ' ' . $history;
}
*/
Код: Выделить всё
debmes('ур4 original '.$original);
debmes('ур4 context_get_history '.context_get_history());
Вводил команды по одной. В ответе значение переменной $original и функции context_get_history()18:44:38 0.18617000 ур4 context_get_history
18:44:38 0.17697100 ур4 original Уровень 4
18:44:36 0.14097900 ур3 context_get_history Уровень 1 Уровень 2 Уровень 3
18:44:36 0.13184000 ур3 original Уровень 3
18:44:33 0.59629600 ур2 context_get_history Уровень 1 Уровень 2
18:44:33 0.58763800 ур2 original Уровень 2
18:44:31 0.42546600 ур1 context_get_history Уровень 1
18:44:31 0.41500800 ур1 original Уровень 1
Как мы видим, $original содержит текст последней команды целиком. А было время, когда там собиралась история, хоть и дублировалась странным образом. Последние исправления файла patterns.class.php как раз и убирают дубли, но убирают и историю. Которая была мне так нужна для шаблона (Включи|Выключи). Не готов я отказаться от этой конструкции и разбивать на разные ветки Включи и Выключи, дублируя практически одинаковый код в них. Я ранее оставлял много примеров с $original и шаблоном (Включи|Выключи). Теперь это уже давно не работает без правки файла patterns.class.php Ну да и ладно, не сторонник я править код в файлах.
Какие теперь есть альтернативы, давайте посмотрим на функцию context_get_history() которая могла бы заменить нам $original.
И всё вроде хорошо, но вот на последнем уровне ответ context_get_history() пустой. Всё дело в том, что у уровня 4 не стоит галка использовать как контекст. Это последний уровень, но на нем как раз и нужна история, чтобы понять включать нужно или выключать. По моему это как то не правильно. Буду разбираться почему так. А пока на этом всё, как найду решение, отпишусь. Тема шаблонов снова очень актуальна для меня. Прицепил Я.колонку. Теперь управлять голосом стало удобно.
- Bagir
- Сообщения: 1613
- Зарегистрирован: Вт сен 17, 2013 6:46 pm
- Откуда: Ярославская область город Углич
- Благодарил (а): 212 раз
- Поблагодарили: 375 раз
Re: Контексты в шаблонах поведения
Вот ещё дополнение к сказанному ранее. Второй тест, только команды вводим уже не по одной, а так:
В итоге у меня пока два вопроса к context_get_history()
1. Дубли истории при автоматическом переходе на следующий уровень контекста если команда содержит в себе его
2. Отсутствие ответа на последнем уровне.
Функция context_get_history() в файле context.inc.phpКак видно, функция берет значение из базы SQL. Вероятно дубли уже летят туда, а на последнем уровне значение стирается раньше, чем мы получаем его. Копаем дальше...
P.S. посмотрел в myadmin, так и есть
Ответ:Уровень 1 Уровень 2
Уровень 3
Уровень 4
Видим, что нет первого уровня, и это понятно, он автоматом пролетел, т.к. в первой команде 1 и 2 уровень указаны вместе. Не понятно для меня почему context_get_history() сразу дублирует историю? Похоже именно по этому возникали дикие дубли в $original потому что она ранее копила ответы context_get_history()20:13:47 0.78936800 ур4 context_get_history
20:13:47 0.77681600 ур4 original Уровень 4
20:13:45 0.43422200 ур3 context_get_history Уровень 1 Уровень 2 Уровень 1 Уровень 2 Уровень 3
20:13:45 0.42050700 ур3 original Уровень 3
20:13:42 0.76294300 ур2 context_get_history Уровень 1 Уровень 2 Уровень 1 Уровень 2
20:13:42 0.74754800 ур2 original Уровень 1 Уровень 2
В итоге у меня пока два вопроса к context_get_history()
1. Дубли истории при автоматическом переходе на следующий уровень контекста если команда содержит в себе его
2. Отсутствие ответа на последнем уровне.
Функция context_get_history() в файле context.inc.php
Код: Выделить всё
/**
* Summary of context_get_history
* @return mixed
*/
function context_get_history($user_id = 0)
{
if (!$user_id) {
$user_id = context_getuser();
}
$sqlQuery = "SELECT ID, ACTIVE_CONTEXT_ID, ACTIVE_CONTEXT_EXTERNAL, ACTIVE_CONTEXT_HISTORY
FROM users
WHERE ID = '" . (int)$user_id . "'";
$user = SQLSelectOne($sqlQuery);
if ($user['ACTIVE_CONTEXT_ID'])
return $user['ACTIVE_CONTEXT_HISTORY'];
return '';
}
P.S. посмотрел в myadmin, так и есть
- xor
- Сообщения: 2039
- Зарегистрирован: Сб ноя 22, 2014 8:45 pm
- Благодарил (а): 286 раз
- Поблагодарили: 629 раз
Re: Контексты в шаблонах поведения
про оригинал - не помню, вроде, уже писал - сделал свой, чтобы делать многоуровневые шаблоны
включи или выключи/свет, музыку,.../в спальне,на улице,...
уровень (включи|выключи)
Код: Выделить всё
if(preg_match('/включи/isu', $original)){
say('Включить что именно?',2);
saveToCache('VAR:original.0','включи');
}elseif(preg_match('/выключи/isu', $original)){
say('Выключить что именно?',2);
saveToCache('VAR:original.0','выключи');
}else{
saveToCache('VAR:original.0','');
}
Код: Выделить всё
$ss = checkFromCache("VAR:original.0");
if($ss){
$ss = $ss.' '.mb_strtolower($original); //для красоты
}else{
$ss = mb_strtolower($original);
}
saveToCache('VAR:original.0',$ss);
if(preg_match('/включи/isu', $ss)){
say('Включить свет где?',2);
}elseif(preg_match('/выключи/isu', $ss)){
say('Выключить свет где?',2);
}else{
saveToCache('VAR:original.0','');
}
ps. у меня только кэш не сбрасывается по любому чиху, если это не так, можно вместо кэша ивент использовать
win10 connect https://connect.smartliving.ru/profile/303
- Bagir
- Сообщения: 1613
- Зарегистрирован: Вт сен 17, 2013 6:46 pm
- Откуда: Ярославская область город Углич
- Благодарил (а): 212 раз
- Поблагодарили: 375 раз
Re: Контексты в шаблонах поведения
Да, я пользуюсь этой подсказкой уже давно. Большое спасибо. Только ещё добавляю и имени переменной в кеше user_id. Просто решил разобраться, почему такое происходит.
И как временный итог могу сказать следующее. Всё вроде бы так как надо, и история приклеивается функцией context_activate, но при переходе сразу на несколько уровней будет дубль. И вот с чем это связано:
Допустим мы пишем
Уровень 1
Уровень 2
на каждом шаге вызывается функция context_activate() и история собирается
было Уровень 1
стало Уровень 1 Уровень 2
Тут всё хорошо.
Но если написать сразу
Уровень 1 Уровень 2
то при переходе на второй уровень, функция context_activate() так же склеит историю, в которой уже есть "Уровень 1 Уровень 2 "
Получается Уровень 1 Уровень 2 + Уровень 1 Уровень 2
вот и ответ.
То есть, при автоматическом переходе на следующий уровень, историю уже не надо приклеивать.
Попробую разобраться.
А на второй пункт ответ тоже есть. В шаблонах на последнем уровне мы не можем пользоваться функцией context_get_history() потому что функция context_activate() уже стерла историю в SQL.
Сейчас посмотрим что можно сделать.
Последний раз редактировалось Bagir Чт авг 04, 2022 3:24 am, всего редактировалось 1 раз.
- Bagir
- Сообщения: 1613
- Зарегистрирован: Вт сен 17, 2013 6:46 pm
- Откуда: Ярославская область город Углич
- Благодарил (а): 212 раз
- Поблагодарили: 375 раз
Re: Контексты в шаблонах поведения
Чтож, ситуация такая:
checkPattern() вызывается рекурсивно, если команда делает переход более чем по одному уровню шаблонов. checkPattern() каждый раз вызывает функцию context_activate() для активации следующего шаблона. context_activate() записывает в поле ACTIVE_CONTEXT_HISTORY таблицы users историю. При рекурсивных вызовах checkPattern() образуются дубли в ACTIVE_CONTEXT_HISTORY, т.к. команда уже содержит в себе весь текст. Убрать их можно, не передавая context_activate() параметр $history при рекурсивных вызовах checkPattern(). Например так:
в файле patterns.class.php добавить условие смотря на $pattern_matched. При рекурсивных вызовах он уже = 1
код не стал в тег запихивать, чтобы жирным подсветить
if ($rec['IS_CONTEXT']) {
context_activate($rec['ID'], 1, ($pattern_matched ? '' : $history),$from_user_id);
} elseif ($rec['MATCHED_CONTEXT_ID']) {
context_activate($rec['MATCHED_CONTEXT_ID'], 0, $history,$from_user_id);
} elseif (!$is_common) {
context_activate(0,0, '',$from_user_id);
}
Но толку с этого мы не получим. Колонка ACTIVE_CONTEXT_HISTORY похоже никому больше вообще не нужна. В эту колонку смотрит функция context_get_history(), которую я и хотел использовать, вначале разобравшись с дублями. Но дело в том, что при исполнении кода шаблона, контекст уже сброшен, и ACTIVE_CONTEXT_HISTORY затерто. Перехватить раньше просто так не получится. context_clear() вызываемая context_activate() на последнем уровне шаблонов, стирает ACTIVE_CONTEXT_HISTORY раньше, чем мы добираемся до него из кода в шаблоне. Соответственно придется опять делать временную переменную, что убивает смысл бороться. Проще использовать кеш.
Конечно, иметь весь текст в коде шаблона, собранный при переходе по уровням, без танцев с кешем, было бы круто.
checkPattern() вызывается рекурсивно, если команда делает переход более чем по одному уровню шаблонов. checkPattern() каждый раз вызывает функцию context_activate() для активации следующего шаблона. context_activate() записывает в поле ACTIVE_CONTEXT_HISTORY таблицы users историю. При рекурсивных вызовах checkPattern() образуются дубли в ACTIVE_CONTEXT_HISTORY, т.к. команда уже содержит в себе весь текст. Убрать их можно, не передавая context_activate() параметр $history при рекурсивных вызовах checkPattern(). Например так:
в файле patterns.class.php добавить условие смотря на $pattern_matched. При рекурсивных вызовах он уже = 1
код не стал в тег запихивать, чтобы жирным подсветить
if ($rec['IS_CONTEXT']) {
context_activate($rec['ID'], 1, ($pattern_matched ? '' : $history),$from_user_id);
} elseif ($rec['MATCHED_CONTEXT_ID']) {
context_activate($rec['MATCHED_CONTEXT_ID'], 0, $history,$from_user_id);
} elseif (!$is_common) {
context_activate(0,0, '',$from_user_id);
}
Но толку с этого мы не получим. Колонка ACTIVE_CONTEXT_HISTORY похоже никому больше вообще не нужна. В эту колонку смотрит функция context_get_history(), которую я и хотел использовать, вначале разобравшись с дублями. Но дело в том, что при исполнении кода шаблона, контекст уже сброшен, и ACTIVE_CONTEXT_HISTORY затерто. Перехватить раньше просто так не получится. context_clear() вызываемая context_activate() на последнем уровне шаблонов, стирает ACTIVE_CONTEXT_HISTORY раньше, чем мы добираемся до него из кода в шаблоне. Соответственно придется опять делать временную переменную, что убивает смысл бороться. Проще использовать кеш.
Конечно, иметь весь текст в коде шаблона, собранный при переходе по уровням, без танцев с кешем, было бы круто.