tdengine 0.1.2

game server for Rust
Documentation
-- raiser.lua
-- Created by wugd
-- 实现事件相关功能

--变量定义
-- event_responder 和 event_audience 格式如下:
-- {
--                 EVENT_XXX : {
--                       listener = {"func" : func, args = args},
--                       ...
--                 },
--                 ...
-- }

--raiser发起事件的类
--listener 接收的对像 仅做避免重复的索引用
--event_routines 事件的索引
local event_responder = {};
local event_audience  = {};

-- 定义公共接口,按照字母顺序排序
function get_all_audiences()
    return event_audience;
end

function get_all_responders()
    return event_responder;
end

-- 发送事件
function raise_issue(event, ...)
    local info, f, result, ret = nil, nil, {}, nil
    local nodes = event_responder[event] or {}
    for listener, node in pairs(nodes) do
        f = node["func"];
        if type(f) == "function" then
            ret = call_func(f, node["args"], ...)
            if ret then
                table.insert(result, ret)
                return result
            end
       end
    end

    local nodes = event_audience[event] or {}
    for listener, node in pairs(nodes) do
        f = node["func"];
        if type(f) == "function" then
            ret = call_func(f, node["args"], ...)
            if ret then
                table.insert(result, ret)
            end
       end
    end

    return result
end

local function register_by_type(event_struct, listener, event_routines)
    -- 遍历注册的事件
    for event, info in pairs(event_routines) do
        local func = info
        local args = {}
        if type(func) ~= "function" then
            func = info["func"]
            args = info["args"]
        end
        assert(type(func) == "function")
        event_struct[event] = event_struct[event] or {}
        event_struct[event][listener] = {func = func, args = args}
    end
end

-- 注册观众
-- 接收指定事件,但不拦截该事件,事件会继续传递给其它观众
function register_as_audience(listener, event_routines)
    register_by_type(event_audience, listener, event_routines)
end

-- 注册响应者
-- 指定事件若被响应者截获,则会直接返回,不会继续传递该事件
function register_as_responder(listener, event_routines)
    register_by_type(event_responder, listener, event_routines)
end

local function remove_by_type(event_struct, listener, events)
    assert(listener ~= nil, "listener must no nil")
    if not events then
        for event,node in pairs(event_struct) do
            node[listener] = nil
        end
        return
    end

    for _, event in ipairs(events) do
        if event_struct[event] then
            event_struct[event][listener] = nil
        end
    end
end

-- 移除观众
function remove_audience_from_raiser(listener, events)
    remove_by_type(event_audience, listener, events)
end

-- 移除响应者
function remove_responder_from_raiser(listener, events)
    remove_by_type(event_responder, listener, events)
end