From 7c7bebc95accf9b3c5321ee9209ec2cdcb306c69 Mon Sep 17 00:00:00 2001 From: Slipstream Date: Wed, 11 Jun 2025 18:24:18 -0600 Subject: [PATCH] Add listener helpers (#69) --- disagreement/client.py | 32 +++++++++++++++++++++++--------- docs/events.md | 4 ++-- 2 files changed, 25 insertions(+), 11 deletions(-) diff --git a/disagreement/client.py b/disagreement/client.py index 8902cd0..497dbc0 100644 --- a/disagreement/client.py +++ b/disagreement/client.py @@ -529,15 +529,29 @@ class Client: print(f"Message: {message.content}") """ - def decorator( - coro: Callable[..., Awaitable[None]], - ) -> Callable[..., Awaitable[None]]: - if not asyncio.iscoroutinefunction(coro): - raise TypeError("Event registered must be a coroutine function.") - self._event_dispatcher.register(event_name.upper(), coro) - return coro - - return decorator + def decorator( + coro: Callable[..., Awaitable[None]], + ) -> Callable[..., Awaitable[None]]: + if not asyncio.iscoroutinefunction(coro): + raise TypeError("Event registered must be a coroutine function.") + self._event_dispatcher.register(event_name.upper(), coro) + return coro + + return decorator + + def add_listener( + self, event_name: str, coro: Callable[..., Awaitable[None]] + ) -> None: + """Register ``coro`` to listen for ``event_name``.""" + + self._event_dispatcher.register(event_name, coro) + + def remove_listener( + self, event_name: str, coro: Callable[..., Awaitable[None]] + ) -> None: + """Remove ``coro`` from ``event_name`` listeners.""" + + self._event_dispatcher.unregister(event_name, coro) async def _process_message_for_commands(self, message: "Message") -> None: """Internal listener to process messages for commands.""" diff --git a/docs/events.md b/docs/events.md index 08df6f5..810944d 100644 --- a/docs/events.md +++ b/docs/events.md @@ -1,7 +1,7 @@ # Events -Disagreement dispatches Gateway events to asynchronous callbacks. Handlers can be registered with `@client.event` or `client.on_event`. -Listeners may be removed later using `EventDispatcher.unregister(event_name, coro)`. +Disagreement dispatches Gateway events to asynchronous callbacks. Handlers can be registered with `@client.event`, `client.on_event`, or `client.add_listener(event_name, coro)`. +Listeners may be removed later using `client.remove_listener(event_name, coro)` or `EventDispatcher.unregister(event_name, coro)`. ## Raw Events