Skip to content

hikari.impl.event_manager#

Event handling logic for more info.

EventManagerImpl #

EventManagerImpl(
    entity_factory: EntityFactory,
    event_factory: EventFactory,
    intents: Intents,
    /,
    *,
    auto_chunk_members: bool = True,
    cache: Optional[MutableCache] = None,
)

Bases: EventManagerBase

Provides event handling logic for Discord events.

consume_raw_event #

consume_raw_event(
    event_name: str, shard: GatewayShard, payload: JSONObject
) -> None

Consume a raw event.

PARAMETER DESCRIPTION
event_name

The case-insensitive name of the event being triggered.

TYPE: str

shard

Object of the shard that received this event.

TYPE: GatewayShard

payload

Payload of the event being triggered.

TYPE: JSONObject

RAISES DESCRIPTION
LookupError

If there is no consumer for the event.

dispatch #

dispatch(event: Event) -> Future[Any]

Dispatch an event.

PARAMETER DESCRIPTION
event

The event to dispatch.

TYPE: Event

Examples:

We can dispatch custom events by first defining a class that derives from hikari.events.base_events.Event.

    import attrs

    from hikari.traits import RESTAware
    from hikari.events.base_events import Event
    from hikari.users import User
    from hikari.snowflakes import Snowflake

    @attrs.define()
    class EveryoneMentionedEvent(Event):
        app: RESTAware = attrs.field()

        author: User = attrs.field()
        '''The user who mentioned everyone.'''

        content: str = attrs.field()
        '''The message that was sent.'''

        message_id: Snowflake = attrs.field()
        '''The message ID.'''

        channel_id: Snowflake = attrs.field()
        '''The channel ID.'''

We can then dispatch our event as we see fit.

    from hikari.events.messages import MessageCreateEvent

    @bot.listen(MessageCreateEvent)
    async def on_message(event):
        if "@everyone" in event.content or "@here" in event.content:
            event = EveryoneMentionedEvent(
                author=event.author,
                content=event.content,
                message_id=event.id,
                channel_id=event.channel_id,
            )

            bot.dispatch(event)

This event can be listened to elsewhere by subscribing to it with hikari.api.event_manager.EventManager.subscribe.

    @bot.listen(EveryoneMentionedEvent)
    async def on_everyone_mentioned(event):
        print(event.user, "just pinged everyone in", event.channel_id)
RETURNS DESCRIPTION
Future[Any]

A future that can be optionally awaited. If awaited, the future will complete once all corresponding event listeners have been invoked. If not awaited, this will schedule the dispatch of the events in the background for later.

See Also

Listen : hikari.api.event_manager.EventManager.listen. Stream : hikari.api.event_manager.EventManager.stream. Subscribe : hikari.api.event_manager.EventManager.subscribe. Unsubscribe : hikari.api.event_manager.EventManager.unsubscribe. Wait_for: hikari.api.event_manager.EventManager.wait_for.

get_listeners #

get_listeners(
    event_type: Type[EventT], /, *, polymorphic: bool = True
) -> Collection[CallbackT[EventT]]

Get the listeners for a given event type, if there are any.

PARAMETER DESCRIPTION
event_type

The event type to look for. T must be a subclass of hikari.events.base_events.Event.

TYPE: Type[T]

polymorphic

If True, this will also return the listeners for all the event types event_type will dispatch. If False, then only listeners for this class specifically are returned. The default is True.

TYPE: bool DEFAULT: True

RETURNS DESCRIPTION
Collection[Callable[[T], Coroutine[Any, Any, None]]]

A copy of the collection of listeners for the event. Will return an empty collection if nothing is registered.

listen #

listen(
    *event_types: Type[EventT],
) -> Callable[[CallbackT[EventT]], CallbackT[EventT]]

Generate a decorator to subscribe a callback to an event type.

This is a second-order decorator.

PARAMETER DESCRIPTION
*event_types

