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.3.tar.gz (176.1 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.3-py3-none-any.whl (19.2 kB view details)

Uploaded Python 3

File details

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

File metadata

  • Download URL: tn_slack_py_module-0.2.3.tar.gz
  • Upload date:
  • Size: 176.1 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.3.tar.gz
Algorithm Hash digest
SHA256 66422a1f492055035156ad079c6c130403836c05b9717fd362853fdbcc43def7
MD5 5c9076f5eb93608191116992938fe9df
BLAKE2b-256 718f9fc59de6f9bcd5a49f595acdee2c2501e28ae554aee3d664fe2416ec0b57

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tn_slack_py_module-0.2.3-py3-none-any.whl
Algorithm Hash digest
SHA256 8deaea4ab9914ba4bb7f3016bb0b0f51a8440dcab7bc4e3b61e4000baf829033
MD5 31c331dc437c5d49d64d4aa09c44871e
BLAKE2b-256 1e8d1b891bcb55c898585f53ecbca3c9f609636cca5642e82eda4e78218240ad

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