Source code for src.events
from __future__ import annotations
from typing import Callable, Coroutine
import inspect
EVENTS: dict[str, list[EventListener]] = {}
[docs]
class EventListener:
def __init__(self, name: str, func: Coroutine):
if not inspect.iscoroutinefunction(func):
raise TypeError(f"Listener {self.name} must receive a coroutine")
self.name = name
self.callback = func
# note: this does not handle any of the scheduling machinery
# it is meant to be passed as-is to the relevant event schedulers
[docs]
async def invoke(self, args, kwargs):
return await self.callback(*args, **kwargs)
[docs]
def get(name: str) -> list[EventListener]:
return EVENTS.get(name, [])
[docs]
def add_listener(name: str):
def inner(func: Coroutine):
listener = EventListener(name, func)
if name not in EVENTS:
EVENTS[name] = []
EVENTS[name].append(listener)
return func
return inner
[docs]
async def invoke(name: str, /, *args, **kwargs) -> list:
rets = []
for listener in get(name):
rets.append(await listener.invoke(args, kwargs))
return rets