The event types to subscribe to. The implementation may allow this to be undefined. If this is the case, the event type will be inferred instead from the type hints on the function signature. T must be a subclass of hikari.events.base_events.Event.

TYPE: Optional[Type[T]] DEFAULT: ()

RETURNS DESCRIPTION
Callable[[T], T]

A decorator for a coroutine function that passes it to hikari.api.event_manager.EventManager.subscribe before returning the function reference.

See Also

Dispatch : hikari.api.event_manager.EventManager.dispatch. Stream : hikari.api.event_manager.EventManager.stream. Subscribe : hikari.api.event_manager.EventManager.subscribe. Unsubscribe : hikari.api.event_manager.EventManager.unsubscribe. Wait_for : hikari.api.event_manager.EventManager.wait_for.

on_channel_create async #

on_channel_create(shard: GatewayShard, payload: JSONObject) -> None

See https://discord.com/developers/docs/topics/gateway-events#channel-create for more info.

on_channel_delete async #

on_channel_delete(shard: GatewayShard, payload: JSONObject) -> None

See https://discord.com/developers/docs/topics/gateway-events#channel-delete for more info.

on_channel_pins_update async #

on_channel_pins_update(shard: GatewayShard, payload: JSONObject) -> None

See https://discord.com/developers/docs/topics/gateway-events#channel-pins-update for more info.

on_channel_update async #

on_channel_update(shard: GatewayShard, payload: JSONObject) -> None

See https://discord.com/developers/docs/topics/gateway-events#channel-update for more info.

on_guild_audit_log_entry_create async #

on_guild_audit_log_entry_create(
    shard: GatewayShard, payload: JSONObject
) -> None

See https://discord.com/developers/docs/topics/gateway-events#guild-audit-log-entry-create for more info.

on_guild_ban_add async #

on_guild_ban_add(shard: GatewayShard, payload: JSONObject) -> None

See https://discord.com/developers/docs/topics/gateway-events#guild-ban-add for more info.

on_guild_ban_remove async #

on_guild_ban_remove(shard: GatewayShard, payload: JSONObject) -> None

See https://discord.com/developers/docs/topics/gateway-events#guild-ban-remove for more info.

on_guild_create async #

on_guild_create(shard: GatewayShard, payload: JSONObject) -> None

See https://discord.com/developers/docs/topics/gateway-events#guild-create for more info.

on_guild_delete async #

on_guild_delete(shard: GatewayShard, payload: JSONObject) -> None

See https://discord.com/developers/docs/topics/gateway-events#guild-delete for more info.

on_guild_emojis_update async #

on_guild_emojis_update(shard: GatewayShard, payload: JSONObject) -> None

See https://discord.com/developers/docs/topics/gateway-events#guild-emojis-update for more info.

on_guild_integrations_update async #

on_guild_integrations_update(_: GatewayShard, __: JSONObject) -> None

See https://discord.com/developers/docs/topics/gateway-events#guild-integrations-update for more info.

on_guild_member_add async #

on_guild_member_add(shard: GatewayShard, payload: JSONObject) -> None

See https://discord.com/developers/docs/topics/gateway-events#guild-member-add for more info.

on_guild_member_remove async #

on_guild_member_remove(shard: GatewayShard, payload: JSONObject) -> None

See https://discord.com/developers/docs/topics/gateway-events#guild-member-remove for more info.

on_guild_member_update async #

on_guild_member_update(shard: GatewayShard, payload: JSONObject) -> None

See https://discord.com/developers/docs/topics/gateway-events#guild-member-update for more info.

on_guild_members_chunk async #

on_guild_members_chunk(shard: GatewayShard, payload: JSONObject) -> None

See https://discord.com/developers/docs/topics/gateway-events#guild-members-chunk for more info.

on_guild_role_create async #

on_guild_role_create(shard: GatewayShard, payload: JSONObject) -> None

See https://discord.com/developers/docs/topics/gateway-events#guild-role-create for more info.

on_guild_role_delete async #

