Skip to content

Commit 5ced85d

Browse files
committed
✨ omg
1 parent c20b6f5 commit 5ced85d

27 files changed

+783
-477
lines changed

discord/app/cache.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -365,6 +365,9 @@ async def store_message(self, message: MessagePayload, channel: "MessageableChan
365365
self._messages.append(msg)
366366
return msg
367367

368+
async def delete_message(self, message_id: int) -> None:
369+
self._messages.remove(utils.find(lambda m: m.id == message_id, reversed(self._messages)))
370+
368371
async def get_message(self, message_id: int) -> Message | None:
369372
return utils.find(lambda m: m.id == message_id, reversed(self._messages))
370373

discord/app/event_emitter.py

Lines changed: 29 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -24,9 +24,9 @@
2424

2525
import asyncio
2626
from abc import ABC, abstractmethod
27-
from asyncio import Future
2827
from 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

3131
from 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+
4754
class 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)

discord/app/state.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -242,7 +242,7 @@ def __init__(
242242

243243
self.cache_app_emojis: bool = options.get("cache_app_emojis", False)
244244

245-
self.emitter = EventEmitter(self)
245+
self.emitter: EventEmitter = EventEmitter(self)
246246

247247
self.cache: Cache = cache
248248
self.cache._state = self

0 commit comments

Comments
 (0)