Skip to content

Event Handling

The SDK provides an event-driven architecture for handling real-time events from Mezon.

Registering Event Handlers

Convenient Methods

The client provides convenient methods for common events:

from mezon.protobuf.api import api_pb2
from mezon.protobuf.rtapi import realtime_pb2

# Message events
async def on_message(message: api_pb2.ChannelMessage):
    print(f"Message: {message.content}")

client.on_channel_message(on_message)

# Channel events
async def on_channel_created(event: realtime_pb2.ChannelCreatedEvent):
    print(f"Channel created: {event.channel_id}")

async def on_channel_updated(event: realtime_pb2.ChannelUpdatedEvent):
    print(f"Channel updated: {event.channel_id}")

async def on_channel_deleted(event: realtime_pb2.ChannelDeletedEvent):
    print(f"Channel deleted: {event.channel_id}")

client.on_channel_created(on_channel_created)
client.on_channel_updated(on_channel_updated)
client.on_channel_deleted(on_channel_deleted)

# User events
async def on_user_joined(event: realtime_pb2.UserChannelAdded):
    print(f"User {event.user_id} joined channel")

async def on_user_left(event: realtime_pb2.UserChannelRemoved):
    print(f"User {event.user_id} left channel")

client.on_user_channel_added(on_user_joined)
client.on_user_channel_removed(on_user_left)

# Clan events
async def on_clan_user_added(event: realtime_pb2.AddClanUserEvent):
    print(f"User joined clan: {event.clan_id}")

client.on_add_clan_user(on_clan_user_added)

# Button clicks
async def on_button_click(event):
    print(f"Button clicked: {event}")

client.on_message_button_clicked(on_button_click)

# Notifications
async def on_notification(event):
    print(f"Notification: {event}")

client.on_notification(on_notification)

Generic Event Handler

For any event, use the on() method:

from mezon import Events

async def handler(data):
    print(f"Event received: {data}")

client.on(Events.VOICE_STARTED_EVENT, handler)
client.on(Events.GIVE_COFFEE, handler)

Available Events

Message Events

Event Description
Events.CHANNEL_MESSAGE New message in channel
Events.MESSAGE_REACTION Reaction added/removed
Events.MESSAGE_TYPING_EVENT User is typing
Events.MESSAGE_BUTTON_CLICKED Button clicked

Channel Events

Event Description
Events.CHANNEL_CREATED Channel created
Events.CHANNEL_UPDATED Channel updated
Events.CHANNEL_DELETED Channel deleted
Events.CHANNEL_PRESENCE_EVENT User presence in channel

User Events

Event Description
Events.USER_CHANNEL_ADDED User added to channel
Events.USER_CHANNEL_REMOVED User removed from channel
Events.USER_CLAN_REMOVED User removed from clan
Events.ADD_CLAN_USER User joined clan

Voice Events

Event Description
Events.VOICE_STARTED_EVENT Voice session started
Events.VOICE_ENDED_EVENT Voice session ended
Events.VOICE_JOINED_EVENT User joined voice
Events.VOICE_LEAVED_EVENT User left voice

Other Events

Event Description
Events.CLAN_UPDATED_EVENT Clan settings updated
Events.CLAN_EVENT_CREATED Clan event created
Events.GIVE_COFFEE Coffee given
Events.TOKEN_SEND Token sent
Events.NOTIFICATION Notification received

Sync vs Async Handlers

Both sync and async handlers are supported:

# Async handler (recommended)
async def async_handler(data):
    await some_async_operation()
    print(f"Received: {data}")

# Sync handler
def sync_handler(data):
    print(f"Received: {data}")

client.on(Events.GIVE_COFFEE, async_handler)
client.on(Events.GIVE_COFFEE, sync_handler)

Handler Execution

Handlers are executed in a fire-and-forget manner. Exceptions in handlers are logged but don't affect other handlers:

async def handler(data):
    raise Exception("This won't crash the bot")

client.on_channel_message(handler)  # Error is logged, bot continues

Multiple Handlers

You can register multiple handlers for the same event:

async def log_message(message):
    print(f"Log: {message.content}")

async def process_message(message):
    # Process the message
    pass

client.on_channel_message(log_message)
client.on_channel_message(process_message)

Both handlers will be called for each message.