on_guild_role_delete(shard: GatewayShard, payload: JSONObject) -> None

See https://discord.com/developers/docs/topics/gateway-events#guild-role-delete for more info.

on_guild_role_update async #

on_guild_role_update(shard: GatewayShard, payload: JSONObject) -> None

See https://discord.com/developers/docs/topics/gateway-events#guild-role-update for more info.

on_guild_scheduled_event_create async #

on_guild_scheduled_event_create(
    shard: GatewayShard, payload: JSONObject
) -> None

See https://discord.com/developers/docs/topics/gateway-events#guild-scheduled-event-create for more info.

on_guild_scheduled_event_delete async #

on_guild_scheduled_event_delete(
    shard: GatewayShard, payload: JSONObject
) -> None

See https://discord.com/developers/docs/topics/gateway-events#guild-scheduled-event-delete for more info.

on_guild_scheduled_event_update async #

on_guild_scheduled_event_update(
    shard: GatewayShard, payload: JSONObject
) -> None

See https://discord.com/developers/docs/topics/gateway-events#guild-scheduled-event-update for more info.

on_guild_scheduled_event_user_add async #

on_guild_scheduled_event_user_add(
    shard: GatewayShard, payload: JSONObject
) -> None

See https://discord.com/developers/docs/topics/gateway-events#guild-scheduled-event-user-add for more info.

on_guild_scheduled_event_user_remove async #

on_guild_scheduled_event_user_remove(
    shard: GatewayShard, payload: JSONObject
) -> None

See https://discord.com/developers/docs/topics/gateway-events#guild-scheduled-event-user-remove for more info.

on_guild_stickers_update async #

on_guild_stickers_update(shard: GatewayShard, payload: JSONObject) -> None

See https://discord.com/developers/docs/topics/gateway-events#guild-stickers-update for more info.

on_guild_update async #

on_guild_update(shard: GatewayShard, payload: JSONObject) -> None

See https://discord.com/developers/docs/topics/gateway-events#guild-update for more info.

on_interaction_create async #

on_interaction_create(shard: GatewayShard, payload: JSONObject) -> None

See https://discord.com/developers/docs/topics/gateway-events#interaction-create for more info.

on_invite_create async #

on_invite_create(shard: GatewayShard, payload: JSONObject) -> None

See https://discord.com/developers/docs/topics/gateway-events#invite-create for more info.

on_invite_delete async #

on_invite_delete(shard: GatewayShard, payload: JSONObject) -> None

See https://discord.com/developers/docs/topics/gateway-events#invite-delete for more info.

on_message_create async #

on_message_create(shard: GatewayShard, payload: JSONObject) -> None

See https://discord.com/developers/docs/topics/gateway-events#message-create for more info.

on_message_delete async #

on_message_delete(shard: GatewayShard, payload: JSONObject) -> None

See https://discord.com/developers/docs/topics/gateway-events#message-delete for more info.

on_message_delete_bulk async #

on_message_delete_bulk(shard: GatewayShard, payload: JSONObject) -> None

See https://discord.com/developers/docs/topics/gateway-events#message-delete-bulk for more info.

on_message_reaction_add async #

on_message_reaction_add(shard: GatewayShard, payload: JSONObject) -> None

See https://discord.com/developers/docs/topics/gateway-events#message-reaction-add for more info.

on_message_reaction_remove async #

on_message_reaction_remove(shard: GatewayShard, payload: JSONObject) -> None

See https://discord.com/developers/docs/topics/gateway-events#message-reaction-remove for more info.

on_message_reaction_remove_all async #

on_message_reaction_remove_all(
    shard: GatewayShard, payload: JSONObject
) -> None

See https://discord.com/developers/docs/topics/gateway-events#message-reaction-remove-all for more info.

on_message_reaction_remove_emoji async #

on_message_reaction_remove_emoji(
    shard: GatewayShard, payload: JSONObject
) -> None

See https://discord.com/developers/docs/topics/gateway-events#message-reaction-remove-emoji for more info.

