2424
2525import asyncio
2626from abc import ABC , abstractmethod
27- from asyncio import Future
2827from collections import defaultdict
29- from typing import TYPE_CHECKING , Any , Callable , TypeVar
28+ from collections .abc import Awaitable , Coroutine
29+ from typing import TYPE_CHECKING , Any , Callable , Protocol , TypeAlias , TypeVar
3030
3131from typing_extensions import Self
3232
@@ -44,59 +44,47 @@ class Event(ABC):
4444 async def __load__ (cls , data : Any , state : "ConnectionState" ) -> Self | None : ...
4545
4646
47+ ListenerCallback : TypeAlias = Callable [[Event ], Any ]
48+
49+
50+ class EventReciever (Protocol ):
51+ def __call__ (self , event : Event ) -> Awaitable [Any ]: ...
52+
53+
4754class EventEmitter :
4855 def __init__ (self , state : "ConnectionState" ) -> None :
49- self ._listeners : dict [type [Event ], list [Callable ]] = {}
50- self ._events : dict [str , list [type [Event ]]]
51- self ._wait_fors : dict [type [Event ], list [Future ]] = defaultdict (list )
52- self ._state = state
56+ self ._receivers : list [EventReciever ] = []
57+ self ._events : dict [str , list [type [Event ]]] = defaultdict (list )
58+ self ._state : ConnectionState = state
59+
60+ # Auto-register all Event classes
61+ from ..events import ALL_EVENTS
62+
63+ for event_cls in ALL_EVENTS :
64+ self .add_event (event_cls )
5365
5466 def add_event (self , event : type [Event ]) -> None :
55- try :
56- self ._events [event .__event_name__ ].append (event )
57- except KeyError :
58- self ._events [event .__event_name__ ] = [event ]
67+ self ._events [event .__event_name__ ].append (event )
5968
6069 def remove_event (self , event : type [Event ]) -> list [type [Event ]] | None :
6170 return self ._events .pop (event .__event_name__ , None )
6271
63- def add_listener (self , event : type [Event ], listener : Callable ) -> None :
64- try :
65- self ._listeners [event ].append (listener )
66- except KeyError :
67- self .add_event (event )
68- self ._listeners [event ] = [listener ]
72+ def add_receiver (self , receiver : EventReciever ) -> None :
73+ self ._receivers .append (receiver )
6974
70- def remove_listener (self , event : type [Event ], listener : Callable ) -> None :
71- self ._listeners [event ].remove (listener )
72-
73- def add_wait_for (self , event : type [T ]) -> Future [T ]:
74- fut = Future ()
75-
76- self ._wait_fors [event ].append (fut )
77-
78- return fut
79-
80- def remove_wait_for (self , event : type [Event ], fut : Future ) -> None :
81- self ._wait_fors [event ].remove (fut )
75+ def remove_receiver (self , receiver : EventReciever ) -> None :
76+ self ._receivers .remove (receiver )
8277
8378 async def emit (self , event_str : str , data : Any ) -> None :
8479 events = self ._events .get (event_str , [])
8580
86- for event in events :
87- eve = await event .__load__ (data = data , state = self ._state )
81+ coros : list [Awaitable [None ]] = []
82+ for event_cls in events :
83+ event = await event_cls .__load__ (data = data , state = self ._state )
8884
89- if eve is None :
85+ if event is None :
9086 continue
9187
92- funcs = self ._listeners .get (event , [])
93-
94- for func in funcs :
95- asyncio .create_task (func (eve ))
96-
97- wait_fors = self ._wait_fors .get (event )
88+ coros .extend (receiver (event ) for receiver in self ._receivers )
9889
99- if wait_fors is not None :
100- for wait_for in wait_fors :
101- wait_for .set_result (eve )
102- self ._wait_fors .pop (event )
90+ await asyncio .gather (* coros )
0 commit comments