scythargon / slack-channeler

Power a Slack bot with Django Channels v2

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

slack-channeler

Power a Slack bot with Django Channels v2

Installation

pip install slack-channeler

Usage

slack-channeler relies on the channel layer. First, ensure it's setup. channels-redis is recommended.

# settings.py

CHANNEL_LAYERS = {
    'default': {
        'BACKEND': 'channels_redis.core.RedisChannelLayer',
        'CONFIG': {
            "hosts": [('localhost', 6379)],
        },
    },
}

Create a consumer to handle Slack events

# consumers.py

from channels.consumer import AsyncConsumer, get_handler_name

class SlackConsumer(AsyncConsumer):
    async def dispatch(self, message):
        handler = getattr(self, get_handler_name(message), None)
        if handler:
            await handler(**message['data'])

    async def slack_message(self, channel, text, **kwargs):
        # Simply echo back message
        await self.channel_layer.send('slack', {
            'type': 'message',
            'channel': channel,
            'text': text,
        })

Route Slack events to the consumer

# routing.py

from channels.routing import ProtocolTypeRouter, ChannelNameRouter

from .consumers import SlackConsumer

application = ProtocolTypeRouter({
    'channel': ChannelNameRouter({
        'slack': SlackConsumer,
    }),
})

Start a Channels worker to handle Slack events from the channel layer

python manage.py runworker slack

Lastly, run slack-channeler

SLACK_CHANNELER_TOKEN=xoxb-12345678900-098765432100-DeadBeefFeed90iIJjYsf3ay slack_channeler

Building package

Currently, poetry does not support dynamic generation of version files, nor custom hooks to do so. To keep pyproject.toml the source of authority for version numbers, a custom build.py script is used to dynamically generate version.py.

To build slack-channeler, run python build.py. This has the same semantics as poetry build.

About

Power a Slack bot with Django Channels v2

License:MIT License


Languages

Language:Python 100.0%