CtrlK
BlogDocsLog inGet started
Tessl Logo

tessl/pypi-slackeventsapi

Python Slack Events API adapter for Flask that provides event-driven Slack app development

Pending
Overview
Eval results
Files

event-handling.mddocs/

Event Handling

Event listener registration and management using PyEE's event emitter pattern. The SlackEventAdapter inherits from BaseEventEmitter, providing comprehensive event handling capabilities for processing various Slack event types.

Capabilities

Event Listener Registration

Register callback functions to handle specific Slack event types using the decorator pattern or direct method calls.

def on(self, event_type: str, callback: callable):
    """
    Register an event listener for a specific event type.
    
    Parameters:
    - event_type: str - The Slack event type to listen for (e.g., "message", "reaction_added")
    - callback: callable - Function to call when the event occurs
    
    Returns:
    The callback function (for use as decorator)
    """

Event Emission

Emit events to registered listeners (primarily used internally for error handling).

def emit(self, event_type: str, *args):
    """
    Emit an event to all registered listeners.
    
    Parameters:
    - event_type: str - The event type to emit
    - *args: Arguments to pass to event listeners
    
    Returns:
    None
    """

Common Slack Event Types

The adapter can listen for any Slack event type. Common event types include:

  • "message" - Messages posted in channels
  • "reaction_added" - Emoji reactions added to messages
  • "reaction_removed" - Emoji reactions removed from messages
  • "app_mention" - App mentioned in messages
  • "team_join" - New team members join
  • "user_change" - User profile changes
  • "channel_created" - New channels created
  • "error" - Internal errors (signature verification failures, etc.)

Event Data Structure

All Slack events (except "error") receive event data with this structure:

{
    "token": "verification_token",  # Legacy verification token
    "team_id": "T1234567890",      # Slack team ID
    "api_app_id": "A1234567890",   # Slack app ID
    "event": {                     # The actual event data
        "type": "message",         # Event type
        "channel": "C1234567890",  # Channel ID
        "user": "U1234567890",     # User ID
        "text": "Hello world!",    # Message content (for message events)
        "ts": "1234567890.123456", # Timestamp
        # ... other event-specific fields
    },
    "type": "event_callback",      # Always "event_callback" for events
    "event_id": "Ev1234567890",    # Unique event ID
    "event_time": 1234567890       # Event timestamp
}

Usage Examples

Decorator Pattern

from slackeventsapi import SlackEventAdapter

slack_events_adapter = SlackEventAdapter(signing_secret="your_secret")

@slack_events_adapter.on("message")
def handle_message(event_data):
    event = event_data["event"]
    if event.get("subtype") is None:  # Ignore special message subtypes
        user = event["user"]
        text = event["text"]
        channel = event["channel"]
        print(f"Message from {user} in {channel}: {text}")

@slack_events_adapter.on("reaction_added")
def handle_reaction(event_data):
    event = event_data["event"]
    emoji = event["reaction"]
    user = event["user"]
    print(f"User {user} added reaction: {emoji}")

Direct Method Registration

from slackeventsapi import SlackEventAdapter

slack_events_adapter = SlackEventAdapter(signing_secret="your_secret")

def app_mention_handler(event_data):
    event = event_data["event"]
    text = event["text"]
    channel = event["channel"]
    print(f"App mentioned in {channel}: {text}")

# Register handler directly
slack_events_adapter.on("app_mention", app_mention_handler)

Error Handling

from slackeventsapi import SlackEventAdapter
from slackeventsapi.server import SlackEventAdapterException

slack_events_adapter = SlackEventAdapter(signing_secret="your_secret")

@slack_events_adapter.on("error")
def error_handler(error):
    if isinstance(error, SlackEventAdapterException):
        print(f"Slack Events API Error: {error}")
        if "Invalid request signature" in str(error):
            print("Check your signing secret configuration")
        elif "Invalid request timestamp" in str(error):
            print("Request timestamp is too old (>5 minutes)")
    else:
        print(f"Unknown error: {error}")

Multiple Event Types

from slackeventsapi import SlackEventAdapter

slack_events_adapter = SlackEventAdapter(signing_secret="your_secret")

def universal_handler(event_data):
    event_type = event_data["event"]["type"]
    print(f"Received event: {event_type}")

# Register same handler for multiple event types
slack_events_adapter.on("message", universal_handler)
slack_events_adapter.on("reaction_added", universal_handler)
slack_events_adapter.on("app_mention", universal_handler)

Conditional Event Processing

from slackeventsapi import SlackEventAdapter

slack_events_adapter = SlackEventAdapter(signing_secret="your_secret")

@slack_events_adapter.on("message")
def handle_greetings(event_data):
    event = event_data["event"]
    
    # Only process direct messages (no subtype) containing "hi"
    if (event.get("subtype") is None and 
        event.get("channel_type") == "im" and 
        "hi" in event.get("text", "").lower()):
        
        user = event["user"]
        print(f"Greeting from user {user}")

Install with Tessl CLI

npx tessl i tessl/pypi-slackeventsapi

docs

event-adapter.md

event-handling.md

index.md

server-integration.md

tile.json