OpenComputers/Event API

Базовая система событий. Представляет собой надстройку над стандартными сигналами, с более удобным интерфейсом.

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



## Интерфейс

`event.listen(name: string, callback: function): boolean`


Регистрирует нового "слушателя" (listener) событий, который вызывается для событий с заданным названием (если это "слушатель" сигналов, то должно быть задано имя сигнала). Возвращает `true`

, если "слушатель" был успешно зарегистрирован и `false`

, если "слушатель" для событий этого типа уже назначен.

Обратите внимание, что "слушатели" могут возвращать значение `false`

для удаления своей регистрации (эквивалентно вызову `event.ignore`

с названием этого "слушателя" и именем события, для которого он был зарегистрирован).



`event.ignore(name: string, callback: function): boolean`


Удаляет регистрацию "слушателя" (listener). Возвращает `true`

, если регистрация была успешно удалена и `false`

, если такого "слушателя" зарегистрировано не было.



`event.timer(interval: number, callback: function[, times: number]): number`


Запускает новый таймер, который будет вызван через время, определенное в `interval`

. По умолчанию таймер срабатывает один раз. Число срабатываний определяет параметр `times`

. Значение `math.huge`

заставит таймер повторяться бесконечно.

Функция возвращает номер-идентификатор, который может быть использован в функции `timer.cancel`

для того, чтобы отменить таймер (даже если он еще ни разу не сработал).

*Примечание*: время срабатывания таймера может изменяться. Если компьютер простаивает и переходит в спящий режим, таймер измеряет время в игровых "тактах". Таким образом время срабатывания может колебаться в пределах 0.05 секунд.

**Важно**: таймеры используют функцию `event.pull`

. Если вы перехватываете сигналы функцией `os.pullSignal`

, и не используете `event.pull`

— таймеры работать не будут!



`event.cancel(timerId: function): boolean`


Отменяет таймер созданный командой `event.timer`

. Возвращает `true`

, если таймер успешно отменен и `false`

, если таймера с таким ID не существует.



`event.pull([timeout: number], [name: string], ...): string, ...`


Эта команда, кроме `os.sleep()`

, должна быть основным способом "ожидания" программы. Функция используется для обработки событий (в том числе и сигналов, которые не были перехвачены другой функцией раньше). Также функция принимает вызовы таймеров созданных функцией `event.timer`

. Таким образом, функция должна вызываться периодически.

Первый параметр — это число, определяющее сколько функция ждет события, прежде чем отправить `nil`

. В это случае второй параметр — это имя события.
Если время ожидания не определено, то имя события становится первым параметром. Имя события может быть `nil`

, тогда фильтрация событий выполняться не будет. Остальные параметры используются как прямой фильтр. Функция будет возвращать только те события, которые подойдут под условие (точное совпадение параметров, для названия события можно использовать регулярные выражения, см. `string.match`

).

Для примера, сигнал `touch`

(когда игрок щелкает мышью по монитору второго поколения) имеет сигнатуру `screenX: number, screenY: number, playerName: string`

. Чтобы отсортировать щелчки только от игрока "Стив", вы должны использовать следующую конструкцию: `local _, x, y = event.pull("touch", _, _, "Стив")`




`event.shouldInterrupt(): boolean`


Эта функция вызывается `event.pull`

, после каждого принятого сигнала, чтобы определить должен ли тот быть прерван преждевременно. Если она возвращает `true`

, `event.pull`

создаст `interrupted`

ошибку. По умолчанию, она возвращает `true`

, если была нажата комбинация `Ctrl` + `Alt` + `C`.



`event.onError(message: any)`


Глобальный обработчик ошибок событий. Если какой-либо "слушатель" событий создаст ошибку, эта функция ее перехватывает, чтобы избежать "попадания" в другую часть кода. По умолчанию, функция ведет лог ошибок во временной файловой системе компьютера.



## Пример

Эта программа проверяет, работает ли компьютер больше 300 секунд, каждые 30 секунд. Если да, то перезагружает компьютер.

local computer = require("computer") local event = require("event") function onTimer() computer.shutdown(true) end -- Выполнить 50 раз, затем остановится. Если вы не успели что-то -- доделать за эти 300 секунд - то у вас большие проблемы event.timer(30, onTimer, 50)