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.5.tar.gz (177.9 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.5-py3-none-any.whl (20.8 kB view details)

Uploaded Python 3

File details

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

File metadata

  • Download URL: tn_slack_py_module-0.2.5.tar.gz
  • Upload date:
  • Size: 177.9 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.5.tar.gz
Algorithm Hash digest
SHA256 d2eb941f58a6e40f0753164edd50de150d275af75bff2b62c168b76bea6560b9
MD5 a679c9de1538108d4154f0e7fa4febd3
BLAKE2b-256 eaffbeef54755405e47280751bea6f4f80df9f80f070a2f39b046af75d823e5b

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tn_slack_py_module-0.2.5-py3-none-any.whl
Algorithm Hash digest
SHA256 6d10438d09846cb461baa94ebe8ff06da283e8a407367caf07bad9514427a909
MD5 e92d359f0c83b4fd482e40e3b9b21bda
BLAKE2b-256 10edd6687b093a33f7b2598b1547879521b8dca635c87cffef23410fd34e9a91

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