on_message_update async #

on_message_update(shard: GatewayShard, payload: JSONObject) -> None

See https://discord.com/developers/docs/topics/gateway-events#message-update for more info.

on_presence_update async #

on_presence_update(shard: GatewayShard, payload: JSONObject) -> None

See https://discord.com/developers/docs/topics/gateway-events#presence-update for more info.

on_ready async #

on_ready(shard: GatewayShard, payload: JSONObject) -> None

See https://discord.com/developers/docs/topics/gateway-events#ready for more info.

on_resumed async #

on_resumed(shard: GatewayShard, _: JSONObject) -> None

See https://discord.com/developers/docs/topics/gateway-events#resumed for more info.

on_thread_create async #

on_thread_create(shard: GatewayShard, payload: JSONObject) -> None

See https://discord.com/developers/docs/topics/gateway-events#thread-create for more info.

on_thread_delete async #

on_thread_delete(shard: GatewayShard, payload: JSONObject) -> None

See https://discord.com/developers/docs/topics/gateway-events#thread-delete for more info.

on_thread_list_sync async #

on_thread_list_sync(shard: GatewayShard, payload: JSONObject) -> None

See https://discord.com/developers/docs/topics/gateway-events#thread-list-sync for more info.

on_thread_members_update async #

on_thread_members_update(shard: GatewayShard, payload: JSONObject) -> None

See https://discord.com/developers/docs/topics/gateway-events#thread-members-update for more info.

on_thread_update async #

on_thread_update(shard: GatewayShard, payload: JSONObject) -> None

See https://discord.com/developers/docs/topics/gateway-events#thread-update for more info.

on_typing_start async #

on_typing_start(shard: GatewayShard, payload: JSONObject) -> None

See https://discord.com/developers/docs/topics/gateway-events#typing-start for more info.

on_user_update async #

on_user_update(shard: GatewayShard, payload: JSONObject) -> None

See https://discord.com/developers/docs/topics/gateway-events#user-update for more info.

on_voice_server_update async #

on_voice_server_update(shard: GatewayShard, payload: JSONObject) -> None

See https://discord.com/developers/docs/topics/gateway-events#voice-server-update for more info.

on_voice_state_update async #

on_voice_state_update(shard: GatewayShard, payload: JSONObject) -> None

See https://discord.com/developers/docs/topics/gateway-events#voice-state-update for more info.

on_webhooks_update async #

on_webhooks_update(shard: GatewayShard, payload: JSONObject) -> None

See https://discord.com/developers/docs/topics/gateway-events#webhooks-update for more info.

stream #

stream(
    event_type: Type[EventT],
    /,
    timeout: Union[float, int, None],
    limit: Optional[int] = None,
) -> EventStream[EventT]

Return a stream iterator for the given event and sub-events.

Warning

If you use [await stream.open()][] to start the stream then you must also close it with [await stream.close()][] otherwise it may queue events in memory indefinitely.

PARAMETER DESCRIPTION
event_type

The event type to listen for. This will listen for subclasses of this type additionally.

TYPE: Type[Event]

timeout

How long this streamer should wait for the next event before ending the iteration. If None then this will continue until explicitly broken from.

TYPE: Optional[int, float]

limit

The limit for how many events this should queue at one time before dropping extra incoming events, leave this as None for the cache size to be unlimited.

TYPE: Optional[int] DEFAULT: None

RETURNS DESCRIPTION
EventStream[Event]

The async iterator to handle streamed events. This must be started with with stream: or stream.open before asynchronously iterating over it.

Examples:

    with bot.stream(events.ReactionAddEvent, timeout=30).filter(("message_id", message.id)) as stream:
        async for user_id in stream.map("user_id").limit(50):
            ...

or using open() and close()

    stream = bot.stream(events.ReactionAddEvent, timeout=30).filter(("message_id", message.id))
    stream.open()

    async for user_id in stream.map("user_id").limit(50)
        ...

    stream.close()
