Add boot event listener

This event is fired when server has just started up, but before it is accepting connections.

Also implement `fire()` method in `DummyEventListenerManager` for more easily firing custom events.
This commit is contained in:
Ben 2020-02-14 21:32:09 +00:00
parent 9bd7bada62
commit 9a4acade3f
3 changed files with 13 additions and 14 deletions

View File

@ -188,6 +188,13 @@ class XMLListenerManager(_ListenerManager):
class DummyEventListenerManager(_ListenerManager): class DummyEventListenerManager(_ListenerManager):
ListenerClass = _DummyListener ListenerClass = _DummyListener
async def fire(self, event, *args, **kwargs):
dummy_event = DummyEventPacket(event)
if dummy_event in self.server.dummy_event_listeners:
dummy_event_listeners = self.server.dummy_event_listeners[dummy_event]
for listener in dummy_event_listeners:
await listener(*args, **kwargs)
def handler(packet, **kwargs): def handler(packet, **kwargs):
if not issubclass(type(packet), _Packet): if not issubclass(type(packet), _Packet):
@ -197,6 +204,7 @@ def handler(packet, **kwargs):
return _listener(listener_class, packet, **kwargs) return _listener(listener_class, packet, **kwargs)
boot = _listener(_DummyListener, DummyEventPacket('boot'))
connected = _listener(_DummyListener, DummyEventPacket('connected')) connected = _listener(_DummyListener, DummyEventPacket('connected'))
disconnected = _listener(_DummyListener, DummyEventPacket('disconnected')) disconnected = _listener(_DummyListener, DummyEventPacket('disconnected'))

View File

@ -173,14 +173,13 @@ class Houdini:
await self.xml_listeners.setup(houdini.handlers, exclude_load='houdini.handlers.login.login') await self.xml_listeners.setup(houdini.handlers, exclude_load='houdini.handlers.login.login')
await self.xt_listeners.setup(houdini.handlers) await self.xt_listeners.setup(houdini.handlers)
await self.dummy_event_listeners.setup(houdini.handlers)
self.logger.info('World server started') self.logger.info('World server started')
else: else:
await self.xml_listeners.setup(houdini.handlers, 'houdini.handlers.login.login') await self.xml_listeners.setup(houdini.handlers, 'houdini.handlers.login.login')
self.logger.info('Login server started') self.logger.info('Login server started')
self.items = await ItemCollection.get_collection() await self.dummy_event_listeners.setup(houdini.handlers)
self.logger.info(f'Loaded {len(self.items)} clothing items') await self.dummy_event_listeners.fire('boot', self)
self.igloos = await IglooCollection.get_collection() self.igloos = await IglooCollection.get_collection()
self.logger.info(f'Loaded {len(self.igloos)} igloos') self.logger.info(f'Loaded {len(self.igloos)} igloos')

View File

@ -6,7 +6,7 @@ import defusedxml.cElementTree as Et
from xml.etree.cElementTree import Element, SubElement, tostring from xml.etree.cElementTree import Element, SubElement, tostring
from houdini.constants import ClientType from houdini.constants import ClientType
from houdini.handlers import AuthorityError, DummyEventPacket from houdini.handlers import AuthorityError
class Spheniscidae: class Spheniscidae:
@ -142,21 +142,13 @@ class Spheniscidae:
async def _client_connected(self): async def _client_connected(self):
self.logger.info(f'Client {self.peer_name} connected') self.logger.info(f'Client {self.peer_name} connected')
dummy_event = DummyEventPacket('connected') await self.server.dummy_event_listeners.fire('connected', self)
if dummy_event in self.server.dummy_event_listeners:
dummy_event_listeners = self.server.dummy_event_listeners[dummy_event]
for listener in dummy_event_listeners:
await listener(self)
async def _client_disconnected(self): async def _client_disconnected(self):
del self.server.peers_by_ip[self.peer_name] del self.server.peers_by_ip[self.peer_name]
self.logger.info(f'Client {self.peer_name} disconnected') self.logger.info(f'Client {self.peer_name} disconnected')
dummy_event = DummyEventPacket('disconnected') await self.server.dummy_event_listeners.fire('disconnected', self)
if dummy_event in self.server.dummy_event_listeners:
dummy_event_listeners = self.server.dummy_event_listeners[dummy_event]
for listener in dummy_event_listeners:
await listener(self)
async def __data_received(self, data): async def __data_received(self, data):
data = data.decode()[:-1] data = data.decode()[:-1]