Skip to content

ru_Events

Akito Iwakura edited this page Jan 26, 2017 · 9 revisions

События

Модулям m0ssion доступно два вида событий: событие новой команды с сервера и событие отправки команды на сервер клиентом. Это основные события, с которыми можно (и нужно) работать, остальные возможные — лишь их производные. Минимализм m0ssion заключается именно в этом: не перегружать систему лишними перехватами, ведь, перехватив команду клиенту и от него, можно сделать всё что угодно. В том числе и не дать команде дойти, но об этом позже.

Принцип работы событий

Если модуль желает получать события от системы, он регистрирует обработчик с помощью метода m0s.addEvent(). В параметрах он указывает желаемый тип события (receive или send) и функцию, с помощью которой будет обрабатывать событие. Функция принимает на вход один единственный параметр — строку command, содержащую в себе команду клиента или сервера. После работы функция должна вернуть результат работы: (не)изменённую команду или false, если дальнейшая обработка не должна проводиться. Каждому последующему обработчику передаётся уже видоизменённая команда, если же платформа получает от какого-то обработчика false, она завершает цепочку и "теряет" команду. Возврат результата обязателен, отсутствие return приведёт к зависанию клиента!

Ничего не понял, давай примеры!

Без проблем. Ниже представлен пример обработчика, регистрирующегося на событие получения команды от сервера, ищущего там строку "OBJ_" и блокирующего её распространение: так будем блокировать объекты на планетах.

function disable_objects (command)
{
    if (command.indexOf('OBJ_') > -1)
        return false; // объекты #нинужны
    else
        return command; // ok, пропускаем
}

m0s.addEvent ('receive', disable_objects); // receive - получение команды с сервера

Не дадим себе забивать другим мозг о своей возлюбленной, например, Алисе:

function lock_me (command)
{
    var name = 'алиса';
    if (command.toLowerCase().indexOf(name) > -1)
        return false; // не в этой жизни
    else
        return command; // ok, пропускаем
}

m0s.addEvent ('send', lock_me); // send - отправка команды клиентом 

Одну и ту же функцию можно использовать в обоих направлениях. Например, не дадим себе и другим использовать много скобочек, потому что это идиотизм:

function parentheses_are_cancer (command)
{
    var rx = /[а-яА-Яa-zA-Z](?:\)|\(|9|0){4,}/;
    if (rx.test(command))
        return false;   // нет, спасибо
    else
        return command; // ok, пропускаем
}

m0s.addEvent ('send', parentheses_are_cancer);    // send    - отправка команды клиентом 
m0s.addEvent ('receive', parentheses_are_cancer); // receive - получение команды с сервера

Работа модулей не ограничивается блокировкой команд, их ещё можно изменять. Давайте заменим всех "кошек" на "няяш" в тексте других пользователей:

function cats (command)
{
    command = command.replace('кошк', 'няяш');
    return command; // вернём видоизменённую команду
}

m0s.addEvent ('receive', cats); // receive - получение команды с сервера

В примерах выше использовались явно заданные функции, однако, никто не запрещает использовать и анонимные:

m0s.addEvent ('receive', function (command) {
    command = command.replace('кошк', 'няяш');
    return command;
});

Теперь, когда стало хоть немного стало понятно, как работают события, настало время изучить устройство самой Galaxy.

Clone this wiki locally