See Also

Dispatch : hikari.api.event_manager.EventManager.dispatch. Listen : hikari.api.event_manager.EventManager.listen. Subscribe : hikari.api.event_manager.EventManager.subscribe. Unsubscribe : hikari.api.event_manager.EventManager.unsubscribe. Wait_for : hikari.api.event_manager.EventManager.wait_for.

subscribe #

subscribe(
    event_type: Type[Any], callback: CallbackT[Any], *, _nested: int = 0
) -> None

Subscribe a given callback to a given event type.

PARAMETER DESCRIPTION
event_type

The event type to listen for. This will also listen for any subclasses of the given type. T must be a subclass of hikari.events.base_events.Event.

TYPE: Type[T]

callback

Must be a coroutine function to invoke. This should consume an instance of the given event, or an instance of a valid subclass if one exists. Any result is discarded.

TYPE: CallbackT[Any]

Examples:

The following demonstrates subscribing a callback to message creation events.

    from hikari.events.messages import MessageCreateEvent

    async def on_message(event):
        ...

    bot.subscribe(MessageCreateEvent, on_message)
See Also

Dispatch : hikari.api.event_manager.EventManager.dispatch. Listen : hikari.api.event_manager.EventManager.listen. Stream : hikari.api.event_manager.EventManager.stream. Unsubscribe : hikari.api.event_manager.EventManager.unsubscribe. Wait_for : hikari.api.event_manager.EventManager.wait_for.

unsubscribe #

unsubscribe(event_type: Type[Any], callback: CallbackT[Any]) -> None

Unsubscribe a given callback from a given event type, if present.

PARAMETER DESCRIPTION
event_type

The event type to unsubscribe from. This must be the same exact type as was originally subscribed with to be removed correctly. T must derive from hikari.events.base_events.Event.

TYPE: Type[T]

callback

The callback to unsubscribe.

TYPE: CallbackT[Any]

Examples:

The following demonstrates unsubscribing a callback from a message creation event.

    from hikari.events.messages import MessageCreateEvent

    async def on_message(event):
        ...

    bot.unsubscribe(MessageCreateEvent, on_message)
See Also

Dispatch : hikari.api.event_manager.EventManager.dispatch. Listen : hikari.api.event_manager.EventManager.listen. Stream : hikari.api.event_manager.EventManager.stream. Subscribe : hikari.api.event_manager.EventManager.subscribe. Wait_for : hikari.api.event_manager.EventManager.wait_for.

wait_for async #

wait_for(
    event_type: Type[EventT],
    /,
    timeout: Union[float, int, None],
    predicate: Optional[PredicateT[EventT]] = None,
) -> EventT

Wait for a given event to occur once, then return the event.

Warning

Async predicates are not supported.

PARAMETER DESCRIPTION
event_type

The event type to listen for. This will listen for subclasses of this type additionally.

TYPE: Type[Event]

predicate

A function taking the event as the single parameter. This should return True if the event is one you want to return, or False if the event should not be returned. If left as None (the default), then the first matching event type that the bot receives (or any subtype) will be the one returned.

TYPE: Optional[PredicateT[EventT]] DEFAULT: None

timeout

The amount of time to wait before raising an asyncio.TimeoutError and giving up instead. This is measured in seconds. If None, then no timeout will be waited for (no timeout can result in "leaking" of coroutines that never complete if called in an uncontrolled way, so is not recommended).

TYPE: Union[float, int, None]

RETURNS DESCRIPTION
Event

The event that was provided.

RAISES DESCRIPTION
TimeoutError

If the timeout is not None and is reached before an event is received that the predicate returns True for.

See Also

Dispatch : hikari.api.event_manager.EventManager.dispatch. Listen : hikari.api.event_manager.EventManager.listen. Stream : hikari.api.event_manager.EventManager.stream. Subscribe : hikari.api.event_manager.EventManager.subscribe. Unsubscribe : hikari.api.event_manager.EventManager.unsubscribe.