From 3cc8183e2347e7d9eb3ad25cd443346c571560f0 Mon Sep 17 00:00:00 2001 From: Nadir Chowdhury Date: Mon, 5 Oct 2020 13:55:22 +0000 Subject: [PATCH 1/4] rewrite dispatcher system --- .gitignore | 1 + discord/ext/events/_events.py | 5 ---- discord/ext/events/custom_events/__init__.py | 6 +++++ .../events/{ => custom_events}/member_kick.py | 10 ++----- discord/ext/events/dispatcher.py | 27 +++++++++++++++++++ discord/ext/events/errors.py | 5 ++++ discord/ext/events/mixins.py | 11 +++----- setup.py | 2 +- 8 files changed, 45 insertions(+), 22 deletions(-) delete mode 100644 discord/ext/events/_events.py create mode 100644 discord/ext/events/custom_events/__init__.py rename discord/ext/events/{ => custom_events}/member_kick.py (76%) create mode 100644 discord/ext/events/dispatcher.py create mode 100644 discord/ext/events/errors.py diff --git a/.gitignore b/.gitignore index 65d739b..04f45f0 100644 --- a/.gitignore +++ b/.gitignore @@ -2,3 +2,4 @@ __pycache__/ build/ *.egg-info/ dist/ +.pythonenv3.8/ \ No newline at end of file diff --git a/discord/ext/events/_events.py b/discord/ext/events/_events.py deleted file mode 100644 index 4329ba9..0000000 --- a/discord/ext/events/_events.py +++ /dev/null @@ -1,5 +0,0 @@ -from typing import Callable, Dict - -_ALL: Dict[str, Callable] = { - # This is populated by subscribed events at runtime -} diff --git a/discord/ext/events/custom_events/__init__.py b/discord/ext/events/custom_events/__init__.py new file mode 100644 index 0000000..795e9a6 --- /dev/null +++ b/discord/ext/events/custom_events/__init__.py @@ -0,0 +1,6 @@ +from typing import Callable, Dict +from . import member_kick + +_ALL: Dict[str, Callable] = { + member_kick.EVENT_NAME: member_kick.EVENT_CALLABLE, +} diff --git a/discord/ext/events/member_kick.py b/discord/ext/events/custom_events/member_kick.py similarity index 76% rename from discord/ext/events/member_kick.py rename to discord/ext/events/custom_events/member_kick.py index 966e1c3..adac0ce 100644 --- a/discord/ext/events/member_kick.py +++ b/discord/ext/events/custom_events/member_kick.py @@ -1,18 +1,13 @@ import discord -from ._events import _ALL -from .utils import fetch_recent_audit_log_entry, listens_for - +from ..utils import fetch_recent_audit_log_entry, listens_for EVENT_NAME = 'member_kick' - @listens_for('member_remove') async def check_member_kick(client: discord.Client, member: discord.Member): guild = member.guild - print('!RAN') - if not guild.me.guild_permissions.view_audit_log: return @@ -22,5 +17,4 @@ async def check_member_kick(client: discord.Client, member: discord.Member): client.dispatch(EVENT_NAME, member, entry) - -_ALL[EVENT_NAME] = check_member_kick +EVENT_CALLABLE = check_member_kick diff --git a/discord/ext/events/dispatcher.py b/discord/ext/events/dispatcher.py new file mode 100644 index 0000000..af7711c --- /dev/null +++ b/discord/ext/events/dispatcher.py @@ -0,0 +1,27 @@ +import asyncio +from typing import List, Optional + +import discord + +from .custom_events import _ALL +from .errors import InvalidEvent + + +class CustomEventDispatcher: + def __init__(self, listening_to: Optional[List[str]]=None): + valid_handlers = _ALL + + if listening_to: + try: + valid_handlers = {name: _ALL[name] for name in listening_to} + except KeyError as e: + raise InvalidEvent('no registered handler for {!r}'.format(e.args[0])) + + self.valid_handlers = valid_handlers + + def handle(self, client: discord.Client, event: str, *args, **kwargs): + if event in self.valid_handlers: + return + + for event_check in self.valid_handlers.values(): + asyncio.ensure_future(event_check(client, event, *args, **kwargs)) diff --git a/discord/ext/events/errors.py b/discord/ext/events/errors.py new file mode 100644 index 0000000..a35ebb9 --- /dev/null +++ b/discord/ext/events/errors.py @@ -0,0 +1,5 @@ +class EventsException(Exception): + pass + +class InvalidEvent(EventsException): + pass diff --git a/discord/ext/events/mixins.py b/discord/ext/events/mixins.py index 4c63f27..1015de7 100644 --- a/discord/ext/events/mixins.py +++ b/discord/ext/events/mixins.py @@ -1,16 +1,11 @@ -import asyncio - import discord -from ._events import _ALL +from .dispatcher import CustomEventDispatcher class EventsMixin(discord.Client): - - async def on__event(self, event, *args, **kwargs): - for event_name, event_check in _ALL.items(): - asyncio.ensure_future(event_check(self, event, *args, **kwargs)) + dispatcher = CustomEventDispatcher() def dispatch(self, event, *args, **kwargs): super().dispatch(event, *args, **kwargs) # type: ignore - super().dispatch('_event', event, *args, **kwargs) + self.dispatcher.handle(self, event, *args, **kwargs) # type: ignore diff --git a/setup.py b/setup.py index 15161d9..e35b1e8 100644 --- a/setup.py +++ b/setup.py @@ -17,7 +17,7 @@ python_requires=">=3.5.3", url="https://github.com/Ext-Creators/discord-ext-events", version=version, - packages=["discord.ext.events"], + packages=["discord.ext.events", "discord.ext.events.custom_events"], license="Apache Software License", description="Custom events derived from events dispatched by Discord. ", long_description=readme, From c3d0da5a9774edbfaece04871bad93fe5f8e873d Mon Sep 17 00:00:00 2001 From: Nadir Chowdhury Date: Mon, 5 Oct 2020 13:58:30 +0000 Subject: [PATCH 2/4] update .gitignore & remove type comment from mixins.py --- .gitignore | 2 +- discord/ext/events/mixins.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.gitignore b/.gitignore index 04f45f0..6e16512 100644 --- a/.gitignore +++ b/.gitignore @@ -2,4 +2,4 @@ __pycache__/ build/ *.egg-info/ dist/ -.pythonenv3.8/ \ No newline at end of file +pythonenv*/ diff --git a/discord/ext/events/mixins.py b/discord/ext/events/mixins.py index 1015de7..785ac0d 100644 --- a/discord/ext/events/mixins.py +++ b/discord/ext/events/mixins.py @@ -8,4 +8,4 @@ class EventsMixin(discord.Client): def dispatch(self, event, *args, **kwargs): super().dispatch(event, *args, **kwargs) # type: ignore - self.dispatcher.handle(self, event, *args, **kwargs) # type: ignore + self.dispatcher.handle(self, event, *args, **kwargs) From 289e1762071a9c5267a35ee180bfe841268944de Mon Sep 17 00:00:00 2001 From: NCPlayz Date: Sat, 12 Dec 2020 17:33:24 +0000 Subject: [PATCH 3/4] update according to review --- .gitignore | 1 - README.rst | 5 ++++- discord/ext/events/__init__.py | 1 + discord/ext/events/errors.py | 4 +++- 4 files changed, 8 insertions(+), 3 deletions(-) diff --git a/.gitignore b/.gitignore index 6e16512..65d739b 100644 --- a/.gitignore +++ b/.gitignore @@ -2,4 +2,3 @@ __pycache__/ build/ *.egg-info/ dist/ -pythonenv*/ diff --git a/README.rst b/README.rst index 4a1a17d..9958666 100644 --- a/README.rst +++ b/README.rst @@ -26,10 +26,13 @@ An example for when subscribing to the on_member_kick event. import discord from discord.ext import commands, events - from discord.ext.events import member_kick + from discord.ext.events import EventsMixin, CustomEventDispatcher class MyBot(commands.Bot, events.EventsMixin): + dispatcher = CustomEventDispatcher([ + 'member_kick', + ]) async def on_ready(self): print('Logged in!') diff --git a/discord/ext/events/__init__.py b/discord/ext/events/__init__.py index 39f3c55..39ab3ab 100644 --- a/discord/ext/events/__init__.py +++ b/discord/ext/events/__init__.py @@ -17,6 +17,7 @@ from collections import namedtuple from .mixins import EventsMixin +from .dispatcher import CustomEventDispatcher from . import utils diff --git a/discord/ext/events/errors.py b/discord/ext/events/errors.py index a35ebb9..6d21b69 100644 --- a/discord/ext/events/errors.py +++ b/discord/ext/events/errors.py @@ -1,4 +1,6 @@ -class EventsException(Exception): +from discord.errors import DiscordException + +class EventsException(DiscordException): pass class InvalidEvent(EventsException): From 4a6a517c094da497a45224fce00a225231434f6d Mon Sep 17 00:00:00 2001 From: James <50501825+Gobot1234@users.noreply.github.com> Date: Sat, 12 Dec 2020 17:38:25 +0000 Subject: [PATCH 4/4] Re-rewrite the listen_for decorator (#1) * Re-rewrite the listen_for decorator * Wrap stuff * Remove sentinental --- discord/ext/events/custom_events/__init__.py | 7 +++---- discord/ext/events/custom_events/member_kick.py | 5 +---- discord/ext/events/utils.py | 11 +++++++++-- 3 files changed, 13 insertions(+), 10 deletions(-) diff --git a/discord/ext/events/custom_events/__init__.py b/discord/ext/events/custom_events/__init__.py index 795e9a6..1bd3e9d 100644 --- a/discord/ext/events/custom_events/__init__.py +++ b/discord/ext/events/custom_events/__init__.py @@ -1,6 +1,5 @@ from typing import Callable, Dict -from . import member_kick -_ALL: Dict[str, Callable] = { - member_kick.EVENT_NAME: member_kick.EVENT_CALLABLE, -} +# Filled at run time +_ALL: Dict[str, Callable] = {} + diff --git a/discord/ext/events/custom_events/member_kick.py b/discord/ext/events/custom_events/member_kick.py index adac0ce..034c4f2 100644 --- a/discord/ext/events/custom_events/member_kick.py +++ b/discord/ext/events/custom_events/member_kick.py @@ -2,7 +2,6 @@ from ..utils import fetch_recent_audit_log_entry, listens_for -EVENT_NAME = 'member_kick' @listens_for('member_remove') async def check_member_kick(client: discord.Client, member: discord.Member): @@ -15,6 +14,4 @@ async def check_member_kick(client: discord.Client, member: discord.Member): if entry is None: return - client.dispatch(EVENT_NAME, member, entry) - -EVENT_CALLABLE = check_member_kick + return member, entry diff --git a/discord/ext/events/utils.py b/discord/ext/events/utils.py index 687cdb2..709658b 100644 --- a/discord/ext/events/utils.py +++ b/discord/ext/events/utils.py @@ -1,11 +1,12 @@ import asyncio import datetime - from functools import wraps from typing import Callable, Optional import discord +from .custom_events import _ALL + SLEEP_FOR = 2.5 @@ -68,11 +69,17 @@ def listens_for(*events: str) -> Callable: """ def decorator(func: Callable) -> Callable: + event_name = func.__name__[6:] + _ALL[event_name] = func @wraps(func) async def wrapper(client, event, *args, **kwargs): if event in events: - await func(client, *args, **kwargs) + result = await func(client, *args, **kwargs) + if result is not None: + if not isinstance(result, tuple): + result = (result,) + client.dispatch(event_name, *result) return wrapper