From b7815395e867d77d7b897bb1d15265e241626565 Mon Sep 17 00:00:00 2001 From: xiaojin Date: Mon, 12 Jul 2021 11:36:42 +0800 Subject: [PATCH] =?UTF-8?q?=F0=9F=90=B3=20chore(=E5=B7=A5=E5=85=B7):=20?= =?UTF-8?q?=E5=A2=9E=E5=8A=A0=20=E5=85=A8=E5=B1=80=E4=BA=8B=E4=BB=B6=20?= =?UTF-8?q?=E5=92=8C=20=E4=BA=8B=E4=BB=B6=E5=AF=B9=E8=B1=A1=E5=9F=BA?= =?UTF-8?q?=E7=A1=80=E7=B1=BB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .luacheckrc | 2 +- framework/lualib/3rd/zeus/events.lua | 221 -------------- .../zeus/events/cross/cross_event_client.lua | 178 ++++++++++++ .../zeus/events/cross/cross_event_router.lua | 28 ++ .../zeus/events/cross/cross_event_type.lua | 8 + .../lualib/zeus/events/dispatcher_global.lua | 270 ++++++++++++++++++ .../lualib/zeus/events/dispatcher_obj.lua | 125 ++++++++ framework/lualib/zeus/events/local/readme.txt | 1 + 8 files changed, 611 insertions(+), 222 deletions(-) delete mode 100644 framework/lualib/3rd/zeus/events.lua create mode 100644 framework/lualib/zeus/events/cross/cross_event_client.lua create mode 100644 framework/lualib/zeus/events/cross/cross_event_router.lua create mode 100644 framework/lualib/zeus/events/cross/cross_event_type.lua create mode 100644 framework/lualib/zeus/events/dispatcher_global.lua create mode 100644 framework/lualib/zeus/events/dispatcher_obj.lua create mode 100644 framework/lualib/zeus/events/local/readme.txt diff --git a/.luacheckrc b/.luacheckrc index 3a37180..ba9d19b 100644 --- a/.luacheckrc +++ b/.luacheckrc @@ -14,7 +14,7 @@ globals = { "class", "singleton", "handler", - "zlog", + "ZLog", } ignore = { diff --git a/framework/lualib/3rd/zeus/events.lua b/framework/lualib/3rd/zeus/events.lua deleted file mode 100644 index e24e2bd..0000000 --- a/framework/lualib/3rd/zeus/events.lua +++ /dev/null @@ -1,221 +0,0 @@ ------------------------------------------------------------------------------- --- https://github.com/simenkid/lua-events ------------------------------------------------------------------------------- -local PFX = '__lsn_' -local PFX_LEN = #PFX -local Events = { - defaultMaxListeners = 10, -} - -setmetatable(Events, { - __call = function(_, ...) - return Events:new(...) - end, -}) - -local function rmEntry(tbl, pred) - local x, len = 0, #tbl - for i = 1, len do - local trusy, idx = false, (i - x) - if (type(pred) == 'function') then - trusy = pred(tbl[idx]) - else - trusy = tbl[idx] == pred - end - - if (tbl[idx] ~= nil and trusy) then - tbl[idx] = nil - table.remove(tbl, idx) - x = x + 1 - end - end - return tbl -end - -function Events:new(obj) - obj = obj or {} - self.__index = self - setmetatable(obj, self) - obj._on = {} - - return obj -end - -function Events:evTable(ev) - if (type(self._on[ev]) ~= 'table') then - self._on[ev] = {} - end - return self._on[ev] -end - -function Events:getEvTable(ev) - return self._on[ev] -end - --- ************************************************************************ -- --- ** Public APIs * -- --- ************************************************************************ -- -function Events:addListener(ev, listener) - local pfx_ev = PFX .. tostring(ev) - local evtbl = self:evTable(pfx_ev) - local maxLsnNum = self.currentMaxListeners or self.defaultMaxListeners - local lsnNum = self:listenerCount(ev) - table.insert(evtbl, listener) - - if (lsnNum > maxLsnNum) then - print('WARN: Number of ' .. string.sub(pfx_ev, PFX_LEN + 1) .. " event listeners: " .. tostring(lsnNum)) - end - return self -end - -function Events:emit(ev, ...) - local pfx_ev = PFX .. tostring(ev) - local evtbl = self:getEvTable(pfx_ev) - if (evtbl ~= nil) then - for _, lsn in ipairs(evtbl) do - local status, err = pcall(lsn, ...) - if not (status) then - print(string.sub(_, PFX_LEN + 1) .. " emit error: " .. tostring(err)) - end - end - end - - -- one-time listener - pfx_ev = pfx_ev .. ':once' - evtbl = self:getEvTable(pfx_ev) - - if (evtbl ~= nil) then - for _, lsn in ipairs(evtbl) do - local status, err = pcall(lsn, ...) - if not (status) then - print(string.sub(_, PFX_LEN + 1) .. " emit error: " .. tostring(err)) - end - end - - rmEntry(evtbl, function(v) - return v ~= nil - end) - self._on[pfx_ev] = nil - end - return self -end - -function Events:getMaxListeners() - return self.currentMaxListeners or self.defaultMaxListeners -end - -function Events:listenerCount(ev) - local totalNum = 0 - local pfx_ev = PFX .. tostring(ev) - local evtbl = self:getEvTable(pfx_ev) - - if (evtbl ~= nil) then - totalNum = totalNum + #evtbl - end - - pfx_ev = pfx_ev .. ':once' - evtbl = self:getEvTable(pfx_ev) - - if (evtbl ~= nil) then - totalNum = totalNum + #evtbl - end - - return totalNum -end - -function Events:listeners(ev) - local pfx_ev = PFX .. tostring(ev) - local evtbl = self:getEvTable(pfx_ev) - local clone = {} - - if (evtbl ~= nil) then - for i, lsn in ipairs(evtbl) do - table.insert(clone, lsn) - end - end - - pfx_ev = pfx_ev .. ':once' - evtbl = self:getEvTable(pfx_ev) - - if (evtbl ~= nil) then - for i, lsn in ipairs(evtbl) do - table.insert(clone, lsn) - end - end - - return clone -end - -Events.on = Events.addListener - -function Events:once(ev, listener) - local pfx_ev = PFX .. tostring(ev) .. ':once' - local evtbl = self:evTable(pfx_ev) - local maxLsnNum = self.currentMaxListeners or self.defaultMaxListeners - local lsnNum = self:listenerCount(ev) - if (lsnNum > maxLsnNum) then - print('WARN: Number of ' .. ev .. " event listeners: " .. tostring(lsnNum)) - end - - table.insert(evtbl, listener) - return self -end - -function Events:removeAllListeners(ev) - if ev ~= nil then - local pfx_ev = PFX .. tostring(ev) - local evtbl = self:evTable(pfx_ev) - rmEntry(evtbl, function(v) - return v ~= nil - end) - - pfx_ev = pfx_ev .. ':once' - evtbl = self:evTable(pfx_ev) - rmEntry(evtbl, function(v) - return v ~= nil - end) - self._on[pfx_ev] = nil - else - for _pfx_ev, _t in pairs(self._on) do - self:removeAllListeners(string.sub(_pfx_ev, PFX_LEN + 1)) - end - end - - for _pfx_ev, _t in pairs(self._on) do - if (#_t == 0) then - self._on[_pfx_ev] = nil - end - end - - return self -end - -function Events:removeListener(ev, listener) - local pfx_ev = PFX .. tostring(ev) - local evtbl = self:evTable(pfx_ev) - local lsnCount = 0 - assert(listener ~= nil, "listener is nil") - -- normal listener - rmEntry(evtbl, listener) - - if (#evtbl == 0) then - self._on[pfx_ev] = nil - end - - -- emit-once listener - pfx_ev = pfx_ev .. ':once' - evtbl = self:evTable(pfx_ev) - rmEntry(evtbl, listener) - - if (#evtbl == 0) then - self._on[pfx_ev] = nil - end - return self -end - -function Events:setMaxListeners(n) - self.currentMaxListeners = n - return self -end - -return Events diff --git a/framework/lualib/zeus/events/cross/cross_event_client.lua b/framework/lualib/zeus/events/cross/cross_event_client.lua new file mode 100644 index 0000000..ff35c99 --- /dev/null +++ b/framework/lualib/zeus/events/cross/cross_event_client.lua @@ -0,0 +1,178 @@ +-- local skynet = require("skynet") +-- local serviceAddress = require("serviceAddress") +-- local serviceProxy = require("serviceProxy") +-- local eventd +-- local curlistenerHandleIndex = 1 +-- local string_format = string.format +-- local table_insert = table.insert + +-- local dispatch = {} + +-- local crossEventClient = {} + +-- function crossEventClient.addEventListener(crossEventType, eventId, objId, cb, obj) +-- assert(objId == nil or (type(objId) == "number" and objId > 0) or (type(objId) == "string" and #objId > 0), +-- string_format("[crossEventClient].addEventListener,objId")) +-- local dispatchKey = string_format("%s-%s", crossEventType, eventId) +-- local handle = curlistenerHandleIndex +-- curlistenerHandleIndex = curlistenerHandleIndex + 1 +-- local listener = {cb, obj} +-- local eventListener = dispatch[dispatchKey] +-- if not eventListener then +-- eventListener = {} +-- dispatch[dispatchKey] = eventListener +-- end +-- local listeners +-- if objId then +-- eventListener.single = eventListener.single or {} +-- listeners = eventListener.single[objId] +-- if not listeners then +-- listeners = {} +-- eventListener.single[objId] = listeners +-- end +-- else +-- eventListener.all = eventListener.all or {} +-- listeners = eventListener.all +-- end + +-- if not next(listeners) then +-- local addr = skynet.self() +-- skynet.send(eventd, "lua", "addEventListener", dispatchKey, addr, objId) +-- end +-- listeners[handle] = listener +-- return handle +-- end + +-- function crossEventClient.removeEventListener(handle) +-- for dispatchKey, eventListener in pairs(dispatch) do +-- local singleListener = eventListener.single +-- if singleListener then +-- for objId, listeners in pairs(singleListener) do +-- for h, _ in pairs(listeners) do +-- if h == handle then +-- listeners[h] = nil +-- if not next(singleListener) then +-- eventListener.single = nil +-- local addr = skynet.self() +-- skynet.send(eventd, "lua", "removeEventListener", dispatchKey, addr, objId) +-- end +-- break +-- end +-- end +-- end +-- end + +-- local allListener = eventListener.all +-- if allListener then +-- for h, _ in pairs(allListener) do +-- if h == handle then +-- allListener[h] = nil +-- if not next(allListener) then +-- eventListener.all = nil +-- local addr = skynet.self() +-- skynet.send(eventd, "lua", "removeEventListener", dispatchKey, addr) +-- end +-- break +-- end +-- end +-- end +-- end +-- end + +-- function crossEventClient.dispatchEventBySend(crossEventType, eventId, objId, event) +-- assert(objId == nil or (type(objId) == "number" and objId > 0) or (type(objId) == "string" and #objId > 0), +-- string_format("[crossEventClient].addEventListener,objId")) +-- local dispatchKey = string_format("%s-%s", crossEventType, eventId) +-- event.dispatchKey = dispatchKey +-- event.dispatchObjId = objId +-- local strEvent = skynet.tostring(skynet.pack(event)) +-- skynet.send(eventd, "lua", "dispatchEventBySend", dispatchKey, strEvent, objId) +-- end + +-- function crossEventClient.dispatchEventByCall(crossEventType, eventId, objId, event) +-- assert(objId == nil or (type(objId) == "number" and objId > 0) or (type(objId) == "string" and #objId > 0), +-- string_format("[crossEventClient].addEventListener,objId")) +-- local dispatchKey = string_format("%s-%s", crossEventType, eventId) +-- event.dispatchKey = dispatchKey +-- event.dispatchObjId = objId +-- local strEvent = skynet.tostring(skynet.pack(event)) +-- skynet.call(eventd, "lua", "dispatchEventByCall", dispatchKey, strEvent, objId) +-- end + +-- function crossEventClient.dispatchEventComposeBySend(crossEventType, eventId, objId, event, amongSvr, amongCluster, +-- nodeNames) +-- assert(objId == nil or (type(objId) == "number" and objId > 0) or (type(objId) == "string" and #objId > 0), +-- string_format("[crossEventClient].addEventListener,objId")) +-- local dispatchKey = string_format("%s-%s", crossEventType, eventId) +-- event.dispatchKey = dispatchKey +-- event.dispatchObjId = objId +-- local strEvent = skynet.tostring(skynet.pack(event)) +-- if amongSvr then +-- skynet.send(eventd, "lua", "dispatchEventBySend", dispatchKey, strEvent, objId) +-- end +-- if amongCluster then +-- for _, nodeName in pairs(nodeNames) do +-- local crossEventServerProxy = serviceProxy.remote(nodeName, "crossEvent") +-- crossEventServerProxy.remotePost.dispatchEventBySend(nodeName, dispatchKey, strEvent, objId) +-- end +-- end +-- end + +-- local function dispatchEvent(session, _, strEvent) +-- local event = skynet.unpack(strEvent) +-- local dispatchKey = event.dispatchKey +-- local objId = event.dispatchObjId +-- local eventListener = dispatch[dispatchKey] +-- if not eventListener then +-- return +-- end + +-- local tmpListeners = {} +-- if objId then +-- local singleListener = eventListener.single +-- if singleListener then +-- local listeners = singleListener[objId] +-- if listeners then +-- for _, listener in pairs(listeners) do +-- table_insert(tmpListeners, listener) +-- end +-- end +-- end +-- end + +-- local allListener = eventListener.all +-- if allListener then +-- for _, listener in pairs(allListener) do +-- table_insert(tmpListeners, listener) +-- end +-- end + +-- for _, listener in pairs(tmpListeners) do +-- local cb = listener[1] +-- local obj = listener[2] +-- if obj then +-- cb(obj, event) +-- else +-- cb(event) +-- end +-- end + +-- if session > 0 then +-- skynet.ret(skynet.pack(true)) +-- end +-- end + +-- local function init() +-- eventd = serviceAddress.crossEvent() +-- log.debug("[crossEventClient].init,eventd=%s", eventd) +-- skynet.register_protocol { +-- name = "crossevent", +-- id = skynet.PTYPE_TEXT, +-- unpack = skynet.tostring, +-- dispatch = dispatchEvent, +-- } +-- end + +-- init() + +-- return crossEventClient diff --git a/framework/lualib/zeus/events/cross/cross_event_router.lua b/framework/lualib/zeus/events/cross/cross_event_router.lua new file mode 100644 index 0000000..e1cb494 --- /dev/null +++ b/framework/lualib/zeus/events/cross/cross_event_router.lua @@ -0,0 +1,28 @@ +-- local crossEventType = require("crossEvent.crossEventType") +-- local PlayerEventEnum = gEnum("PlayerEventEnum") +-- local PlayerEventId = PlayerEventEnum.PlayerEventId +-- local ClusterEnum = gEnum("ClusterEnum") +-- local ClusterEventId = ClusterEnum.ClusterEventId + + +-- local eventRouteConfig = { +-- amongService = { +-- [crossEventType.CLUSTER] = { +-- [ClusterEventId.NODE_STATUS_CHANGE] = true, +-- }, +-- [crossEventType.PLAYER] = { +-- [PlayerEventId.ONLINE] = true, +-- [PlayerEventId.OFFLINE] = true, +-- }, +-- }, +-- amongCluster = { +-- [crossEventType.CLUSTER] = { +-- [ClusterEventId.NODE_STATUS_CHANGE] = { +-- "login", +-- "game", +-- }, +-- } +-- } +-- } + +-- return eventRouteConfig \ No newline at end of file diff --git a/framework/lualib/zeus/events/cross/cross_event_type.lua b/framework/lualib/zeus/events/cross/cross_event_type.lua new file mode 100644 index 0000000..5efb6c9 --- /dev/null +++ b/framework/lualib/zeus/events/cross/cross_event_type.lua @@ -0,0 +1,8 @@ +-- 跨服务 事件类型 +local crossEventType = { + CLUSTER = 1, -- 集群 + PLAYER = 2, -- 玩家 + ALLIANCE = 3, -- 联盟 +} + +return crossEventType diff --git a/framework/lualib/zeus/events/dispatcher_global.lua b/framework/lualib/zeus/events/dispatcher_global.lua new file mode 100644 index 0000000..f92fd35 --- /dev/null +++ b/framework/lualib/zeus/events/dispatcher_global.lua @@ -0,0 +1,270 @@ +--[[-- +Provides custom event broadcaster / listener mechanism to regular Lua objects. + +All listeners receive the following fields in the parameter event table: + +event.name (name of the event) + +event.target (the listener itself) + +event.source (the dispatcher) + +Latest code: https://github.com/daveyang/EventDispatcher + +@module EventDispatcher +@usage +local EvtD = require "EventDispatcher" + +local dispatcher = EvtD() + +-- listener as table +local listener = { + eventName = function(event, ...) + print(event.name, event.target, event.source) + end +} + +-- listener as function +local function listener(event, ...) + print(event.name, event.target, event.source) +end + +dispatcher:addEventListener( "eventName", listener ) -- or +dispatcher:on( "eventName", listener ) + +dispatcher:once( "eventName", listener ) + +dispatcher:hasEventListener( "eventName", listener ) + +dispatcher:dispatchEvent( { name="eventName" } ) -- or +dispatcher:dispatchEvent( "eventName" ) -- or +dispatcher:emit( { name="eventName" } ) -- or +dispatcher:emit( "eventName" ) + +dispatcher:removeEventListener( "eventName", listener ) + +dispatcher:removeAllListeners( "eventName" ) -- or +dispatcher:removeAllListeners() + +dispatcher:printListeners() +]] + + +local EventDispatcher = {} + +-- Initializes an object (this is automatically invoked and is considered a private method) +-- @param o table object to become event dispatcher +-- @return a table +function EventDispatcher:init(o) + o = o or {} + o._listeners = {} + self.__index = self + return setmetatable(o, self) +end + +--------------------------------------------------------------------------- + +--- Checks if the event dispatcher has registered listener for the event eventName. +-- @param eventName event name (string) +-- @param listener object (table or function) +-- @return found status (boolean); if found also returns the index of listener object. +function EventDispatcher:hasEventListener(eventName, listener) + if eventName == nil or #eventName == 0 or listener == nil then + return false + end + + local a = self._listeners + if a == nil then + return false + end + + for i, o in next, a do + if o ~= nil and o.evt == eventName and o.obj == listener then + return true, i + end + end + return false +end + +--------------------------------------------------------------------------- + +--- Adds a listener for the event eventName. Optional runs once flag. +-- @param eventName event name (string) +-- @param listener object (table or function) +-- @param isOnce flag to specify the listener only runs once (boolean) +-- @return success/fail status (boolean); position of listener is also returned if false; position=0 if failed. +-- @see on +-- @see once +function EventDispatcher:addEventListener(eventName, listener, isOnce) + if not isOnce then + local found, pos = self:hasEventListener(eventName, listener) + if found then + return false, pos + end + end + + local a = self._listeners + if a == nil then + return false, 0 + end + + a[#a + 1] = { + evt = eventName, + obj = listener, + isOnce = isOnce, + } + return true +end + +--- 'on' is an alias of 'addEventListener' +EventDispatcher.on = EventDispatcher.addEventListener + +--------------------------------------------------------------------------- + +--- Adds a one-time listener for the event eventName. Once the event is dispatched, the listener is removed. +-- @param eventName event name (string) +-- @param listener object (table or function) +-- @return success/fail status (boolean); position of listener is also returned if false; position=0 if failed. +-- @see addEventListener +-- @see on +function EventDispatcher:once(eventName, listener) + return self:addEventListener(eventName, listener, true) +end + +--------------------------------------------------------------------------- + +--- Dispatches an event, with optional extra parameters. +-- @param event the event (table, must have a 'name' key; e.g. { name="eventName" }, or as string) +-- @param ... optional extra parameters +-- @return dispatch status (boolean). +-- @see emit +function EventDispatcher:dispatchEvent(event, ...) + if event == nil then + return false + end + + if type(event) == "table" then + if event.name == nil or type(event.name) ~= "string" or #event.name == 0 then + return false + end + elseif type(event) == "string" then + if #event == 0 then + return false + end + event = { + name = event, + } + end + + local a = self._listeners + if a == nil then + return false + end + + local dispatched = false + for _, o in next, a do + if o ~= nil and o.obj ~= nil and o.evt == event.name then + event.target = o.obj + event.source = self + + if type(o.obj) == "function" then + o.obj(event, ...) + if o.isOnce then + self:removeEventListener(event.name, o.obj, true) + end + dispatched = true + elseif type(o.obj) == "table" then + local f = o.obj[event.name] + if f ~= nil then + f(event, ...) + if o.isOnce then + self:removeEventListener(event.name, o.obj, true) + end + dispatched = true + end + end + end + end + return dispatched +end + +--- 'emit' is an alias of 'dispatchEvent' +EventDispatcher.emit = EventDispatcher.dispatchEvent + +--------------------------------------------------------------------------- + +--- Removes listener with the eventName event from the event dispatcher. +-- @param eventName event name (string) +-- @param listener object (table or function) +-- @return removal status (boolean). +-- @see removeAllListeners +function EventDispatcher:removeEventListener(eventName, listener) + local found, pos = self:hasEventListener(eventName, listener) + if found then + table.remove(self._listeners, pos) + end + return found +end + +--------------------------------------------------------------------------- + +--- Removes all listeners with the eventName event from the event dispatcher. +--- If the optional eventName is nil, all listeners are removed from the event dispatcher. +-- @param eventName event name (string) +-- @return removal status (boolean), with the number of listeners removed. +-- @see removeEventListener +function EventDispatcher:removeAllListeners(eventName) + local a = self._listeners + if a == nil then + return false + end + + if eventName == nil then + local n = #self._listeners + self._listeners = {} + return true, n + else + local found = false + local i = #a + local n = 0 + + while i > 0 do + local o = a[i] + if o ~= nil and o.evt == eventName then + table.remove(a, i) + found = true + n = n + 1 + end + i = i - 1 + end + return found, n + end +end + +--------------------------------------------------------------------------- + +--- Prints the content of the _listeners array (for debugging). +-- Format: index, eventName, listener, isOnce. +function EventDispatcher:printListeners() + local a = self._listeners + if a == nil then + return false + end + + for i, o in next, a do + if o ~= nil then + print(i, o.evt, o.obj, o.isOnce) + end + end +end + +--------------------------------------------------------------------------- + +-- Create syntactic sugar to automatically call init(). +setmetatable(EventDispatcher, { + __call = function(_, ...) + return EventDispatcher:init(...) + end, +}) + +return EventDispatcher diff --git a/framework/lualib/zeus/events/dispatcher_obj.lua b/framework/lualib/zeus/events/dispatcher_obj.lua new file mode 100644 index 0000000..48d3b50 --- /dev/null +++ b/framework/lualib/zeus/events/dispatcher_obj.lua @@ -0,0 +1,125 @@ +local eventRouteConfig = require("crossEvent.cross_event_router") +local crossEventClient = require("events.cross.cross_event_client") + +------------------------------------------------ +local EventDispatcher = class("EventDispatcher") + +function EventDispatcher:initialize(crossEventType) + self.crossEventType = crossEventType + self.beforeListeners = {} + self.listeners = {} + self.nextListenerHandleIndex = 0 + + self.eventAmongService = eventRouteConfig.amongService[self.crossEventType] + self.eventAmongCluster = eventRouteConfig.amongCluster[self.crossEventType] +end + +function EventDispatcher:addEventListener(eventId, listener, obj) + assert(type(eventId) == "number" and eventId ~= "", "EventDispatcher:addEventListener() - invalid eventId") + if self.listeners[eventId] == nil then + self.listeners[eventId] = {} + end + + self.nextListenerHandleIndex = self.nextListenerHandleIndex + 1 + local handle = self.nextListenerHandleIndex + self.listeners[eventId][handle] = {listener, obj} + + return handle +end + +function EventDispatcher:addBeforeEventListener(eventId, listener, obj) + assert(type(eventId) == "number" or type(eventId) == "string" and eventId, + "EventDispatcher:addBeforeEventListener() - invalid eventId") + if self.beforeListeners[eventId] == nil then + self.beforeListeners[eventId] = {} + end + + self.nextListenerHandleIndex = self.nextListenerHandleIndex + 1 + local handle = self.nextListenerHandleIndex + self.beforeListeners[eventId][handle] = {listener, obj} + + return handle +end + +local function execListeners(listeners, event) + local listenerlist = {} + for _, listener in pairs(listeners) do + table.insert(listenerlist, listener) + end + + for _, listener in ipairs(listenerlist) do + if listener[2] then + listener[1](listener[2], event) + else + listener[1](event) + end + end +end + +function EventDispatcher:dispatchEvent(eventId, event) + local beforeListeners = self.beforeListeners[eventId] + if beforeListeners then + event.eventId = eventId + execListeners(beforeListeners, event) + end + + local listeners = self.listeners[eventId] + if listeners then + event.eventId = eventId + execListeners(listeners, event) + end + + local amongSvr = self.eventAmongService and self.eventAmongService[eventId] + local amongCluster = self.eventAmongCluster and self.eventAmongCluster[eventId] + local nodeNames + + if amongCluster then + nodeNames = {} + for _, nodeTypeName in pairs(self.eventAmongCluster[eventId]) do + local tmpNodeNames = self:getNodeNames(nodeTypeName) + for _, nodeName in pairs(tmpNodeNames) do + table.insert(nodeNames, nodeName) + end + end + end + + if amongSvr or amongCluster then + local eventType = self.crossEventType + local objId = self:getOwnerId() + ZLog.debug("[EventDispatcher].dispatchEvent,cross,eventType=%s,objId=%s", eventType, objId) + crossEventClient.dispatchEventDispatcheroseBySend(eventType, eventId, objId, event, amongSvr, amongCluster, + nodeNames) + end +end + +function EventDispatcher:removeEventListener(handleToRemove) + for _, listenersForEvent in pairs(self.beforeListeners) do + local isRemoved = false + for handle, _ in pairs(listenersForEvent) do + if handle == handleToRemove then + listenersForEvent[handle] = nil + isRemoved = true + break + end + end + if isRemoved then + break + end + end + + for _, listenersForEvent in pairs(self.listeners) do + local isRemoved = false + for handle, _ in pairs(listenersForEvent) do + if handle == handleToRemove then + listenersForEvent[handle] = nil + isRemoved = true + break + end + end + if isRemoved then + break + end + end +end + +return EventDispatcher diff --git a/framework/lualib/zeus/events/local/readme.txt b/framework/lualib/zeus/events/local/readme.txt new file mode 100644 index 0000000..7ae281d --- /dev/null +++ b/framework/lualib/zeus/events/local/readme.txt @@ -0,0 +1 @@ +本服务事件定义 \ No newline at end of file