Skip to main content

An adaptation for slack

Project description

TNSlack - Modern Slack App Builder for Python

CI codecov PyPI version Python Support

A modern, type-safe Slack app builder for Python that makes building Slack apps faster and more maintainable. Built on top of the official Slack SDK with a router-based architecture and comprehensive async support.

Features

  • 🚀 Modern Python: Full type hints, async/await support, Python 3.10+
  • 🔒 Type Safe: Complete type safety with mypy support
  • 🎯 Router Pattern: Clean, organized interaction handling
  • Official Slack SDK: Built on the official Slack SDK for Python
  • 🧱 Block Builder: Intuitive Block Kit component builder
  • 📦 No Dependencies: Minimal external dependencies
  • 🧪 Well Tested: Comprehensive test suite with 95%+ coverage
  • 📚 Great Docs: Clear documentation and examples

Installation

pip install tn-slack-py-module

For development:

pip install tn-slack-py-module[dev]

Quick Start

Basic App Setup

from tnslack import SlackApp

# Create app instance  
app = SlackApp(
    client_id="your_client_id",
    client_secret="your_client_secret", 
    signing_secret="your_signing_secret",
    bot_scopes=["chat:write", "commands"]
)

# Register a button handler
@app.register_route("block_actions", name="hello_button")
def handle_hello_button(payload, params):
    return {
        "text": f"Hello {payload['user']['name']}!"
    }

# Process incoming interactions
def handle_slack_event(request):
    # Verify request authenticity
    if not app.authenticate_incoming_request(request.body, request.headers):
        return {"error": "Invalid signature"}, 401
    
    # Parse payload and route to handler
    payload = json.loads(request.form["payload"])
    response = app.slack_interaction_consumer(payload)
    return response

Using Block Builder

from tnslack import BlockBuilder

builder = BlockBuilder()

# Create interactive components
blocks = [
    builder.header_block("Welcome to TNSlack!"),
    builder.simple_section_block("Click the button below:"),
    builder.section_with_button_block(
        button_label="Say Hello",
        button_value="hello_clicked", 
        section_text="Interactive demo:",
        action_id="hello_button"
    ),
    builder.divider_block()
]

# Send message with blocks
app.send_channel_message(
    channel="#general",
    access_token="xoxb-your-bot-token",
    text="Fallback text",
    block_set=blocks
)

Async Support

from tnslack import AsyncSlackApp

async_app = AsyncSlackApp(
    client_id="your_client_id",
    client_secret="your_client_secret",
    signing_secret="your_signing_secret"
)

# Async route handlers
@async_app.register_route("block_actions", name="async_button")
async def handle_async_button(payload, params):
    # Perform async operations
    user_info = await async_app.async_get_user_info(
        user_id=payload["user"]["id"],
        access_token="xoxb-your-bot-token"
    )
    
    return {
        "text": f"Hello {user_info['user']['real_name']}!"
    }

# Process interactions asynchronously
async def handle_slack_event_async(request):
    payload = json.loads(request.form["payload"])
    response = await async_app.async_slack_interaction_consumer(payload)
    return response

Block Sets with Context Validation

from tnslack.decorators import block_set

@block_set(required_context=["user_id", "user_name"])
def user_profile_blocks(context):
    builder = BlockBuilder()
    return [
        builder.header_block(f"Profile: {context['user_name']}"),
        builder.simple_section_block(f"User ID: {context['user_id']}"),
        # ... more blocks
    ]

# Register and use block set
app.register_block_set(user_profile_blocks)

# Use with context
blocks = app.get_block_set("user_profile_blocks", {
    "user_id": "U123456",
    "user_name": "John Doe"
})

Architecture

TNSlack uses a router-based architecture that makes it easy to organize your Slack app's interactions:

SlackApp
├── Route Registration (by interaction type)
│   ├── block_actions
│   ├── view_submission  
│   ├── view_closed
│   └── block_suggestion
├── Block Set Management
│   └── Reusable UI components
├── OAuth Flow Support
└── Official Slack SDK Integration

Route Types

Route Type Description Example Use Case
block_actions Button clicks, select menus Interactive buttons, dropdowns
view_submission Modal form submissions Form processing, data collection
view_closed Modal/home tab closed Cleanup, analytics
block_suggestion External select options Dynamic dropdowns, search

Examples

Check out the examples/ directory for complete working examples:

Development

Setup

git clone https://github.com/thinknimble/tn-slack-py-module.git
cd tn-slack-py-module
pip install -e ".[dev]"
pre-commit install

Running Tests

pytest

Type Checking

mypy src/tnslack

Linting and Formatting

ruff check .
ruff format .

Key Changes

  • Removed singleton pattern - use regular instantiation
  • Added type hints throughout
  • Replaced custom HTTP client with official Slack SDK
  • Added async support
  • Modernized error handling

Contributing

We welcome contributions! Please see CONTRIBUTING.md for guidelines.

License

MIT License - see LICENSE file for details.

Changelog

See CHANGELOG.md for version history.

Support

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

tn_slack_py_module-0.2.4.tar.gz (176.2 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

tn_slack_py_module-0.2.4-py3-none-any.whl (19.3 kB view details)

Uploaded Python 3

File details

Details for the file tn_slack_py_module-0.2.4.tar.gz.

File metadata

  • Download URL: tn_slack_py_module-0.2.4.tar.gz
  • Upload date:
  • Size: 176.2 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.13.2

File hashes

Hashes for tn_slack_py_module-0.2.4.tar.gz
Algorithm Hash digest
SHA256 b9b9c44c04a263cd51e20fed1a5a5b1d60a44896f9f083f14562f4356029adf5
MD5 f3d257344219f22e700ed51e581cd158
BLAKE2b-256 dce214b92d7e1bba42cef0e70d8ef1c0ef78ebbbf1293d91ab9d08cf26828c07

See more details on using hashes here.

File details

Details for the file tn_slack_py_module-0.2.4-py3-none-any.whl.

File metadata

File hashes

Hashes for tn_slack_py_module-0.2.4-py3-none-any.whl
Algorithm Hash digest
SHA256 a5e32a0ae0109dc38b0642689c48d42f9d56fd2dba59d8e7a4ac5b44088eb05d
MD5 338cb06f8a92903b2e47d0e104b59a27
BLAKE2b-256 b26c1950964c2ae0d391f4869849beb14f7f31f97b237c59f8c28c3ff96e8dce

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page