Skip to content
This repository was archived by the owner on Sep 30, 2025. It is now read-only.
This repository was archived by the owner on Sep 30, 2025. It is now read-only.

Event rework #39

@shayypy

Description

@shayypy

This issue outlines two enhancements to how events work in guilded.py. The first is the addition of more granular event control: restraining categories of events based on what your client needs. The second is a rework to how parameters are passed to event callbacks.

Granular events

discord.py implements a similar idea with its enable_debug_events parameter for Clients. This enhancement proposes the addition of this parameter as well as a use_discordpy_style_events parameter in order to "switch" event behavior to be more akin to discord.py. This would currently only detail event names (e.g., server_join vs. guild_join - only one or the other), but its effects are greater when considering the following change:

Event parameters

This change is considerably more impactful. If you are familiar with the JavaScript event system (with its Event and inheritors) then this may ring a bell for you. Instead of the following:

async def on_message(message):
    # message is a ChatMessage
    ...

you would handle events like so:

async def on_message(event):
    # event is a MessageEvent
    message = event.message
    # message is a ChatMessage

This change could also come with the decision to drop raw_ events in exchange for a more unified interface:

async def on_message_update(event):
    before = event.before  # could be None. Such a value indicates that the message was not cached.
    after = event.after  # always a ChatMessage

    # To perform cache-dependent logic, the user will essentially mirror the previous internal behavior:
    if before is None:
        return

This also flattens relatively convoluted events like raw_message_reaction_add and makes the whole event system function similarly. For example:

async def on_message_reaction_add(event):
    message = event.message  # could be None, but the user will always have event.message_id
    emote = event.emote  # Emote
    # The user will also have event.channel(_id), event.created_by(_id), and event.server(_id)

Guilded does not provide the rich data in its ChannelMessageReactionCreated/ChannelMessageReactionDeleted payloads that would make Reaction a better model to have here.

This would also enable events to include miscellaneous metadata, like that which is seen in TeamMemberRemoved:

async def on_member_remove(event):
    member = event.member  # could be None, but the user will always have event.server_id and event.user_id
    kicked = event.kicked
    banned = event.banned

This removes the need for extraneous member_leave and member_kick events which are not present in the bot API.

Conclusion

The latter part of this issue is currently available for use as an opt-in experiment, more details here. Feel free to discuss either of these in the #development channel (see the support header) or in this issue's comments.

Metadata

Metadata

Assignees

No one assigned

    Labels

    enhancementNew feature or request

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions