Страница 1 из 1

Собственные обработчики системных событий

Добавлено: Чт июн 05, 2014 1:27 pm
sergejey
В последнем обновлении исходников немного переработал раздел общих настроек в панеле управления.

Во-первых, настройки сейчас разбиты на секции, чтобы не всё в одной куче.

Во-вторых, добавилась секция Обработчики, в которой можно задать собственный код, который встраивается в системные функции.

Пока реализовано два обработчика:
After Say
Before Say

Этот код будет выполняться соответственнов в начале и в конце вызова системной функции say().

Пример использования:
Изображение
Текстом:

Код: Выделить всё

DebMes("Before say (".$level."): ".$ph);
DebMes("After say (".$level."): ".$ph); 
$level это параметр "важности" и $ph это сама фраза (собственно, это параметры системной функции say($ph,$level=0);)

В приведённом примере каждая фраза будет дополнительно записываться в лог-файл.

Таким же образом можно сделать вызов собственных методов, например:

Код: Выделить всё

callMethod('MyObject.MyMethod',array('ph'=>$ph,'level'=>$level)); 
и тогда в коде MyObject.MyMethod можно использовать
$params['ph'] -- фраза
$params['level'] -- уровень важности

Т.е. теперь можно создавать и подключать собственные средства оповещения.

Аналогичным образом можно будет добавить обработчики и на другие системные функции, но я пока не придумал, где ещё есть такая необходимость -- подсказывайте :)

Re: Собственные обработчики системных событий

Добавлено: Чт июн 05, 2014 1:31 pm
sergejey
Небольшое уточнение насчёт After Say -- этот код выполнеяется не по окончанию произнесения фразы, а по окончанию выполнения функции say. Дело в том, что эта функция не ждёт, когда фраза будет произнесена (непосредственное произношение идёт в отдельном потоке). Просто имейте в виду, что для выполнения каких-либо действий после произношения лучше воспользоваться таймером, запуская его в Before Say (или After Say -- без разницы).

Re: Собственные обработчики системных событий

Добавлено: Чт июн 05, 2014 2:45 pm
Ivan
Я уже заметил это когда реализовывал глушения радио. В итоге у меня новости проговариваются с ИКАМИ.

Хотел бы внести свои пожелания насчёт этих обработок. Они как раз нужны во время проговаривания фразы. Чтобы потушить радио. С таймером не угадаешь время произнесения

Re: Собственные обработчики системных событий

Добавлено: Чт июн 05, 2014 2:50 pm
Ivan
Ещё вопрос как использовать эти обработчики для реализации модуля например skype
То есть есть ли на уровне ядра возможность подписаться на них?

Re: Собственные обработчики системных событий

Добавлено: Чт июн 05, 2014 3:06 pm
sergejey
Ivan писал(а):Ещё вопрос как использовать эти обработчики для реализации модуля например skype
То есть есть ли на уровне ядра возможность подписаться на них?
Модуль автоматически не может подписаться. Хотя... есть вариант. Модуль может сам внести изменения в общие настройки через базу данных (например, при установке) и прописать вызов собственной функции. Например так:

Код: Выделить всё

SQLExec("UPDATE settings SET VALUE='include_once(DIR_MODULES.\"/mymodule/mymodule.class.php\");$m=new mymodule();$m->beforeSay($ph,$level);' WHERE `NAME`='HOOK_BEFORE_SAY'"); 
и соответственно в модуле mymodule должен быть метод beforeSay()

Насчёт таймеров -- мне кажется должно нормально работать, если принять что произнесённая фраза будет не дольше 5 секунд, то достаточно в afterSay поставить такой код:

Код: Выделить всё

runScript("myBeforeSayScript");clearTimeOut('afterSayTimer');setTimeOut('afterSayTimer','runScript("myAfterSayScript")',5); 
ну и скрипты должны быть myBeforeSayScript и myAfterSayScript

Re: Собственные обработчики системных событий

Добавлено: Вс июн 08, 2014 5:06 pm
aurodionov
Сергей, Огромное спасибо за обновление.
"Пушовер" больше не придётся менять руками после каждого обновления.
Из хотелок ,имя системы ,через что произносить голос.

Re: Собственные обработчики системных событий

Добавлено: Пн июн 09, 2014 9:42 am
sergejey
aurodionov писал(а):Сергей, Огромное спасибо за обновление.
"Пушовер" больше не придётся менять руками после каждого обновления.
Из хотелок ,имя системы ,через что произносить голос.
Это можно устроить с текущим функционалом обработчика.
Например, вместо просто фразы передавать какие-то параметры дополнительно:

Код: Выделить всё

say(array('name'=>'Имя','text'=>"Фраза")); 
а в обработчик beforesay сделать следующее:

Код: Выделить всё

if (is_array($ph)) {$name=$ph['name']; $ph=$ph['text'];} 
ну и потом с $name делать всё, что угодно. параметров можно любое количество так передавать, при этом остаётся совместимость со стандартным способом

Re: Собственные обработчики системных событий

Добавлено: Вс авг 31, 2014 11:17 pm
Bagir
sergejey писал(а):Аналогичным образом можно будет добавить обработчики и на другие системные функции, но я пока не придумал, где ещё есть такая необходимость -- подсказывайте :)
Если я правильно понял, что таким образом можно увести чтение сообщений в свою программу, то тогда было бы неплохо добавить такие же обработчики на функцию playSound, чтобы так же перехватить имена файлов со звуковыми сообщениями, и не проигрывать их в madplay.exe, а утащить себе, где они будут выстроены в очередь с чтением текстовых сообщений.
Только вот я еще не разобрался, как этот перехват сделать. Допустим в beforeSay() я сделаю вызов своего метода

Код: Выделить всё

callMethod('MyObject.MyMethod',array('ph'=>$ph,'level'=>$level));  
В этом методе текст будет отправлен в другую программу, и там будет прочтен. А как запретить его чтение тут? Наверное то же самое и со звуковыми файлами.