Skip to content

Commit

Permalink
Event style experiment
Browse files Browse the repository at this point in the history
For more details, find the guilded.py group's #updates channel in this repository's README. Related to #39
  • Loading branch information
shayypy committed Aug 7, 2022
1 parent 223b9b3 commit 1c7d764
Show file tree
Hide file tree
Showing 7 changed files with 1,812 additions and 316 deletions.
74 changes: 74 additions & 0 deletions examples/events_experiment.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,74 @@
import asyncio
import guilded

# This is a showcase of the event style experiment.
# Read more here:
# https://www.guilded.gg/guilded-api/blog/updates/Event-style-experiment
# https://github.com/shayypy/guilded.py/issues/39

client = guilded.Client(experimental_event_style=True)

@client.event
async def on_ready():
print(f'Logged in as {client.user} (ID: {client.user.id})')
print('------')

@client.event
async def on_message(event: guilded.MessageEvent):
if event.message.content == 'ping':
await event.message.channel.send('pong!')

# This experiment also affects wait_for(), of course:
elif event.message.content == '$wait':
message = await event.message.channel.send("I'm waiting for a reaction to this message.")
try:
reaction_event = await client.wait_for(
'message_reaction_add',
check=lambda e: e.user_id == event.message.author_id and e.message_id == message.id,
timeout=30
)
except asyncio.TimeoutError:
pass
else:
await message.reply(f'You reacted with **{reaction_event.emote.name}**.')

@client.event
async def on_message_update(event: guilded.MessageUpdateEvent):
if not event.before or event.before.content == event.after.content:
# The content hasn't changed or we did not have it cached
return

# You should not actually do this
diff = len(event.after.content) - len(event.before.content)
await event.after.reply(f'You added {diff:,} characters to your message, nice job!')

@client.event
async def on_member_remove(event: guilded.MemberRemoveEvent):
# In this example we pretend that every server wants member logs in their default channel

if event.server.default_channel_id:
channel = event.server.default_channel or await event.server.fetch_default_channel()
else:
return

# Extra metadata
if event.banned:
cause = 'was banned from'
colour = guilded.Colour.red()
elif event.kicked:
cause = 'was kicked from'
colour = guilded.Colour.red()
else:
cause = 'has left'
colour = guilded.Colour.gilded()

embed = guilded.Embed(
description=f'<@{event.user_id}> {cause} the server.',
colour=colour,
)
await channel.send(embed=embed)

# We also have `event.member` which will not be None if the member was cached prior to this event.
# See also on_member_ban, which is a separate WebSocket event representing ban creation.

client.run('token')
1 change: 1 addition & 0 deletions guilded/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@
from .emote import *
from .enums import *
from .errors import *
from .events import *
from .file import *
from .flowbot import *
from .group import *
Expand Down
20 changes: 14 additions & 6 deletions guilded/client.py
Original file line number Diff line number Diff line change
Expand Up @@ -56,10 +56,11 @@
import logging
import sys
import traceback
from typing import TYPE_CHECKING, Any, Callable, Coroutine, Generator, List, Optional, Type
from typing import TYPE_CHECKING, Any, Callable, Coroutine, Generator, List, Optional, Type, Union

from .errors import ClientException, HTTPException
from .enums import *
from .events import BaseEvent
from .gateway import GuildedWebSocket, WebSocketClosure
from .http import HTTPClient
from .invite import Invite
Expand Down Expand Up @@ -144,6 +145,7 @@ def __init__(
self.ws: Optional[GuildedWebSocket] = None
self.http: HTTPClient = HTTPClient(
max_messages=self.max_messages,
experimental_event_style=options.pop('experimental_event_style', False),
)

async def __aenter__(self) -> Self:
Expand Down Expand Up @@ -442,11 +444,17 @@ async def on_ready():
log.debug('%s has successfully been registered as an event', coro.__name__)
return coro

def dispatch(self, event: str, *args: Any, **kwargs: Any) -> None:
log.debug('Dispatching event %s', event)
method = 'on_' + event
def dispatch(self, event: Union[str, BaseEvent], *args: Any, **kwargs: Any) -> None:
if isinstance(event, BaseEvent):
event_name = event.__dispatch_event__
args = (event,)
else:
event_name = event

log.debug('Dispatching event %s', event_name)
method = 'on_' + event_name

listeners = self._listeners.get(event)
listeners = self._listeners.get(event_name)
if listeners:
removed = []
for i, (future, condition) in enumerate(listeners):
Expand All @@ -470,7 +478,7 @@ def dispatch(self, event: str, *args: Any, **kwargs: Any) -> None:
removed.append(i)

if len(removed) == len(listeners):
self._listeners.pop(event)
self._listeners.pop(event_name)
else:
for idx in reversed(removed):
del listeners[idx]
Expand Down
Loading

0 comments on commit 1c7d764

Please sign in to comment.