{"id":26377337,"url":"https://github.com/iky/nameko-slack","last_synced_at":"2025-03-17T03:27:05.470Z","repository":{"id":57444775,"uuid":"77454175","full_name":"iky/nameko-slack","owner":"iky","description":"Nameko extension for interaction with Slack APIs","archived":false,"fork":false,"pushed_at":"2019-05-09T12:56:56.000Z","size":79,"stargazers_count":20,"open_issues_count":0,"forks_count":7,"subscribers_count":2,"default_branch":"master","last_synced_at":"2025-03-11T02:39:32.943Z","etag":null,"topics":["nameko","python","slack"],"latest_commit_sha":null,"homepage":"","language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"apache-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/iky.png","metadata":{"files":{"readme":"README.rst","changelog":"CHANGELOG.rst","contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2016-12-27T12:33:17.000Z","updated_at":"2024-07-12T19:11:33.000Z","dependencies_parsed_at":"2022-09-26T17:30:36.284Z","dependency_job_id":null,"html_url":"https://github.com/iky/nameko-slack","commit_stats":null,"previous_names":[],"tags_count":5,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/iky%2Fnameko-slack","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/iky%2Fnameko-slack/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/iky%2Fnameko-slack/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/iky%2Fnameko-slack/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/iky","download_url":"https://codeload.github.com/iky/nameko-slack/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":243967209,"owners_count":20376200,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["nameko","python","slack"],"created_at":"2025-03-17T03:27:04.833Z","updated_at":"2025-03-17T03:27:05.461Z","avatar_url":"https://github.com/iky.png","language":"Python","funding_links":[],"categories":[],"sub_categories":[],"readme":".. image:: https://api.travis-ci.org/iky/nameko-slack.svg?branch=master\n    :target: https://travis-ci.org/iky/nameko-slack\n\n\n===========================\nSlack Extensions for Nameko\n===========================\n\n`Nameko`_ extension for interaction with `Slack APIs`_. Uses\n`Slack Developer Kit for Python`_.\n\n.. _Nameko: http://nameko.readthedocs.org\n.. _Slack APIs: https://api.slack.com\n.. _Slack Developer Kit for Python: http://slackapi.github.io/python-slackclient\n\n\nReal Time Messaging Client\n==========================\n\nThe RTM extension is a Websocket client for Slack's `Real Time Messaging API`_\nthat allows you to receive events from Slack in real time. The ``rtm`` module\ncontains two Nameko entrypoints for handling such events - ``handle_event`` and\n``handle_message``.\n\n.. _Real Time Messaging API: https://api.slack.com/rtm\n\n\nUsage\n-----\n\nProvide Slack bot API token in your Nameko service config file:\n\n.. code:: yaml\n\n    # config.yml\n\n    SLACK:\n        TOKEN: \"xoxb-abc-1232\"\n\nOr using environment variable within your config:\n\n.. code:: yaml\n\n    # config.yml\n\n    SLACK:\n        TOKEN: ${SLACK_BOT_TOKEN}\n\nDefine your service with an entrypoint which will listen for and fire on any\nevent coming from Slack:\n\n.. code:: python\n\n    # service.py\n\n    from nameko_slack import rtm\n\n    class Service:\n\n        name = 'some-service'\n\n        @rtm.handle_event\n        def on_any_event(self, event):\n            print(event)\n\nFinally, run the service:\n\n.. code::\n\n    $ SLACK_BOT_TOKEN=xoxb-abc-1232 nameko run --config ./config.yaml service\n    starting services: some-service\n    {'type': 'hello'}\n    {'type': 'presence_change', 'user': 'ABCDE1234', 'presence': 'active'}\n    {'type': 'user_typing', 'user': 'ABCDE1234', 'channel': 'ABCDE1234'}\n    {'type': 'message', 'text': 'spam', 'channel': 'ABCDE1234', 'user': 'ABC...\n    {'type': 'presence_change', 'user': 'ABCDE1234', 'presence': 'active'}\n    ...\n\n\nMore Examples\n-------------\n\nListen for events of a particular type:\n\n.. code:: python\n\n    from nameko_slack import rtm\n\n    class Service:\n\n        name = 'some-service'\n\n        @rtm.handle_event('presence_change')\n        def on_presence_change(self, event):\n            pass\n\nListen for any message type event:\n\n.. code:: python\n\n    from nameko_slack import rtm\n\n    class Service:\n\n        name = 'some-service'\n\n        @rtm.handle_message\n        def on_any_message(self, event, message):\n            pass\n\nUse regular expressions to fire on matching messages only:\n\n.. code:: python\n\n    from nameko_slack import rtm\n\n    class Service:\n\n        name = 'some-service'\n\n        @rtm.handle_message('^spam')\n        def on_message_starting_with(self, event, message):\n            pass\n\nParse message and pass matching groups as positional or named arguments\nto the entrypoint:\n\n.. code:: python\n\n    from nameko_slack import rtm\n\n    class Service:\n\n        name = 'some-service'\n\n        @rtm.handle_message('^spam (\\w*)')\n        def on_spam(self, event, message, egg):\n            pass\n\n        @rtm.handle_message('^egg (?P\u003cham\u003e\\w+)')\n        def on_egg(self, event, message, ham=None):\n            pass\n\nRespond back to the channel by returning a string in the message handling\nentrypoint:\n\n.. code:: python\n\n    from nameko_slack import rtm\n\n    class Service:\n\n        name = 'some-service'\n\n        @rtm.handle_message\n        def sure(self, event, message):\n            return 'sure, {}'.format(message)\n\n\nRun multiple RTM bots:\n\n.. code:: yaml\n\n    # config.yml\n\n    SLACK:\n        BOTS:\n            alice: ${ALICE_BOT_TOKEN}\n            bob: ${BOB_BOT_TOKEN}\n\n.. code:: python\n\n    # service.py\n\n    from nameko_slack import rtm\n\n    class Service:\n\n        name = 'some-service'\n\n        @rtm.handle_message(bot_name='alice')\n        def listen_as_alice(self, event, message):\n            pass\n\n        @rtm.handle_message(bot_name='bob')\n        def listen_as_bob(self, event, message):\n            pass\n\n.. code::\n\n    $ ALICE_BOT_TOKEN=xoxb-aaa-111 BOB_BOT_TOKEN=xoxb-bbb-222 nameko run --config ./config.yaml service\n    starting services: some-service\n\n\n\nWEB API Client\n==============\n\nA simple dependency provider wrapping `Slack WEB API client`_.\n\n\n.. _Slack WEB API client: http://slackapi.github.io/python-slackclient/basic_usage.html#sending-a-message\n\n\nUsage\n-----\n\nThe dependency provider uses the same config key as the RTM extension:\n\n.. code:: yaml\n\n    # config.yml\n\n    AMQP_URI: 'pyamqp://guest:guest@localhost'\n    SLACK:\n        TOKEN: ${SLACK_BOT_TOKEN}\n\n.. code:: python\n\n    # service.py\n\n    from nameko.rpc import rpc\n    from nameko_slack import web\n\n\n    class Service:\n\n        name = 'some-service'\n\n        slack = web.Slack()\n\n        @rpc\n        def say_hello(self, name):\n            self.slack.api_call(\n                'chat.postMessage',\n                channel=\"#nameko\",\n                text=\"Hello from Nameko! :tada:\")\n\n\nYou can also use multiple bots:\n\n.. code:: yaml\n\n    # config.yml\n\n    AMQP_URI: 'pyamqp://guest:guest@localhost'\n    SLACK:\n        BOTS:\n            alice: ${ALICE_BOT_TOKEN}\n            bob: ${BOB_BOT_TOKEN}\n\n.. code:: python\n\n    # service.py\n\n    from nameko.rpc import rpc\n    from nameko_slack import web\n\n\n    class Service:\n\n        name = 'some-service'\n\n        alice = web.Slack('alice')\n        bob = web.Slack('bob')\n\n        @rpc\n        def say_hello(self):\n            self.alice.api_call(\n                'chat.postMessage',\n                channel=\"#nameko\",\n                text=\"Hello from Alice! :tada:\")\n            self.bob.api_call(\n                'chat.postMessage',\n                channel=\"#nameko\",\n                text=\"Hello from Bob! :tada:\")\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fiky%2Fnameko-slack","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fiky%2Fnameko-slack","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fiky%2Fnameko-slack/lists"}