diff --git a/.github/workflows/ci-build.yml b/.github/workflows/ci-build.yml index 2b30be62b..93f251234 100644 --- a/.github/workflows/ci-build.yml +++ b/.github/workflows/ci-build.yml @@ -72,11 +72,9 @@ jobs: uses: actions/setup-python@5fda3b95a4ea91299a34e894583c3862153e4b97 # v7.0.0 with: python-version: ${{ env.LATEST_SUPPORTED_PY }} - # Regenerating also runs the MDX/acorn hazard gate inside the generator, - # so a stale tree or an unfenced code example both fail here. - - name: Regenerate the API reference + - name: Generate API reference run: ./scripts/generate_api_docs.sh - - name: Fail if the committed reference is out of date + - name: Verify committed reference is up to date run: git diff --exit-code -- docs/english/reference unittest: diff --git a/docs/english/_sidebar.json b/docs/english/_sidebar.json index 348c134d1..6dc97ce2d 100644 --- a/docs/english/_sidebar.json +++ b/docs/english/_sidebar.json @@ -6,10 +6,7 @@ "className": "sidebar-title" }, "tools/bolt-python/getting-started", - { - "type": "html", - "value": "
" - }, + { "type": "html", "value": "
" }, "tools/bolt-python/creating-an-app", { "type": "category", @@ -17,7 +14,7 @@ "link": { "type": "doc", "id": "tools/bolt-python/concepts/adding-agent-features" - }, + }, "items": [ "tools/bolt-python/concepts/adding-agent-features", "tools/bolt-python/concepts/using-the-assistant-class" @@ -103,14 +100,9 @@ { "type": "category", "label": "Legacy", - "items": [ - "tools/bolt-python/legacy/steps-from-apps" - ] - }, - { - "type": "html", - "value": "
" + "items": ["tools/bolt-python/legacy/steps-from-apps"] }, + { "type": "html", "value": "
" }, { "type": "category", "label": "Tutorials", @@ -124,24 +116,19 @@ "tools/bolt-python/tutorial/modals/modals" ] }, - { - "type": "html", - "value": "
" - }, + { "type": "html", "value": "
" }, { "type": "category", "label": "Reference", + "link": { + "type": "doc", + "id": "tools/bolt-python/reference/index" + }, "items": [ - { - "type": "autogenerated", - "dirName": "tools/bolt-python/reference" - } + { "type": "autogenerated", "dirName": "tools/bolt-python/reference" } ] }, - { - "type": "html", - "value": "
" - }, + { "type": "html", "value": "
" }, { "type": "category", "label": "日本語 (日本)", @@ -218,9 +205,7 @@ { "type": "category", "label": "レガシー(非推奨)", - "items": [ - "tools/bolt-python/ja-jp/legacy/steps-from-apps" - ] + "items": ["tools/bolt-python/ja-jp/legacy/steps-from-apps"] } ] } diff --git a/docs/english/reference/adapter/aiohttp/index.md b/docs/english/reference/adapter/aiohttp/index.md index 9e41cad68..87882ccd4 100644 --- a/docs/english/reference/adapter/aiohttp/index.md +++ b/docs/english/reference/adapter/aiohttp/index.md @@ -3,14 +3,4 @@ sidebar_label: aiohttp title: slack_bolt.adapter.aiohttp --- -#### to\_bolt\_request -```python -async def to_bolt_request(request: web.Request) -> AsyncBoltRequest -``` - -#### to\_aiohttp\_response - -```python -async def to_aiohttp_response(bolt_resp: BoltResponse) -> web.Response -``` diff --git a/docs/english/reference/adapter/asgi/aiohttp/index.md b/docs/english/reference/adapter/asgi/aiohttp/index.md index 83bf93ac8..e76fff38c 100644 --- a/docs/english/reference/adapter/asgi/aiohttp/index.md +++ b/docs/english/reference/adapter/asgi/aiohttp/index.md @@ -3,19 +3,13 @@ sidebar_label: aiohttp title: slack_bolt.adapter.asgi.aiohttp --- -## AsyncSlackRequestHandler Objects +## `AsyncSlackRequestHandler` ```python -class AsyncSlackRequestHandler(SlackRequestHandler) +AsyncSlackRequestHandler(app, path='/slack/events') ``` -#### app: `AsyncApp` - -#### \_\_init\_\_ - -```python -def __init__(app: AsyncApp, path: str = '/slack/events') -``` +Bases: SlackRequestHandler Setup Bolt as an ASGI web framework, this will make your application compatible with ASGI web servers. @@ -25,36 +19,17 @@ With the default settings, `http://localhost:3000/slack/events` Run Bolt with [uvicron](https://www.uvicorn.org/) ```python -# Python app = AsyncApp() api = SlackRequestHandler(app) +``` -# bash +```bash export SLACK_SIGNING_SECRET=*** export SLACK_BOT_TOKEN=xoxb-*** uvicorn app:api --port 3000 --log-level debug ``` +**Parameters:** -**Arguments**: - -- `app` _AsyncApp_ - Your bolt application -- `path` _str_ - The path to handle request from Slack (Default: `/slack/events`) - -#### dispatch - -```python -async def dispatch(request: AsgiHttpRequest) -> BoltResponse -``` - -#### handle\_installation - -```python -async def handle_installation(request: AsgiHttpRequest) -> BoltResponse -``` - -#### handle\_callback - -```python -async def handle_callback(request: AsgiHttpRequest) -> BoltResponse -``` +- **app** (AsyncApp) – Your bolt application +- **path** (str) – The path to handle request from Slack (Default: `/slack/events`) diff --git a/docs/english/reference/adapter/asgi/async_handler.md b/docs/english/reference/adapter/asgi/async_handler.md index f0719db0e..2b8cd30d1 100644 --- a/docs/english/reference/adapter/asgi/async_handler.md +++ b/docs/english/reference/adapter/asgi/async_handler.md @@ -3,19 +3,13 @@ sidebar_label: async_handler title: slack_bolt.adapter.asgi.async_handler --- -## AsyncSlackRequestHandler Objects +## `AsyncSlackRequestHandler` ```python -class AsyncSlackRequestHandler(SlackRequestHandler) +AsyncSlackRequestHandler(app, path='/slack/events') ``` -#### app: `AsyncApp` - -#### \_\_init\_\_ - -```python -def __init__(app: AsyncApp, path: str = '/slack/events') -``` +Bases: SlackRequestHandler Setup Bolt as an ASGI web framework, this will make your application compatible with ASGI web servers. @@ -25,36 +19,17 @@ With the default settings, `http://localhost:3000/slack/events` Run Bolt with [uvicron](https://www.uvicorn.org/) ```python -# Python app = AsyncApp() api = SlackRequestHandler(app) +``` -# bash +```bash export SLACK_SIGNING_SECRET=*** export SLACK_BOT_TOKEN=xoxb-*** uvicorn app:api --port 3000 --log-level debug ``` +**Parameters:** -**Arguments**: - -- `app` _AsyncApp_ - Your bolt application -- `path` _str_ - The path to handle request from Slack (Default: `/slack/events`) - -#### dispatch - -```python -async def dispatch(request: AsgiHttpRequest) -> BoltResponse -``` - -#### handle\_installation - -```python -async def handle_installation(request: AsgiHttpRequest) -> BoltResponse -``` - -#### handle\_callback - -```python -async def handle_callback(request: AsgiHttpRequest) -> BoltResponse -``` +- **app** (AsyncApp) – Your bolt application +- **path** (str) – The path to handle request from Slack (Default: `/slack/events`) diff --git a/docs/english/reference/adapter/asgi/base_handler.md b/docs/english/reference/adapter/asgi/base_handler.md index 34bb6ea0e..21285ef7c 100644 --- a/docs/english/reference/adapter/asgi/base_handler.md +++ b/docs/english/reference/adapter/asgi/base_handler.md @@ -3,36 +3,28 @@ sidebar_label: base_handler title: slack_bolt.adapter.asgi.base_handler --- -## BaseSlackRequestHandler Objects +## `BaseSlackRequestHandler` -```python -class BaseSlackRequestHandler() -``` - -#### app: `Union[App, AsyncApp]` - -#### path: `str` - -#### dispatch +### `dispatch` ```python -async def dispatch(request: AsgiHttpRequest) -> BoltResponse +dispatch(request) ``` Dispatches a request to the Bolt App. -#### handle\_installation +### `handle_callback` ```python -async def handle_installation(request: AsgiHttpRequest) -> BoltResponse +handle_callback(request) ``` -Handles installation of the OAuthFlow. +Handles the callback of the OAuthFlow. -#### handle\_callback +### `handle_installation` ```python -async def handle_callback(request: AsgiHttpRequest) -> BoltResponse +handle_installation(request) ``` -Handles the callback of the OAuthFlow. +Handles installation of the OAuthFlow. diff --git a/docs/english/reference/adapter/asgi/builtin/index.md b/docs/english/reference/adapter/asgi/builtin/index.md index 8c6526f5b..9abf83540 100644 --- a/docs/english/reference/adapter/asgi/builtin/index.md +++ b/docs/english/reference/adapter/asgi/builtin/index.md @@ -3,17 +3,13 @@ sidebar_label: builtin title: slack_bolt.adapter.asgi.builtin --- -## SlackRequestHandler Objects +## `SlackRequestHandler` ```python -class SlackRequestHandler(BaseSlackRequestHandler) +SlackRequestHandler(app, path='/slack/events') ``` -#### \_\_init\_\_ - -```python -def __init__(app: App, path: str = '/slack/events') -``` +Bases: BaseSlackRequestHandler Setup Bolt as an ASGI web framework, this will make your application compatible with ASGI web servers. @@ -23,36 +19,17 @@ With the default settings, `http://localhost:3000/slack/events` Run Bolt with [uvicron](https://www.uvicorn.org/) ```python -# Python app = App() api = SlackRequestHandler(app) +``` -# bash +```bash export SLACK_SIGNING_SECRET=*** export SLACK_BOT_TOKEN=xoxb-*** uvicorn app:api --port 3000 --log-level debug ``` +**Parameters:** -**Arguments**: - -- `app` _App_ - Your bolt application -- `path` _str_ - The path to handle request from Slack (Default: `/slack/events`) - -#### dispatch - -```python -async def dispatch(request: AsgiHttpRequest) -> BoltResponse -``` - -#### handle\_installation - -```python -async def handle_installation(request: AsgiHttpRequest) -> BoltResponse -``` - -#### handle\_callback - -```python -async def handle_callback(request: AsgiHttpRequest) -> BoltResponse -``` +- **app** (App) – Your bolt application +- **path** (str) – The path to handle request from Slack (Default: `/slack/events`) diff --git a/docs/english/reference/adapter/asgi/http_request.md b/docs/english/reference/adapter/asgi/http_request.md index 6fc4a2c6d..883312260 100644 --- a/docs/english/reference/adapter/asgi/http_request.md +++ b/docs/english/reference/adapter/asgi/http_request.md @@ -3,28 +3,4 @@ sidebar_label: http_request title: slack_bolt.adapter.asgi.http_request --- -## AsgiHttpRequest Objects -```python -class AsgiHttpRequest() -``` - -#### \_\_init\_\_ - -```python -def __init__(scope: scope_type, receive: Callable) -``` - -#### raw\_headers: `Iterable[Tuple[bytes, bytes]]` - -#### get\_headers - -```python -def get_headers() -> Dict[str, Union[str, Sequence[str]]] -``` - -#### get\_raw\_body - -```python -async def get_raw_body() -> str -``` diff --git a/docs/english/reference/adapter/asgi/http_response.md b/docs/english/reference/adapter/asgi/http_response.md index 5c0ffe1ca..30ce5480e 100644 --- a/docs/english/reference/adapter/asgi/http_response.md +++ b/docs/english/reference/adapter/asgi/http_response.md @@ -3,32 +3,4 @@ sidebar_label: http_response title: slack_bolt.adapter.asgi.http_response --- -## AsgiHttpResponse Objects -```python -class AsgiHttpResponse() -``` - -#### \_\_init\_\_ - -```python -def __init__(status: int, headers: Dict[str, Sequence[str]] = {}, body: str = '') -``` - -#### status: `int` - -#### body: `bytes` - -#### raw\_headers: `List[Tuple[bytes, bytes]]` - -#### get\_response\_start - -```python -def get_response_start() -> Dict[str, Union[str, int, Iterable[Tuple[bytes, bytes]]]] -``` - -#### get\_response\_body - -```python -def get_response_body() -> Dict[str, Union[str, bytes, bool]] -``` diff --git a/docs/english/reference/adapter/asgi/index.md b/docs/english/reference/adapter/asgi/index.md index 069590f06..190e9936d 100644 --- a/docs/english/reference/adapter/asgi/index.md +++ b/docs/english/reference/adapter/asgi/index.md @@ -3,27 +3,13 @@ sidebar_label: asgi title: slack_bolt.adapter.asgi --- -## Submodules - -- [slack_bolt.adapter.asgi.aiohttp](/tools/bolt-python/reference/adapter/asgi/aiohttp) -- [slack_bolt.adapter.asgi.async_handler](/tools/bolt-python/reference/adapter/asgi/async_handler) -- [slack_bolt.adapter.asgi.base_handler](/tools/bolt-python/reference/adapter/asgi/base_handler) -- [slack_bolt.adapter.asgi.builtin](/tools/bolt-python/reference/adapter/asgi/builtin) -- [slack_bolt.adapter.asgi.http_request](/tools/bolt-python/reference/adapter/asgi/http_request) -- [slack_bolt.adapter.asgi.http_response](/tools/bolt-python/reference/adapter/asgi/http_response) -- [slack_bolt.adapter.asgi.utils](/tools/bolt-python/reference/adapter/asgi/utils) - -## SlackRequestHandler Objects +## `SlackRequestHandler` ```python -class SlackRequestHandler(BaseSlackRequestHandler) +SlackRequestHandler(app, path='/slack/events') ``` -#### \_\_init\_\_ - -```python -def __init__(app: App, path: str = '/slack/events') -``` +Bases: BaseSlackRequestHandler Setup Bolt as an ASGI web framework, this will make your application compatible with ASGI web servers. @@ -33,36 +19,27 @@ With the default settings, `http://localhost:3000/slack/events` Run Bolt with [uvicron](https://www.uvicorn.org/) ```python -# Python app = App() api = SlackRequestHandler(app) +``` -# bash +```bash export SLACK_SIGNING_SECRET=*** export SLACK_BOT_TOKEN=xoxb-*** uvicorn app:api --port 3000 --log-level debug ``` +**Parameters:** -**Arguments**: - -- `app` _App_ - Your bolt application -- `path` _str_ - The path to handle request from Slack (Default: `/slack/events`) +- **app** (App) – Your bolt application +- **path** (str) – The path to handle request from Slack (Default: `/slack/events`) -#### dispatch - -```python -async def dispatch(request: AsgiHttpRequest) -> BoltResponse -``` - -#### handle\_installation - -```python -async def handle_installation(request: AsgiHttpRequest) -> BoltResponse -``` - -#### handle\_callback +## Submodules -```python -async def handle_callback(request: AsgiHttpRequest) -> BoltResponse -``` +- [slack_bolt.adapter.asgi.aiohttp](/tools/bolt-python/reference/adapter/asgi/aiohttp) +- [slack_bolt.adapter.asgi.async_handler](/tools/bolt-python/reference/adapter/asgi/async_handler) +- [slack_bolt.adapter.asgi.base_handler](/tools/bolt-python/reference/adapter/asgi/base_handler) +- [slack_bolt.adapter.asgi.builtin](/tools/bolt-python/reference/adapter/asgi/builtin) +- [slack_bolt.adapter.asgi.http_request](/tools/bolt-python/reference/adapter/asgi/http_request) +- [slack_bolt.adapter.asgi.http_response](/tools/bolt-python/reference/adapter/asgi/http_response) +- [slack_bolt.adapter.asgi.utils](/tools/bolt-python/reference/adapter/asgi/utils) diff --git a/docs/english/reference/adapter/asgi/utils.md b/docs/english/reference/adapter/asgi/utils.md index a9a25ebe6..40e26a7b1 100644 --- a/docs/english/reference/adapter/asgi/utils.md +++ b/docs/english/reference/adapter/asgi/utils.md @@ -3,8 +3,4 @@ sidebar_label: utils title: slack_bolt.adapter.asgi.utils --- -#### ENCODING -#### scope\_value\_type - -#### scope\_type diff --git a/docs/english/reference/adapter/aws_lambda/chalice_handler.md b/docs/english/reference/adapter/aws_lambda/chalice_handler.md index a647098c4..5a39bc0ca 100644 --- a/docs/english/reference/adapter/aws_lambda/chalice_handler.md +++ b/docs/english/reference/adapter/aws_lambda/chalice_handler.md @@ -3,44 +3,4 @@ sidebar_label: chalice_handler title: slack_bolt.adapter.aws_lambda.chalice_handler --- -## ChaliceSlackRequestHandler Objects -```python -class ChaliceSlackRequestHandler() -``` - -#### \_\_init\_\_ - -```python -def __init__(app: App, chalice: Chalice, lambda_client: Optional[BaseClient] = None) -``` - -#### clear\_all\_log\_handlers - -```python -def clear_all_log_handlers() -``` - -#### handle - -```python -def handle(request: Request) -``` - -#### to\_bolt\_request - -```python -def to_bolt_request(request: Request, body: str) -> BoltRequest -``` - -#### to\_chalice\_response - -```python -def to_chalice_response(resp: BoltResponse) -> Response -``` - -#### not\_found - -```python -def not_found() -> Response -``` diff --git a/docs/english/reference/adapter/aws_lambda/chalice_lazy_listener_runner.md b/docs/english/reference/adapter/aws_lambda/chalice_lazy_listener_runner.md index 96644a442..3b3eddcd1 100644 --- a/docs/english/reference/adapter/aws_lambda/chalice_lazy_listener_runner.md +++ b/docs/english/reference/adapter/aws_lambda/chalice_lazy_listener_runner.md @@ -3,20 +3,4 @@ sidebar_label: chalice_lazy_listener_runner title: slack_bolt.adapter.aws_lambda.chalice_lazy_listener_runner --- -## ChaliceLazyListenerRunner Objects -```python -class ChaliceLazyListenerRunner(LazyListenerRunner) -``` - -#### \_\_init\_\_ - -```python -def __init__(logger: Logger, lambda_client: Optional[BaseClient] = None) -``` - -#### start - -```python -def start(function: Callable[..., None], request: BoltRequest) -> None -``` diff --git a/docs/english/reference/adapter/aws_lambda/handler.md b/docs/english/reference/adapter/aws_lambda/handler.md index 5de6c9992..50cc1f82f 100644 --- a/docs/english/reference/adapter/aws_lambda/handler.md +++ b/docs/english/reference/adapter/aws_lambda/handler.md @@ -3,44 +3,4 @@ sidebar_label: handler title: slack_bolt.adapter.aws_lambda.handler --- -## SlackRequestHandler Objects -```python -class SlackRequestHandler() -``` - -#### \_\_init\_\_ - -```python -def __init__(app: App) -``` - -#### clear\_all\_log\_handlers - -```python -def clear_all_log_handlers() -``` - -#### handle - -```python -def handle(event, context) -``` - -#### to\_bolt\_request - -```python -def to_bolt_request(event) -> BoltRequest -``` - -#### to\_aws\_response - -```python -def to_aws_response(resp: BoltResponse) -> Dict[str, Any] -``` - -#### not\_found - -```python -def not_found() -> Dict[str, Any] -``` diff --git a/docs/english/reference/adapter/aws_lambda/index.md b/docs/english/reference/adapter/aws_lambda/index.md index 8666da643..75f559ccc 100644 --- a/docs/english/reference/adapter/aws_lambda/index.md +++ b/docs/english/reference/adapter/aws_lambda/index.md @@ -12,27 +12,3 @@ title: slack_bolt.adapter.aws_lambda - [slack_bolt.adapter.aws_lambda.lambda_s3_oauth_flow](/tools/bolt-python/reference/adapter/aws_lambda/lambda_s3_oauth_flow) - [slack_bolt.adapter.aws_lambda.lazy_listener_runner](/tools/bolt-python/reference/adapter/aws_lambda/lazy_listener_runner) - [slack_bolt.adapter.aws_lambda.local_lambda_client](/tools/bolt-python/reference/adapter/aws_lambda/local_lambda_client) - -## SlackRequestHandler Objects - -```python -class SlackRequestHandler() -``` - -#### \_\_init\_\_ - -```python -def __init__(app: App) -``` - -#### clear\_all\_log\_handlers - -```python -def clear_all_log_handlers() -``` - -#### handle - -```python -def handle(event, context) -``` diff --git a/docs/english/reference/adapter/aws_lambda/lambda_s3_oauth_flow.md b/docs/english/reference/adapter/aws_lambda/lambda_s3_oauth_flow.md index b050e5dea..2b5cde54f 100644 --- a/docs/english/reference/adapter/aws_lambda/lambda_s3_oauth_flow.md +++ b/docs/english/reference/adapter/aws_lambda/lambda_s3_oauth_flow.md @@ -3,34 +3,4 @@ sidebar_label: lambda_s3_oauth_flow title: slack_bolt.adapter.aws_lambda.lambda_s3_oauth_flow --- -## LambdaS3OAuthFlow Objects -```python -class LambdaS3OAuthFlow(OAuthFlow) -``` - -#### \_\_init\_\_ - -```python -def __init__( - *, - client: Optional[WebClient] = None, - logger: Optional[Logger] = None, - settings: Optional[OAuthSettings] = None, - oauth_state_bucket_name: Optional[str] = None, - installation_bucket_name: Optional[str] = None) -``` - -#### client - -```python -@property -def client() -> WebClient -``` - -#### logger - -```python -@property -def logger() -> Logger -``` diff --git a/docs/english/reference/adapter/aws_lambda/lazy_listener_runner.md b/docs/english/reference/adapter/aws_lambda/lazy_listener_runner.md index f4b38941a..903771242 100644 --- a/docs/english/reference/adapter/aws_lambda/lazy_listener_runner.md +++ b/docs/english/reference/adapter/aws_lambda/lazy_listener_runner.md @@ -3,20 +3,4 @@ sidebar_label: lazy_listener_runner title: slack_bolt.adapter.aws_lambda.lazy_listener_runner --- -## LambdaLazyListenerRunner Objects -```python -class LambdaLazyListenerRunner(LazyListenerRunner) -``` - -#### \_\_init\_\_ - -```python -def __init__(logger: Logger, lambda_client: Optional[Any] = None) -``` - -#### start - -```python -def start(function: Callable[..., None], request: BoltRequest) -> None -``` diff --git a/docs/english/reference/adapter/aws_lambda/local_lambda_client.md b/docs/english/reference/adapter/aws_lambda/local_lambda_client.md index 95a381253..4f6d6132a 100644 --- a/docs/english/reference/adapter/aws_lambda/local_lambda_client.md +++ b/docs/english/reference/adapter/aws_lambda/local_lambda_client.md @@ -3,25 +3,12 @@ sidebar_label: local_lambda_client title: slack_bolt.adapter.aws_lambda.local_lambda_client --- -## LocalLambdaClient Objects +## `LocalLambdaClient` ```python -class LocalLambdaClient(BaseClient) +LocalLambdaClient(app, config) ``` -Lambda client implementing `invoke` for use when running with Chalice CLI. - -#### \_\_init\_\_ - -```python -def __init__(app: Chalice, config: Config) -> None -``` +Bases: BaseClient -#### invoke - -```python -def invoke( - FunctionName: str, - InvocationType: str = 'Event', - Payload: str = '{}') -> InvokeResponse -``` +Lambda client implementing `invoke` for use when running with Chalice CLI. diff --git a/docs/english/reference/adapter/bottle/handler.md b/docs/english/reference/adapter/bottle/handler.md index 727a643fc..7f5733eac 100644 --- a/docs/english/reference/adapter/bottle/handler.md +++ b/docs/english/reference/adapter/bottle/handler.md @@ -3,32 +3,4 @@ sidebar_label: handler title: slack_bolt.adapter.bottle.handler --- -#### to\_bolt\_request -```python -def to_bolt_request(req: Request) -> BoltRequest -``` - -#### set\_response - -```python -def set_response(bolt_resp: BoltResponse, resp: Response) -> None -``` - -## SlackRequestHandler Objects - -```python -class SlackRequestHandler() -``` - -#### \_\_init\_\_ - -```python -def __init__(app: App) -``` - -#### handle - -```python -def handle(req: Request, resp: Response) -> str -``` diff --git a/docs/english/reference/adapter/bottle/index.md b/docs/english/reference/adapter/bottle/index.md index 703afa1c9..610eb1db8 100644 --- a/docs/english/reference/adapter/bottle/index.md +++ b/docs/english/reference/adapter/bottle/index.md @@ -6,21 +6,3 @@ title: slack_bolt.adapter.bottle ## Submodules - [slack_bolt.adapter.bottle.handler](/tools/bolt-python/reference/adapter/bottle/handler) - -## SlackRequestHandler Objects - -```python -class SlackRequestHandler() -``` - -#### \_\_init\_\_ - -```python -def __init__(app: App) -``` - -#### handle - -```python -def handle(req: Request, resp: Response) -> str -``` diff --git a/docs/english/reference/adapter/cherrypy/handler.md b/docs/english/reference/adapter/cherrypy/handler.md index cd477de29..4aa84d521 100644 --- a/docs/english/reference/adapter/cherrypy/handler.md +++ b/docs/english/reference/adapter/cherrypy/handler.md @@ -3,38 +3,4 @@ sidebar_label: handler title: slack_bolt.adapter.cherrypy.handler --- -#### build\_bolt\_request -```python -def build_bolt_request() -> BoltRequest -``` - -#### set\_response\_status\_and\_headers - -```python -def set_response_status_and_headers(bolt_resp: BoltResponse) -> None -``` - -#### slack\_in - -```python -def slack_in() -``` - -## SlackRequestHandler Objects - -```python -class SlackRequestHandler() -``` - -#### \_\_init\_\_ - -```python -def __init__(app: App) -``` - -#### handle - -```python -def handle() -> bytes -``` diff --git a/docs/english/reference/adapter/cherrypy/index.md b/docs/english/reference/adapter/cherrypy/index.md index 036c74acc..9e3d5c9c3 100644 --- a/docs/english/reference/adapter/cherrypy/index.md +++ b/docs/english/reference/adapter/cherrypy/index.md @@ -6,21 +6,3 @@ title: slack_bolt.adapter.cherrypy ## Submodules - [slack_bolt.adapter.cherrypy.handler](/tools/bolt-python/reference/adapter/cherrypy/handler) - -## SlackRequestHandler Objects - -```python -class SlackRequestHandler() -``` - -#### \_\_init\_\_ - -```python -def __init__(app: App) -``` - -#### handle - -```python -def handle() -> bytes -``` diff --git a/docs/english/reference/adapter/django/handler.md b/docs/english/reference/adapter/django/handler.md index e488ad8c7..5c6b06f79 100644 --- a/docs/english/reference/adapter/django/handler.md +++ b/docs/english/reference/adapter/django/handler.md @@ -3,84 +3,20 @@ sidebar_label: handler title: slack_bolt.adapter.django.handler --- -#### to\_bolt\_request +## `DjangoListenerCompletionHandler` -```python -def to_bolt_request(req: HttpRequest) -> BoltRequest -``` - -#### to\_django\_response - -```python -def to_django_response(bolt_resp: BoltResponse) -> HttpResponse -``` - -#### release\_thread\_local\_connections - -```python -def release_thread_local_connections(logger: Logger, execution_timing: str) -``` - -## DjangoListenerStartHandler Objects - -```python -class DjangoListenerStartHandler(ListenerStartHandler) -``` +Bases: ListenerCompletionHandler Django sets DB connections as a thread-local variable per thread. If the thread is not managed on the Django app side, the connections won't be released by Django. This handler releases the connections every time a ThreadListenerRunner execution completes. -#### handle - -```python -def handle(request: BoltRequest, response: Optional[BoltResponse]) -> None -``` - -## DjangoListenerCompletionHandler Objects +## `DjangoListenerStartHandler` -```python -class DjangoListenerCompletionHandler(ListenerCompletionHandler) -``` +Bases: ListenerStartHandler Django sets DB connections as a thread-local variable per thread. If the thread is not managed on the Django app side, the connections won't be released by Django. This handler releases the connections every time a ThreadListenerRunner execution completes. - -#### handle - -```python -def handle(request: BoltRequest, response: Optional[BoltResponse]) -> None -``` - -## DjangoThreadLazyListenerRunner Objects - -```python -class DjangoThreadLazyListenerRunner(ThreadLazyListenerRunner) -``` - -#### start - -```python -def start(function: Callable[..., None], request: BoltRequest) -> None -``` - -## SlackRequestHandler Objects - -```python -class SlackRequestHandler() -``` - -#### \_\_init\_\_ - -```python -def __init__(app: App) -``` - -#### handle - -```python -def handle(req: HttpRequest) -> HttpResponse -``` diff --git a/docs/english/reference/adapter/django/index.md b/docs/english/reference/adapter/django/index.md index 2d0178e77..7b909c770 100644 --- a/docs/english/reference/adapter/django/index.md +++ b/docs/english/reference/adapter/django/index.md @@ -6,21 +6,3 @@ title: slack_bolt.adapter.django ## Submodules - [slack_bolt.adapter.django.handler](/tools/bolt-python/reference/adapter/django/handler) - -## SlackRequestHandler Objects - -```python -class SlackRequestHandler() -``` - -#### \_\_init\_\_ - -```python -def __init__(app: App) -``` - -#### handle - -```python -def handle(req: HttpRequest) -> HttpResponse -``` diff --git a/docs/english/reference/adapter/falcon/async_resource.md b/docs/english/reference/adapter/falcon/async_resource.md index 6173d1104..72ce8936b 100644 --- a/docs/english/reference/adapter/falcon/async_resource.md +++ b/docs/english/reference/adapter/falcon/async_resource.md @@ -3,10 +3,10 @@ sidebar_label: async_resource title: slack_bolt.adapter.falcon.async_resource --- -## AsyncSlackAppResource Objects +## `AsyncSlackAppResource` ```python -class AsyncSlackAppResource() +AsyncSlackAppResource(app) ``` For use with ASGI Falcon Apps. @@ -21,21 +21,3 @@ import falcon app = falcon.asgi.App() app.add_route("/slack/events", AsyncSlackAppResource(app)) ``` - -#### \_\_init\_\_ - -```python -def __init__(app: AsyncApp) -``` - -#### on\_get - -```python -async def on_get(req: Request, resp: Response) -``` - -#### on\_post - -```python -async def on_post(req: Request, resp: Response) -``` diff --git a/docs/english/reference/adapter/falcon/index.md b/docs/english/reference/adapter/falcon/index.md index b8ca47980..5dec1584b 100644 --- a/docs/english/reference/adapter/falcon/index.md +++ b/docs/english/reference/adapter/falcon/index.md @@ -3,15 +3,10 @@ sidebar_label: falcon title: slack_bolt.adapter.falcon --- -## Submodules - -- [slack_bolt.adapter.falcon.async_resource](/tools/bolt-python/reference/adapter/falcon/async_resource) -- [slack_bolt.adapter.falcon.resource](/tools/bolt-python/reference/adapter/falcon/resource) - -## SlackAppResource Objects +## `SlackAppResource` ```python -class SlackAppResource() +SlackAppResource(app) ``` For use with WSGI Falcon Apps. @@ -27,20 +22,7 @@ api = application = falcon.API() api.add_route("/slack/events", SlackAppResource(app)) ``` -#### \_\_init\_\_ - -```python -def __init__(app: App) -``` - -#### on\_get - -```python -def on_get(req: Request, resp: Response) -``` - -#### on\_post +## Submodules -```python -def on_post(req: Request, resp: Response) -``` +- [slack_bolt.adapter.falcon.async_resource](/tools/bolt-python/reference/adapter/falcon/async_resource) +- [slack_bolt.adapter.falcon.resource](/tools/bolt-python/reference/adapter/falcon/resource) diff --git a/docs/english/reference/adapter/falcon/resource.md b/docs/english/reference/adapter/falcon/resource.md index 1cd39ea82..1547a3956 100644 --- a/docs/english/reference/adapter/falcon/resource.md +++ b/docs/english/reference/adapter/falcon/resource.md @@ -3,10 +3,10 @@ sidebar_label: resource title: slack_bolt.adapter.falcon.resource --- -## SlackAppResource Objects +## `SlackAppResource` ```python -class SlackAppResource() +SlackAppResource(app) ``` For use with WSGI Falcon Apps. @@ -21,21 +21,3 @@ import falcon api = application = falcon.API() api.add_route("/slack/events", SlackAppResource(app)) ``` - -#### \_\_init\_\_ - -```python -def __init__(app: App) -``` - -#### on\_get - -```python -def on_get(req: Request, resp: Response) -``` - -#### on\_post - -```python -def on_post(req: Request, resp: Response) -``` diff --git a/docs/english/reference/adapter/fastapi/async_handler.md b/docs/english/reference/adapter/fastapi/async_handler.md index 75497e71b..5ad5ec3c1 100644 --- a/docs/english/reference/adapter/fastapi/async_handler.md +++ b/docs/english/reference/adapter/fastapi/async_handler.md @@ -3,22 +3,4 @@ sidebar_label: async_handler title: slack_bolt.adapter.fastapi.async_handler --- -## AsyncSlackRequestHandler Objects -```python -class AsyncSlackRequestHandler() -``` - -#### \_\_init\_\_ - -```python -def __init__(app: AsyncApp) -``` - -#### handle - -```python -async def handle( - req: Request, - addition_context_properties: Optional[Dict[str, Any]] = None) -> Response -``` diff --git a/docs/english/reference/adapter/fastapi/index.md b/docs/english/reference/adapter/fastapi/index.md index 469bc7bb7..3605502f0 100644 --- a/docs/english/reference/adapter/fastapi/index.md +++ b/docs/english/reference/adapter/fastapi/index.md @@ -6,23 +6,3 @@ title: slack_bolt.adapter.fastapi ## Submodules - [slack_bolt.adapter.fastapi.async_handler](/tools/bolt-python/reference/adapter/fastapi/async_handler) - -## SlackRequestHandler Objects - -```python -class SlackRequestHandler() -``` - -#### \_\_init\_\_ - -```python -def __init__(app: App) -``` - -#### handle - -```python -async def handle( - req: Request, - addition_context_properties: Optional[Dict[str, Any]] = None) -> Response -``` diff --git a/docs/english/reference/adapter/flask/handler.md b/docs/english/reference/adapter/flask/handler.md index 3657debd0..a68e66007 100644 --- a/docs/english/reference/adapter/flask/handler.md +++ b/docs/english/reference/adapter/flask/handler.md @@ -3,32 +3,4 @@ sidebar_label: handler title: slack_bolt.adapter.flask.handler --- -#### to\_bolt\_request -```python -def to_bolt_request(req: Request) -> BoltRequest -``` - -#### to\_flask\_response - -```python -def to_flask_response(bolt_resp: BoltResponse) -> Response -``` - -## SlackRequestHandler Objects - -```python -class SlackRequestHandler() -``` - -#### \_\_init\_\_ - -```python -def __init__(app: App) -``` - -#### handle - -```python -def handle(req: Request) -> Response -``` diff --git a/docs/english/reference/adapter/flask/index.md b/docs/english/reference/adapter/flask/index.md index 80807da8a..d5db40abf 100644 --- a/docs/english/reference/adapter/flask/index.md +++ b/docs/english/reference/adapter/flask/index.md @@ -6,21 +6,3 @@ title: slack_bolt.adapter.flask ## Submodules - [slack_bolt.adapter.flask.handler](/tools/bolt-python/reference/adapter/flask/handler) - -## SlackRequestHandler Objects - -```python -class SlackRequestHandler() -``` - -#### \_\_init\_\_ - -```python -def __init__(app: App) -``` - -#### handle - -```python -def handle(req: Request) -> Response -``` diff --git a/docs/english/reference/adapter/google_cloud_functions/handler.md b/docs/english/reference/adapter/google_cloud_functions/handler.md index 0d8807ba8..45ed53de4 100644 --- a/docs/english/reference/adapter/google_cloud_functions/handler.md +++ b/docs/english/reference/adapter/google_cloud_functions/handler.md @@ -3,32 +3,4 @@ sidebar_label: handler title: slack_bolt.adapter.google_cloud_functions.handler --- -## NoopLazyListenerRunner Objects -```python -class NoopLazyListenerRunner(LazyListenerRunner) -``` - -#### start - -```python -def start(function: Callable[..., None], request: BoltRequest) -> None -``` - -## SlackRequestHandler Objects - -```python -class SlackRequestHandler() -``` - -#### \_\_init\_\_ - -```python -def __init__(app: App) -``` - -#### handle - -```python -def handle(req: Request) -> Response -``` diff --git a/docs/english/reference/adapter/google_cloud_functions/index.md b/docs/english/reference/adapter/google_cloud_functions/index.md index 56129e6dd..b4a15832a 100644 --- a/docs/english/reference/adapter/google_cloud_functions/index.md +++ b/docs/english/reference/adapter/google_cloud_functions/index.md @@ -6,21 +6,3 @@ title: slack_bolt.adapter.google_cloud_functions ## Submodules - [slack_bolt.adapter.google_cloud_functions.handler](/tools/bolt-python/reference/adapter/google_cloud_functions/handler) - -## SlackRequestHandler Objects - -```python -class SlackRequestHandler() -``` - -#### \_\_init\_\_ - -```python -def __init__(app: App) -``` - -#### handle - -```python -def handle(req: Request) -> Response -``` diff --git a/docs/english/reference/adapter/pyramid/handler.md b/docs/english/reference/adapter/pyramid/handler.md index 614d2c19b..2c6178b1c 100644 --- a/docs/english/reference/adapter/pyramid/handler.md +++ b/docs/english/reference/adapter/pyramid/handler.md @@ -3,32 +3,4 @@ sidebar_label: handler title: slack_bolt.adapter.pyramid.handler --- -#### to\_bolt\_request -```python -def to_bolt_request(request: Request) -> BoltRequest -``` - -#### to\_pyramid\_response - -```python -def to_pyramid_response(bolt_resp: BoltResponse) -> Response -``` - -## SlackRequestHandler Objects - -```python -class SlackRequestHandler() -``` - -#### \_\_init\_\_ - -```python -def __init__(app: App) -``` - -#### handle - -```python -def handle(request: Request) -> Response -``` diff --git a/docs/english/reference/adapter/pyramid/index.md b/docs/english/reference/adapter/pyramid/index.md index 013feb456..128204306 100644 --- a/docs/english/reference/adapter/pyramid/index.md +++ b/docs/english/reference/adapter/pyramid/index.md @@ -6,21 +6,3 @@ title: slack_bolt.adapter.pyramid ## Submodules - [slack_bolt.adapter.pyramid.handler](/tools/bolt-python/reference/adapter/pyramid/handler) - -## SlackRequestHandler Objects - -```python -class SlackRequestHandler() -``` - -#### \_\_init\_\_ - -```python -def __init__(app: App) -``` - -#### handle - -```python -def handle(request: Request) -> Response -``` diff --git a/docs/english/reference/adapter/sanic/async_handler.md b/docs/english/reference/adapter/sanic/async_handler.md index f24dd05ee..d6494555c 100644 --- a/docs/english/reference/adapter/sanic/async_handler.md +++ b/docs/english/reference/adapter/sanic/async_handler.md @@ -3,36 +3,4 @@ sidebar_label: async_handler title: slack_bolt.adapter.sanic.async_handler --- -#### to\_async\_bolt\_request -```python -def to_async_bolt_request( - req: Request, - addition_context_properties: Optional[Dict[str, Any]] = None) -> AsyncBoltRequest -``` - -#### to\_sanic\_response - -```python -def to_sanic_response(bolt_resp: BoltResponse) -> HTTPResponse -``` - -## AsyncSlackRequestHandler Objects - -```python -class AsyncSlackRequestHandler() -``` - -#### \_\_init\_\_ - -```python -def __init__(app: AsyncApp) -``` - -#### handle - -```python -async def handle( - req: Request, - addition_context_properties: Optional[Dict[str, Any]] = None) -> HTTPResponse -``` diff --git a/docs/english/reference/adapter/sanic/index.md b/docs/english/reference/adapter/sanic/index.md index fccec02f8..d8a7a47a4 100644 --- a/docs/english/reference/adapter/sanic/index.md +++ b/docs/english/reference/adapter/sanic/index.md @@ -6,23 +6,3 @@ title: slack_bolt.adapter.sanic ## Submodules - [slack_bolt.adapter.sanic.async_handler](/tools/bolt-python/reference/adapter/sanic/async_handler) - -## AsyncSlackRequestHandler Objects - -```python -class AsyncSlackRequestHandler() -``` - -#### \_\_init\_\_ - -```python -def __init__(app: AsyncApp) -``` - -#### handle - -```python -async def handle( - req: Request, - addition_context_properties: Optional[Dict[str, Any]] = None) -> HTTPResponse -``` diff --git a/docs/english/reference/adapter/socket_mode/aiohttp/index.md b/docs/english/reference/adapter/socket_mode/aiohttp/index.md index f83c116a5..976ed4c23 100644 --- a/docs/english/reference/adapter/socket_mode/aiohttp/index.md +++ b/docs/english/reference/adapter/socket_mode/aiohttp/index.md @@ -5,74 +5,55 @@ title: slack_bolt.adapter.socket_mode.aiohttp [`aiohttp`](https://pypi.org/project/aiohttp/) based implementation / asyncio compatible. -## SocketModeHandler Objects +## `SocketModeHandler` ```python -class SocketModeHandler(AsyncBaseSocketModeHandler) +SocketModeHandler(app, app_token=None, logger=None, web_client=None, proxy=None, ping_interval=10) ``` -#### app: `App` +Bases: AsyncBaseSocketModeHandler -#### app\_token: `str` +Socket Mode adapter for Bolt apps. + +**Parameters:** -#### client: `SocketModeClient` +- **app** (App) – The Bolt app +- **app_token** (Optional[str]) – App-level token starting with `xapp-` +- **logger** (Optional[Logger]) – Custom logger +- **web_client** (Optional[AsyncWebClient]) – custom `slack_sdk.web.WebClient` instance +- **proxy** (Optional[str]) – HTTP proxy URL +- **ping_interval** (float) – The ping-pong internal (seconds) -#### \_\_init\_\_ +### `close_async` ```python -def __init__( - app: App, - app_token: Optional[str] = None, - logger: Optional[Logger] = None, - web_client: Optional[AsyncWebClient] = None, - proxy: Optional[str] = None, - ping_interval: float = 10) +close_async() ``` -Socket Mode adapter for Bolt apps. - -**Arguments**: - -- `app` _App_ - The Bolt app -- `app_token` _Optional[str]_ - App-level token starting with `xapp-` -- `logger` _Optional[Logger]_ - Custom logger -- `web_client` _Optional[AsyncWebClient]_ - custom `slack_sdk.web.WebClient` instance -- `proxy` _Optional[str]_ - HTTP proxy URL -- `ping_interval` _float_ - The ping-pong internal (seconds) +Disconnects from the Socket Mode server and cleans the resources this instance holds up. -#### handle +### `connect_async` ```python -async def handle(client: SocketModeClient, req: SocketModeRequest) -> None +connect_async() ``` -## AsyncSocketModeHandler Objects +Establishes a new connection with the Socket Mode server. + +### `disconnect_async` ```python -class AsyncSocketModeHandler(AsyncBaseSocketModeHandler) +disconnect_async() ``` -#### app: `AsyncApp` - -#### app\_token: `str` - -#### client: `SocketModeClient` +Disconnects the current WebSocket connection with the Socket Mode server. -#### \_\_init\_\_ +### `start_async` ```python -def __init__( - app: AsyncApp, - app_token: Optional[str] = None, - logger: Optional[Logger] = None, - web_client: Optional[AsyncWebClient] = None, - proxy: Optional[str] = None, - ping_interval: float = 10, - loop: Optional[AbstractEventLoop] = None) +start_async() ``` -#### handle +Establishes a new connection and then starts infinite sleep to prevent the termination of this process. -```python -async def handle(client: SocketModeClient, req: SocketModeRequest) -> None -``` +If you don't want to have the sleep, use `#connect()` method instead. diff --git a/docs/english/reference/adapter/socket_mode/async_base_handler.md b/docs/english/reference/adapter/socket_mode/async_base_handler.md index 9161b832d..8e0f030cd 100644 --- a/docs/english/reference/adapter/socket_mode/async_base_handler.md +++ b/docs/english/reference/adapter/socket_mode/async_base_handler.md @@ -5,57 +5,49 @@ title: slack_bolt.adapter.socket_mode.async_base_handler The base class of asyncio-based Socket Mode client implementation. -## AsyncBaseSocketModeHandler Objects +## `AsyncBaseSocketModeHandler` -```python -class AsyncBaseSocketModeHandler() -``` - -#### app: `Union[App, AsyncApp]` - -#### client: `AsyncBaseSocketModeClient` - -#### handle +### `close_async` ```python -async def handle(client: AsyncBaseSocketModeClient, req: SocketModeRequest) -> None +close_async() ``` -Handles Socket Mode envelope requests through a WebSocket connection. - -**Arguments**: - -- `client` _AsyncBaseSocketModeClient_ - this Socket Mode client instance -- `req` _SocketModeRequest_ - the request data +Disconnects from the Socket Mode server and cleans the resources this instance holds up. -#### connect\_async +### `connect_async` ```python -async def connect_async() +connect_async() ``` Establishes a new connection with the Socket Mode server. -#### disconnect\_async +### `disconnect_async` ```python -async def disconnect_async() +disconnect_async() ``` Disconnects the current WebSocket connection with the Socket Mode server. -#### close\_async +### `handle` ```python -async def close_async() +handle(client, req) ``` -Disconnects from the Socket Mode server and cleans the resources this instance holds up. +Handles Socket Mode envelope requests through a WebSocket connection. + +**Parameters:** + +- **client** (AsyncBaseSocketModeClient) – this Socket Mode client instance +- **req** (SocketModeRequest) – the request data -#### start\_async +### `start_async` ```python -async def start_async() +start_async() ``` Establishes a new connection and then starts infinite sleep to prevent the termination of this process. diff --git a/docs/english/reference/adapter/socket_mode/async_handler.md b/docs/english/reference/adapter/socket_mode/async_handler.md index 6f4503a26..57e0bc5bc 100644 --- a/docs/english/reference/adapter/socket_mode/async_handler.md +++ b/docs/english/reference/adapter/socket_mode/async_handler.md @@ -4,34 +4,3 @@ title: slack_bolt.adapter.socket_mode.async_handler --- Default implementation is the aiohttp-based one. - -## AsyncSocketModeHandler Objects - -```python -class AsyncSocketModeHandler(AsyncBaseSocketModeHandler) -``` - -#### app: `AsyncApp` - -#### app\_token: `str` - -#### client: `SocketModeClient` - -#### \_\_init\_\_ - -```python -def __init__( - app: AsyncApp, - app_token: Optional[str] = None, - logger: Optional[Logger] = None, - web_client: Optional[AsyncWebClient] = None, - proxy: Optional[str] = None, - ping_interval: float = 10, - loop: Optional[AbstractEventLoop] = None) -``` - -#### handle - -```python -async def handle(client: SocketModeClient, req: SocketModeRequest) -> None -``` diff --git a/docs/english/reference/adapter/socket_mode/async_internals.md b/docs/english/reference/adapter/socket_mode/async_internals.md index 532c00289..6f3a12ce8 100644 --- a/docs/english/reference/adapter/socket_mode/async_internals.md +++ b/docs/english/reference/adapter/socket_mode/async_internals.md @@ -4,19 +4,3 @@ title: slack_bolt.adapter.socket_mode.async_internals --- Internal functions. - -#### run\_async\_bolt\_app - -```python -async def run_async_bolt_app(app: AsyncApp, req: SocketModeRequest) -``` - -#### send\_async\_response - -```python -async def send_async_response( - client: AsyncBaseSocketModeClient, - req: SocketModeRequest, - bolt_resp: BoltResponse, - start_time: float) -``` diff --git a/docs/english/reference/adapter/socket_mode/base_handler.md b/docs/english/reference/adapter/socket_mode/base_handler.md index f2f6455ec..feff09550 100644 --- a/docs/english/reference/adapter/socket_mode/base_handler.md +++ b/docs/english/reference/adapter/socket_mode/base_handler.md @@ -7,57 +7,49 @@ The base class of Socket Mode client implementation. If you want to build asyncio-based ones, use `AsyncBaseSocketModeHandler` instead. -## BaseSocketModeHandler Objects +## `BaseSocketModeHandler` -```python -class BaseSocketModeHandler() -``` - -#### app: `App` - -#### client: `BaseSocketModeClient` - -#### handle +### `close` ```python -def handle(client: BaseSocketModeClient, req: SocketModeRequest) -> None +close() ``` -Handles Socket Mode envelope requests through a WebSocket connection. - -**Arguments**: - -- `client` _BaseSocketModeClient_ - this Socket Mode client instance -- `req` _SocketModeRequest_ - the request data +Disconnects from the Socket Mode server and cleans the resources this instance holds up. -#### connect +### `connect` ```python -def connect() +connect() ``` Establishes a new connection with the Socket Mode server. -#### disconnect +### `disconnect` ```python -def disconnect() +disconnect() ``` Disconnects the current WebSocket connection with the Socket Mode server. -#### close +### `handle` ```python -def close() +handle(client, req) ``` -Disconnects from the Socket Mode server and cleans the resources this instance holds up. +Handles Socket Mode envelope requests through a WebSocket connection. + +**Parameters:** + +- **client** (BaseSocketModeClient) – this Socket Mode client instance +- **req** (SocketModeRequest) – the request data -#### start +### `start` ```python -def start() +start() ``` Establishes a new connection and then blocks the current thread to prevent the termination of this process. diff --git a/docs/english/reference/adapter/socket_mode/builtin/index.md b/docs/english/reference/adapter/socket_mode/builtin/index.md index 7583f5591..c7eca72f4 100644 --- a/docs/english/reference/adapter/socket_mode/builtin/index.md +++ b/docs/english/reference/adapter/socket_mode/builtin/index.md @@ -5,57 +5,62 @@ title: slack_bolt.adapter.socket_mode.builtin The built-in implementation, which does not have any external dependencies. -## SocketModeHandler Objects +## `SocketModeHandler` ```python -class SocketModeHandler(BaseSocketModeHandler) +SocketModeHandler(app, app_token=None, logger=None, web_client=None, proxy=None, proxy_headers=None, auto_reconnect_enabled=True, trace_enabled=False, all_message_trace_enabled=False, ping_pong_trace_enabled=False, ping_interval=10, receive_buffer_size=1024, concurrency=10) ``` -#### app: `App` +Bases: BaseSocketModeHandler -#### app\_token: `str` +Socket Mode adapter for Bolt apps. + +**Parameters:** -#### client: `SocketModeClient` +- **app** (App) – The Bolt app +- **app_token** (Optional[str]) – App-level token starting with `xapp-` +- **logger** (Optional[Logger]) – Custom logger +- **web_client** (Optional[WebClient]) – custom `slack_sdk.web.WebClient` instance +- **proxy** (Optional[str]) – HTTP proxy URL +- **proxy_headers** (Optional[Dict[str, str]]) – Additional request header for proxy connections +- **auto_reconnect_enabled** (bool) – True if the auto-reconnect logic works +- **trace_enabled** (bool) – True if trace-level logging is enabled +- **all_message_trace_enabled** (bool) – True if trace-logging for all received WebSocket messages is enabled +- **ping_pong_trace_enabled** (bool) – True if trace-logging for all ping-pong communications +- **ping_interval** (float) – The ping-pong internal (seconds) +- **receive_buffer_size** (int) – The data length for a single socket recv operation +- **concurrency** (int) – The size of the underlying thread pool -#### \_\_init\_\_ +### `close` ```python -def __init__( - app: App, - app_token: Optional[str] = None, - logger: Optional[Logger] = None, - web_client: Optional[WebClient] = None, - proxy: Optional[str] = None, - proxy_headers: Optional[Dict[str, str]] = None, - auto_reconnect_enabled: bool = True, - trace_enabled: bool = False, - all_message_trace_enabled: bool = False, - ping_pong_trace_enabled: bool = False, - ping_interval: float = 10, - receive_buffer_size: int = 1024, - concurrency: int = 10) +close() ``` -Socket Mode adapter for Bolt apps. +Disconnects from the Socket Mode server and cleans the resources this instance holds up. -**Arguments**: +### `connect` -- `app` _App_ - The Bolt app -- `app_token` _Optional[str]_ - App-level token starting with `xapp-` -- `logger` _Optional[Logger]_ - Custom logger -- `web_client` _Optional[WebClient]_ - custom `slack_sdk.web.WebClient` instance -- `proxy` _Optional[str]_ - HTTP proxy URL -- `proxy_headers` _Optional[Dict[str, str]]_ - Additional request header for proxy connections -- `auto_reconnect_enabled` _bool_ - True if the auto-reconnect logic works -- `trace_enabled` _bool_ - True if trace-level logging is enabled -- `all_message_trace_enabled` _bool_ - True if trace-logging for all received WebSocket messages is enabled -- `ping_pong_trace_enabled` _bool_ - True if trace-logging for all ping-pong communications -- `ping_interval` _float_ - The ping-pong internal (seconds) -- `receive_buffer_size` _int_ - The data length for a single socket recv operation -- `concurrency` _int_ - The size of the underlying thread pool +```python +connect() +``` + +Establishes a new connection with the Socket Mode server. -#### handle +### `disconnect` ```python -def handle(client: SocketModeClient, req: SocketModeRequest) -> None +disconnect() ``` + +Disconnects the current WebSocket connection with the Socket Mode server. + +### `start` + +```python +start() +``` + +Establishes a new connection and then blocks the current thread to prevent the termination of this process. + +If you don't want to block the current thread, use `#connect()` method instead. diff --git a/docs/english/reference/adapter/socket_mode/index.md b/docs/english/reference/adapter/socket_mode/index.md index 34d36381f..af475ec10 100644 --- a/docs/english/reference/adapter/socket_mode/index.md +++ b/docs/english/reference/adapter/socket_mode/index.md @@ -10,69 +10,74 @@ Socket Mode adapter package provides the following implementations. If you don't * `slack_bolt.adapter.socket_mode.aiohttp` * `slack_bolt.adapter.socket_mode.websockets` -## Submodules - -- [slack_bolt.adapter.socket_mode.aiohttp](/tools/bolt-python/reference/adapter/socket_mode/aiohttp) -- [slack_bolt.adapter.socket_mode.async_base_handler](/tools/bolt-python/reference/adapter/socket_mode/async_base_handler) -- [slack_bolt.adapter.socket_mode.async_handler](/tools/bolt-python/reference/adapter/socket_mode/async_handler) -- [slack_bolt.adapter.socket_mode.async_internals](/tools/bolt-python/reference/adapter/socket_mode/async_internals) -- [slack_bolt.adapter.socket_mode.base_handler](/tools/bolt-python/reference/adapter/socket_mode/base_handler) -- [slack_bolt.adapter.socket_mode.builtin](/tools/bolt-python/reference/adapter/socket_mode/builtin) -- [slack_bolt.adapter.socket_mode.internals](/tools/bolt-python/reference/adapter/socket_mode/internals) -- [slack_bolt.adapter.socket_mode.websocket_client](/tools/bolt-python/reference/adapter/socket_mode/websocket_client) -- [slack_bolt.adapter.socket_mode.websockets](/tools/bolt-python/reference/adapter/socket_mode/websockets) - -## SocketModeHandler Objects +## `SocketModeHandler` ```python -class SocketModeHandler(BaseSocketModeHandler) +SocketModeHandler(app, app_token=None, logger=None, web_client=None, proxy=None, proxy_headers=None, auto_reconnect_enabled=True, trace_enabled=False, all_message_trace_enabled=False, ping_pong_trace_enabled=False, ping_interval=10, receive_buffer_size=1024, concurrency=10) ``` -#### app: `App` +Bases: BaseSocketModeHandler -#### app\_token: `str` +Socket Mode adapter for Bolt apps. -#### client: `SocketModeClient` +**Parameters:** -#### \_\_init\_\_ +- **app** (App) – The Bolt app +- **app_token** (Optional[str]) – App-level token starting with `xapp-` +- **logger** (Optional[Logger]) – Custom logger +- **web_client** (Optional[WebClient]) – custom `slack_sdk.web.WebClient` instance +- **proxy** (Optional[str]) – HTTP proxy URL +- **proxy_headers** (Optional[Dict[str, str]]) – Additional request header for proxy connections +- **auto_reconnect_enabled** (bool) – True if the auto-reconnect logic works +- **trace_enabled** (bool) – True if trace-level logging is enabled +- **all_message_trace_enabled** (bool) – True if trace-logging for all received WebSocket messages is enabled +- **ping_pong_trace_enabled** (bool) – True if trace-logging for all ping-pong communications +- **ping_interval** (float) – The ping-pong internal (seconds) +- **receive_buffer_size** (int) – The data length for a single socket recv operation +- **concurrency** (int) – The size of the underlying thread pool + +### `close` ```python -def __init__( - app: App, - app_token: Optional[str] = None, - logger: Optional[Logger] = None, - web_client: Optional[WebClient] = None, - proxy: Optional[str] = None, - proxy_headers: Optional[Dict[str, str]] = None, - auto_reconnect_enabled: bool = True, - trace_enabled: bool = False, - all_message_trace_enabled: bool = False, - ping_pong_trace_enabled: bool = False, - ping_interval: float = 10, - receive_buffer_size: int = 1024, - concurrency: int = 10) +close() ``` -Socket Mode adapter for Bolt apps. +Disconnects from the Socket Mode server and cleans the resources this instance holds up. -**Arguments**: +### `connect` -- `app` _App_ - The Bolt app -- `app_token` _Optional[str]_ - App-level token starting with `xapp-` -- `logger` _Optional[Logger]_ - Custom logger -- `web_client` _Optional[WebClient]_ - custom `slack_sdk.web.WebClient` instance -- `proxy` _Optional[str]_ - HTTP proxy URL -- `proxy_headers` _Optional[Dict[str, str]]_ - Additional request header for proxy connections -- `auto_reconnect_enabled` _bool_ - True if the auto-reconnect logic works -- `trace_enabled` _bool_ - True if trace-level logging is enabled -- `all_message_trace_enabled` _bool_ - True if trace-logging for all received WebSocket messages is enabled -- `ping_pong_trace_enabled` _bool_ - True if trace-logging for all ping-pong communications -- `ping_interval` _float_ - The ping-pong internal (seconds) -- `receive_buffer_size` _int_ - The data length for a single socket recv operation -- `concurrency` _int_ - The size of the underlying thread pool +```python +connect() +``` -#### handle +Establishes a new connection with the Socket Mode server. + +### `disconnect` ```python -def handle(client: SocketModeClient, req: SocketModeRequest) -> None +disconnect() ``` + +Disconnects the current WebSocket connection with the Socket Mode server. + +### `start` + +```python +start() +``` + +Establishes a new connection and then blocks the current thread to prevent the termination of this process. + +If you don't want to block the current thread, use `#connect()` method instead. + +## Submodules + +- [slack_bolt.adapter.socket_mode.aiohttp](/tools/bolt-python/reference/adapter/socket_mode/aiohttp) +- [slack_bolt.adapter.socket_mode.async_base_handler](/tools/bolt-python/reference/adapter/socket_mode/async_base_handler) +- [slack_bolt.adapter.socket_mode.async_handler](/tools/bolt-python/reference/adapter/socket_mode/async_handler) +- [slack_bolt.adapter.socket_mode.async_internals](/tools/bolt-python/reference/adapter/socket_mode/async_internals) +- [slack_bolt.adapter.socket_mode.base_handler](/tools/bolt-python/reference/adapter/socket_mode/base_handler) +- [slack_bolt.adapter.socket_mode.builtin](/tools/bolt-python/reference/adapter/socket_mode/builtin) +- [slack_bolt.adapter.socket_mode.internals](/tools/bolt-python/reference/adapter/socket_mode/internals) +- [slack_bolt.adapter.socket_mode.websocket_client](/tools/bolt-python/reference/adapter/socket_mode/websocket_client) +- [slack_bolt.adapter.socket_mode.websockets](/tools/bolt-python/reference/adapter/socket_mode/websockets) diff --git a/docs/english/reference/adapter/socket_mode/internals.md b/docs/english/reference/adapter/socket_mode/internals.md index 13811922c..063c7ddd9 100644 --- a/docs/english/reference/adapter/socket_mode/internals.md +++ b/docs/english/reference/adapter/socket_mode/internals.md @@ -4,26 +4,3 @@ title: slack_bolt.adapter.socket_mode.internals --- Internal functions. - -#### build\_headers - -```python -def build_headers( - req: SocketModeRequest) -> Optional[Dict[str, Union[str, Sequence[str]]]] -``` - -#### run\_bolt\_app - -```python -def run_bolt_app(app: App, req: SocketModeRequest) -``` - -#### send\_response - -```python -def send_response( - client: BaseSocketModeClient, - req: SocketModeRequest, - bolt_resp: BoltResponse, - start_time: float) -``` diff --git a/docs/english/reference/adapter/socket_mode/websocket_client/index.md b/docs/english/reference/adapter/socket_mode/websocket_client/index.md index f56183beb..bb0de3f32 100644 --- a/docs/english/reference/adapter/socket_mode/websocket_client/index.md +++ b/docs/english/reference/adapter/socket_mode/websocket_client/index.md @@ -5,53 +5,60 @@ title: slack_bolt.adapter.socket_mode.websocket_client [`websocket-client`](https://pypi.org/project/websocket-client/) based implementation. -## SocketModeHandler Objects +## `SocketModeHandler` ```python -class SocketModeHandler(BaseSocketModeHandler) +SocketModeHandler(app, app_token=None, logger=None, web_client=None, ping_interval=10, concurrency=10, http_proxy_host=None, http_proxy_port=None, http_proxy_auth=None, proxy_type=None, trace_enabled=False) ``` -#### app: `App` +Bases: BaseSocketModeHandler -#### app\_token: `str` +Socket Mode adapter for Bolt apps. + +**Parameters:** -#### client: `SocketModeClient` +- **app** (App) – The Bolt app +- **app_token** (Optional[str]) – App-level token starting with `xapp-` +- **logger** (Optional[Logger]) – Custom logger +- **web_client** (Optional[WebClient]) – custom `slack_sdk.web.WebClient` instance +- **ping_interval** (float) – The ping-pong internal (seconds) +- **concurrency** (int) – The size of the underlying thread pool +- **http_proxy_host** (Optional[str]) – HTTP proxy host +- **http_proxy_port** (Optional[int]) – HTTP proxy port +- **http_proxy_auth** (Optional[Tuple[str, str]]) – HTTP proxy authentication (username, password) +- **proxy_type** (Optional[str]) – Proxy type +- **trace_enabled** (bool) – True if trace-level logging is enabled -#### \_\_init\_\_ +### `close` ```python -def __init__( - app: App, - app_token: Optional[str] = None, - logger: Optional[Logger] = None, - web_client: Optional[WebClient] = None, - ping_interval: float = 10, - concurrency: int = 10, - http_proxy_host: Optional[str] = None, - http_proxy_port: Optional[int] = None, - http_proxy_auth: Optional[Tuple[str, str]] = None, - proxy_type: Optional[str] = None, - trace_enabled: bool = False) +close() ``` -Socket Mode adapter for Bolt apps. +Disconnects from the Socket Mode server and cleans the resources this instance holds up. -**Arguments**: +### `connect` -- `app` _App_ - The Bolt app -- `app_token` _Optional[str]_ - App-level token starting with `xapp-` -- `logger` _Optional[Logger]_ - Custom logger -- `web_client` _Optional[WebClient]_ - custom `slack_sdk.web.WebClient` instance -- `ping_interval` _float_ - The ping-pong internal (seconds) -- `concurrency` _int_ - The size of the underlying thread pool -- `http_proxy_host` _Optional[str]_ - HTTP proxy host -- `http_proxy_port` _Optional[int]_ - HTTP proxy port -- `http_proxy_auth` _Optional[Tuple[str, str]]_ - HTTP proxy authentication (username, password) -- `proxy_type` _Optional[str]_ - Proxy type -- `trace_enabled` _bool_ - True if trace-level logging is enabled +```python +connect() +``` + +Establishes a new connection with the Socket Mode server. -#### handle +### `disconnect` ```python -def handle(client: SocketModeClient, req: SocketModeRequest) -> None +disconnect() ``` + +Disconnects the current WebSocket connection with the Socket Mode server. + +### `start` + +```python +start() +``` + +Establishes a new connection and then blocks the current thread to prevent the termination of this process. + +If you don't want to block the current thread, use `#connect()` method instead. diff --git a/docs/english/reference/adapter/socket_mode/websockets/index.md b/docs/english/reference/adapter/socket_mode/websockets/index.md index aed36c234..2ba520fd9 100644 --- a/docs/english/reference/adapter/socket_mode/websockets/index.md +++ b/docs/english/reference/adapter/socket_mode/websockets/index.md @@ -5,28 +5,13 @@ title: slack_bolt.adapter.socket_mode.websockets [`websockets`](https://pypi.org/project/websockets/) based implementation / asyncio compatible. -## SocketModeHandler Objects +## `SocketModeHandler` ```python -class SocketModeHandler(AsyncBaseSocketModeHandler) +SocketModeHandler(app, app_token=None, logger=None, web_client=None, ping_interval=10) ``` -#### app: `App` - -#### app\_token: `str` - -#### client: `SocketModeClient` - -#### \_\_init\_\_ - -```python -def __init__( - app: App, - app_token: Optional[str] = None, - logger: Optional[Logger] = None, - web_client: Optional[AsyncWebClient] = None, - ping_interval: float = 10) -``` +Bases: AsyncBaseSocketModeHandler Socket Mode adapter for Bolt apps. @@ -34,45 +19,44 @@ Please note that this adapter does not support proxy configuration as the underlying websockets module does not support proxy-wired connections. If you use proxy, consider using one of the other Socket Mode adapters. -**Arguments**: +**Parameters:** -- `app` _App_ - The Bolt app -- `app_token` _Optional[str]_ - App-level token starting with `xapp-` -- `logger` _Optional[Logger]_ - Custom logger -- `web_client` _Optional[AsyncWebClient]_ - custom `slack_sdk.web.WebClient` instance -- `ping_interval` _float_ - The ping-pong internal (seconds) +- **app** (App) – The Bolt app +- **app_token** (Optional[str]) – App-level token starting with `xapp-` +- **logger** (Optional[Logger]) – Custom logger +- **web_client** (Optional[AsyncWebClient]) – custom `slack_sdk.web.WebClient` instance +- **ping_interval** (float) – The ping-pong internal (seconds) -#### handle +### `close_async` ```python -async def handle(client: SocketModeClient, req: SocketModeRequest) -> None +close_async() ``` -## AsyncSocketModeHandler Objects +Disconnects from the Socket Mode server and cleans the resources this instance holds up. + +### `connect_async` ```python -class AsyncSocketModeHandler(AsyncBaseSocketModeHandler) +connect_async() ``` -#### app: `AsyncApp` - -#### app\_token: `str` - -#### client: `SocketModeClient` +Establishes a new connection with the Socket Mode server. -#### \_\_init\_\_ +### `disconnect_async` ```python -def __init__( - app: AsyncApp, - app_token: Optional[str] = None, - logger: Optional[Logger] = None, - web_client: Optional[AsyncWebClient] = None, - ping_interval: float = 10) +disconnect_async() ``` -#### handle +Disconnects the current WebSocket connection with the Socket Mode server. + +### `start_async` ```python -async def handle(client: SocketModeClient, req: SocketModeRequest) -> None +start_async() ``` + +Establishes a new connection and then starts infinite sleep to prevent the termination of this process. + +If you don't want to have the sleep, use `#connect()` method instead. diff --git a/docs/english/reference/adapter/starlette/async_handler.md b/docs/english/reference/adapter/starlette/async_handler.md index 2ac2f00b3..0e5040183 100644 --- a/docs/english/reference/adapter/starlette/async_handler.md +++ b/docs/english/reference/adapter/starlette/async_handler.md @@ -3,37 +3,4 @@ sidebar_label: async_handler title: slack_bolt.adapter.starlette.async_handler --- -#### to\_async\_bolt\_request -```python -def to_async_bolt_request( - req: Request, - body: bytes, - addition_context_properties: Optional[Dict[str, Any]] = None) -> AsyncBoltRequest -``` - -#### to\_starlette\_response - -```python -def to_starlette_response(bolt_resp: BoltResponse) -> Response -``` - -## AsyncSlackRequestHandler Objects - -```python -class AsyncSlackRequestHandler() -``` - -#### \_\_init\_\_ - -```python -def __init__(app: AsyncApp) -``` - -#### handle - -```python -async def handle( - req: Request, - addition_context_properties: Optional[Dict[str, Any]] = None) -> Response -``` diff --git a/docs/english/reference/adapter/starlette/handler.md b/docs/english/reference/adapter/starlette/handler.md index 206ccad91..8a824ba07 100644 --- a/docs/english/reference/adapter/starlette/handler.md +++ b/docs/english/reference/adapter/starlette/handler.md @@ -3,37 +3,4 @@ sidebar_label: handler title: slack_bolt.adapter.starlette.handler --- -#### to\_bolt\_request -```python -def to_bolt_request( - req: Request, - body: bytes, - addition_context_properties: Optional[Dict[str, Any]] = None) -> BoltRequest -``` - -#### to\_starlette\_response - -```python -def to_starlette_response(bolt_resp: BoltResponse) -> Response -``` - -## SlackRequestHandler Objects - -```python -class SlackRequestHandler() -``` - -#### \_\_init\_\_ - -```python -def __init__(app: App) -``` - -#### handle - -```python -async def handle( - req: Request, - addition_context_properties: Optional[Dict[str, Any]] = None) -> Response -``` diff --git a/docs/english/reference/adapter/starlette/index.md b/docs/english/reference/adapter/starlette/index.md index fd29b9306..ebb125da9 100644 --- a/docs/english/reference/adapter/starlette/index.md +++ b/docs/english/reference/adapter/starlette/index.md @@ -7,23 +7,3 @@ title: slack_bolt.adapter.starlette - [slack_bolt.adapter.starlette.async_handler](/tools/bolt-python/reference/adapter/starlette/async_handler) - [slack_bolt.adapter.starlette.handler](/tools/bolt-python/reference/adapter/starlette/handler) - -## SlackRequestHandler Objects - -```python -class SlackRequestHandler() -``` - -#### \_\_init\_\_ - -```python -def __init__(app: App) -``` - -#### handle - -```python -async def handle( - req: Request, - addition_context_properties: Optional[Dict[str, Any]] = None) -> Response -``` diff --git a/docs/english/reference/adapter/tornado/async_handler.md b/docs/english/reference/adapter/tornado/async_handler.md index cc9f21ff8..d3bd39ec3 100644 --- a/docs/english/reference/adapter/tornado/async_handler.md +++ b/docs/english/reference/adapter/tornado/async_handler.md @@ -3,44 +3,4 @@ sidebar_label: async_handler title: slack_bolt.adapter.tornado.async_handler --- -## AsyncSlackEventsHandler Objects -```python -class AsyncSlackEventsHandler(RequestHandler) -``` - -#### initialize - -```python -def initialize(app: AsyncApp) -``` - -#### post - -```python -async def post() -``` - -## AsyncSlackOAuthHandler Objects - -```python -class AsyncSlackOAuthHandler(RequestHandler) -``` - -#### initialize - -```python -def initialize(app: AsyncApp) -``` - -#### get - -```python -async def get() -``` - -#### to\_async\_bolt\_request - -```python -def to_async_bolt_request(req: HTTPServerRequest) -> AsyncBoltRequest -``` diff --git a/docs/english/reference/adapter/tornado/handler.md b/docs/english/reference/adapter/tornado/handler.md index a549c990c..66a9e25b5 100644 --- a/docs/english/reference/adapter/tornado/handler.md +++ b/docs/english/reference/adapter/tornado/handler.md @@ -3,50 +3,4 @@ sidebar_label: handler title: slack_bolt.adapter.tornado.handler --- -## SlackEventsHandler Objects -```python -class SlackEventsHandler(RequestHandler) -``` - -#### initialize - -```python -def initialize(app: App) -``` - -#### post - -```python -def post() -``` - -## SlackOAuthHandler Objects - -```python -class SlackOAuthHandler(RequestHandler) -``` - -#### initialize - -```python -def initialize(app: App) -``` - -#### get - -```python -def get() -``` - -#### to\_bolt\_request - -```python -def to_bolt_request(req: HTTPServerRequest) -> BoltRequest -``` - -#### set\_response - -```python -def set_response(self, bolt_resp) -> None -``` diff --git a/docs/english/reference/adapter/tornado/index.md b/docs/english/reference/adapter/tornado/index.md index 2877d5848..1789c6e4e 100644 --- a/docs/english/reference/adapter/tornado/index.md +++ b/docs/english/reference/adapter/tornado/index.md @@ -7,39 +7,3 @@ title: slack_bolt.adapter.tornado - [slack_bolt.adapter.tornado.async_handler](/tools/bolt-python/reference/adapter/tornado/async_handler) - [slack_bolt.adapter.tornado.handler](/tools/bolt-python/reference/adapter/tornado/handler) - -## SlackEventsHandler Objects - -```python -class SlackEventsHandler(RequestHandler) -``` - -#### initialize - -```python -def initialize(app: App) -``` - -#### post - -```python -def post() -``` - -## SlackOAuthHandler Objects - -```python -class SlackOAuthHandler(RequestHandler) -``` - -#### initialize - -```python -def initialize(app: App) -``` - -#### get - -```python -def get() -``` diff --git a/docs/english/reference/adapter/wsgi/handler.md b/docs/english/reference/adapter/wsgi/handler.md index 2da1ed217..98e07ce65 100644 --- a/docs/english/reference/adapter/wsgi/handler.md +++ b/docs/english/reference/adapter/wsgi/handler.md @@ -3,16 +3,10 @@ sidebar_label: handler title: slack_bolt.adapter.wsgi.handler --- -## SlackRequestHandler Objects +## `SlackRequestHandler` ```python -class SlackRequestHandler() -``` - -#### \_\_init\_\_ - -```python -def __init__(app: App, path: str = '/slack/events') +SlackRequestHandler(app, path='/slack/events') ``` Setup Bolt as a WSGI web framework, this will make your application compatible with WSGI web servers. @@ -22,42 +16,21 @@ This can be used for production deployments. With the default settings, `http://localhost:3000/slack/events` Run Bolt with [gunicorn](https://gunicorn.org/) -# Python - app = App() - ```python +app = App() + api = SlackRequestHandler(app) ``` -# bash - export SLACK_SIGNING_SECRET=*** +```bash +export SLACK_SIGNING_SECRET=*** -```python export SLACK_BOT_TOKEN=xoxb-*** gunicorn app:api -b 0.0.0.0:3000 --log-level debug ``` +**Parameters:** -**Arguments**: - -- `app` _App_ - Your bolt application -- `path` _str_ - The path to handle request from Slack (Default: `/slack/events`) - -#### dispatch - -```python -def dispatch(request: WsgiHttpRequest) -> BoltResponse -``` - -#### handle\_installation - -```python -def handle_installation(request: WsgiHttpRequest) -> BoltResponse -``` - -#### handle\_callback - -```python -def handle_callback(request: WsgiHttpRequest) -> BoltResponse -``` +- **app** (App) – Your bolt application +- **path** (str) – The path to handle request from Slack (Default: `/slack/events`) diff --git a/docs/english/reference/adapter/wsgi/http_request.md b/docs/english/reference/adapter/wsgi/http_request.md index 49bacefba..a9082c7e8 100644 --- a/docs/english/reference/adapter/wsgi/http_request.md +++ b/docs/english/reference/adapter/wsgi/http_request.md @@ -3,38 +3,12 @@ sidebar_label: http_request title: slack_bolt.adapter.wsgi.http_request --- -## WsgiHttpRequest Objects +## `WsgiHttpRequest` ```python -class WsgiHttpRequest() +WsgiHttpRequest(environ) ``` Extracts request information from the WSGI web server using the PEP 3333 standard. PEP 3333: https://peps.python.org/pep-3333/ - -#### \_\_init\_\_ - -```python -def __init__(environ: WSGIEnvironment) -``` - -#### method: `str` - -#### path: `str` - -#### query\_string: `str` - -#### protocol: `str` - -#### get\_headers - -```python -def get_headers() -> Dict[str, Union[str, Sequence[str]]] -``` - -#### get\_body - -```python -def get_body() -> str -``` diff --git a/docs/english/reference/adapter/wsgi/http_response.md b/docs/english/reference/adapter/wsgi/http_response.md index d6dee034c..146eaa39a 100644 --- a/docs/english/reference/adapter/wsgi/http_response.md +++ b/docs/english/reference/adapter/wsgi/http_response.md @@ -3,33 +3,12 @@ sidebar_label: http_response title: slack_bolt.adapter.wsgi.http_response --- -## WsgiHttpResponse Objects +## `WsgiHttpResponse` ```python -class WsgiHttpResponse() +WsgiHttpResponse(status, headers=None, body='') ``` Adapts bolt response information for the WSGI web server using the PEP 3333 standard. PEP 3333: https://peps.python.org/pep-3333/ - -#### \_\_init\_\_ - -```python -def __init__( - status: int, - headers: Optional[Dict[str, Sequence[str]]] = None, - body: str = '') -``` - -#### get\_headers - -```python -def get_headers() -> List[Tuple[str, str]] -``` - -#### get\_body - -```python -def get_body() -> Iterable[bytes] -``` diff --git a/docs/english/reference/adapter/wsgi/index.md b/docs/english/reference/adapter/wsgi/index.md index f88bb9ab3..b3c20d335 100644 --- a/docs/english/reference/adapter/wsgi/index.md +++ b/docs/english/reference/adapter/wsgi/index.md @@ -3,23 +3,10 @@ sidebar_label: wsgi title: slack_bolt.adapter.wsgi --- -## Submodules - -- [slack_bolt.adapter.wsgi.handler](/tools/bolt-python/reference/adapter/wsgi/handler) -- [slack_bolt.adapter.wsgi.http_request](/tools/bolt-python/reference/adapter/wsgi/http_request) -- [slack_bolt.adapter.wsgi.http_response](/tools/bolt-python/reference/adapter/wsgi/http_response) -- [slack_bolt.adapter.wsgi.internals](/tools/bolt-python/reference/adapter/wsgi/internals) - -## SlackRequestHandler Objects +## `SlackRequestHandler` ```python -class SlackRequestHandler() -``` - -#### \_\_init\_\_ - -```python -def __init__(app: App, path: str = '/slack/events') +SlackRequestHandler(app, path='/slack/events') ``` Setup Bolt as a WSGI web framework, this will make your application compatible with WSGI web servers. @@ -29,42 +16,28 @@ This can be used for production deployments. With the default settings, `http://localhost:3000/slack/events` Run Bolt with [gunicorn](https://gunicorn.org/) -# Python - app = App() - ```python +app = App() + api = SlackRequestHandler(app) ``` -# bash - export SLACK_SIGNING_SECRET=*** +```bash +export SLACK_SIGNING_SECRET=*** -```python export SLACK_BOT_TOKEN=xoxb-*** gunicorn app:api -b 0.0.0.0:3000 --log-level debug ``` +**Parameters:** -**Arguments**: - -- `app` _App_ - Your bolt application -- `path` _str_ - The path to handle request from Slack (Default: `/slack/events`) - -#### dispatch - -```python -def dispatch(request: WsgiHttpRequest) -> BoltResponse -``` - -#### handle\_installation - -```python -def handle_installation(request: WsgiHttpRequest) -> BoltResponse -``` +- **app** (App) – Your bolt application +- **path** (str) – The path to handle request from Slack (Default: `/slack/events`) -#### handle\_callback +## Submodules -```python -def handle_callback(request: WsgiHttpRequest) -> BoltResponse -``` +- [slack_bolt.adapter.wsgi.handler](/tools/bolt-python/reference/adapter/wsgi/handler) +- [slack_bolt.adapter.wsgi.http_request](/tools/bolt-python/reference/adapter/wsgi/http_request) +- [slack_bolt.adapter.wsgi.http_response](/tools/bolt-python/reference/adapter/wsgi/http_response) +- [slack_bolt.adapter.wsgi.internals](/tools/bolt-python/reference/adapter/wsgi/internals) diff --git a/docs/english/reference/adapter/wsgi/internals.md b/docs/english/reference/adapter/wsgi/internals.md index 19433fb00..f76bc61e7 100644 --- a/docs/english/reference/adapter/wsgi/internals.md +++ b/docs/english/reference/adapter/wsgi/internals.md @@ -3,4 +3,4 @@ sidebar_label: internals title: slack_bolt.adapter.wsgi.internals --- -#### ENCODING + diff --git a/docs/english/reference/app/app.md b/docs/english/reference/app/app.md index 397e0133b..36ec8aa0c 100644 --- a/docs/english/reference/app/app.md +++ b/docs/english/reference/app/app.md @@ -4,42 +4,10 @@ title: slack_bolt.app.app slug: app --- -## App Objects - -```python -class App() -``` - -#### \_\_init\_\_ - -```python -def __init__( - *, - logger: Optional[logging.Logger] = None, - name: Optional[str] = None, - process_before_response: bool = False, - raise_error_for_unhandled_request: bool = False, - signing_secret: Optional[str] = None, - token: Optional[str] = None, - token_verification_enabled: bool = True, - client: Optional[WebClient] = None, - before_authorize: Optional[Union[Middleware, Callable[..., Any]]] = None, - authorize: Optional[Callable[..., AuthorizeResult]] = None, - user_facing_authorize_error_message: Optional[str] = None, - installation_store: Optional[InstallationStore] = None, - installation_store_bot_only: Optional[bool] = None, - request_verification_enabled: bool = True, - ignoring_self_events_enabled: bool = True, - ignoring_self_assistant_message_events_enabled: bool = True, - ssl_check_enabled: bool = True, - url_verification_enabled: bool = True, - attaching_function_token_enabled: bool = True, - oauth_settings: Optional[OAuthSettings] = None, - oauth_flow: Optional[OAuthFlow] = None, - verification_token: Optional[str] = None, - listener_executor: Optional[Executor] = None, - assistant_thread_context_store: Optional[AssistantThreadContextStore] = None, - attaching_conversation_kwargs_enabled: bool = True) +## `App` + +```python +App(*, logger=None, name=None, process_before_response=False, raise_error_for_unhandled_request=False, signing_secret=None, token=None, token_verification_enabled=True, client=None, before_authorize=None, authorize=None, user_facing_authorize_error_message=None, installation_store=None, installation_store_bot_only=None, request_verification_enabled=True, ignoring_self_events_enabled=True, ignoring_self_assistant_message_events_enabled=True, ssl_check_enabled=True, url_verification_enabled=True, attaching_function_token_enabled=True, oauth_settings=None, oauth_flow=None, verification_token=None, listener_executor=None, assistant_thread_context_store=None, attaching_conversation_kwargs_enabled=True) ``` Bolt App that provides functionalities to register middleware/listeners. @@ -70,259 +38,210 @@ Refer to https://docs.slack.dev/tools/bolt-python/creating-an-app for details. If you would like to build an OAuth app for enabling the app to run with multiple workspaces, refer to https://docs.slack.dev/tools/bolt-python/concepts/authenticating-oauth to learn how to configure the app. -**Arguments**: - -- `logger` _Optional[logging.Logger]_ - The custom logger that can be used in this app. -- `name` _Optional[str]_ - The application name that will be used in logging. If absent, the source file name will be used. -- `process_before_response` _bool_ - True if this app runs on Function as a Service. (Default: False) -- `raise_error_for_unhandled_request` _bool_ - True if you want to raise exceptions for unhandled requests - and use @app.error listeners instead of - the built-in handler, which pints warning logs and returns 404 to Slack (Default: False) -- `signing_secret` _Optional[str]_ - The Signing Secret value used for verifying requests from Slack. -- `token` _Optional[str]_ - The bot/user access token required only for single-workspace app. -- `token_verification_enabled` _bool_ - Verifies the validity of the given token if True. -- `client` _Optional[WebClient]_ - The singleton `slack_sdk.WebClient` instance for this app. -- `before_authorize` _Optional[Union[Middleware, Callable[..., Any]]]_ - A global middleware that can be executed right before authorize function -- `authorize` _Optional[Callable[..., AuthorizeResult]]_ - The function to authorize an incoming request from Slack - by checking if there is a team/user in the installation data. -- `user_facing_authorize_error_message` _Optional[str]_ - The user-facing error message to display - when the app is installed but the installation is not managed by this app's installation store -- `installation_store` _Optional[InstallationStore]_ - The module offering save/find operations of installation data -- `installation_store_bot_only` _Optional[bool]_ - Use `InstallationStore#find_bot()` if True (Default: False) -- `request_verification_enabled` _bool_ - False if you would like to disable the built-in middleware (Default: True). - `RequestVerification` is a built-in middleware that verifies the signature in HTTP Mode requests. - Make sure if it's safe enough when you turn a built-in middleware off. - We strongly recommend using RequestVerification for better security. - If you have a proxy that verifies request signature in front of the Bolt app, - it's totally fine to disable RequestVerification to avoid duplication of work. - Don't turn it off just for easiness of development. -- `ignoring_self_events_enabled` _bool_ - False if you would like to disable the built-in middleware (Default: True). - `IgnoringSelfEvents` is a built-in middleware that enables Bolt apps to easily skip the events - generated by this app's bot user (this is useful for avoiding code error causing an infinite loop). -- `ignoring_self_assistant_message_events_enabled` _bool_ - False if you would like to disable the built-in middleware. - `IgnoringSelfEvents` for this app's bot user message events within an assistant thread - This is useful for avoiding code error causing an infinite loop; Default: True -- `url_verification_enabled` _bool_ - False if you would like to disable the built-in middleware (Default: True). - `UrlVerification` is a built-in middleware that handles url_verification requests - that verify the endpoint for Events API in HTTP Mode requests. -- `attaching_function_token_enabled` _bool_ - False if you would like to disable the built-in middleware (Default: True). - `AttachingFunctionToken` is a built-in middleware that injects the just-in-time workflow-execution tokens - when your app receives `function_executed` or interactivity events scoped to a custom step. -- `ssl_check_enabled` _bool_ - bool = False if you would like to disable the built-in middleware (Default: True). - `SslCheck` is a built-in middleware that handles ssl_check requests from Slack. -- `oauth_settings` _Optional[OAuthSettings]_ - The settings related to Slack app installation flow (OAuth flow) -- `oauth_flow` _Optional[OAuthFlow]_ - Instantiated `slack_bolt.oauth.OAuthFlow`. This is always prioritized over oauth_settings. -- `verification_token` _Optional[str]_ - Deprecated verification mechanism. This can be used only for ssl_check requests. -- `listener_executor` _Optional[Executor]_ - Custom executor to run background tasks. If absent, the default `ThreadPoolExecutor` will - be used. -- `assistant_thread_context_store` _Optional[AssistantThreadContextStore]_ - Custom AssistantThreadContext store (Default: the built-in implementation, - which uses a parent message's metadata to store the latest context) -- `attaching_conversation_kwargs_enabled` _bool_ - False if you would like to disable the built-in - middleware (Default: True). `AttachingConversationKwargs` is a built-in middleware that attaches - conversation-specific listener arguments (such as `say`, `set_status`, `say_stream`, and - `set_suggested_prompts`) for assistant thread and direct message events. - -#### name - -```python -@property -def name() -> str -``` - -The name of this app (default: the filename). - -#### oauth\_flow - -```python -@property -def oauth_flow() -> Optional[OAuthFlow] +**Parameters:** + +- **logger** (Optional[Logger]) – The custom logger that can be used in this app. +- **name** (Optional[str]) – The application name that will be used in logging. If absent, the source file name will be used. +- **process_before_response** (bool) – True if this app runs on Function as a Service. (Default: False) +- **raise_error_for_unhandled_request** (bool) – True if you want to raise exceptions for unhandled requests +and use @app.error listeners instead of +the built-in handler, which pints warning logs and returns 404 to Slack (Default: False) +- **signing_secret** (Optional[str]) – The Signing Secret value used for verifying requests from Slack. +- **token** (Optional[str]) – The bot/user access token required only for single-workspace app. +- **token_verification_enabled** (bool) – Verifies the validity of the given token if True. +- **client** (Optional[WebClient]) – The singleton `slack_sdk.WebClient` instance for this app. +- **before_authorize** (Optional[Union[Middleware, Callable..., [Any]]]) – A global middleware that can be executed right before authorize function +- **authorize** (Optional[Callable..., [AuthorizeResult]]) – The function to authorize an incoming request from Slack +by checking if there is a team/user in the installation data. +- **user_facing_authorize_error_message** (Optional[str]) – The user-facing error message to display +when the app is installed but the installation is not managed by this app's installation store +- **installation_store** (Optional[InstallationStore]) – The module offering save/find operations of installation data +- **installation_store_bot_only** (Optional[bool]) – Use `InstallationStore#find_bot()` if True (Default: False) +- **request_verification_enabled** (bool) – False if you would like to disable the built-in middleware (Default: True). +`RequestVerification` is a built-in middleware that verifies the signature in HTTP Mode requests. +Make sure if it's safe enough when you turn a built-in middleware off. +We strongly recommend using RequestVerification for better security. +If you have a proxy that verifies request signature in front of the Bolt app, +it's totally fine to disable RequestVerification to avoid duplication of work. +Don't turn it off just for easiness of development. +- **ignoring_self_events_enabled** (bool) – False if you would like to disable the built-in middleware (Default: True). +`IgnoringSelfEvents` is a built-in middleware that enables Bolt apps to easily skip the events +generated by this app's bot user (this is useful for avoiding code error causing an infinite loop). +- **ignoring_self_assistant_message_events_enabled** (bool) – False if you would like to disable the built-in middleware. +`IgnoringSelfEvents` for this app's bot user message events within an assistant thread +This is useful for avoiding code error causing an infinite loop; Default: True +- **url_verification_enabled** (bool) – False if you would like to disable the built-in middleware (Default: True). +`UrlVerification` is a built-in middleware that handles url_verification requests +that verify the endpoint for Events API in HTTP Mode requests. +- **attaching_function_token_enabled** (bool) – False if you would like to disable the built-in middleware (Default: True). +`AttachingFunctionToken` is a built-in middleware that injects the just-in-time workflow-execution tokens +when your app receives `function_executed` or interactivity events scoped to a custom step. +- **ssl_check_enabled** (bool) – bool = False if you would like to disable the built-in middleware (Default: True). +`SslCheck` is a built-in middleware that handles ssl_check requests from Slack. +- **oauth_settings** (Optional[OAuthSettings]) – The settings related to Slack app installation flow (OAuth flow) +- **oauth_flow** (Optional[OAuthFlow]) – Instantiated `slack_bolt.oauth.OAuthFlow`. This is always prioritized over oauth_settings. +- **verification_token** (Optional[str]) – Deprecated verification mechanism. This can be used only for ssl_check requests. +- **listener_executor** (Optional[Executor]) – Custom executor to run background tasks. If absent, the default `ThreadPoolExecutor` will +be used. +- **assistant_thread_context_store** (Optional[AssistantThreadContextStore]) – Custom AssistantThreadContext store (Default: the built-in implementation, +which uses a parent message's metadata to store the latest context) +- **attaching_conversation_kwargs_enabled** (bool) – False if you would like to disable the built-in +middleware (Default: True). `AttachingConversationKwargs` is a built-in middleware that attaches +conversation-specific listener arguments (such as `say`, `set_status`, `say_stream`, and +`set_suggested_prompts`) for assistant thread and direct message events. + +### `action` + +```python +action(constraints, matchers=None, middleware=None) ``` -Configured `OAuthFlow` object if exists. - -#### logger - -```python -@property -def logger() -> logging.Logger -``` - -The logger this app uses. - -#### client +Registers a new action listener. This method can be used as either a decorator or a method. ```python -@property -def client() -> WebClient -``` - -The singleton `slack_sdk.WebClient` instance in this app. - -#### installation\_store +# Use this method as a decorator +@app.action("approve_button") +def update_message(ack): + ack() -```python -@property -def installation_store() -> Optional[InstallationStore] +# Pass a function to this method +app.action("approve_button")(update_message) ``` -The `slack_sdk.oauth.InstallationStore` that can be used in the `authorize` middleware. +* Refer to https://docs.slack.dev/reference/interaction-payloads/block_actions-payload/ for actions in `blocks`. +* Refer to https://docs.slack.dev/legacy/legacy-messaging/legacy-message-buttons/ for actions in `attachments`. +* Refer to https://docs.slack.dev/legacy/legacy-dialogs/ for actions in dialogs. -#### listener\_runner +To learn available arguments for middleware/listeners, see `slack_bolt.kwargs_injection.args`'s API document. -```python -@property -def listener_runner() -> ThreadListenerRunner -``` +**Parameters:** -The thread executor for asynchronously running listeners. +- **constraints** (Union[str, Pattern, Dict[str, Union[str, Pattern]]]) – The conditions that match a request payload +- **matchers** (Optional[Sequence[Callable..., [bool]]]) – A list of listener matcher functions. +Only when all the matchers return True, the listener function can be invoked. +- **middleware** (Optional[Sequence[Union[Callable, Middleware]]]) – A list of lister middleware functions. +Only when all the middleware call `next()` method, the listener function can be invoked. -#### process\_before\_response +### `attachment_action` ```python -@property -def process_before_response() -> bool +attachment_action(callback_id, matchers=None, middleware=None) ``` -#### start +Registers a new `interactive_message` action listener. -```python -def start( - port: int = 3000, - path: str = '/slack/events', - http_server_logger_enabled: bool = True) -> None -``` +Refer to https://docs.slack.dev/legacy/legacy-messaging/legacy-message-buttons/ for details. -Starts a web server for local development. +### `block_action` ```python -# With the default settings, `http://localhost:3000/slack/events` -# is available for handling incoming requests from Slack -app.start() +block_action(constraints, matchers=None, middleware=None) ``` -This method internally starts a Web server process built with the `http.server` module. -For production, consider using a production-ready WSGI server such as Gunicorn. - -**Arguments**: +Registers a new `block_actions` action listener. -- `port` _int_ - The port to listen on (Default: 3000) -- `path` _str_ - The path to handle request from Slack (Default: `/slack/events`) -- `http_server_logger_enabled` _bool_ - The flag to enable http.server logging if True (Default: True) +Refer to https://docs.slack.dev/reference/interaction-payloads/block_actions-payload/ for details. -#### dispatch +### `block_suggestion` ```python -def dispatch(req: BoltRequest) -> BoltResponse +block_suggestion(action_id, matchers=None, middleware=None) ``` -Applies all middleware and dispatches an incoming request from Slack to the right code path. - -**Arguments**: - -- `req` _BoltRequest_ - An incoming request from Slack - -**Returns**: - -- `BoltResponse` - The response generated by this Bolt app +Registers a new `block_suggestion` listener. -#### use +### `client` ```python -def use(*args) -> Optional[Callable] +client: WebClient ``` -Registers a new global middleware to this app. This method can be used as either a decorator or a method. - -Refer to `App#middleware()` method's docstring for details. +The singleton `slack_sdk.WebClient` instance in this app. -#### middleware +### `command` ```python -def middleware(*args) -> Optional[Callable] +command(command, matchers=None, middleware=None) ``` -Registers a new middleware to this app. +Registers a new slash command listener. This method can be used as either a decorator or a method. ```python # Use this method as a decorator -@app.middleware -def middleware_func(logger, body, next): - logger.info(f"request body: {body}") - next() +@app.command("/echo") +def repeat_text(ack, say, command): + # Acknowledge command request + ack() + say(f"{command['text']}") # Pass a function to this method -app.middleware(middleware_func) +app.command("/echo")(repeat_text) ``` -Refer to https://docs.slack.dev/tools/bolt-python/concepts/global-middleware for details. +Refer to https://docs.slack.dev/interactivity/implementing-slash-commands/ for details of Slash Commands. To learn available arguments for middleware/listeners, see `slack_bolt.kwargs_injection.args`'s API document. -**Arguments**: +**Parameters:** -- `*args` - A function that works as a global middleware. +- **command** (Union[str, Pattern]) – The conditions that match a request payload +- **matchers** (Optional[Sequence[Callable..., [bool]]]) – A list of listener matcher functions. +Only when all the matchers return True, the listener function can be invoked. +- **middleware** (Optional[Sequence[Union[Callable, Middleware]]]) – A list of lister middleware functions. +Only when all the middleware call `next()` method, the listener function can be invoked. -#### assistant +### `dialog_cancellation` ```python -def assistant(assistant: Assistant) -> Optional[Callable] +dialog_cancellation(callback_id, matchers=None, middleware=None) ``` -#### step +Registers a new `dialog_cancellation` listener. + +Refer to https://docs.slack.dev/legacy/legacy-dialogs/ for details. + +### `dialog_submission` ```python -def step( - callback_id: Union[str, Pattern, WorkflowStep, WorkflowStepBuilder], - edit: Optional[Union[Callable[..., Optional[BoltResponse]], Listener, Sequence[Callable]]] = None, - save: Optional[Union[Callable[..., Optional[BoltResponse]], Listener, Sequence[Callable]]] = None, - execute: Optional[Union[Callable[..., Optional[BoltResponse]], Listener, Sequence[Callable]]] = None) +dialog_submission(callback_id, matchers=None, middleware=None) ``` -Deprecated: register a new step from app listener. +Registers a new `dialog_submission` listener. -Steps from apps for legacy workflows are now deprecated. -Use new custom steps: https://docs.slack.dev/workflows/workflow-steps/ +Refer to https://docs.slack.dev/legacy/legacy-dialogs/ for details. -Registers a new step from app listener. +### `dialog_suggestion` -Unlike others, this method doesn't behave as a decorator. -If you want to register a step from app by a decorator, use `WorkflowStepBuilder`'s methods. +```python +dialog_suggestion(callback_id, matchers=None, middleware=None) +``` + +Registers a new `dialog_suggestion` listener. + +Refer to https://docs.slack.dev/legacy/legacy-dialogs/ for details. + +### `dispatch` ```python -# Create a new WorkflowStep instance -from slack_bolt.workflows.step import WorkflowStep -ws = WorkflowStep( - callback_id="add_task", - edit=edit, - save=save, - execute=execute, -) -# Pass Step to set up listeners -app.step(ws) +dispatch(req) ``` -Refer to https://docs.slack.dev/legacy/legacy-steps-from-apps/ for details of steps from apps. +Applies all middleware and dispatches an incoming request from Slack to the right code path. -To learn available arguments for middleware/listeners, see `slack_bolt.kwargs_injection.args`'s API document. +**Parameters:** -For further information about WorkflowStep specific function arguments -such as `configure`, `update`, `complete`, and `fail`, -refer to `slack_bolt.workflows.step.utilities` API documents. +- **req** (BoltRequest) – An incoming request from Slack -**Arguments**: +**Returns:** -- `callback_id` _Union[str, Pattern, WorkflowStep, WorkflowStepBuilder]_ - The Callback ID for this step from app -- `edit` _Optional[Union[Callable[..., Optional[BoltResponse]], Listener, Sequence[Callable]]]_ - The function for displaying a modal in the Workflow Builder -- `save` _Optional[Union[Callable[..., Optional[BoltResponse]], Listener, Sequence[Callable]]]_ - The function for handling configuration in the Workflow Builder -- `execute` _Optional[Union[Callable[..., Optional[BoltResponse]], Listener, Sequence[Callable]]]_ - The function for handling the step execution +- BoltResponse – The response generated by this Bolt app -#### error +### `error` ```python -def error( - func: Callable[..., Optional[BoltResponse]]) -> Callable[..., Optional[BoltResponse]] +error(func) ``` Updates the global error handler. This method can be used as either a decorator or a method. @@ -340,18 +259,15 @@ app.error(custom_error_handler) To learn available arguments for middleware/listeners, see `slack_bolt.kwargs_injection.args`'s API document. -**Arguments**: +**Parameters:** -- `func` _Callable[..., Optional[BoltResponse]]_ - The function that is supposed to be executed - when getting an unhandled error in Bolt app. +- **func** (Callable..., [Optional[BoltResponse]]) – The function that is supposed to be executed +when getting an unhandled error in Bolt app. -#### event +### `event` ```python -def event( - event: Union[str, Pattern, Dict[str, Optional[Union[str, Sequence[Optional[Union[str, Pattern]]]]]]], - matchers: Optional[Sequence[Callable[..., bool]]] = None, - middleware: Optional[Sequence[Union[Callable, Middleware]]] = None) -> Callable[..., Optional[Callable[..., Optional[BoltResponse]]]] +event(event, matchers=None, middleware=None) ``` Registers a new event listener. This method can be used as either a decorator or a method. @@ -373,22 +289,92 @@ Refer to https://docs.slack.dev/apis/events-api/ for details of Events API. To learn available arguments for middleware/listeners, see `slack_bolt.kwargs_injection.args`'s API document. -**Arguments**: +**Parameters:** + +- **event** (Union[str, Pattern, Dict[str, Optional[Union[str, Sequence[Optional[Union[str, Pattern]]]]]]]) – The conditions that match a request payload. +If you pass a dict for this, you can have type, subtype in the constraint. +- **matchers** (Optional[Sequence[Callable..., [bool]]]) – A list of listener matcher functions. +Only when all the matchers return True, the listener function can be invoked. +- **middleware** (Optional[Sequence[Union[Callable, Middleware]]]) – A list of lister middleware functions. +Only when all the middleware call `next()` method, the listener function can be invoked. + +### `function` + +```python +function(callback_id, matchers=None, middleware=None, auto_acknowledge=True, ack_timeout=3) +``` + +Registers a new Function listener. + +This method can be used as either a decorator or a method. + +```python +# Use this method as a decorator +@app.function("reverse") +def reverse_string(ack: Ack, inputs: dict, complete: Complete, fail: Fail): + try: + ack() + string_to_reverse = inputs["stringToReverse"] + complete(outputs={"reverseString": string_to_reverse[::-1]}) + except Exception as e: + fail(f"Cannot reverse string (error: {e})") + raise e + +# Pass a function to this method +app.function("reverse")(reverse_string) +``` + +To learn available arguments for middleware/listeners, see `slack_bolt.kwargs_injection.args`'s API document. + +**Parameters:** + +- **callback_id** (Union[str, Pattern]) – The callback id to identify the function +- **matchers** (Optional[Sequence[Callable..., [bool]]]) – A list of listener matcher functions. +Only when all the matchers return True, the listener function can be invoked. +- **middleware** (Optional[Sequence[Union[Callable, Middleware]]]) – A list of lister middleware functions. +Only when all the middleware call `next()` method, the listener function can be invoked. +- **auto_acknowledge** (bool) – Whether Bolt automatically acknowledges the function execution event on the +listener's behalf. When False, your listener must call `ack()` itself within `ack_timeout` +seconds (Default: True). +- **ack_timeout** (int) – The number of seconds to wait for the listener to call `ack()`. +Only takes effect when `auto_acknowledge` is False (Default: 3). + +### `global_shortcut` + +```python +global_shortcut(callback_id, matchers=None, middleware=None) +``` -- `event` _Union[str, Pattern, Dict[str, Optional[Union[str, Sequence[Optional[Union[str, Pattern]]]]]]]_ - The conditions that match a request payload. - If you pass a dict for this, you can have type, subtype in the constraint. -- `matchers` _Optional[Sequence[Callable[..., bool]]]_ - A list of listener matcher functions. - Only when all the matchers return True, the listener function can be invoked. -- `middleware` _Optional[Sequence[Union[Callable, Middleware]]]_ - A list of lister middleware functions. - Only when all the middleware call `next()` method, the listener function can be invoked. +Registers a new global shortcut listener. -#### message +### `installation_store` ```python -def message( - keyword: Union[str, Pattern] = '', - matchers: Optional[Sequence[Callable[..., bool]]] = None, - middleware: Optional[Sequence[Union[Callable, Middleware]]] = None) -> Callable[..., Optional[Callable[..., Optional[BoltResponse]]]] +installation_store: Optional[InstallationStore] +``` + +The `slack_sdk.oauth.InstallationStore` that can be used in the `authorize` middleware. + +### `listener_runner` + +```python +listener_runner: ThreadListenerRunner +``` + +The thread executor for asynchronously running listeners. + +### `logger` + +```python +logger: logging.Logger +``` + +The logger this app uses. + +### `message` + +```python +message(keyword='', matchers=None, middleware=None) ``` Registers a new message event listener. This method can be used as either a decorator or a method. @@ -410,104 +396,116 @@ Refer to https://docs.slack.dev/reference/events/message/ for details of `messag To learn available arguments for middleware/listeners, see `slack_bolt.kwargs_injection.args`'s API document. -**Arguments**: +**Parameters:** -- `keyword` _Union[str, Pattern]_ - The keyword to match -- `matchers` _Optional[Sequence[Callable[..., bool]]]_ - A list of listener matcher functions. - Only when all the matchers return True, the listener function can be invoked. -- `middleware` _Optional[Sequence[Union[Callable, Middleware]]]_ - A list of lister middleware functions. - Only when all the middleware call `next()` method, the listener function can be invoked. +- **keyword** (Union[str, Pattern]) – The keyword to match +- **matchers** (Optional[Sequence[Callable..., [bool]]]) – A list of listener matcher functions. +Only when all the matchers return True, the listener function can be invoked. +- **middleware** (Optional[Sequence[Union[Callable, Middleware]]]) – A list of lister middleware functions. +Only when all the middleware call `next()` method, the listener function can be invoked. -#### function +### `message_shortcut` ```python -def function( - callback_id: Union[str, Pattern], - matchers: Optional[Sequence[Callable[..., bool]]] = None, - middleware: Optional[Sequence[Union[Callable, Middleware]]] = None, - auto_acknowledge: bool = True, - ack_timeout: int = 3) -> Callable[..., Optional[Callable[..., Optional[BoltResponse]]]] +message_shortcut(callback_id, matchers=None, middleware=None) ``` -Registers a new Function listener. +Registers a new message shortcut listener. + +### `middleware` + +```python +middleware(*args) +``` + +Registers a new middleware to this app. This method can be used as either a decorator or a method. ```python # Use this method as a decorator -@app.function("reverse") -def reverse_string(ack: Ack, inputs: dict, complete: Complete, fail: Fail): - try: - ack() - string_to_reverse = inputs["stringToReverse"] - complete(outputs={"reverseString": string_to_reverse[::-1]}) - except Exception as e: - fail(f"Cannot reverse string (error: {e})") - raise e +@app.middleware +def middleware_func(logger, body, next): + logger.info(f"request body: {body}") + next() # Pass a function to this method -app.function("reverse")(reverse_string) +app.middleware(middleware_func) ``` +Refer to https://docs.slack.dev/tools/bolt-python/concepts/global-middleware for details. + To learn available arguments for middleware/listeners, see `slack_bolt.kwargs_injection.args`'s API document. -**Arguments**: +**Parameters:** -- `callback_id` _Union[str, Pattern]_ - The callback id to identify the function -- `matchers` _Optional[Sequence[Callable[..., bool]]]_ - A list of listener matcher functions. - Only when all the matchers return True, the listener function can be invoked. -- `middleware` _Optional[Sequence[Union[Callable, Middleware]]]_ - A list of lister middleware functions. - Only when all the middleware call `next()` method, the listener function can be invoked. -- `auto_acknowledge` _bool_ - Whether Bolt automatically acknowledges the function execution event on the - listener's behalf. When False, your listener must call `ack()` itself within `ack_timeout` - seconds (Default: True). -- `ack_timeout` _int_ - The number of seconds to wait for the listener to call `ack()`. - Only takes effect when `auto_acknowledge` is False (Default: 3). +- ***args** – A function that works as a global middleware. -#### command +### `name` ```python -def command( - command: Union[str, Pattern], - matchers: Optional[Sequence[Callable[..., bool]]] = None, - middleware: Optional[Sequence[Union[Callable, Middleware]]] = None) -> Callable[..., Optional[Callable[..., Optional[BoltResponse]]]] +name: str ``` -Registers a new slash command listener. +The name of this app (default: the filename). + +### `oauth_flow` + +```python +oauth_flow: Optional[OAuthFlow] +``` + +Configured `OAuthFlow` object if exists. + +### `options` + +```python +options(constraints, matchers=None, middleware=None) +``` + +Registers a new options listener. This method can be used as either a decorator or a method. ```python # Use this method as a decorator -@app.command("/echo") -def repeat_text(ack, say, command): - # Acknowledge command request - ack() - say(f"{command['text']}") +@app.options("menu_selection") +def show_menu_options(ack): + options = [ + { + "text": {"type": "plain_text", "text": "Option 1"}, + "value": "1-1", + }, + { + "text": {"type": "plain_text", "text": "Option 2"}, + "value": "1-2", + }, + ] + ack(options=options) # Pass a function to this method -app.command("/echo")(repeat_text) +app.options("menu_selection")(show_menu_options) ``` -Refer to https://docs.slack.dev/interactivity/implementing-slash-commands/ for details of Slash Commands. +Refer to the following documents for details: + +* https://docs.slack.dev/reference/block-kit/block-elements/select-menu-element#external_select +* https://docs.slack.dev/reference/block-kit/block-elements/multi-select-menu-element#external_multi_select To learn available arguments for middleware/listeners, see `slack_bolt.kwargs_injection.args`'s API document. -**Arguments**: +**Parameters:** -- `command` _Union[str, Pattern]_ - The conditions that match a request payload -- `matchers` _Optional[Sequence[Callable[..., bool]]]_ - A list of listener matcher functions. - Only when all the matchers return True, the listener function can be invoked. -- `middleware` _Optional[Sequence[Union[Callable, Middleware]]]_ - A list of lister middleware functions. - Only when all the middleware call `next()` method, the listener function can be invoked. +- **constraints** (Union[str, Pattern, Dict[str, Union[str, Pattern]]]) – The conditions that match a request payload +- **matchers** (Optional[Sequence[Callable..., [bool]]]) – A list of listener matcher functions. +Only when all the matchers return True, the listener function can be invoked. +- **middleware** (Optional[Sequence[Union[Callable, Middleware]]]) – A list of lister middleware functions. +Only when all the middleware call `next()` method, the listener function can be invoked. -#### shortcut +### `shortcut` ```python -def shortcut( - constraints: Union[str, Pattern, Dict[str, Union[str, Pattern]]], - matchers: Optional[Sequence[Callable[..., bool]]] = None, - middleware: Optional[Sequence[Union[Callable, Middleware]]] = None) -> Callable[..., Optional[Callable[..., Optional[BoltResponse]]]] +shortcut(constraints, matchers=None, middleware=None) ``` Registers a new shortcut listener. @@ -536,130 +534,95 @@ Refer to https://docs.slack.dev/interactivity/implementing-shortcuts/ for detail To learn available arguments for middleware/listeners, see `slack_bolt.kwargs_injection.args`'s API document. -**Arguments**: +**Parameters:** -- `constraints` _Union[str, Pattern, Dict[str, Union[str, Pattern]]]_ - The conditions that match a request payload. -- `matchers` _Optional[Sequence[Callable[..., bool]]]_ - A list of listener matcher functions. - Only when all the matchers return True, the listener function can be invoked. -- `middleware` _Optional[Sequence[Union[Callable, Middleware]]]_ - A list of lister middleware functions. - Only when all the middleware call `next()` method, the listener function can be invoked. +- **constraints** (Union[str, Pattern, Dict[str, Union[str, Pattern]]]) – The conditions that match a request payload. +- **matchers** (Optional[Sequence[Callable..., [bool]]]) – A list of listener matcher functions. +Only when all the matchers return True, the listener function can be invoked. +- **middleware** (Optional[Sequence[Union[Callable, Middleware]]]) – A list of lister middleware functions. +Only when all the middleware call `next()` method, the listener function can be invoked. -#### global\_shortcut +### `start` ```python -def global_shortcut( - callback_id: Union[str, Pattern], - matchers: Optional[Sequence[Callable[..., bool]]] = None, - middleware: Optional[Sequence[Union[Callable, Middleware]]] = None) -> Callable[..., Optional[Callable[..., Optional[BoltResponse]]]] +start(port=3000, path='/slack/events', http_server_logger_enabled=True) ``` -Registers a new global shortcut listener. - -#### message\_shortcut +Starts a web server for local development. ```python -def message_shortcut( - callback_id: Union[str, Pattern], - matchers: Optional[Sequence[Callable[..., bool]]] = None, - middleware: Optional[Sequence[Union[Callable, Middleware]]] = None) -> Callable[..., Optional[Callable[..., Optional[BoltResponse]]]] +# With the default settings, `http://localhost:3000/slack/events` +# is available for handling incoming requests from Slack +app.start() ``` -Registers a new message shortcut listener. +This method internally starts a Web server process built with the `http.server` module. +For production, consider using a production-ready WSGI server such as Gunicorn. -#### action +**Parameters:** -```python -def action( - constraints: Union[str, Pattern, Dict[str, Union[str, Pattern]]], - matchers: Optional[Sequence[Callable[..., bool]]] = None, - middleware: Optional[Sequence[Union[Callable, Middleware]]] = None) -> Callable[..., Optional[Callable[..., Optional[BoltResponse]]]] -``` +- **port** (int) – The port to listen on (Default: 3000) +- **path** (str) – The path to handle request from Slack (Default: `/slack/events`) +- **http_server_logger_enabled** (bool) – The flag to enable http.server logging if True (Default: True) -Registers a new action listener. This method can be used as either a decorator or a method. +### `step` ```python -# Use this method as a decorator -@app.action("approve_button") -def update_message(ack): - ack() - -# Pass a function to this method -app.action("approve_button")(update_message) +step(callback_id, edit=None, save=None, execute=None) ``` -* Refer to https://docs.slack.dev/reference/interaction-payloads/block_actions-payload/ for actions in `blocks`. -* Refer to https://docs.slack.dev/legacy/legacy-messaging/legacy-message-buttons/ for actions in `attachments`. -* Refer to https://docs.slack.dev/legacy/legacy-dialogs/ for actions in dialogs. - -To learn available arguments for middleware/listeners, see `slack_bolt.kwargs_injection.args`'s API document. - -**Arguments**: - -- `constraints` _Union[str, Pattern, Dict[str, Union[str, Pattern]]]_ - The conditions that match a request payload -- `matchers` _Optional[Sequence[Callable[..., bool]]]_ - A list of listener matcher functions. - Only when all the matchers return True, the listener function can be invoked. -- `middleware` _Optional[Sequence[Union[Callable, Middleware]]]_ - A list of lister middleware functions. - Only when all the middleware call `next()` method, the listener function can be invoked. - -#### block\_action - -```python -def block_action( - constraints: Union[str, Pattern, Dict[str, Union[str, Pattern]]], - matchers: Optional[Sequence[Callable[..., bool]]] = None, - middleware: Optional[Sequence[Union[Callable, Middleware]]] = None) -> Callable[..., Optional[Callable[..., Optional[BoltResponse]]]] -``` +Deprecated: register a new step from app listener. -Registers a new `block_actions` action listener. +Steps from apps for legacy workflows are now deprecated. +Use new custom steps: https://docs.slack.dev/workflows/workflow-steps/ -Refer to https://docs.slack.dev/reference/interaction-payloads/block_actions-payload/ for details. +Registers a new step from app listener. -#### attachment\_action +Unlike others, this method doesn't behave as a decorator. +If you want to register a step from app by a decorator, use `WorkflowStepBuilder`'s methods. ```python -def attachment_action( - callback_id: Union[str, Pattern], - matchers: Optional[Sequence[Callable[..., bool]]] = None, - middleware: Optional[Sequence[Union[Callable, Middleware]]] = None) -> Callable[..., Optional[Callable[..., Optional[BoltResponse]]]] +# Create a new WorkflowStep instance +from slack_bolt.workflows.step import WorkflowStep +ws = WorkflowStep( + callback_id="add_task", + edit=edit, + save=save, + execute=execute, +) +# Pass Step to set up listeners +app.step(ws) ``` -Registers a new `interactive_message` action listener. +Refer to https://docs.slack.dev/legacy/legacy-steps-from-apps/ for details of steps from apps. -Refer to https://docs.slack.dev/legacy/legacy-messaging/legacy-message-buttons/ for details. +To learn available arguments for middleware/listeners, see `slack_bolt.kwargs_injection.args`'s API document. -#### dialog\_submission +For further information about WorkflowStep specific function arguments +such as `configure`, `update`, `complete`, and `fail`, +refer to `slack_bolt.workflows.step.utilities` API documents. -```python -def dialog_submission( - callback_id: Union[str, Pattern], - matchers: Optional[Sequence[Callable[..., bool]]] = None, - middleware: Optional[Sequence[Union[Callable, Middleware]]] = None) -> Callable[..., Optional[Callable[..., Optional[BoltResponse]]]] -``` +**Parameters:** -Registers a new `dialog_submission` listener. +- **callback_id** (Union[str, Pattern, WorkflowStep, WorkflowStepBuilder]) – The Callback ID for this step from app +- **edit** (Optional[Union[Callable..., [Optional[BoltResponse]], Listener, Sequence[Callable]]]) – The function for displaying a modal in the Workflow Builder +- **save** (Optional[Union[Callable..., [Optional[BoltResponse]], Listener, Sequence[Callable]]]) – The function for handling configuration in the Workflow Builder +- **execute** (Optional[Union[Callable..., [Optional[BoltResponse]], Listener, Sequence[Callable]]]) – The function for handling the step execution -Refer to https://docs.slack.dev/legacy/legacy-dialogs/ for details. - -#### dialog\_cancellation +### `use` ```python -def dialog_cancellation( - callback_id: Union[str, Pattern], - matchers: Optional[Sequence[Callable[..., bool]]] = None, - middleware: Optional[Sequence[Union[Callable, Middleware]]] = None) -> Callable[..., Optional[Callable[..., Optional[BoltResponse]]]] +use(*args) ``` -Registers a new `dialog_cancellation` listener. +Registers a new global middleware to this app. This method can be used as either a decorator or a method. -Refer to https://docs.slack.dev/legacy/legacy-dialogs/ for details. +Refer to `App#middleware()` method's docstring for details. -#### view +### `view` ```python -def view( - constraints: Union[str, Pattern, Dict[str, Union[str, Pattern]]], - matchers: Optional[Sequence[Callable[..., bool]]] = None, - middleware: Optional[Sequence[Union[Callable, Middleware]]] = None) -> Callable[..., Optional[Callable[..., Optional[BoltResponse]]]] +view(constraints, matchers=None, middleware=None) ``` Registers a new `view_submission`/`view_closed` event listener. @@ -692,146 +655,39 @@ Refer to https://docs.slack.dev/reference/interaction-payloads/view-interactions To learn available arguments for middleware/listeners, see `slack_bolt.kwargs_injection.args`'s API document. -**Arguments**: +**Parameters:** -- `constraints` _Union[str, Pattern, Dict[str, Union[str, Pattern]]]_ - The conditions that match a request payload -- `matchers` _Optional[Sequence[Callable[..., bool]]]_ - A list of listener matcher functions. - Only when all the matchers return True, the listener function can be invoked. -- `middleware` _Optional[Sequence[Union[Callable, Middleware]]]_ - A list of lister middleware functions. - Only when all the middleware call `next()` method, the listener function can be invoked. +- **constraints** (Union[str, Pattern, Dict[str, Union[str, Pattern]]]) – The conditions that match a request payload +- **matchers** (Optional[Sequence[Callable..., [bool]]]) – A list of listener matcher functions. +Only when all the matchers return True, the listener function can be invoked. +- **middleware** (Optional[Sequence[Union[Callable, Middleware]]]) – A list of lister middleware functions. +Only when all the middleware call `next()` method, the listener function can be invoked. -#### view\_submission +### `view_closed` ```python -def view_submission( - constraints: Union[str, Pattern], - matchers: Optional[Sequence[Callable[..., bool]]] = None, - middleware: Optional[Sequence[Union[Callable, Middleware]]] = None) -> Callable[..., Optional[Callable[..., Optional[BoltResponse]]]] -``` - -Registers a new `view_submission` listener. - -Refer to https://docs.slack.dev/reference/interaction-payloads/view-interactions-payload/#view_submission for -details. - -#### view\_closed - -```python -def view_closed( - constraints: Union[str, Pattern], - matchers: Optional[Sequence[Callable[..., bool]]] = None, - middleware: Optional[Sequence[Union[Callable, Middleware]]] = None) -> Callable[..., Optional[Callable[..., Optional[BoltResponse]]]] +view_closed(constraints, matchers=None, middleware=None) ``` Registers a new `view_closed` listener. Refer to https://docs.slack.dev/reference/interaction-payloads/view-interactions-payload/#view_closed for details. -#### options - -```python -def options( - constraints: Union[str, Pattern, Dict[str, Union[str, Pattern]]], - matchers: Optional[Sequence[Callable[..., bool]]] = None, - middleware: Optional[Sequence[Union[Callable, Middleware]]] = None) -> Callable[..., Optional[Callable[..., Optional[BoltResponse]]]] -``` - -Registers a new options listener. - -This method can be used as either a decorator or a method. - -```python -# Use this method as a decorator -@app.options("menu_selection") -def show_menu_options(ack): - options = [ - { - "text": {"type": "plain_text", "text": "Option 1"}, - "value": "1-1", - }, - { - "text": {"type": "plain_text", "text": "Option 2"}, - "value": "1-2", - }, - ] - ack(options=options) - -# Pass a function to this method -app.options("menu_selection")(show_menu_options) -``` - -Refer to the following documents for details: - -* https://docs.slack.dev/reference/block-kit/block-elements/select-menu-element#external_select -* https://docs.slack.dev/reference/block-kit/block-elements/multi-select-menu-element#external_multi_select - -To learn available arguments for middleware/listeners, see `slack_bolt.kwargs_injection.args`'s API document. - -**Arguments**: - -- `constraints` _Union[str, Pattern, Dict[str, Union[str, Pattern]]]_ - The conditions that match a request payload -- `matchers` _Optional[Sequence[Callable[..., bool]]]_ - A list of listener matcher functions. - Only when all the matchers return True, the listener function can be invoked. -- `middleware` _Optional[Sequence[Union[Callable, Middleware]]]_ - A list of lister middleware functions. - Only when all the middleware call `next()` method, the listener function can be invoked. - -#### block\_suggestion +### `view_submission` ```python -def block_suggestion( - action_id: Union[str, Pattern], - matchers: Optional[Sequence[Callable[..., bool]]] = None, - middleware: Optional[Sequence[Union[Callable, Middleware]]] = None) -> Callable[..., Optional[Callable[..., Optional[BoltResponse]]]] +view_submission(constraints, matchers=None, middleware=None) ``` -Registers a new `block_suggestion` listener. - -#### dialog\_suggestion - -```python -def dialog_suggestion( - callback_id: Union[str, Pattern], - matchers: Optional[Sequence[Callable[..., bool]]] = None, - middleware: Optional[Sequence[Union[Callable, Middleware]]] = None) -> Callable[..., Optional[Callable[..., Optional[BoltResponse]]]] -``` - -Registers a new `dialog_suggestion` listener. - -Refer to https://docs.slack.dev/legacy/legacy-dialogs/ for details. - -#### default\_tokens\_revoked\_event\_listener - -```python -def default_tokens_revoked_event_listener() -> Callable[..., Optional[BoltResponse]] -``` - -#### default\_app\_uninstalled\_event\_listener - -```python -def default_app_uninstalled_event_listener() -> Callable[..., Optional[BoltResponse]] -``` - -#### enable\_token\_revocation\_listeners - -```python -def enable_token_revocation_listeners() -> None -``` - -## SlackAppDevelopmentServer Objects +Registers a new `view_submission` listener. -```python -class SlackAppDevelopmentServer() -``` +Refer to https://docs.slack.dev/reference/interaction-payloads/view-interactions-payload/#view_submission for +details. -#### \_\_init\_\_ +## `SlackAppDevelopmentServer` ```python -def __init__( - port: int, - path: str, - app: App, - oauth_flow: Optional[OAuthFlow] = None, - http_server_logger_enabled: bool = True) +SlackAppDevelopmentServer(port, path, app, oauth_flow=None, http_server_logger_enabled=True) ``` Slack App Development Server. @@ -844,18 +700,18 @@ is not recommended. Please consider using an adapter (refer to slack_bolt.adapte along with a production-grade server when running the app for end users. https://docs.python.org/3/library/http.server.html#http.server.HTTPServer -**Arguments**: +**Parameters:** -- `port` _int_ - the port number -- `path` _str_ - the path to receive incoming requests -- `app` _App_ - the `App` instance to execute -- `oauth_flow` _Optional[OAuthFlow]_ - the `OAuthFlow` instance to use for OAuth flow -- `http_server_logger_enabled` _bool_ - The flag to turn on/off http.server's logging +- **port** (int) – the port number +- **path** (str) – the path to receive incoming requests +- **app** (App) – the `App` instance to execute +- **oauth_flow** (Optional[OAuthFlow]) – the `OAuthFlow` instance to use for OAuth flow +- **http_server_logger_enabled** (bool) – The flag to turn on/off http.server's logging -#### start +### `start` ```python -def start() -> None +start() ``` Starts a new web server process. diff --git a/docs/english/reference/app/async_app.md b/docs/english/reference/app/async_app.md index a0ca092f6..4bbb21b29 100644 --- a/docs/english/reference/app/async_app.md +++ b/docs/english/reference/app/async_app.md @@ -3,40 +3,10 @@ sidebar_label: async_app title: slack_bolt.app.async_app --- -## AsyncApp Objects - -```python -class AsyncApp() -``` - -#### \_\_init\_\_ - -```python -def __init__( - *, - logger: Optional[logging.Logger] = None, - name: Optional[str] = None, - process_before_response: bool = False, - raise_error_for_unhandled_request: bool = False, - signing_secret: Optional[str] = None, - token: Optional[str] = None, - client: Optional[AsyncWebClient] = None, - before_authorize: Optional[Union[AsyncMiddleware, Callable[..., Awaitable[Any]]]] = None, - authorize: Optional[Callable[..., Awaitable[AuthorizeResult]]] = None, - user_facing_authorize_error_message: Optional[str] = None, - installation_store: Optional[AsyncInstallationStore] = None, - installation_store_bot_only: Optional[bool] = None, - request_verification_enabled: bool = True, - ignoring_self_events_enabled: bool = True, - ignoring_self_assistant_message_events_enabled: bool = True, - ssl_check_enabled: bool = True, - url_verification_enabled: bool = True, - attaching_function_token_enabled: bool = True, - oauth_settings: Optional[AsyncOAuthSettings] = None, - oauth_flow: Optional[AsyncOAuthFlow] = None, - verification_token: Optional[str] = None, - assistant_thread_context_store: Optional[AsyncAssistantThreadContextStore] = None, - attaching_conversation_kwargs_enabled: bool = True) +## `AsyncApp` + +```python +AsyncApp(*, logger=None, name=None, process_before_response=False, raise_error_for_unhandled_request=False, signing_secret=None, token=None, client=None, before_authorize=None, authorize=None, user_facing_authorize_error_message=None, installation_store=None, installation_store_bot_only=None, request_verification_enabled=True, ignoring_self_events_enabled=True, ignoring_self_assistant_message_events_enabled=True, ssl_check_enabled=True, url_verification_enabled=True, attaching_function_token_enabled=True, oauth_settings=None, oauth_flow=None, verification_token=None, assistant_thread_context_store=None, attaching_conversation_kwargs_enabled=True) ``` Bolt App that provides functionalities to register middleware/listeners. @@ -67,292 +37,207 @@ Refer to https://docs.slack.dev/tools/bolt-python/concepts/async for details. If you would like to build an OAuth app for enabling the app to run with multiple workspaces, refer to https://docs.slack.dev/tools/bolt-python/concepts/authenticating-oauth to learn how to configure the app. -**Arguments**: - -- `logger` _Optional[logging.Logger]_ - The custom logger that can be used in this app. -- `name` _Optional[str]_ - The application name that will be used in logging. If absent, the source file name will be used. -- `process_before_response` _bool_ - True if this app runs on Function as a Service. (Default: False) -- `raise_error_for_unhandled_request` _bool_ - True if you want to raise exceptions for unhandled requests - and use @app.error listeners instead of - the built-in handler, which pints warning logs and returns 404 to Slack (Default: False) -- `signing_secret` _Optional[str]_ - The Signing Secret value used for verifying requests from Slack. -- `token` _Optional[str]_ - The bot/user access token required only for single-workspace app. -- `client` _Optional[AsyncWebClient]_ - The singleton `slack_sdk.web.async_client.AsyncWebClient` instance for this app. -- `before_authorize` _Optional[Union[AsyncMiddleware, Callable[..., Awaitable[Any]]]]_ - A global middleware that can be executed right before authorize function -- `authorize` _Optional[Callable[..., Awaitable[AuthorizeResult]]]_ - The function to authorize an incoming request from Slack - by checking if there is a team/user in the installation data. -- `user_facing_authorize_error_message` _Optional[str]_ - The user-facing error message to display - when the app is installed but the installation is not managed by this app's installation store -- `installation_store` _Optional[AsyncInstallationStore]_ - The module offering save/find operations of installation data -- `installation_store_bot_only` _Optional[bool]_ - Use `AsyncInstallationStore#async_find_bot()` if True (Default: False) -- `request_verification_enabled` _bool_ - False if you would like to disable the built-in middleware (Default: True). - `AsyncRequestVerification` is a built-in middleware that verifies the signature in HTTP Mode requests. - Make sure if it's safe enough when you turn a built-in middleware off. - We strongly recommend using RequestVerification for better security. - If you have a proxy that verifies request signature in front of the Bolt app, - it's totally fine to disable RequestVerification to avoid duplication of work. - Don't turn it off just for easiness of development. -- `ignoring_self_events_enabled` _bool_ - False if you would like to disable the built-in middleware (Default: True). - `AsyncIgnoringSelfEvents` is a built-in middleware that enables Bolt apps to easily skip the events - generated by this app's bot user (this is useful for avoiding code error causing an infinite loop). -- `ignoring_self_assistant_message_events_enabled` _bool_ - False if you would like to disable the built-in middleware. - `IgnoringSelfEvents` for this app's bot user message events within an assistant thread - This is useful for avoiding code error causing an infinite loop; Default: True -- `url_verification_enabled` _bool_ - False if you would like to disable the built-in middleware (Default: True). - `AsyncUrlVerification` is a built-in middleware that handles url_verification requests - that verify the endpoint for Events API in HTTP Mode requests. -- `ssl_check_enabled` _bool_ - bool = False if you would like to disable the built-in middleware (Default: True). - `AsyncSslCheck` is a built-in middleware that handles ssl_check requests from Slack. -- `attaching_function_token_enabled` _bool_ - False if you would like to disable the built-in middleware (Default: True). - `AsyncAttachingFunctionToken` is a built-in middleware that injects the just-in-time workflow-execution token - when your app receives `function_executed` or interactivity events scoped to a custom step. -- `oauth_settings` _Optional[AsyncOAuthSettings]_ - The settings related to Slack app installation flow (OAuth flow) -- `oauth_flow` _Optional[AsyncOAuthFlow]_ - Instantiated `slack_bolt.oauth.AsyncOAuthFlow`. This is always prioritized over oauth_settings. -- `verification_token` _Optional[str]_ - Deprecated verification mechanism. This can be used only for ssl_check requests. -- `assistant_thread_context_store` _Optional[AsyncAssistantThreadContextStore]_ - Custom AssistantThreadContext store (Default: the built-in implementation, - which uses a parent message's metadata to store the latest context) -- `attaching_conversation_kwargs_enabled` _bool_ - False if you would like to disable the built-in - middleware (Default: True). `AttachingConversationKwargs` is a built-in middleware that attaches - conversation-specific listener arguments (such as `say`, `set_status`, `say_stream`, and - `set_suggested_prompts`) for assistant thread and direct message events. - -#### name - -```python -@property -def name() -> str -``` - -The name of this app (default: the filename). - -#### oauth\_flow - -```python -@property -def oauth_flow() -> Optional[AsyncOAuthFlow] -``` - -Configured `OAuthFlow` object if exists. - -#### client - -```python -@property -def client() -> AsyncWebClient +**Parameters:** + +- **logger** (Optional[Logger]) – The custom logger that can be used in this app. +- **name** (Optional[str]) – The application name that will be used in logging. If absent, the source file name will be used. +- **process_before_response** (bool) – True if this app runs on Function as a Service. (Default: False) +- **raise_error_for_unhandled_request** (bool) – True if you want to raise exceptions for unhandled requests +and use @app.error listeners instead of +the built-in handler, which pints warning logs and returns 404 to Slack (Default: False) +- **signing_secret** (Optional[str]) – The Signing Secret value used for verifying requests from Slack. +- **token** (Optional[str]) – The bot/user access token required only for single-workspace app. +- **client** (Optional[AsyncWebClient]) – The singleton `slack_sdk.web.async_client.AsyncWebClient` instance for this app. +- **before_authorize** (Optional[Union[AsyncMiddleware, Callable..., [Awaitable[Any]]]]) – A global middleware that can be executed right before authorize function +- **authorize** (Optional[Callable..., [Awaitable[AuthorizeResult]]]) – The function to authorize an incoming request from Slack +by checking if there is a team/user in the installation data. +- **user_facing_authorize_error_message** (Optional[str]) – The user-facing error message to display +when the app is installed but the installation is not managed by this app's installation store +- **installation_store** (Optional[AsyncInstallationStore]) – The module offering save/find operations of installation data +- **installation_store_bot_only** (Optional[bool]) – Use `AsyncInstallationStore#async_find_bot()` if True (Default: False) +- **request_verification_enabled** (bool) – False if you would like to disable the built-in middleware (Default: True). +`AsyncRequestVerification` is a built-in middleware that verifies the signature in HTTP Mode requests. +Make sure if it's safe enough when you turn a built-in middleware off. +We strongly recommend using RequestVerification for better security. +If you have a proxy that verifies request signature in front of the Bolt app, +it's totally fine to disable RequestVerification to avoid duplication of work. +Don't turn it off just for easiness of development. +- **ignoring_self_events_enabled** (bool) – False if you would like to disable the built-in middleware (Default: True). +`AsyncIgnoringSelfEvents` is a built-in middleware that enables Bolt apps to easily skip the events +generated by this app's bot user (this is useful for avoiding code error causing an infinite loop). +- **ignoring_self_assistant_message_events_enabled** (bool) – False if you would like to disable the built-in middleware. +`IgnoringSelfEvents` for this app's bot user message events within an assistant thread +This is useful for avoiding code error causing an infinite loop; Default: True +- **url_verification_enabled** (bool) – False if you would like to disable the built-in middleware (Default: True). +`AsyncUrlVerification` is a built-in middleware that handles url_verification requests +that verify the endpoint for Events API in HTTP Mode requests. +- **ssl_check_enabled** (bool) – bool = False if you would like to disable the built-in middleware (Default: True). +`AsyncSslCheck` is a built-in middleware that handles ssl_check requests from Slack. +- **attaching_function_token_enabled** (bool) – False if you would like to disable the built-in middleware (Default: True). +`AsyncAttachingFunctionToken` is a built-in middleware that injects the just-in-time workflow-execution token +when your app receives `function_executed` or interactivity events scoped to a custom step. +- **oauth_settings** (Optional[AsyncOAuthSettings]) – The settings related to Slack app installation flow (OAuth flow) +- **oauth_flow** (Optional[AsyncOAuthFlow]) – Instantiated `slack_bolt.oauth.AsyncOAuthFlow`. This is always prioritized over oauth_settings. +- **verification_token** (Optional[str]) – Deprecated verification mechanism. This can be used only for ssl_check requests. +- **assistant_thread_context_store** (Optional[AsyncAssistantThreadContextStore]) – Custom AssistantThreadContext store (Default: the built-in implementation, +which uses a parent message's metadata to store the latest context) +- **attaching_conversation_kwargs_enabled** (bool) – False if you would like to disable the built-in +middleware (Default: True). `AttachingConversationKwargs` is a built-in middleware that attaches +conversation-specific listener arguments (such as `say`, `set_status`, `say_stream`, and +`set_suggested_prompts`) for assistant thread and direct message events. + +### `action` + +```python +action(constraints, matchers=None, middleware=None) ``` -The singleton `slack_sdk.web.async_client.AsyncWebClient` instance in this app. - -#### logger +Registers a new action listener. This method can be used as either a decorator or a method. ```python -@property -def logger() -> logging.Logger -``` - -The logger this app uses. - -#### installation\_store +# Use this method as a decorator +@app.action("approve_button") +async def update_message(ack): + await ack() -```python -@property -def installation_store() -> Optional[AsyncInstallationStore] +# Pass a function to this method +app.action("approve_button")(update_message) ``` -The `slack_sdk.oauth.AsyncInstallationStore` that can be used in the `authorize` middleware. +* Refer to https://docs.slack.dev/reference/interaction-payloads/block_actions-payload/ for actions in `blocks`. +* Refer to https://docs.slack.dev/legacy/legacy-messaging/legacy-message-buttons/ for actions in `attachments`. +* Refer to https://docs.slack.dev/legacy/legacy-dialogs/ for actions in dialogs. -#### listener\_runner +To learn available arguments for middleware/listeners, see `slack_bolt.kwargs_injection.async_args`'s API document. -```python -@property -def listener_runner() -> AsyncioListenerRunner -``` +**Parameters:** -The asyncio-based executor for asynchronously running listeners. +- **constraints** (Union[str, Pattern, Dict[str, Union[str, Pattern]]]) – The conditions that match a request payload +- **matchers** (Optional[Sequence[Callable..., [Awaitable[bool]]]]) – A list of listener matcher functions. +Only when all the matchers return True, the listener function can be invoked. +- **middleware** (Optional[Sequence[Union[Callable, AsyncMiddleware]]]) – A list of lister middleware functions. +Only when all the middleware call `next()` method, the listener function can be invoked. -#### process\_before\_response +### `async_dispatch` ```python -@property -def process_before_response() -> bool +async_dispatch(req) ``` -#### server - -```python -def server( - port: int = 3000, - path: str = '/slack/events', - host: Optional[str] = None) -> AsyncSlackAppServer -``` +Applies all middleware and dispatches an incoming request from Slack to the right code path. -Configure a web server using AIOHTTP. +**Parameters:** -Refer to https://docs.aiohttp.org/ for more details about AIOHTTP. +- **req** (AsyncBoltRequest) – An incoming request from Slack. -**Arguments**: +**Returns:** -- `port` _int_ - The port to listen on (Default: 3000) -- `path` _str_ - The path to handle request from Slack (Default: `/slack/events`) -- `host` _Optional[str]_ - The hostname to serve the web endpoints. (Default: 0.0.0.0) +- BoltResponse – The response generated by this Bolt app. -#### web\_app +### `attachment_action` ```python -def web_app(path: str = '/slack/events', port: int = 3000) -> web.Application +attachment_action(callback_id, matchers=None, middleware=None) ``` -Returns a `web.Application` instance for aiohttp-devtools users. - -```python -from slack_bolt.async_app import AsyncApp -app = AsyncApp() - -@app.event("app_mention") -async def event_test(body, say, logger): - logger.info(body) - await say("What's up?") - -def app_factory(): - return app.web_app() - -# adev runserver --port 3000 --app-factory app_factory async_app.py -``` - - -**Arguments**: +Registers a new `interactive_message` action listener. -- `path` _str_ - The path to receive incoming requests from Slack -- `port` _int_ - The port to listen on (Default: 3000) +Refer to https://docs.slack.dev/legacy/legacy-messaging/legacy-message-buttons/ for details. -#### start +### `block_action` ```python -def start( - port: int = 3000, - path: str = '/slack/events', - host: Optional[str] = None) -> None +block_action(constraints, matchers=None, middleware=None) ``` -Start a web server using AIOHTTP. - -Refer to https://docs.aiohttp.org/ for more details about AIOHTTP. - -**Arguments**: +Registers a new `block_actions` action listener. -- `port` _int_ - The port to listen on (Default: 3000) -- `path` _str_ - The path to handle request from Slack (Default: `/slack/events`) -- `host` _Optional[str]_ - The hostname to serve the web endpoints. (Default: 0.0.0.0) +Refer to https://docs.slack.dev/reference/interaction-payloads/block_actions-payload/ for details. -#### async\_dispatch +### `block_suggestion` ```python -async def async_dispatch(req: AsyncBoltRequest) -> BoltResponse +block_suggestion(action_id, matchers=None, middleware=None) ``` -Applies all middleware and dispatches an incoming request from Slack to the right code path. - -**Arguments**: - -- `req` _AsyncBoltRequest_ - An incoming request from Slack. - -**Returns**: - -- `BoltResponse` - The response generated by this Bolt app. +Registers a new `block_suggestion` listener. -#### use +### `client` ```python -def use(*args) -> Optional[Callable] +client: AsyncWebClient ``` -Refer to `AsyncApp#middleware()` method's docstring for details. +The singleton `slack_sdk.web.async_client.AsyncWebClient` instance in this app. -#### middleware +### `command` ```python -def middleware(*args) -> Optional[Callable] +command(command, matchers=None, middleware=None) ``` -Registers a new middleware to this app. +Registers a new slash command listener. This method can be used as either a decorator or a method. ```python # Use this method as a decorator -@app.middleware -async def middleware_func(logger, body, next): - logger.info(f"request body: {body}") - await next() +@app.command("/echo") +async def repeat_text(ack, say, command): + # Acknowledge command request + await ack() + await say(f"{command['text']}") # Pass a function to this method -app.middleware(middleware_func) +app.command("/echo")(repeat_text) ``` +Refer to https://docs.slack.dev/interactivity/implementing-slash-commands/ for details of Slash Commands. + To learn available arguments for middleware/listeners, see `slack_bolt.kwargs_injection.async_args`'s API document. -**Arguments**: +**Parameters:** -- `*args` - A function that works as a global middleware. +- **command** (Union[str, Pattern]) – The conditions that match a request payload +- **matchers** (Optional[Sequence[Callable..., [Awaitable[bool]]]]) – A list of listener matcher functions. +Only when all the matchers return True, the listener function can be invoked. +- **middleware** (Optional[Sequence[Union[Callable, AsyncMiddleware]]]) – A list of lister middleware functions. +Only when all the middleware call `next()` method, the listener function can be invoked. -#### assistant +### `dialog_cancellation` ```python -def assistant(assistant: AsyncAssistant) -> Optional[Callable] +dialog_cancellation(callback_id, matchers=None, middleware=None) ``` -#### step +Registers a new `dialog_cancellation` listener. + +Refer to https://docs.slack.dev/legacy/legacy-dialogs/ for details. + +### `dialog_submission` ```python -def step( - callback_id: Union[str, Pattern, AsyncWorkflowStep, AsyncWorkflowStepBuilder], - edit: Optional[Union[Callable[..., Optional[BoltResponse]], AsyncListener, Sequence[Callable]]] = None, - save: Optional[Union[Callable[..., Optional[BoltResponse]], AsyncListener, Sequence[Callable]]] = None, - execute: Optional[Union[Callable[..., Optional[BoltResponse]], AsyncListener, Sequence[Callable]]] = None) +dialog_submission(callback_id, matchers=None, middleware=None) ``` -Deprecated: register a new step from app listener. - -Steps from apps for legacy workflows are now deprecated. -Use new custom steps: https://docs.slack.dev/workflows/workflow-steps/ +Registers a new `dialog_submission` listener. -Registers a new step from app listener. +Refer to https://docs.slack.dev/legacy/legacy-dialogs/ for details. -Unlike others, this method doesn't behave as a decorator. -If you want to register a step from app by a decorator, use `AsyncWorkflowStepBuilder`'s methods. +### `dialog_suggestion` ```python -# Create a new WorkflowStep instance -from slack_bolt.workflows.async_step import AsyncWorkflowStep -ws = AsyncWorkflowStep( - callback_id="add_task", - edit=edit, - save=save, - execute=execute, -) -# Pass Step to set up listeners -app.step(ws) +dialog_suggestion(callback_id, matchers=None, middleware=None) ``` -Refer to https://docs.slack.dev/legacy/legacy-steps-from-apps/ for details of steps from apps. - -To learn available arguments for middleware/listeners, see `slack_bolt.kwargs_injection.async_args`'s API document. -For further information about AsyncWorkflowStep specific function arguments -such as `configure`, `update`, `complete`, and `fail`, -refer to the `async` prefixed ones in `slack_bolt.workflows.step.utilities` API documents. - -**Arguments**: +Registers a new `dialog_suggestion` listener. -- `callback_id` _Union[str, Pattern, AsyncWorkflowStep, AsyncWorkflowStepBuilder]_ - The Callback ID for this step from app -- `edit` _Optional[Union[Callable[..., Optional[BoltResponse]], AsyncListener, Sequence[Callable]]]_ - The function for displaying a modal in the Workflow Builder -- `save` _Optional[Union[Callable[..., Optional[BoltResponse]], AsyncListener, Sequence[Callable]]]_ - The function for handling configuration in the Workflow Builder -- `execute` _Optional[Union[Callable[..., Optional[BoltResponse]], AsyncListener, Sequence[Callable]]]_ - The function for handling the step execution +Refer to https://docs.slack.dev/legacy/legacy-dialogs/ for details. -#### error +### `error` ```python -def error( - func: Callable[..., Awaitable[Optional[BoltResponse]]]) -> Callable[..., Awaitable[Optional[BoltResponse]]] +error(func) ``` Updates the global error handler. This method can be used as either a decorator or a method. @@ -370,18 +255,15 @@ app.error(custom_error_handler) To learn available arguments for middleware/listeners, see `slack_bolt.kwargs_injection.async_args`'s API document. -**Arguments**: +**Parameters:** -- `func` _Callable[..., Awaitable[Optional[BoltResponse]]]_ - The function that is supposed to be executed - when getting an unhandled error in Bolt app. +- **func** (Callable..., [Awaitable[Optional[BoltResponse]]]) – The function that is supposed to be executed +when getting an unhandled error in Bolt app. -#### event +### `event` ```python -def event( - event: Union[str, Pattern, Dict[str, Optional[Union[str, Sequence[Optional[Union[str, Pattern]]]]]]], - matchers: Optional[Sequence[Callable[..., Awaitable[bool]]]] = None, - middleware: Optional[Sequence[Union[Callable, AsyncMiddleware]]] = None) -> Callable[..., Optional[Callable[..., Awaitable[Optional[BoltResponse]]]]] +event(event, matchers=None, middleware=None) ``` Registers a new event listener. This method can be used as either a decorator or a method. @@ -403,22 +285,92 @@ Refer to https://docs.slack.dev/apis/events-api/ for details of Events API. To learn available arguments for middleware/listeners, see `slack_bolt.kwargs_injection.async_args`'s API document. -**Arguments**: +**Parameters:** + +- **event** (Union[str, Pattern, Dict[str, Optional[Union[str, Sequence[Optional[Union[str, Pattern]]]]]]]) – The conditions that match a request payload. +If you pass a dict for this, you can have type, subtype in the constraint. +- **matchers** (Optional[Sequence[Callable..., [Awaitable[bool]]]]) – A list of listener matcher functions. +Only when all the matchers return True, the listener function can be invoked. +- **middleware** (Optional[Sequence[Union[Callable, AsyncMiddleware]]]) – A list of lister middleware functions. +Only when all the middleware call `next()` method, the listener function can be invoked. + +### `function` + +```python +function(callback_id, matchers=None, middleware=None, auto_acknowledge=True, ack_timeout=3) +``` + +Registers a new Function listener. + +This method can be used as either a decorator or a method. + +```python +# Use this method as a decorator +@app.function("reverse") +async def reverse_string(ack: AsyncAck, inputs: dict, complete: AsyncComplete, fail: AsyncFail): + try: + await ack() + string_to_reverse = inputs["stringToReverse"] + await complete({"reverseString": string_to_reverse[::-1]}) + except Exception as e: + await fail(f"Cannot reverse string (error: {e})") + raise e + +# Pass a function to this method +app.function("reverse")(reverse_string) +``` + +To learn available arguments for middleware/listeners, see `slack_bolt.kwargs_injection.async_args`'s API document. + +**Parameters:** + +- **callback_id** (Union[str, Pattern]) – The callback id to identify the function +- **matchers** (Optional[Sequence[Callable..., [Awaitable[bool]]]]) – A list of listener matcher functions. +Only when all the matchers return True, the listener function can be invoked. +- **middleware** (Optional[Sequence[Union[Callable, AsyncMiddleware]]]) – A list of lister middleware functions. +Only when all the middleware call `next()` method, the listener function can be invoked. +- **auto_acknowledge** (bool) – Whether Bolt automatically acknowledges the function execution event on the +listener's behalf. When False, your listener must call `ack()` itself within `ack_timeout` +seconds (Default: True). +- **ack_timeout** (int) – The number of seconds to wait for the listener to call `ack()`. +Only takes effect when `auto_acknowledge` is False (Default: 3). + +### `global_shortcut` + +```python +global_shortcut(callback_id, matchers=None, middleware=None) +``` + +Registers a new global shortcut listener. + +### `installation_store` + +```python +installation_store: Optional[AsyncInstallationStore] +``` -- `event` _Union[str, Pattern, Dict[str, Optional[Union[str, Sequence[Optional[Union[str, Pattern]]]]]]]_ - The conditions that match a request payload. - If you pass a dict for this, you can have type, subtype in the constraint. -- `matchers` _Optional[Sequence[Callable[..., Awaitable[bool]]]]_ - A list of listener matcher functions. - Only when all the matchers return True, the listener function can be invoked. -- `middleware` _Optional[Sequence[Union[Callable, AsyncMiddleware]]]_ - A list of lister middleware functions. - Only when all the middleware call `next()` method, the listener function can be invoked. +The `slack_sdk.oauth.AsyncInstallationStore` that can be used in the `authorize` middleware. -#### message +### `listener_runner` ```python -def message( - keyword: Union[str, Pattern] = '', - matchers: Optional[Sequence[Callable[..., Awaitable[bool]]]] = None, - middleware: Optional[Sequence[Union[Callable, AsyncMiddleware]]] = None) -> Callable[..., Optional[Callable[..., Awaitable[Optional[BoltResponse]]]]] +listener_runner: AsyncioListenerRunner +``` + +The asyncio-based executor for asynchronously running listeners. + +### `logger` + +```python +logger: logging.Logger +``` + +The logger this app uses. + +### `message` + +```python +message(keyword='', matchers=None, middleware=None) ``` Registers a new message event listener. This method can be used as either a decorator or a method. @@ -440,104 +392,130 @@ Refer to https://docs.slack.dev/reference/events/message/ for details of `messag To learn available arguments for middleware/listeners, see `slack_bolt.kwargs_injection.async_args`'s API document. -**Arguments**: +**Parameters:** -- `keyword` _Union[str, Pattern]_ - The keyword to match -- `matchers` _Optional[Sequence[Callable[..., Awaitable[bool]]]]_ - A list of listener matcher functions. - Only when all the matchers return True, the listener function can be invoked. -- `middleware` _Optional[Sequence[Union[Callable, AsyncMiddleware]]]_ - A list of lister middleware functions. - Only when all the middleware call `next()` method, the listener function can be invoked. +- **keyword** (Union[str, Pattern]) – The keyword to match +- **matchers** (Optional[Sequence[Callable..., [Awaitable[bool]]]]) – A list of listener matcher functions. +Only when all the matchers return True, the listener function can be invoked. +- **middleware** (Optional[Sequence[Union[Callable, AsyncMiddleware]]]) – A list of lister middleware functions. +Only when all the middleware call `next()` method, the listener function can be invoked. -#### function +### `message_shortcut` ```python -def function( - callback_id: Union[str, Pattern], - matchers: Optional[Sequence[Callable[..., Awaitable[bool]]]] = None, - middleware: Optional[Sequence[Union[Callable, AsyncMiddleware]]] = None, - auto_acknowledge: bool = True, - ack_timeout: int = 3) -> Callable[..., Optional[Callable[..., Awaitable[BoltResponse]]]] +message_shortcut(callback_id, matchers=None, middleware=None) ``` -Registers a new Function listener. +Registers a new message shortcut listener. + +### `middleware` + +```python +middleware(*args) +``` + +Registers a new middleware to this app. This method can be used as either a decorator or a method. ```python # Use this method as a decorator -@app.function("reverse") -async def reverse_string(ack: AsyncAck, inputs: dict, complete: AsyncComplete, fail: AsyncFail): - try: - await ack() - string_to_reverse = inputs["stringToReverse"] - await complete({"reverseString": string_to_reverse[::-1]}) - except Exception as e: - await fail(f"Cannot reverse string (error: {e})") - raise e +@app.middleware +async def middleware_func(logger, body, next): + logger.info(f"request body: {body}") + await next() # Pass a function to this method -app.function("reverse")(reverse_string) +app.middleware(middleware_func) ``` To learn available arguments for middleware/listeners, see `slack_bolt.kwargs_injection.async_args`'s API document. -**Arguments**: +**Parameters:** -- `callback_id` _Union[str, Pattern]_ - The callback id to identify the function -- `matchers` _Optional[Sequence[Callable[..., Awaitable[bool]]]]_ - A list of listener matcher functions. - Only when all the matchers return True, the listener function can be invoked. -- `middleware` _Optional[Sequence[Union[Callable, AsyncMiddleware]]]_ - A list of lister middleware functions. - Only when all the middleware call `next()` method, the listener function can be invoked. -- `auto_acknowledge` _bool_ - Whether Bolt automatically acknowledges the function execution event on the - listener's behalf. When False, your listener must call `ack()` itself within `ack_timeout` - seconds (Default: True). -- `ack_timeout` _int_ - The number of seconds to wait for the listener to call `ack()`. - Only takes effect when `auto_acknowledge` is False (Default: 3). +- ***args** – A function that works as a global middleware. -#### command +### `name` ```python -def command( - command: Union[str, Pattern], - matchers: Optional[Sequence[Callable[..., Awaitable[bool]]]] = None, - middleware: Optional[Sequence[Union[Callable, AsyncMiddleware]]] = None) -> Callable[..., Optional[Callable[..., Awaitable[Optional[BoltResponse]]]]] +name: str ``` -Registers a new slash command listener. +The name of this app (default: the filename). + +### `oauth_flow` + +```python +oauth_flow: Optional[AsyncOAuthFlow] +``` + +Configured `OAuthFlow` object if exists. + +### `options` + +```python +options(constraints, matchers=None, middleware=None) +``` + +Registers a new options listener. This method can be used as either a decorator or a method. ```python # Use this method as a decorator -@app.command("/echo") -async def repeat_text(ack, say, command): - # Acknowledge command request - await ack() - await say(f"{command['text']}") +@app.options("menu_selection") +async def show_menu_options(ack): + options = [ + { + "text": {"type": "plain_text", "text": "Option 1"}, + "value": "1-1", + }, + { + "text": {"type": "plain_text", "text": "Option 2"}, + "value": "1-2", + }, + ] + await ack(options=options) # Pass a function to this method -app.command("/echo")(repeat_text) +app.options("menu_selection")(show_menu_options) ``` -Refer to https://docs.slack.dev/interactivity/implementing-slash-commands/ for details of Slash Commands. +Refer to the following documents for details: + +* https://docs.slack.dev/reference/block-kit/block-elements/select-menu-element#external_select +* https://docs.slack.dev/reference/block-kit/block-elements/multi-select-menu-element#external_multi_select To learn available arguments for middleware/listeners, see `slack_bolt.kwargs_injection.async_args`'s API document. -**Arguments**: +**Parameters:** + +- **constraints** (Union[str, Pattern, Dict[str, Union[str, Pattern]]]) – The conditions that match a request payload +- **matchers** (Optional[Sequence[Callable..., [Awaitable[bool]]]]) – A list of listener matcher functions. +Only when all the matchers return True, the listener function can be invoked. +- **middleware** (Optional[Sequence[Union[Callable, AsyncMiddleware]]]) – A list of lister middleware functions. +Only when all the middleware call `next()` method, the listener function can be invoked. + +### `server` + +```python +server(port=3000, path='/slack/events', host=None) +``` + +Configure a web server using AIOHTTP. + +Refer to https://docs.aiohttp.org/ for more details about AIOHTTP. + +**Parameters:** -- `command` _Union[str, Pattern]_ - The conditions that match a request payload -- `matchers` _Optional[Sequence[Callable[..., Awaitable[bool]]]]_ - A list of listener matcher functions. - Only when all the matchers return True, the listener function can be invoked. -- `middleware` _Optional[Sequence[Union[Callable, AsyncMiddleware]]]_ - A list of lister middleware functions. - Only when all the middleware call `next()` method, the listener function can be invoked. +- **port** (int) – The port to listen on (Default: 3000) +- **path** (str) – The path to handle request from Slack (Default: `/slack/events`) +- **host** (Optional[str]) – The hostname to serve the web endpoints. (Default: 0.0.0.0) -#### shortcut +### `shortcut` ```python -def shortcut( - constraints: Union[str, Pattern, Dict[str, Union[str, Pattern]]], - matchers: Optional[Sequence[Callable[..., Awaitable[bool]]]] = None, - middleware: Optional[Sequence[Union[Callable, AsyncMiddleware]]] = None) -> Callable[..., Optional[Callable[..., Awaitable[Optional[BoltResponse]]]]] +shortcut(constraints, matchers=None, middleware=None) ``` Registers a new shortcut listener. @@ -566,130 +544,85 @@ Refer to https://docs.slack.dev/interactivity/implementing-shortcuts/ for detail To learn available arguments for middleware/listeners, see `slack_bolt.kwargs_injection.async_args`'s API document. -**Arguments**: +**Parameters:** -- `constraints` _Union[str, Pattern, Dict[str, Union[str, Pattern]]]_ - The conditions that match a request payload. -- `matchers` _Optional[Sequence[Callable[..., Awaitable[bool]]]]_ - A list of listener matcher functions. - Only when all the matchers return True, the listener function can be invoked. -- `middleware` _Optional[Sequence[Union[Callable, AsyncMiddleware]]]_ - A list of lister middleware functions. - Only when all the middleware call `next()` method, the listener function can be invoked. +- **constraints** (Union[str, Pattern, Dict[str, Union[str, Pattern]]]) – The conditions that match a request payload. +- **matchers** (Optional[Sequence[Callable..., [Awaitable[bool]]]]) – A list of listener matcher functions. +Only when all the matchers return True, the listener function can be invoked. +- **middleware** (Optional[Sequence[Union[Callable, AsyncMiddleware]]]) – A list of lister middleware functions. +Only when all the middleware call `next()` method, the listener function can be invoked. -#### global\_shortcut +### `start` ```python -def global_shortcut( - callback_id: Union[str, Pattern], - matchers: Optional[Sequence[Callable[..., Awaitable[bool]]]] = None, - middleware: Optional[Sequence[Union[Callable, AsyncMiddleware]]] = None) -> Callable[..., Optional[Callable[..., Awaitable[Optional[BoltResponse]]]]] +start(port=3000, path='/slack/events', host=None) ``` -Registers a new global shortcut listener. +Start a web server using AIOHTTP. -#### message\_shortcut +Refer to https://docs.aiohttp.org/ for more details about AIOHTTP. -```python -def message_shortcut( - callback_id: Union[str, Pattern], - matchers: Optional[Sequence[Callable[..., Awaitable[bool]]]] = None, - middleware: Optional[Sequence[Union[Callable, AsyncMiddleware]]] = None) -> Callable[..., Optional[Callable[..., Awaitable[Optional[BoltResponse]]]]] -``` +**Parameters:** -Registers a new message shortcut listener. +- **port** (int) – The port to listen on (Default: 3000) +- **path** (str) – The path to handle request from Slack (Default: `/slack/events`) +- **host** (Optional[str]) – The hostname to serve the web endpoints. (Default: 0.0.0.0) -#### action +### `step` ```python -def action( - constraints: Union[str, Pattern, Dict[str, Union[str, Pattern]]], - matchers: Optional[Sequence[Callable[..., Awaitable[bool]]]] = None, - middleware: Optional[Sequence[Union[Callable, AsyncMiddleware]]] = None) -> Callable[..., Optional[Callable[..., Awaitable[Optional[BoltResponse]]]]] +step(callback_id, edit=None, save=None, execute=None) ``` -Registers a new action listener. This method can be used as either a decorator or a method. - -```python -# Use this method as a decorator -@app.action("approve_button") -async def update_message(ack): - await ack() - -# Pass a function to this method -app.action("approve_button")(update_message) -``` - -* Refer to https://docs.slack.dev/reference/interaction-payloads/block_actions-payload/ for actions in `blocks`. -* Refer to https://docs.slack.dev/legacy/legacy-messaging/legacy-message-buttons/ for actions in `attachments`. -* Refer to https://docs.slack.dev/legacy/legacy-dialogs/ for actions in dialogs. - -To learn available arguments for middleware/listeners, see `slack_bolt.kwargs_injection.async_args`'s API document. - -**Arguments**: - -- `constraints` _Union[str, Pattern, Dict[str, Union[str, Pattern]]]_ - The conditions that match a request payload -- `matchers` _Optional[Sequence[Callable[..., Awaitable[bool]]]]_ - A list of listener matcher functions. - Only when all the matchers return True, the listener function can be invoked. -- `middleware` _Optional[Sequence[Union[Callable, AsyncMiddleware]]]_ - A list of lister middleware functions. - Only when all the middleware call `next()` method, the listener function can be invoked. - -#### block\_action - -```python -def block_action( - constraints: Union[str, Pattern, Dict[str, Union[str, Pattern]]], - matchers: Optional[Sequence[Callable[..., Awaitable[bool]]]] = None, - middleware: Optional[Sequence[Union[Callable, AsyncMiddleware]]] = None) -> Callable[..., Optional[Callable[..., Awaitable[Optional[BoltResponse]]]]] -``` +Deprecated: register a new step from app listener. -Registers a new `block_actions` action listener. +Steps from apps for legacy workflows are now deprecated. +Use new custom steps: https://docs.slack.dev/workflows/workflow-steps/ -Refer to https://docs.slack.dev/reference/interaction-payloads/block_actions-payload/ for details. +Registers a new step from app listener. -#### attachment\_action +Unlike others, this method doesn't behave as a decorator. +If you want to register a step from app by a decorator, use `AsyncWorkflowStepBuilder`'s methods. ```python -def attachment_action( - callback_id: Union[str, Pattern], - matchers: Optional[Sequence[Callable[..., Awaitable[bool]]]] = None, - middleware: Optional[Sequence[Union[Callable, AsyncMiddleware]]] = None) -> Callable[..., Optional[Callable[..., Awaitable[Optional[BoltResponse]]]]] +# Create a new WorkflowStep instance +from slack_bolt.workflows.async_step import AsyncWorkflowStep +ws = AsyncWorkflowStep( + callback_id="add_task", + edit=edit, + save=save, + execute=execute, +) +# Pass Step to set up listeners +app.step(ws) ``` -Registers a new `interactive_message` action listener. - -Refer to https://docs.slack.dev/legacy/legacy-messaging/legacy-message-buttons/ for details. - -#### dialog\_submission +Refer to https://docs.slack.dev/legacy/legacy-steps-from-apps/ for details of steps from apps. -```python -def dialog_submission( - callback_id: Union[str, Pattern], - matchers: Optional[Sequence[Callable[..., Awaitable[bool]]]] = None, - middleware: Optional[Sequence[Union[Callable, AsyncMiddleware]]] = None) -> Callable[..., Optional[Callable[..., Awaitable[Optional[BoltResponse]]]]] -``` +To learn available arguments for middleware/listeners, see `slack_bolt.kwargs_injection.async_args`'s API document. +For further information about AsyncWorkflowStep specific function arguments +such as `configure`, `update`, `complete`, and `fail`, +refer to the `async` prefixed ones in `slack_bolt.workflows.step.utilities` API documents. -Registers a new `dialog_submission` listener. +**Parameters:** -Refer to https://docs.slack.dev/legacy/legacy-dialogs/ for details. +- **callback_id** (Union[str, Pattern, AsyncWorkflowStep, AsyncWorkflowStepBuilder]) – The Callback ID for this step from app +- **edit** (Optional[Union[Callable..., [Optional[BoltResponse]], AsyncListener, Sequence[Callable]]]) – The function for displaying a modal in the Workflow Builder +- **save** (Optional[Union[Callable..., [Optional[BoltResponse]], AsyncListener, Sequence[Callable]]]) – The function for handling configuration in the Workflow Builder +- **execute** (Optional[Union[Callable..., [Optional[BoltResponse]], AsyncListener, Sequence[Callable]]]) – The function for handling the step execution -#### dialog\_cancellation +### `use` ```python -def dialog_cancellation( - callback_id: Union[str, Pattern], - matchers: Optional[Sequence[Callable[..., Awaitable[bool]]]] = None, - middleware: Optional[Sequence[Union[Callable, AsyncMiddleware]]] = None) -> Callable[..., Optional[Callable[..., Awaitable[Optional[BoltResponse]]]]] +use(*args) ``` -Registers a new `dialog_cancellation` listener. - -Refer to https://docs.slack.dev/legacy/legacy-dialogs/ for details. +Refer to `AsyncApp#middleware()` method's docstring for details. -#### view +### `view` ```python -def view( - constraints: Union[str, Pattern, Dict[str, Union[str, Pattern]]], - matchers: Optional[Sequence[Callable[..., Awaitable[bool]]]] = None, - middleware: Optional[Sequence[Union[Callable, AsyncMiddleware]]] = None) -> Callable[..., Optional[Callable[..., Awaitable[Optional[BoltResponse]]]]] +view(constraints, matchers=None, middleware=None) ``` Registers a new `view_submission`/`view_closed` event listener. @@ -722,129 +655,59 @@ Refer to https://docs.slack.dev/reference/interaction-payloads/view-interactions To learn available arguments for middleware/listeners, see `slack_bolt.kwargs_injection.async_args`'s API document. -**Arguments**: +**Parameters:** -- `constraints` _Union[str, Pattern, Dict[str, Union[str, Pattern]]]_ - The conditions that match a request payload -- `matchers` _Optional[Sequence[Callable[..., Awaitable[bool]]]]_ - A list of listener matcher functions. - Only when all the matchers return True, the listener function can be invoked. -- `middleware` _Optional[Sequence[Union[Callable, AsyncMiddleware]]]_ - A list of lister middleware functions. - Only when all the middleware call `next()` method, the listener function can be invoked. +- **constraints** (Union[str, Pattern, Dict[str, Union[str, Pattern]]]) – The conditions that match a request payload +- **matchers** (Optional[Sequence[Callable..., [Awaitable[bool]]]]) – A list of listener matcher functions. +Only when all the matchers return True, the listener function can be invoked. +- **middleware** (Optional[Sequence[Union[Callable, AsyncMiddleware]]]) – A list of lister middleware functions. +Only when all the middleware call `next()` method, the listener function can be invoked. -#### view\_submission +### `view_closed` ```python -def view_submission( - constraints: Union[str, Pattern], - matchers: Optional[Sequence[Callable[..., Awaitable[bool]]]] = None, - middleware: Optional[Sequence[Union[Callable, AsyncMiddleware]]] = None) -> Callable[..., Optional[Callable[..., Awaitable[Optional[BoltResponse]]]]] -``` - -Registers a new `view_submission` listener. - -Refer to https://docs.slack.dev/reference/interaction-payloads/view-interactions-payload/#view_submission for -details. - -#### view\_closed - -```python -def view_closed( - constraints: Union[str, Pattern], - matchers: Optional[Sequence[Callable[..., Awaitable[bool]]]] = None, - middleware: Optional[Sequence[Union[Callable, AsyncMiddleware]]] = None) -> Callable[..., Optional[Callable[..., Awaitable[Optional[BoltResponse]]]]] +view_closed(constraints, matchers=None, middleware=None) ``` Registers a new `view_closed` listener. Refer to https://docs.slack.dev/reference/interaction-payloads/view-interactions-payload/#view_closed for details. -#### options +### `view_submission` ```python -def options( - constraints: Union[str, Pattern, Dict[str, Union[str, Pattern]]], - matchers: Optional[Sequence[Callable[..., Awaitable[bool]]]] = None, - middleware: Optional[Sequence[Union[Callable, AsyncMiddleware]]] = None) -> Callable[..., Optional[Callable[..., Awaitable[Optional[BoltResponse]]]]] -``` - -Registers a new options listener. - -This method can be used as either a decorator or a method. - -```python -# Use this method as a decorator -@app.options("menu_selection") -async def show_menu_options(ack): - options = [ - { - "text": {"type": "plain_text", "text": "Option 1"}, - "value": "1-1", - }, - { - "text": {"type": "plain_text", "text": "Option 2"}, - "value": "1-2", - }, - ] - await ack(options=options) - -# Pass a function to this method -app.options("menu_selection")(show_menu_options) +view_submission(constraints, matchers=None, middleware=None) ``` -Refer to the following documents for details: - -* https://docs.slack.dev/reference/block-kit/block-elements/select-menu-element#external_select -* https://docs.slack.dev/reference/block-kit/block-elements/multi-select-menu-element#external_multi_select - -To learn available arguments for middleware/listeners, see `slack_bolt.kwargs_injection.async_args`'s API document. - -**Arguments**: +Registers a new `view_submission` listener. -- `constraints` _Union[str, Pattern, Dict[str, Union[str, Pattern]]]_ - The conditions that match a request payload -- `matchers` _Optional[Sequence[Callable[..., Awaitable[bool]]]]_ - A list of listener matcher functions. - Only when all the matchers return True, the listener function can be invoked. -- `middleware` _Optional[Sequence[Union[Callable, AsyncMiddleware]]]_ - A list of lister middleware functions. - Only when all the middleware call `next()` method, the listener function can be invoked. +Refer to https://docs.slack.dev/reference/interaction-payloads/view-interactions-payload/#view_submission for +details. -#### block\_suggestion +### `web_app` ```python -def block_suggestion( - action_id: Union[str, Pattern], - matchers: Optional[Sequence[Callable[..., Awaitable[bool]]]] = None, - middleware: Optional[Sequence[Union[Callable, AsyncMiddleware]]] = None) -> Callable[..., Optional[Callable[..., Awaitable[Optional[BoltResponse]]]]] +web_app(path='/slack/events', port=3000) ``` -Registers a new `block_suggestion` listener. - -#### dialog\_suggestion +Returns a `web.Application` instance for aiohttp-devtools users. ```python -def dialog_suggestion( - callback_id: Union[str, Pattern], - matchers: Optional[Sequence[Callable[..., Awaitable[bool]]]] = None, - middleware: Optional[Sequence[Union[Callable, AsyncMiddleware]]] = None) -> Callable[..., Optional[Callable[..., Awaitable[Optional[BoltResponse]]]]] -``` - -Registers a new `dialog_suggestion` listener. - -Refer to https://docs.slack.dev/legacy/legacy-dialogs/ for details. - -#### default\_tokens\_revoked\_event\_listener +from slack_bolt.async_app import AsyncApp +app = AsyncApp() -```python -def default_tokens_revoked_event_listener( -) -> Callable[..., Awaitable[Optional[BoltResponse]]] -``` +@app.event("app_mention") +async def event_test(body, say, logger): + logger.info(body) + await say("What's up?") -#### default\_app\_uninstalled\_event\_listener +def app_factory(): + return app.web_app() -```python -def default_app_uninstalled_event_listener( -) -> Callable[..., Awaitable[Optional[BoltResponse]]] +# adev runserver --port 3000 --app-factory app_factory async_app.py ``` -#### enable\_token\_revocation\_listeners +**Parameters:** -```python -def enable_token_revocation_listeners() -> None -``` +- **path** (str) – The path to receive incoming requests from Slack +- **port** (int) – The port to listen on (Default: 3000) diff --git a/docs/english/reference/app/async_server.md b/docs/english/reference/app/async_server.md index 9735d9adc..4c218e90f 100644 --- a/docs/english/reference/app/async_server.md +++ b/docs/english/reference/app/async_server.md @@ -3,55 +3,27 @@ sidebar_label: async_server title: slack_bolt.app.async_server --- -## AsyncSlackAppServer Objects +## `AsyncSlackAppServer` ```python -class AsyncSlackAppServer() -``` - -#### port: `int` - -#### path: `str` - -#### host: `str` - -#### bolt\_app: `AsyncApp` - -#### web\_app: `web.Application` - -#### \_\_init\_\_ - -```python -def __init__(port: int, path: str, app: AsyncApp, host: Optional[str] = None) +AsyncSlackAppServer(port, path, app, host=None) ``` Standalone AIOHTTP Web Server. Refer to https://docs.aiohttp.org/en/stable/web.html for details of AIOHTTP. -**Arguments**: +**Parameters:** -- `port` _int_ - The port to listen on -- `path` _str_ - The path to receive incoming requests from Slack -- `app` _AsyncApp_ - The `AsyncApp` instance that is used for processing requests -- `host` _Optional[str]_ - The hostname to serve the web endpoints. (Default: 0.0.0.0) - -#### handle\_get\_requests - -```python -async def handle_get_requests(request: web.Request) -> web.Response -``` - -#### handle\_post\_requests - -```python -async def handle_post_requests(request: web.Request) -> web.Response -``` +- **port** (int) – The port to listen on +- **path** (str) – The path to receive incoming requests from Slack +- **app** (AsyncApp) – The `AsyncApp` instance that is used for processing requests +- **host** (Optional[str]) – The hostname to serve the web endpoints. (Default: 0.0.0.0) -#### start +### `start` ```python -def start(host: Optional[str] = None) -> None +start(host=None) ``` Starts a new web server process. diff --git a/docs/english/reference/app/index.md b/docs/english/reference/app/index.md index 4f1feacb6..e8daeb330 100644 --- a/docs/english/reference/app/index.md +++ b/docs/english/reference/app/index.md @@ -9,48 +9,10 @@ For most use cases, we recommend using `slack_bolt.app.app`. If you already have knowledge about asyncio and prefer the programming model, you can use `slack_bolt.app.async_app` for building async apps. -## Submodules - -- [slack_bolt.app.app](/tools/bolt-python/reference/app/app) -- [slack_bolt.app.async_app](/tools/bolt-python/reference/app/async_app) -- [slack_bolt.app.async_server](/tools/bolt-python/reference/app/async_server) - -## App Objects +## `App` ```python -class App() -``` - -#### \_\_init\_\_ - -```python -def __init__( - *, - logger: Optional[logging.Logger] = None, - name: Optional[str] = None, - process_before_response: bool = False, - raise_error_for_unhandled_request: bool = False, - signing_secret: Optional[str] = None, - token: Optional[str] = None, - token_verification_enabled: bool = True, - client: Optional[WebClient] = None, - before_authorize: Optional[Union[Middleware, Callable[..., Any]]] = None, - authorize: Optional[Callable[..., AuthorizeResult]] = None, - user_facing_authorize_error_message: Optional[str] = None, - installation_store: Optional[InstallationStore] = None, - installation_store_bot_only: Optional[bool] = None, - request_verification_enabled: bool = True, - ignoring_self_events_enabled: bool = True, - ignoring_self_assistant_message_events_enabled: bool = True, - ssl_check_enabled: bool = True, - url_verification_enabled: bool = True, - attaching_function_token_enabled: bool = True, - oauth_settings: Optional[OAuthSettings] = None, - oauth_flow: Optional[OAuthFlow] = None, - verification_token: Optional[str] = None, - listener_executor: Optional[Executor] = None, - assistant_thread_context_store: Optional[AssistantThreadContextStore] = None, - attaching_conversation_kwargs_enabled: bool = True) +App(*, logger=None, name=None, process_before_response=False, raise_error_for_unhandled_request=False, signing_secret=None, token=None, token_verification_enabled=True, client=None, before_authorize=None, authorize=None, user_facing_authorize_error_message=None, installation_store=None, installation_store_bot_only=None, request_verification_enabled=True, ignoring_self_events_enabled=True, ignoring_self_assistant_message_events_enabled=True, ssl_check_enabled=True, url_verification_enabled=True, attaching_function_token_enabled=True, oauth_settings=None, oauth_flow=None, verification_token=None, listener_executor=None, assistant_thread_context_store=None, attaching_conversation_kwargs_enabled=True) ``` Bolt App that provides functionalities to register middleware/listeners. @@ -81,259 +43,210 @@ Refer to https://docs.slack.dev/tools/bolt-python/creating-an-app for details. If you would like to build an OAuth app for enabling the app to run with multiple workspaces, refer to https://docs.slack.dev/tools/bolt-python/concepts/authenticating-oauth to learn how to configure the app. -**Arguments**: - -- `logger` _Optional[logging.Logger]_ - The custom logger that can be used in this app. -- `name` _Optional[str]_ - The application name that will be used in logging. If absent, the source file name will be used. -- `process_before_response` _bool_ - True if this app runs on Function as a Service. (Default: False) -- `raise_error_for_unhandled_request` _bool_ - True if you want to raise exceptions for unhandled requests - and use @app.error listeners instead of - the built-in handler, which pints warning logs and returns 404 to Slack (Default: False) -- `signing_secret` _Optional[str]_ - The Signing Secret value used for verifying requests from Slack. -- `token` _Optional[str]_ - The bot/user access token required only for single-workspace app. -- `token_verification_enabled` _bool_ - Verifies the validity of the given token if True. -- `client` _Optional[WebClient]_ - The singleton `slack_sdk.WebClient` instance for this app. -- `before_authorize` _Optional[Union[Middleware, Callable[..., Any]]]_ - A global middleware that can be executed right before authorize function -- `authorize` _Optional[Callable[..., AuthorizeResult]]_ - The function to authorize an incoming request from Slack - by checking if there is a team/user in the installation data. -- `user_facing_authorize_error_message` _Optional[str]_ - The user-facing error message to display - when the app is installed but the installation is not managed by this app's installation store -- `installation_store` _Optional[InstallationStore]_ - The module offering save/find operations of installation data -- `installation_store_bot_only` _Optional[bool]_ - Use `InstallationStore#find_bot()` if True (Default: False) -- `request_verification_enabled` _bool_ - False if you would like to disable the built-in middleware (Default: True). - `RequestVerification` is a built-in middleware that verifies the signature in HTTP Mode requests. - Make sure if it's safe enough when you turn a built-in middleware off. - We strongly recommend using RequestVerification for better security. - If you have a proxy that verifies request signature in front of the Bolt app, - it's totally fine to disable RequestVerification to avoid duplication of work. - Don't turn it off just for easiness of development. -- `ignoring_self_events_enabled` _bool_ - False if you would like to disable the built-in middleware (Default: True). - `IgnoringSelfEvents` is a built-in middleware that enables Bolt apps to easily skip the events - generated by this app's bot user (this is useful for avoiding code error causing an infinite loop). -- `ignoring_self_assistant_message_events_enabled` _bool_ - False if you would like to disable the built-in middleware. - `IgnoringSelfEvents` for this app's bot user message events within an assistant thread - This is useful for avoiding code error causing an infinite loop; Default: True -- `url_verification_enabled` _bool_ - False if you would like to disable the built-in middleware (Default: True). - `UrlVerification` is a built-in middleware that handles url_verification requests - that verify the endpoint for Events API in HTTP Mode requests. -- `attaching_function_token_enabled` _bool_ - False if you would like to disable the built-in middleware (Default: True). - `AttachingFunctionToken` is a built-in middleware that injects the just-in-time workflow-execution tokens - when your app receives `function_executed` or interactivity events scoped to a custom step. -- `ssl_check_enabled` _bool_ - bool = False if you would like to disable the built-in middleware (Default: True). - `SslCheck` is a built-in middleware that handles ssl_check requests from Slack. -- `oauth_settings` _Optional[OAuthSettings]_ - The settings related to Slack app installation flow (OAuth flow) -- `oauth_flow` _Optional[OAuthFlow]_ - Instantiated `slack_bolt.oauth.OAuthFlow`. This is always prioritized over oauth_settings. -- `verification_token` _Optional[str]_ - Deprecated verification mechanism. This can be used only for ssl_check requests. -- `listener_executor` _Optional[Executor]_ - Custom executor to run background tasks. If absent, the default `ThreadPoolExecutor` will - be used. -- `assistant_thread_context_store` _Optional[AssistantThreadContextStore]_ - Custom AssistantThreadContext store (Default: the built-in implementation, - which uses a parent message's metadata to store the latest context) -- `attaching_conversation_kwargs_enabled` _bool_ - False if you would like to disable the built-in - middleware (Default: True). `AttachingConversationKwargs` is a built-in middleware that attaches - conversation-specific listener arguments (such as `say`, `set_status`, `say_stream`, and - `set_suggested_prompts`) for assistant thread and direct message events. - -#### name - -```python -@property -def name() -> str +**Parameters:** + +- **logger** (Optional[Logger]) – The custom logger that can be used in this app. +- **name** (Optional[str]) – The application name that will be used in logging. If absent, the source file name will be used. +- **process_before_response** (bool) – True if this app runs on Function as a Service. (Default: False) +- **raise_error_for_unhandled_request** (bool) – True if you want to raise exceptions for unhandled requests +and use @app.error listeners instead of +the built-in handler, which pints warning logs and returns 404 to Slack (Default: False) +- **signing_secret** (Optional[str]) – The Signing Secret value used for verifying requests from Slack. +- **token** (Optional[str]) – The bot/user access token required only for single-workspace app. +- **token_verification_enabled** (bool) – Verifies the validity of the given token if True. +- **client** (Optional[WebClient]) – The singleton `slack_sdk.WebClient` instance for this app. +- **before_authorize** (Optional[Union[Middleware, Callable..., [Any]]]) – A global middleware that can be executed right before authorize function +- **authorize** (Optional[Callable..., [AuthorizeResult]]) – The function to authorize an incoming request from Slack +by checking if there is a team/user in the installation data. +- **user_facing_authorize_error_message** (Optional[str]) – The user-facing error message to display +when the app is installed but the installation is not managed by this app's installation store +- **installation_store** (Optional[InstallationStore]) – The module offering save/find operations of installation data +- **installation_store_bot_only** (Optional[bool]) – Use `InstallationStore#find_bot()` if True (Default: False) +- **request_verification_enabled** (bool) – False if you would like to disable the built-in middleware (Default: True). +`RequestVerification` is a built-in middleware that verifies the signature in HTTP Mode requests. +Make sure if it's safe enough when you turn a built-in middleware off. +We strongly recommend using RequestVerification for better security. +If you have a proxy that verifies request signature in front of the Bolt app, +it's totally fine to disable RequestVerification to avoid duplication of work. +Don't turn it off just for easiness of development. +- **ignoring_self_events_enabled** (bool) – False if you would like to disable the built-in middleware (Default: True). +`IgnoringSelfEvents` is a built-in middleware that enables Bolt apps to easily skip the events +generated by this app's bot user (this is useful for avoiding code error causing an infinite loop). +- **ignoring_self_assistant_message_events_enabled** (bool) – False if you would like to disable the built-in middleware. +`IgnoringSelfEvents` for this app's bot user message events within an assistant thread +This is useful for avoiding code error causing an infinite loop; Default: True +- **url_verification_enabled** (bool) – False if you would like to disable the built-in middleware (Default: True). +`UrlVerification` is a built-in middleware that handles url_verification requests +that verify the endpoint for Events API in HTTP Mode requests. +- **attaching_function_token_enabled** (bool) – False if you would like to disable the built-in middleware (Default: True). +`AttachingFunctionToken` is a built-in middleware that injects the just-in-time workflow-execution tokens +when your app receives `function_executed` or interactivity events scoped to a custom step. +- **ssl_check_enabled** (bool) – bool = False if you would like to disable the built-in middleware (Default: True). +`SslCheck` is a built-in middleware that handles ssl_check requests from Slack. +- **oauth_settings** (Optional[OAuthSettings]) – The settings related to Slack app installation flow (OAuth flow) +- **oauth_flow** (Optional[OAuthFlow]) – Instantiated `slack_bolt.oauth.OAuthFlow`. This is always prioritized over oauth_settings. +- **verification_token** (Optional[str]) – Deprecated verification mechanism. This can be used only for ssl_check requests. +- **listener_executor** (Optional[Executor]) – Custom executor to run background tasks. If absent, the default `ThreadPoolExecutor` will +be used. +- **assistant_thread_context_store** (Optional[AssistantThreadContextStore]) – Custom AssistantThreadContext store (Default: the built-in implementation, +which uses a parent message's metadata to store the latest context) +- **attaching_conversation_kwargs_enabled** (bool) – False if you would like to disable the built-in +middleware (Default: True). `AttachingConversationKwargs` is a built-in middleware that attaches +conversation-specific listener arguments (such as `say`, `set_status`, `say_stream`, and +`set_suggested_prompts`) for assistant thread and direct message events. + +### `action` + +```python +action(constraints, matchers=None, middleware=None) ``` -The name of this app (default: the filename). - -#### oauth\_flow - -```python -@property -def oauth_flow() -> Optional[OAuthFlow] -``` - -Configured `OAuthFlow` object if exists. - -#### logger - -```python -@property -def logger() -> logging.Logger -``` - -The logger this app uses. - -#### client +Registers a new action listener. This method can be used as either a decorator or a method. ```python -@property -def client() -> WebClient -``` - -The singleton `slack_sdk.WebClient` instance in this app. - -#### installation\_store +# Use this method as a decorator +@app.action("approve_button") +def update_message(ack): + ack() -```python -@property -def installation_store() -> Optional[InstallationStore] +# Pass a function to this method +app.action("approve_button")(update_message) ``` -The `slack_sdk.oauth.InstallationStore` that can be used in the `authorize` middleware. +* Refer to https://docs.slack.dev/reference/interaction-payloads/block_actions-payload/ for actions in `blocks`. +* Refer to https://docs.slack.dev/legacy/legacy-messaging/legacy-message-buttons/ for actions in `attachments`. +* Refer to https://docs.slack.dev/legacy/legacy-dialogs/ for actions in dialogs. -#### listener\_runner +To learn available arguments for middleware/listeners, see `slack_bolt.kwargs_injection.args`'s API document. -```python -@property -def listener_runner() -> ThreadListenerRunner -``` +**Parameters:** -The thread executor for asynchronously running listeners. +- **constraints** (Union[str, Pattern, Dict[str, Union[str, Pattern]]]) – The conditions that match a request payload +- **matchers** (Optional[Sequence[Callable..., [bool]]]) – A list of listener matcher functions. +Only when all the matchers return True, the listener function can be invoked. +- **middleware** (Optional[Sequence[Union[Callable, Middleware]]]) – A list of lister middleware functions. +Only when all the middleware call `next()` method, the listener function can be invoked. -#### process\_before\_response +### `attachment_action` ```python -@property -def process_before_response() -> bool +attachment_action(callback_id, matchers=None, middleware=None) ``` -#### start +Registers a new `interactive_message` action listener. -```python -def start( - port: int = 3000, - path: str = '/slack/events', - http_server_logger_enabled: bool = True) -> None -``` +Refer to https://docs.slack.dev/legacy/legacy-messaging/legacy-message-buttons/ for details. -Starts a web server for local development. +### `block_action` ```python -# With the default settings, `http://localhost:3000/slack/events` -# is available for handling incoming requests from Slack -app.start() +block_action(constraints, matchers=None, middleware=None) ``` -This method internally starts a Web server process built with the `http.server` module. -For production, consider using a production-ready WSGI server such as Gunicorn. - -**Arguments**: +Registers a new `block_actions` action listener. -- `port` _int_ - The port to listen on (Default: 3000) -- `path` _str_ - The path to handle request from Slack (Default: `/slack/events`) -- `http_server_logger_enabled` _bool_ - The flag to enable http.server logging if True (Default: True) +Refer to https://docs.slack.dev/reference/interaction-payloads/block_actions-payload/ for details. -#### dispatch +### `block_suggestion` ```python -def dispatch(req: BoltRequest) -> BoltResponse +block_suggestion(action_id, matchers=None, middleware=None) ``` -Applies all middleware and dispatches an incoming request from Slack to the right code path. - -**Arguments**: - -- `req` _BoltRequest_ - An incoming request from Slack - -**Returns**: - -- `BoltResponse` - The response generated by this Bolt app +Registers a new `block_suggestion` listener. -#### use +### `client` ```python -def use(*args) -> Optional[Callable] +client: WebClient ``` -Registers a new global middleware to this app. This method can be used as either a decorator or a method. - -Refer to `App#middleware()` method's docstring for details. +The singleton `slack_sdk.WebClient` instance in this app. -#### middleware +### `command` ```python -def middleware(*args) -> Optional[Callable] +command(command, matchers=None, middleware=None) ``` -Registers a new middleware to this app. +Registers a new slash command listener. This method can be used as either a decorator or a method. ```python # Use this method as a decorator -@app.middleware -def middleware_func(logger, body, next): - logger.info(f"request body: {body}") - next() +@app.command("/echo") +def repeat_text(ack, say, command): + # Acknowledge command request + ack() + say(f"{command['text']}") # Pass a function to this method -app.middleware(middleware_func) +app.command("/echo")(repeat_text) ``` -Refer to https://docs.slack.dev/tools/bolt-python/concepts/global-middleware for details. +Refer to https://docs.slack.dev/interactivity/implementing-slash-commands/ for details of Slash Commands. To learn available arguments for middleware/listeners, see `slack_bolt.kwargs_injection.args`'s API document. -**Arguments**: +**Parameters:** -- `*args` - A function that works as a global middleware. +- **command** (Union[str, Pattern]) – The conditions that match a request payload +- **matchers** (Optional[Sequence[Callable..., [bool]]]) – A list of listener matcher functions. +Only when all the matchers return True, the listener function can be invoked. +- **middleware** (Optional[Sequence[Union[Callable, Middleware]]]) – A list of lister middleware functions. +Only when all the middleware call `next()` method, the listener function can be invoked. -#### assistant +### `dialog_cancellation` ```python -def assistant(assistant: Assistant) -> Optional[Callable] +dialog_cancellation(callback_id, matchers=None, middleware=None) ``` -#### step +Registers a new `dialog_cancellation` listener. + +Refer to https://docs.slack.dev/legacy/legacy-dialogs/ for details. + +### `dialog_submission` ```python -def step( - callback_id: Union[str, Pattern, WorkflowStep, WorkflowStepBuilder], - edit: Optional[Union[Callable[..., Optional[BoltResponse]], Listener, Sequence[Callable]]] = None, - save: Optional[Union[Callable[..., Optional[BoltResponse]], Listener, Sequence[Callable]]] = None, - execute: Optional[Union[Callable[..., Optional[BoltResponse]], Listener, Sequence[Callable]]] = None) +dialog_submission(callback_id, matchers=None, middleware=None) ``` -Deprecated: register a new step from app listener. +Registers a new `dialog_submission` listener. -Steps from apps for legacy workflows are now deprecated. -Use new custom steps: https://docs.slack.dev/workflows/workflow-steps/ +Refer to https://docs.slack.dev/legacy/legacy-dialogs/ for details. -Registers a new step from app listener. +### `dialog_suggestion` -Unlike others, this method doesn't behave as a decorator. -If you want to register a step from app by a decorator, use `WorkflowStepBuilder`'s methods. +```python +dialog_suggestion(callback_id, matchers=None, middleware=None) +``` + +Registers a new `dialog_suggestion` listener. + +Refer to https://docs.slack.dev/legacy/legacy-dialogs/ for details. + +### `dispatch` ```python -# Create a new WorkflowStep instance -from slack_bolt.workflows.step import WorkflowStep -ws = WorkflowStep( - callback_id="add_task", - edit=edit, - save=save, - execute=execute, -) -# Pass Step to set up listeners -app.step(ws) +dispatch(req) ``` -Refer to https://docs.slack.dev/legacy/legacy-steps-from-apps/ for details of steps from apps. +Applies all middleware and dispatches an incoming request from Slack to the right code path. -To learn available arguments for middleware/listeners, see `slack_bolt.kwargs_injection.args`'s API document. +**Parameters:** -For further information about WorkflowStep specific function arguments -such as `configure`, `update`, `complete`, and `fail`, -refer to `slack_bolt.workflows.step.utilities` API documents. +- **req** (BoltRequest) – An incoming request from Slack -**Arguments**: +**Returns:** -- `callback_id` _Union[str, Pattern, WorkflowStep, WorkflowStepBuilder]_ - The Callback ID for this step from app -- `edit` _Optional[Union[Callable[..., Optional[BoltResponse]], Listener, Sequence[Callable]]]_ - The function for displaying a modal in the Workflow Builder -- `save` _Optional[Union[Callable[..., Optional[BoltResponse]], Listener, Sequence[Callable]]]_ - The function for handling configuration in the Workflow Builder -- `execute` _Optional[Union[Callable[..., Optional[BoltResponse]], Listener, Sequence[Callable]]]_ - The function for handling the step execution +- BoltResponse – The response generated by this Bolt app -#### error +### `error` ```python -def error( - func: Callable[..., Optional[BoltResponse]]) -> Callable[..., Optional[BoltResponse]] +error(func) ``` Updates the global error handler. This method can be used as either a decorator or a method. @@ -351,18 +264,15 @@ app.error(custom_error_handler) To learn available arguments for middleware/listeners, see `slack_bolt.kwargs_injection.args`'s API document. -**Arguments**: +**Parameters:** -- `func` _Callable[..., Optional[BoltResponse]]_ - The function that is supposed to be executed - when getting an unhandled error in Bolt app. +- **func** (Callable..., [Optional[BoltResponse]]) – The function that is supposed to be executed +when getting an unhandled error in Bolt app. -#### event +### `event` ```python -def event( - event: Union[str, Pattern, Dict[str, Optional[Union[str, Sequence[Optional[Union[str, Pattern]]]]]]], - matchers: Optional[Sequence[Callable[..., bool]]] = None, - middleware: Optional[Sequence[Union[Callable, Middleware]]] = None) -> Callable[..., Optional[Callable[..., Optional[BoltResponse]]]] +event(event, matchers=None, middleware=None) ``` Registers a new event listener. This method can be used as either a decorator or a method. @@ -384,22 +294,92 @@ Refer to https://docs.slack.dev/apis/events-api/ for details of Events API. To learn available arguments for middleware/listeners, see `slack_bolt.kwargs_injection.args`'s API document. -**Arguments**: +**Parameters:** + +- **event** (Union[str, Pattern, Dict[str, Optional[Union[str, Sequence[Optional[Union[str, Pattern]]]]]]]) – The conditions that match a request payload. +If you pass a dict for this, you can have type, subtype in the constraint. +- **matchers** (Optional[Sequence[Callable..., [bool]]]) – A list of listener matcher functions. +Only when all the matchers return True, the listener function can be invoked. +- **middleware** (Optional[Sequence[Union[Callable, Middleware]]]) – A list of lister middleware functions. +Only when all the middleware call `next()` method, the listener function can be invoked. + +### `function` + +```python +function(callback_id, matchers=None, middleware=None, auto_acknowledge=True, ack_timeout=3) +``` + +Registers a new Function listener. + +This method can be used as either a decorator or a method. + +```python +# Use this method as a decorator +@app.function("reverse") +def reverse_string(ack: Ack, inputs: dict, complete: Complete, fail: Fail): + try: + ack() + string_to_reverse = inputs["stringToReverse"] + complete(outputs={"reverseString": string_to_reverse[::-1]}) + except Exception as e: + fail(f"Cannot reverse string (error: {e})") + raise e + +# Pass a function to this method +app.function("reverse")(reverse_string) +``` + +To learn available arguments for middleware/listeners, see `slack_bolt.kwargs_injection.args`'s API document. + +**Parameters:** + +- **callback_id** (Union[str, Pattern]) – The callback id to identify the function +- **matchers** (Optional[Sequence[Callable..., [bool]]]) – A list of listener matcher functions. +Only when all the matchers return True, the listener function can be invoked. +- **middleware** (Optional[Sequence[Union[Callable, Middleware]]]) – A list of lister middleware functions. +Only when all the middleware call `next()` method, the listener function can be invoked. +- **auto_acknowledge** (bool) – Whether Bolt automatically acknowledges the function execution event on the +listener's behalf. When False, your listener must call `ack()` itself within `ack_timeout` +seconds (Default: True). +- **ack_timeout** (int) – The number of seconds to wait for the listener to call `ack()`. +Only takes effect when `auto_acknowledge` is False (Default: 3). + +### `global_shortcut` + +```python +global_shortcut(callback_id, matchers=None, middleware=None) +``` + +Registers a new global shortcut listener. + +### `installation_store` + +```python +installation_store: Optional[InstallationStore] +``` + +The `slack_sdk.oauth.InstallationStore` that can be used in the `authorize` middleware. + +### `listener_runner` + +```python +listener_runner: ThreadListenerRunner +``` + +The thread executor for asynchronously running listeners. + +### `logger` + +```python +logger: logging.Logger +``` -- `event` _Union[str, Pattern, Dict[str, Optional[Union[str, Sequence[Optional[Union[str, Pattern]]]]]]]_ - The conditions that match a request payload. - If you pass a dict for this, you can have type, subtype in the constraint. -- `matchers` _Optional[Sequence[Callable[..., bool]]]_ - A list of listener matcher functions. - Only when all the matchers return True, the listener function can be invoked. -- `middleware` _Optional[Sequence[Union[Callable, Middleware]]]_ - A list of lister middleware functions. - Only when all the middleware call `next()` method, the listener function can be invoked. +The logger this app uses. -#### message +### `message` ```python -def message( - keyword: Union[str, Pattern] = '', - matchers: Optional[Sequence[Callable[..., bool]]] = None, - middleware: Optional[Sequence[Union[Callable, Middleware]]] = None) -> Callable[..., Optional[Callable[..., Optional[BoltResponse]]]] +message(keyword='', matchers=None, middleware=None) ``` Registers a new message event listener. This method can be used as either a decorator or a method. @@ -421,104 +401,116 @@ Refer to https://docs.slack.dev/reference/events/message/ for details of `messag To learn available arguments for middleware/listeners, see `slack_bolt.kwargs_injection.args`'s API document. -**Arguments**: +**Parameters:** -- `keyword` _Union[str, Pattern]_ - The keyword to match -- `matchers` _Optional[Sequence[Callable[..., bool]]]_ - A list of listener matcher functions. - Only when all the matchers return True, the listener function can be invoked. -- `middleware` _Optional[Sequence[Union[Callable, Middleware]]]_ - A list of lister middleware functions. - Only when all the middleware call `next()` method, the listener function can be invoked. +- **keyword** (Union[str, Pattern]) – The keyword to match +- **matchers** (Optional[Sequence[Callable..., [bool]]]) – A list of listener matcher functions. +Only when all the matchers return True, the listener function can be invoked. +- **middleware** (Optional[Sequence[Union[Callable, Middleware]]]) – A list of lister middleware functions. +Only when all the middleware call `next()` method, the listener function can be invoked. -#### function +### `message_shortcut` ```python -def function( - callback_id: Union[str, Pattern], - matchers: Optional[Sequence[Callable[..., bool]]] = None, - middleware: Optional[Sequence[Union[Callable, Middleware]]] = None, - auto_acknowledge: bool = True, - ack_timeout: int = 3) -> Callable[..., Optional[Callable[..., Optional[BoltResponse]]]] +message_shortcut(callback_id, matchers=None, middleware=None) ``` -Registers a new Function listener. +Registers a new message shortcut listener. + +### `middleware` + +```python +middleware(*args) +``` + +Registers a new middleware to this app. This method can be used as either a decorator or a method. ```python # Use this method as a decorator -@app.function("reverse") -def reverse_string(ack: Ack, inputs: dict, complete: Complete, fail: Fail): - try: - ack() - string_to_reverse = inputs["stringToReverse"] - complete(outputs={"reverseString": string_to_reverse[::-1]}) - except Exception as e: - fail(f"Cannot reverse string (error: {e})") - raise e +@app.middleware +def middleware_func(logger, body, next): + logger.info(f"request body: {body}") + next() # Pass a function to this method -app.function("reverse")(reverse_string) +app.middleware(middleware_func) ``` +Refer to https://docs.slack.dev/tools/bolt-python/concepts/global-middleware for details. + To learn available arguments for middleware/listeners, see `slack_bolt.kwargs_injection.args`'s API document. -**Arguments**: +**Parameters:** -- `callback_id` _Union[str, Pattern]_ - The callback id to identify the function -- `matchers` _Optional[Sequence[Callable[..., bool]]]_ - A list of listener matcher functions. - Only when all the matchers return True, the listener function can be invoked. -- `middleware` _Optional[Sequence[Union[Callable, Middleware]]]_ - A list of lister middleware functions. - Only when all the middleware call `next()` method, the listener function can be invoked. -- `auto_acknowledge` _bool_ - Whether Bolt automatically acknowledges the function execution event on the - listener's behalf. When False, your listener must call `ack()` itself within `ack_timeout` - seconds (Default: True). -- `ack_timeout` _int_ - The number of seconds to wait for the listener to call `ack()`. - Only takes effect when `auto_acknowledge` is False (Default: 3). +- ***args** – A function that works as a global middleware. -#### command +### `name` ```python -def command( - command: Union[str, Pattern], - matchers: Optional[Sequence[Callable[..., bool]]] = None, - middleware: Optional[Sequence[Union[Callable, Middleware]]] = None) -> Callable[..., Optional[Callable[..., Optional[BoltResponse]]]] +name: str ``` -Registers a new slash command listener. +The name of this app (default: the filename). + +### `oauth_flow` + +```python +oauth_flow: Optional[OAuthFlow] +``` + +Configured `OAuthFlow` object if exists. + +### `options` + +```python +options(constraints, matchers=None, middleware=None) +``` + +Registers a new options listener. This method can be used as either a decorator or a method. ```python # Use this method as a decorator -@app.command("/echo") -def repeat_text(ack, say, command): - # Acknowledge command request - ack() - say(f"{command['text']}") +@app.options("menu_selection") +def show_menu_options(ack): + options = [ + { + "text": {"type": "plain_text", "text": "Option 1"}, + "value": "1-1", + }, + { + "text": {"type": "plain_text", "text": "Option 2"}, + "value": "1-2", + }, + ] + ack(options=options) # Pass a function to this method -app.command("/echo")(repeat_text) +app.options("menu_selection")(show_menu_options) ``` -Refer to https://docs.slack.dev/interactivity/implementing-slash-commands/ for details of Slash Commands. +Refer to the following documents for details: + +* https://docs.slack.dev/reference/block-kit/block-elements/select-menu-element#external_select +* https://docs.slack.dev/reference/block-kit/block-elements/multi-select-menu-element#external_multi_select To learn available arguments for middleware/listeners, see `slack_bolt.kwargs_injection.args`'s API document. -**Arguments**: +**Parameters:** -- `command` _Union[str, Pattern]_ - The conditions that match a request payload -- `matchers` _Optional[Sequence[Callable[..., bool]]]_ - A list of listener matcher functions. - Only when all the matchers return True, the listener function can be invoked. -- `middleware` _Optional[Sequence[Union[Callable, Middleware]]]_ - A list of lister middleware functions. - Only when all the middleware call `next()` method, the listener function can be invoked. +- **constraints** (Union[str, Pattern, Dict[str, Union[str, Pattern]]]) – The conditions that match a request payload +- **matchers** (Optional[Sequence[Callable..., [bool]]]) – A list of listener matcher functions. +Only when all the matchers return True, the listener function can be invoked. +- **middleware** (Optional[Sequence[Union[Callable, Middleware]]]) – A list of lister middleware functions. +Only when all the middleware call `next()` method, the listener function can be invoked. -#### shortcut +### `shortcut` ```python -def shortcut( - constraints: Union[str, Pattern, Dict[str, Union[str, Pattern]]], - matchers: Optional[Sequence[Callable[..., bool]]] = None, - middleware: Optional[Sequence[Union[Callable, Middleware]]] = None) -> Callable[..., Optional[Callable[..., Optional[BoltResponse]]]] +shortcut(constraints, matchers=None, middleware=None) ``` Registers a new shortcut listener. @@ -547,130 +539,95 @@ Refer to https://docs.slack.dev/interactivity/implementing-shortcuts/ for detail To learn available arguments for middleware/listeners, see `slack_bolt.kwargs_injection.args`'s API document. -**Arguments**: +**Parameters:** -- `constraints` _Union[str, Pattern, Dict[str, Union[str, Pattern]]]_ - The conditions that match a request payload. -- `matchers` _Optional[Sequence[Callable[..., bool]]]_ - A list of listener matcher functions. - Only when all the matchers return True, the listener function can be invoked. -- `middleware` _Optional[Sequence[Union[Callable, Middleware]]]_ - A list of lister middleware functions. - Only when all the middleware call `next()` method, the listener function can be invoked. +- **constraints** (Union[str, Pattern, Dict[str, Union[str, Pattern]]]) – The conditions that match a request payload. +- **matchers** (Optional[Sequence[Callable..., [bool]]]) – A list of listener matcher functions. +Only when all the matchers return True, the listener function can be invoked. +- **middleware** (Optional[Sequence[Union[Callable, Middleware]]]) – A list of lister middleware functions. +Only when all the middleware call `next()` method, the listener function can be invoked. -#### global\_shortcut +### `start` ```python -def global_shortcut( - callback_id: Union[str, Pattern], - matchers: Optional[Sequence[Callable[..., bool]]] = None, - middleware: Optional[Sequence[Union[Callable, Middleware]]] = None) -> Callable[..., Optional[Callable[..., Optional[BoltResponse]]]] +start(port=3000, path='/slack/events', http_server_logger_enabled=True) ``` -Registers a new global shortcut listener. - -#### message\_shortcut +Starts a web server for local development. ```python -def message_shortcut( - callback_id: Union[str, Pattern], - matchers: Optional[Sequence[Callable[..., bool]]] = None, - middleware: Optional[Sequence[Union[Callable, Middleware]]] = None) -> Callable[..., Optional[Callable[..., Optional[BoltResponse]]]] +# With the default settings, `http://localhost:3000/slack/events` +# is available for handling incoming requests from Slack +app.start() ``` -Registers a new message shortcut listener. +This method internally starts a Web server process built with the `http.server` module. +For production, consider using a production-ready WSGI server such as Gunicorn. -#### action +**Parameters:** -```python -def action( - constraints: Union[str, Pattern, Dict[str, Union[str, Pattern]]], - matchers: Optional[Sequence[Callable[..., bool]]] = None, - middleware: Optional[Sequence[Union[Callable, Middleware]]] = None) -> Callable[..., Optional[Callable[..., Optional[BoltResponse]]]] -``` +- **port** (int) – The port to listen on (Default: 3000) +- **path** (str) – The path to handle request from Slack (Default: `/slack/events`) +- **http_server_logger_enabled** (bool) – The flag to enable http.server logging if True (Default: True) -Registers a new action listener. This method can be used as either a decorator or a method. +### `step` ```python -# Use this method as a decorator -@app.action("approve_button") -def update_message(ack): - ack() - -# Pass a function to this method -app.action("approve_button")(update_message) +step(callback_id, edit=None, save=None, execute=None) ``` -* Refer to https://docs.slack.dev/reference/interaction-payloads/block_actions-payload/ for actions in `blocks`. -* Refer to https://docs.slack.dev/legacy/legacy-messaging/legacy-message-buttons/ for actions in `attachments`. -* Refer to https://docs.slack.dev/legacy/legacy-dialogs/ for actions in dialogs. - -To learn available arguments for middleware/listeners, see `slack_bolt.kwargs_injection.args`'s API document. - -**Arguments**: - -- `constraints` _Union[str, Pattern, Dict[str, Union[str, Pattern]]]_ - The conditions that match a request payload -- `matchers` _Optional[Sequence[Callable[..., bool]]]_ - A list of listener matcher functions. - Only when all the matchers return True, the listener function can be invoked. -- `middleware` _Optional[Sequence[Union[Callable, Middleware]]]_ - A list of lister middleware functions. - Only when all the middleware call `next()` method, the listener function can be invoked. - -#### block\_action - -```python -def block_action( - constraints: Union[str, Pattern, Dict[str, Union[str, Pattern]]], - matchers: Optional[Sequence[Callable[..., bool]]] = None, - middleware: Optional[Sequence[Union[Callable, Middleware]]] = None) -> Callable[..., Optional[Callable[..., Optional[BoltResponse]]]] -``` +Deprecated: register a new step from app listener. -Registers a new `block_actions` action listener. +Steps from apps for legacy workflows are now deprecated. +Use new custom steps: https://docs.slack.dev/workflows/workflow-steps/ -Refer to https://docs.slack.dev/reference/interaction-payloads/block_actions-payload/ for details. +Registers a new step from app listener. -#### attachment\_action +Unlike others, this method doesn't behave as a decorator. +If you want to register a step from app by a decorator, use `WorkflowStepBuilder`'s methods. ```python -def attachment_action( - callback_id: Union[str, Pattern], - matchers: Optional[Sequence[Callable[..., bool]]] = None, - middleware: Optional[Sequence[Union[Callable, Middleware]]] = None) -> Callable[..., Optional[Callable[..., Optional[BoltResponse]]]] +# Create a new WorkflowStep instance +from slack_bolt.workflows.step import WorkflowStep +ws = WorkflowStep( + callback_id="add_task", + edit=edit, + save=save, + execute=execute, +) +# Pass Step to set up listeners +app.step(ws) ``` -Registers a new `interactive_message` action listener. - -Refer to https://docs.slack.dev/legacy/legacy-messaging/legacy-message-buttons/ for details. +Refer to https://docs.slack.dev/legacy/legacy-steps-from-apps/ for details of steps from apps. -#### dialog\_submission +To learn available arguments for middleware/listeners, see `slack_bolt.kwargs_injection.args`'s API document. -```python -def dialog_submission( - callback_id: Union[str, Pattern], - matchers: Optional[Sequence[Callable[..., bool]]] = None, - middleware: Optional[Sequence[Union[Callable, Middleware]]] = None) -> Callable[..., Optional[Callable[..., Optional[BoltResponse]]]] -``` +For further information about WorkflowStep specific function arguments +such as `configure`, `update`, `complete`, and `fail`, +refer to `slack_bolt.workflows.step.utilities` API documents. -Registers a new `dialog_submission` listener. +**Parameters:** -Refer to https://docs.slack.dev/legacy/legacy-dialogs/ for details. +- **callback_id** (Union[str, Pattern, WorkflowStep, WorkflowStepBuilder]) – The Callback ID for this step from app +- **edit** (Optional[Union[Callable..., [Optional[BoltResponse]], Listener, Sequence[Callable]]]) – The function for displaying a modal in the Workflow Builder +- **save** (Optional[Union[Callable..., [Optional[BoltResponse]], Listener, Sequence[Callable]]]) – The function for handling configuration in the Workflow Builder +- **execute** (Optional[Union[Callable..., [Optional[BoltResponse]], Listener, Sequence[Callable]]]) – The function for handling the step execution -#### dialog\_cancellation +### `use` ```python -def dialog_cancellation( - callback_id: Union[str, Pattern], - matchers: Optional[Sequence[Callable[..., bool]]] = None, - middleware: Optional[Sequence[Union[Callable, Middleware]]] = None) -> Callable[..., Optional[Callable[..., Optional[BoltResponse]]]] +use(*args) ``` -Registers a new `dialog_cancellation` listener. +Registers a new global middleware to this app. This method can be used as either a decorator or a method. -Refer to https://docs.slack.dev/legacy/legacy-dialogs/ for details. +Refer to `App#middleware()` method's docstring for details. -#### view +### `view` ```python -def view( - constraints: Union[str, Pattern, Dict[str, Union[str, Pattern]]], - matchers: Optional[Sequence[Callable[..., bool]]] = None, - middleware: Optional[Sequence[Union[Callable, Middleware]]] = None) -> Callable[..., Optional[Callable[..., Optional[BoltResponse]]]] +view(constraints, matchers=None, middleware=None) ``` Registers a new `view_submission`/`view_closed` event listener. @@ -703,127 +660,37 @@ Refer to https://docs.slack.dev/reference/interaction-payloads/view-interactions To learn available arguments for middleware/listeners, see `slack_bolt.kwargs_injection.args`'s API document. -**Arguments**: - -- `constraints` _Union[str, Pattern, Dict[str, Union[str, Pattern]]]_ - The conditions that match a request payload -- `matchers` _Optional[Sequence[Callable[..., bool]]]_ - A list of listener matcher functions. - Only when all the matchers return True, the listener function can be invoked. -- `middleware` _Optional[Sequence[Union[Callable, Middleware]]]_ - A list of lister middleware functions. - Only when all the middleware call `next()` method, the listener function can be invoked. - -#### view\_submission +**Parameters:** -```python -def view_submission( - constraints: Union[str, Pattern], - matchers: Optional[Sequence[Callable[..., bool]]] = None, - middleware: Optional[Sequence[Union[Callable, Middleware]]] = None) -> Callable[..., Optional[Callable[..., Optional[BoltResponse]]]] -``` - -Registers a new `view_submission` listener. - -Refer to https://docs.slack.dev/reference/interaction-payloads/view-interactions-payload/#view_submission for -details. +- **constraints** (Union[str, Pattern, Dict[str, Union[str, Pattern]]]) – The conditions that match a request payload +- **matchers** (Optional[Sequence[Callable..., [bool]]]) – A list of listener matcher functions. +Only when all the matchers return True, the listener function can be invoked. +- **middleware** (Optional[Sequence[Union[Callable, Middleware]]]) – A list of lister middleware functions. +Only when all the middleware call `next()` method, the listener function can be invoked. -#### view\_closed +### `view_closed` ```python -def view_closed( - constraints: Union[str, Pattern], - matchers: Optional[Sequence[Callable[..., bool]]] = None, - middleware: Optional[Sequence[Union[Callable, Middleware]]] = None) -> Callable[..., Optional[Callable[..., Optional[BoltResponse]]]] +view_closed(constraints, matchers=None, middleware=None) ``` Registers a new `view_closed` listener. Refer to https://docs.slack.dev/reference/interaction-payloads/view-interactions-payload/#view_closed for details. -#### options - -```python -def options( - constraints: Union[str, Pattern, Dict[str, Union[str, Pattern]]], - matchers: Optional[Sequence[Callable[..., bool]]] = None, - middleware: Optional[Sequence[Union[Callable, Middleware]]] = None) -> Callable[..., Optional[Callable[..., Optional[BoltResponse]]]] -``` - -Registers a new options listener. - -This method can be used as either a decorator or a method. - -```python -# Use this method as a decorator -@app.options("menu_selection") -def show_menu_options(ack): - options = [ - { - "text": {"type": "plain_text", "text": "Option 1"}, - "value": "1-1", - }, - { - "text": {"type": "plain_text", "text": "Option 2"}, - "value": "1-2", - }, - ] - ack(options=options) - -# Pass a function to this method -app.options("menu_selection")(show_menu_options) -``` - -Refer to the following documents for details: - -* https://docs.slack.dev/reference/block-kit/block-elements/select-menu-element#external_select -* https://docs.slack.dev/reference/block-kit/block-elements/multi-select-menu-element#external_multi_select - -To learn available arguments for middleware/listeners, see `slack_bolt.kwargs_injection.args`'s API document. - -**Arguments**: - -- `constraints` _Union[str, Pattern, Dict[str, Union[str, Pattern]]]_ - The conditions that match a request payload -- `matchers` _Optional[Sequence[Callable[..., bool]]]_ - A list of listener matcher functions. - Only when all the matchers return True, the listener function can be invoked. -- `middleware` _Optional[Sequence[Union[Callable, Middleware]]]_ - A list of lister middleware functions. - Only when all the middleware call `next()` method, the listener function can be invoked. - -#### block\_suggestion - -```python -def block_suggestion( - action_id: Union[str, Pattern], - matchers: Optional[Sequence[Callable[..., bool]]] = None, - middleware: Optional[Sequence[Union[Callable, Middleware]]] = None) -> Callable[..., Optional[Callable[..., Optional[BoltResponse]]]] -``` - -Registers a new `block_suggestion` listener. - -#### dialog\_suggestion - -```python -def dialog_suggestion( - callback_id: Union[str, Pattern], - matchers: Optional[Sequence[Callable[..., bool]]] = None, - middleware: Optional[Sequence[Union[Callable, Middleware]]] = None) -> Callable[..., Optional[Callable[..., Optional[BoltResponse]]]] -``` - -Registers a new `dialog_suggestion` listener. - -Refer to https://docs.slack.dev/legacy/legacy-dialogs/ for details. - -#### default\_tokens\_revoked\_event\_listener +### `view_submission` ```python -def default_tokens_revoked_event_listener() -> Callable[..., Optional[BoltResponse]] +view_submission(constraints, matchers=None, middleware=None) ``` -#### default\_app\_uninstalled\_event\_listener +Registers a new `view_submission` listener. -```python -def default_app_uninstalled_event_listener() -> Callable[..., Optional[BoltResponse]] -``` +Refer to https://docs.slack.dev/reference/interaction-payloads/view-interactions-payload/#view_submission for +details. -#### enable\_token\_revocation\_listeners +## Submodules -```python -def enable_token_revocation_listeners() -> None -``` +- [slack_bolt.app.app](/tools/bolt-python/reference/app/app) +- [slack_bolt.app.async_app](/tools/bolt-python/reference/app/async_app) +- [slack_bolt.app.async_server](/tools/bolt-python/reference/app/async_server) diff --git a/docs/english/reference/async_app.md b/docs/english/reference/async_app.md index d8ea85f10..f088c63b9 100644 --- a/docs/english/reference/async_app.md +++ b/docs/english/reference/async_app.md @@ -49,40 +49,10 @@ Apps can be run the same way as the synchronous example above. If you'd prefer a Refer to `slack_bolt.app.async_app` for more details. -## AsyncApp Objects - -```python -class AsyncApp() -``` - -#### \_\_init\_\_ - -```python -def __init__( - *, - logger: Optional[logging.Logger] = None, - name: Optional[str] = None, - process_before_response: bool = False, - raise_error_for_unhandled_request: bool = False, - signing_secret: Optional[str] = None, - token: Optional[str] = None, - client: Optional[AsyncWebClient] = None, - before_authorize: Optional[Union[AsyncMiddleware, Callable[..., Awaitable[Any]]]] = None, - authorize: Optional[Callable[..., Awaitable[AuthorizeResult]]] = None, - user_facing_authorize_error_message: Optional[str] = None, - installation_store: Optional[AsyncInstallationStore] = None, - installation_store_bot_only: Optional[bool] = None, - request_verification_enabled: bool = True, - ignoring_self_events_enabled: bool = True, - ignoring_self_assistant_message_events_enabled: bool = True, - ssl_check_enabled: bool = True, - url_verification_enabled: bool = True, - attaching_function_token_enabled: bool = True, - oauth_settings: Optional[AsyncOAuthSettings] = None, - oauth_flow: Optional[AsyncOAuthFlow] = None, - verification_token: Optional[str] = None, - assistant_thread_context_store: Optional[AsyncAssistantThreadContextStore] = None, - attaching_conversation_kwargs_enabled: bool = True) +## `AsyncApp` + +```python +AsyncApp(*, logger=None, name=None, process_before_response=False, raise_error_for_unhandled_request=False, signing_secret=None, token=None, client=None, before_authorize=None, authorize=None, user_facing_authorize_error_message=None, installation_store=None, installation_store_bot_only=None, request_verification_enabled=True, ignoring_self_events_enabled=True, ignoring_self_assistant_message_events_enabled=True, ssl_check_enabled=True, url_verification_enabled=True, attaching_function_token_enabled=True, oauth_settings=None, oauth_flow=None, verification_token=None, assistant_thread_context_store=None, attaching_conversation_kwargs_enabled=True) ``` Bolt App that provides functionalities to register middleware/listeners. @@ -113,292 +83,207 @@ Refer to https://docs.slack.dev/tools/bolt-python/concepts/async for details. If you would like to build an OAuth app for enabling the app to run with multiple workspaces, refer to https://docs.slack.dev/tools/bolt-python/concepts/authenticating-oauth to learn how to configure the app. -**Arguments**: - -- `logger` _Optional[logging.Logger]_ - The custom logger that can be used in this app. -- `name` _Optional[str]_ - The application name that will be used in logging. If absent, the source file name will be used. -- `process_before_response` _bool_ - True if this app runs on Function as a Service. (Default: False) -- `raise_error_for_unhandled_request` _bool_ - True if you want to raise exceptions for unhandled requests - and use @app.error listeners instead of - the built-in handler, which pints warning logs and returns 404 to Slack (Default: False) -- `signing_secret` _Optional[str]_ - The Signing Secret value used for verifying requests from Slack. -- `token` _Optional[str]_ - The bot/user access token required only for single-workspace app. -- `client` _Optional[AsyncWebClient]_ - The singleton `slack_sdk.web.async_client.AsyncWebClient` instance for this app. -- `before_authorize` _Optional[Union[AsyncMiddleware, Callable[..., Awaitable[Any]]]]_ - A global middleware that can be executed right before authorize function -- `authorize` _Optional[Callable[..., Awaitable[AuthorizeResult]]]_ - The function to authorize an incoming request from Slack - by checking if there is a team/user in the installation data. -- `user_facing_authorize_error_message` _Optional[str]_ - The user-facing error message to display - when the app is installed but the installation is not managed by this app's installation store -- `installation_store` _Optional[AsyncInstallationStore]_ - The module offering save/find operations of installation data -- `installation_store_bot_only` _Optional[bool]_ - Use `AsyncInstallationStore#async_find_bot()` if True (Default: False) -- `request_verification_enabled` _bool_ - False if you would like to disable the built-in middleware (Default: True). - `AsyncRequestVerification` is a built-in middleware that verifies the signature in HTTP Mode requests. - Make sure if it's safe enough when you turn a built-in middleware off. - We strongly recommend using RequestVerification for better security. - If you have a proxy that verifies request signature in front of the Bolt app, - it's totally fine to disable RequestVerification to avoid duplication of work. - Don't turn it off just for easiness of development. -- `ignoring_self_events_enabled` _bool_ - False if you would like to disable the built-in middleware (Default: True). - `AsyncIgnoringSelfEvents` is a built-in middleware that enables Bolt apps to easily skip the events - generated by this app's bot user (this is useful for avoiding code error causing an infinite loop). -- `ignoring_self_assistant_message_events_enabled` _bool_ - False if you would like to disable the built-in middleware. - `IgnoringSelfEvents` for this app's bot user message events within an assistant thread - This is useful for avoiding code error causing an infinite loop; Default: True -- `url_verification_enabled` _bool_ - False if you would like to disable the built-in middleware (Default: True). - `AsyncUrlVerification` is a built-in middleware that handles url_verification requests - that verify the endpoint for Events API in HTTP Mode requests. -- `ssl_check_enabled` _bool_ - bool = False if you would like to disable the built-in middleware (Default: True). - `AsyncSslCheck` is a built-in middleware that handles ssl_check requests from Slack. -- `attaching_function_token_enabled` _bool_ - False if you would like to disable the built-in middleware (Default: True). - `AsyncAttachingFunctionToken` is a built-in middleware that injects the just-in-time workflow-execution token - when your app receives `function_executed` or interactivity events scoped to a custom step. -- `oauth_settings` _Optional[AsyncOAuthSettings]_ - The settings related to Slack app installation flow (OAuth flow) -- `oauth_flow` _Optional[AsyncOAuthFlow]_ - Instantiated `slack_bolt.oauth.AsyncOAuthFlow`. This is always prioritized over oauth_settings. -- `verification_token` _Optional[str]_ - Deprecated verification mechanism. This can be used only for ssl_check requests. -- `assistant_thread_context_store` _Optional[AsyncAssistantThreadContextStore]_ - Custom AssistantThreadContext store (Default: the built-in implementation, - which uses a parent message's metadata to store the latest context) -- `attaching_conversation_kwargs_enabled` _bool_ - False if you would like to disable the built-in - middleware (Default: True). `AttachingConversationKwargs` is a built-in middleware that attaches - conversation-specific listener arguments (such as `say`, `set_status`, `say_stream`, and - `set_suggested_prompts`) for assistant thread and direct message events. - -#### name - -```python -@property -def name() -> str -``` - -The name of this app (default: the filename). - -#### oauth\_flow - -```python -@property -def oauth_flow() -> Optional[AsyncOAuthFlow] -``` - -Configured `OAuthFlow` object if exists. - -#### client - -```python -@property -def client() -> AsyncWebClient +**Parameters:** + +- **logger** (Optional[Logger]) – The custom logger that can be used in this app. +- **name** (Optional[str]) – The application name that will be used in logging. If absent, the source file name will be used. +- **process_before_response** (bool) – True if this app runs on Function as a Service. (Default: False) +- **raise_error_for_unhandled_request** (bool) – True if you want to raise exceptions for unhandled requests +and use @app.error listeners instead of +the built-in handler, which pints warning logs and returns 404 to Slack (Default: False) +- **signing_secret** (Optional[str]) – The Signing Secret value used for verifying requests from Slack. +- **token** (Optional[str]) – The bot/user access token required only for single-workspace app. +- **client** (Optional[AsyncWebClient]) – The singleton `slack_sdk.web.async_client.AsyncWebClient` instance for this app. +- **before_authorize** (Optional[Union[AsyncMiddleware, Callable..., [Awaitable[Any]]]]) – A global middleware that can be executed right before authorize function +- **authorize** (Optional[Callable..., [Awaitable[AuthorizeResult]]]) – The function to authorize an incoming request from Slack +by checking if there is a team/user in the installation data. +- **user_facing_authorize_error_message** (Optional[str]) – The user-facing error message to display +when the app is installed but the installation is not managed by this app's installation store +- **installation_store** (Optional[AsyncInstallationStore]) – The module offering save/find operations of installation data +- **installation_store_bot_only** (Optional[bool]) – Use `AsyncInstallationStore#async_find_bot()` if True (Default: False) +- **request_verification_enabled** (bool) – False if you would like to disable the built-in middleware (Default: True). +`AsyncRequestVerification` is a built-in middleware that verifies the signature in HTTP Mode requests. +Make sure if it's safe enough when you turn a built-in middleware off. +We strongly recommend using RequestVerification for better security. +If you have a proxy that verifies request signature in front of the Bolt app, +it's totally fine to disable RequestVerification to avoid duplication of work. +Don't turn it off just for easiness of development. +- **ignoring_self_events_enabled** (bool) – False if you would like to disable the built-in middleware (Default: True). +`AsyncIgnoringSelfEvents` is a built-in middleware that enables Bolt apps to easily skip the events +generated by this app's bot user (this is useful for avoiding code error causing an infinite loop). +- **ignoring_self_assistant_message_events_enabled** (bool) – False if you would like to disable the built-in middleware. +`IgnoringSelfEvents` for this app's bot user message events within an assistant thread +This is useful for avoiding code error causing an infinite loop; Default: True +- **url_verification_enabled** (bool) – False if you would like to disable the built-in middleware (Default: True). +`AsyncUrlVerification` is a built-in middleware that handles url_verification requests +that verify the endpoint for Events API in HTTP Mode requests. +- **ssl_check_enabled** (bool) – bool = False if you would like to disable the built-in middleware (Default: True). +`AsyncSslCheck` is a built-in middleware that handles ssl_check requests from Slack. +- **attaching_function_token_enabled** (bool) – False if you would like to disable the built-in middleware (Default: True). +`AsyncAttachingFunctionToken` is a built-in middleware that injects the just-in-time workflow-execution token +when your app receives `function_executed` or interactivity events scoped to a custom step. +- **oauth_settings** (Optional[AsyncOAuthSettings]) – The settings related to Slack app installation flow (OAuth flow) +- **oauth_flow** (Optional[AsyncOAuthFlow]) – Instantiated `slack_bolt.oauth.AsyncOAuthFlow`. This is always prioritized over oauth_settings. +- **verification_token** (Optional[str]) – Deprecated verification mechanism. This can be used only for ssl_check requests. +- **assistant_thread_context_store** (Optional[AsyncAssistantThreadContextStore]) – Custom AssistantThreadContext store (Default: the built-in implementation, +which uses a parent message's metadata to store the latest context) +- **attaching_conversation_kwargs_enabled** (bool) – False if you would like to disable the built-in +middleware (Default: True). `AttachingConversationKwargs` is a built-in middleware that attaches +conversation-specific listener arguments (such as `say`, `set_status`, `say_stream`, and +`set_suggested_prompts`) for assistant thread and direct message events. + +### `action` + +```python +action(constraints, matchers=None, middleware=None) ``` -The singleton `slack_sdk.web.async_client.AsyncWebClient` instance in this app. - -#### logger +Registers a new action listener. This method can be used as either a decorator or a method. ```python -@property -def logger() -> logging.Logger -``` - -The logger this app uses. - -#### installation\_store +# Use this method as a decorator +@app.action("approve_button") +async def update_message(ack): + await ack() -```python -@property -def installation_store() -> Optional[AsyncInstallationStore] +# Pass a function to this method +app.action("approve_button")(update_message) ``` -The `slack_sdk.oauth.AsyncInstallationStore` that can be used in the `authorize` middleware. - -#### listener\_runner - -```python -@property -def listener_runner() -> AsyncioListenerRunner -``` +* Refer to https://docs.slack.dev/reference/interaction-payloads/block_actions-payload/ for actions in `blocks`. +* Refer to https://docs.slack.dev/legacy/legacy-messaging/legacy-message-buttons/ for actions in `attachments`. +* Refer to https://docs.slack.dev/legacy/legacy-dialogs/ for actions in dialogs. -The asyncio-based executor for asynchronously running listeners. +To learn available arguments for middleware/listeners, see `slack_bolt.kwargs_injection.async_args`'s API document. -#### process\_before\_response +**Parameters:** -```python -@property -def process_before_response() -> bool -``` +- **constraints** (Union[str, Pattern, Dict[str, Union[str, Pattern]]]) – The conditions that match a request payload +- **matchers** (Optional[Sequence[Callable..., [Awaitable[bool]]]]) – A list of listener matcher functions. +Only when all the matchers return True, the listener function can be invoked. +- **middleware** (Optional[Sequence[Union[Callable, AsyncMiddleware]]]) – A list of lister middleware functions. +Only when all the middleware call `next()` method, the listener function can be invoked. -#### server +### `async_dispatch` ```python -def server( - port: int = 3000, - path: str = '/slack/events', - host: Optional[str] = None) -> AsyncSlackAppServer +async_dispatch(req) ``` -Configure a web server using AIOHTTP. - -Refer to https://docs.aiohttp.org/ for more details about AIOHTTP. +Applies all middleware and dispatches an incoming request from Slack to the right code path. -**Arguments**: +**Parameters:** -- `port` _int_ - The port to listen on (Default: 3000) -- `path` _str_ - The path to handle request from Slack (Default: `/slack/events`) -- `host` _Optional[str]_ - The hostname to serve the web endpoints. (Default: 0.0.0.0) +- **req** (AsyncBoltRequest) – An incoming request from Slack. -#### web\_app +**Returns:** -```python -def web_app(path: str = '/slack/events', port: int = 3000) -> web.Application -``` +- BoltResponse – The response generated by this Bolt app. -Returns a `web.Application` instance for aiohttp-devtools users. +### `attachment_action` ```python -from slack_bolt.async_app import AsyncApp -app = AsyncApp() - -@app.event("app_mention") -async def event_test(body, say, logger): - logger.info(body) - await say("What's up?") - -def app_factory(): - return app.web_app() - -# adev runserver --port 3000 --app-factory app_factory async_app.py +attachment_action(callback_id, matchers=None, middleware=None) ``` +Registers a new `interactive_message` action listener. -**Arguments**: - -- `path` _str_ - The path to receive incoming requests from Slack -- `port` _int_ - The port to listen on (Default: 3000) +Refer to https://docs.slack.dev/legacy/legacy-messaging/legacy-message-buttons/ for details. -#### start +### `block_action` ```python -def start( - port: int = 3000, - path: str = '/slack/events', - host: Optional[str] = None) -> None +block_action(constraints, matchers=None, middleware=None) ``` -Start a web server using AIOHTTP. - -Refer to https://docs.aiohttp.org/ for more details about AIOHTTP. - -**Arguments**: +Registers a new `block_actions` action listener. -- `port` _int_ - The port to listen on (Default: 3000) -- `path` _str_ - The path to handle request from Slack (Default: `/slack/events`) -- `host` _Optional[str]_ - The hostname to serve the web endpoints. (Default: 0.0.0.0) +Refer to https://docs.slack.dev/reference/interaction-payloads/block_actions-payload/ for details. -#### async\_dispatch +### `block_suggestion` ```python -async def async_dispatch(req: AsyncBoltRequest) -> BoltResponse +block_suggestion(action_id, matchers=None, middleware=None) ``` -Applies all middleware and dispatches an incoming request from Slack to the right code path. - -**Arguments**: - -- `req` _AsyncBoltRequest_ - An incoming request from Slack. - -**Returns**: - -- `BoltResponse` - The response generated by this Bolt app. +Registers a new `block_suggestion` listener. -#### use +### `client` ```python -def use(*args) -> Optional[Callable] +client: AsyncWebClient ``` -Refer to `AsyncApp#middleware()` method's docstring for details. +The singleton `slack_sdk.web.async_client.AsyncWebClient` instance in this app. -#### middleware +### `command` ```python -def middleware(*args) -> Optional[Callable] +command(command, matchers=None, middleware=None) ``` -Registers a new middleware to this app. +Registers a new slash command listener. This method can be used as either a decorator or a method. ```python # Use this method as a decorator -@app.middleware -async def middleware_func(logger, body, next): - logger.info(f"request body: {body}") - await next() +@app.command("/echo") +async def repeat_text(ack, say, command): + # Acknowledge command request + await ack() + await say(f"{command['text']}") # Pass a function to this method -app.middleware(middleware_func) +app.command("/echo")(repeat_text) ``` +Refer to https://docs.slack.dev/interactivity/implementing-slash-commands/ for details of Slash Commands. + To learn available arguments for middleware/listeners, see `slack_bolt.kwargs_injection.async_args`'s API document. -**Arguments**: +**Parameters:** -- `*args` - A function that works as a global middleware. +- **command** (Union[str, Pattern]) – The conditions that match a request payload +- **matchers** (Optional[Sequence[Callable..., [Awaitable[bool]]]]) – A list of listener matcher functions. +Only when all the matchers return True, the listener function can be invoked. +- **middleware** (Optional[Sequence[Union[Callable, AsyncMiddleware]]]) – A list of lister middleware functions. +Only when all the middleware call `next()` method, the listener function can be invoked. -#### assistant +### `dialog_cancellation` ```python -def assistant(assistant: AsyncAssistant) -> Optional[Callable] +dialog_cancellation(callback_id, matchers=None, middleware=None) ``` -#### step +Registers a new `dialog_cancellation` listener. + +Refer to https://docs.slack.dev/legacy/legacy-dialogs/ for details. + +### `dialog_submission` ```python -def step( - callback_id: Union[str, Pattern, AsyncWorkflowStep, AsyncWorkflowStepBuilder], - edit: Optional[Union[Callable[..., Optional[BoltResponse]], AsyncListener, Sequence[Callable]]] = None, - save: Optional[Union[Callable[..., Optional[BoltResponse]], AsyncListener, Sequence[Callable]]] = None, - execute: Optional[Union[Callable[..., Optional[BoltResponse]], AsyncListener, Sequence[Callable]]] = None) +dialog_submission(callback_id, matchers=None, middleware=None) ``` -Deprecated: register a new step from app listener. - -Steps from apps for legacy workflows are now deprecated. -Use new custom steps: https://docs.slack.dev/workflows/workflow-steps/ +Registers a new `dialog_submission` listener. -Registers a new step from app listener. +Refer to https://docs.slack.dev/legacy/legacy-dialogs/ for details. -Unlike others, this method doesn't behave as a decorator. -If you want to register a step from app by a decorator, use `AsyncWorkflowStepBuilder`'s methods. +### `dialog_suggestion` ```python -# Create a new WorkflowStep instance -from slack_bolt.workflows.async_step import AsyncWorkflowStep -ws = AsyncWorkflowStep( - callback_id="add_task", - edit=edit, - save=save, - execute=execute, -) -# Pass Step to set up listeners -app.step(ws) +dialog_suggestion(callback_id, matchers=None, middleware=None) ``` -Refer to https://docs.slack.dev/legacy/legacy-steps-from-apps/ for details of steps from apps. - -To learn available arguments for middleware/listeners, see `slack_bolt.kwargs_injection.async_args`'s API document. -For further information about AsyncWorkflowStep specific function arguments -such as `configure`, `update`, `complete`, and `fail`, -refer to the `async` prefixed ones in `slack_bolt.workflows.step.utilities` API documents. - -**Arguments**: +Registers a new `dialog_suggestion` listener. -- `callback_id` _Union[str, Pattern, AsyncWorkflowStep, AsyncWorkflowStepBuilder]_ - The Callback ID for this step from app -- `edit` _Optional[Union[Callable[..., Optional[BoltResponse]], AsyncListener, Sequence[Callable]]]_ - The function for displaying a modal in the Workflow Builder -- `save` _Optional[Union[Callable[..., Optional[BoltResponse]], AsyncListener, Sequence[Callable]]]_ - The function for handling configuration in the Workflow Builder -- `execute` _Optional[Union[Callable[..., Optional[BoltResponse]], AsyncListener, Sequence[Callable]]]_ - The function for handling the step execution +Refer to https://docs.slack.dev/legacy/legacy-dialogs/ for details. -#### error +### `error` ```python -def error( - func: Callable[..., Awaitable[Optional[BoltResponse]]]) -> Callable[..., Awaitable[Optional[BoltResponse]]] +error(func) ``` Updates the global error handler. This method can be used as either a decorator or a method. @@ -416,18 +301,15 @@ app.error(custom_error_handler) To learn available arguments for middleware/listeners, see `slack_bolt.kwargs_injection.async_args`'s API document. -**Arguments**: +**Parameters:** -- `func` _Callable[..., Awaitable[Optional[BoltResponse]]]_ - The function that is supposed to be executed - when getting an unhandled error in Bolt app. +- **func** (Callable..., [Awaitable[Optional[BoltResponse]]]) – The function that is supposed to be executed +when getting an unhandled error in Bolt app. -#### event +### `event` ```python -def event( - event: Union[str, Pattern, Dict[str, Optional[Union[str, Sequence[Optional[Union[str, Pattern]]]]]]], - matchers: Optional[Sequence[Callable[..., Awaitable[bool]]]] = None, - middleware: Optional[Sequence[Union[Callable, AsyncMiddleware]]] = None) -> Callable[..., Optional[Callable[..., Awaitable[Optional[BoltResponse]]]]] +event(event, matchers=None, middleware=None) ``` Registers a new event listener. This method can be used as either a decorator or a method. @@ -449,60 +331,19 @@ Refer to https://docs.slack.dev/apis/events-api/ for details of Events API. To learn available arguments for middleware/listeners, see `slack_bolt.kwargs_injection.async_args`'s API document. -**Arguments**: - -- `event` _Union[str, Pattern, Dict[str, Optional[Union[str, Sequence[Optional[Union[str, Pattern]]]]]]]_ - The conditions that match a request payload. - If you pass a dict for this, you can have type, subtype in the constraint. -- `matchers` _Optional[Sequence[Callable[..., Awaitable[bool]]]]_ - A list of listener matcher functions. - Only when all the matchers return True, the listener function can be invoked. -- `middleware` _Optional[Sequence[Union[Callable, AsyncMiddleware]]]_ - A list of lister middleware functions. - Only when all the middleware call `next()` method, the listener function can be invoked. - -#### message - -```python -def message( - keyword: Union[str, Pattern] = '', - matchers: Optional[Sequence[Callable[..., Awaitable[bool]]]] = None, - middleware: Optional[Sequence[Union[Callable, AsyncMiddleware]]] = None) -> Callable[..., Optional[Callable[..., Awaitable[Optional[BoltResponse]]]]] -``` - -Registers a new message event listener. This method can be used as either a decorator or a method. - -Check the `App#event` method's docstring for details. - -```python -# Use this method as a decorator -@app.message(":wave:") -async def say_hello(message, say): - user = message['user'] - await say(f"Hi there, <@{user}>!") - -# Pass a function to this method -app.message(":wave:")(say_hello) -``` - -Refer to https://docs.slack.dev/reference/events/message/ for details of `message` events. - -To learn available arguments for middleware/listeners, see `slack_bolt.kwargs_injection.async_args`'s API document. - -**Arguments**: +**Parameters:** -- `keyword` _Union[str, Pattern]_ - The keyword to match -- `matchers` _Optional[Sequence[Callable[..., Awaitable[bool]]]]_ - A list of listener matcher functions. - Only when all the matchers return True, the listener function can be invoked. -- `middleware` _Optional[Sequence[Union[Callable, AsyncMiddleware]]]_ - A list of lister middleware functions. - Only when all the middleware call `next()` method, the listener function can be invoked. +- **event** (Union[str, Pattern, Dict[str, Optional[Union[str, Sequence[Optional[Union[str, Pattern]]]]]]]) – The conditions that match a request payload. +If you pass a dict for this, you can have type, subtype in the constraint. +- **matchers** (Optional[Sequence[Callable..., [Awaitable[bool]]]]) – A list of listener matcher functions. +Only when all the matchers return True, the listener function can be invoked. +- **middleware** (Optional[Sequence[Union[Callable, AsyncMiddleware]]]) – A list of lister middleware functions. +Only when all the middleware call `next()` method, the listener function can be invoked. -#### function +### `function` ```python -def function( - callback_id: Union[str, Pattern], - matchers: Optional[Sequence[Callable[..., Awaitable[bool]]]] = None, - middleware: Optional[Sequence[Union[Callable, AsyncMiddleware]]] = None, - auto_acknowledge: bool = True, - ack_timeout: int = 3) -> Callable[..., Optional[Callable[..., Awaitable[BoltResponse]]]] +function(callback_id, matchers=None, middleware=None, auto_acknowledge=True, ack_timeout=3) ``` Registers a new Function listener. @@ -527,1030 +368,807 @@ app.function("reverse")(reverse_string) To learn available arguments for middleware/listeners, see `slack_bolt.kwargs_injection.async_args`'s API document. -**Arguments**: +**Parameters:** -- `callback_id` _Union[str, Pattern]_ - The callback id to identify the function -- `matchers` _Optional[Sequence[Callable[..., Awaitable[bool]]]]_ - A list of listener matcher functions. - Only when all the matchers return True, the listener function can be invoked. -- `middleware` _Optional[Sequence[Union[Callable, AsyncMiddleware]]]_ - A list of lister middleware functions. - Only when all the middleware call `next()` method, the listener function can be invoked. -- `auto_acknowledge` _bool_ - Whether Bolt automatically acknowledges the function execution event on the - listener's behalf. When False, your listener must call `ack()` itself within `ack_timeout` - seconds (Default: True). -- `ack_timeout` _int_ - The number of seconds to wait for the listener to call `ack()`. - Only takes effect when `auto_acknowledge` is False (Default: 3). +- **callback_id** (Union[str, Pattern]) – The callback id to identify the function +- **matchers** (Optional[Sequence[Callable..., [Awaitable[bool]]]]) – A list of listener matcher functions. +Only when all the matchers return True, the listener function can be invoked. +- **middleware** (Optional[Sequence[Union[Callable, AsyncMiddleware]]]) – A list of lister middleware functions. +Only when all the middleware call `next()` method, the listener function can be invoked. +- **auto_acknowledge** (bool) – Whether Bolt automatically acknowledges the function execution event on the +listener's behalf. When False, your listener must call `ack()` itself within `ack_timeout` +seconds (Default: True). +- **ack_timeout** (int) – The number of seconds to wait for the listener to call `ack()`. +Only takes effect when `auto_acknowledge` is False (Default: 3). -#### command +### `global_shortcut` ```python -def command( - command: Union[str, Pattern], - matchers: Optional[Sequence[Callable[..., Awaitable[bool]]]] = None, - middleware: Optional[Sequence[Union[Callable, AsyncMiddleware]]] = None) -> Callable[..., Optional[Callable[..., Awaitable[Optional[BoltResponse]]]]] +global_shortcut(callback_id, matchers=None, middleware=None) ``` -Registers a new slash command listener. +Registers a new global shortcut listener. -This method can be used as either a decorator or a method. +### `installation_store` ```python -# Use this method as a decorator -@app.command("/echo") -async def repeat_text(ack, say, command): - # Acknowledge command request - await ack() - await say(f"{command['text']}") +installation_store: Optional[AsyncInstallationStore] +``` -# Pass a function to this method -app.command("/echo")(repeat_text) +The `slack_sdk.oauth.AsyncInstallationStore` that can be used in the `authorize` middleware. + +### `listener_runner` + +```python +listener_runner: AsyncioListenerRunner ``` -Refer to https://docs.slack.dev/interactivity/implementing-slash-commands/ for details of Slash Commands. +The asyncio-based executor for asynchronously running listeners. -To learn available arguments for middleware/listeners, see `slack_bolt.kwargs_injection.async_args`'s API document. +### `logger` -**Arguments**: +```python +logger: logging.Logger +``` -- `command` _Union[str, Pattern]_ - The conditions that match a request payload -- `matchers` _Optional[Sequence[Callable[..., Awaitable[bool]]]]_ - A list of listener matcher functions. - Only when all the matchers return True, the listener function can be invoked. -- `middleware` _Optional[Sequence[Union[Callable, AsyncMiddleware]]]_ - A list of lister middleware functions. - Only when all the middleware call `next()` method, the listener function can be invoked. +The logger this app uses. -#### shortcut +### `message` ```python -def shortcut( - constraints: Union[str, Pattern, Dict[str, Union[str, Pattern]]], - matchers: Optional[Sequence[Callable[..., Awaitable[bool]]]] = None, - middleware: Optional[Sequence[Union[Callable, AsyncMiddleware]]] = None) -> Callable[..., Optional[Callable[..., Awaitable[Optional[BoltResponse]]]]] +message(keyword='', matchers=None, middleware=None) ``` -Registers a new shortcut listener. +Registers a new message event listener. This method can be used as either a decorator or a method. -This method can be used as either a decorator or a method. +Check the `App#event` method's docstring for details. ```python # Use this method as a decorator -@app.shortcut("open_modal") -async def open_modal(ack, body, client): - # Acknowledge the command request - await ack() - # Call views_open with the built-in client - await client.views_open( - # Pass a valid trigger_id within 3 seconds of receiving it - trigger_id=body["trigger_id"], - # View payload - view={ ... } - ) +@app.message(":wave:") +async def say_hello(message, say): + user = message['user'] + await say(f"Hi there, <@{user}>!") # Pass a function to this method -app.shortcut("open_modal")(open_modal) +app.message(":wave:")(say_hello) ``` -Refer to https://docs.slack.dev/interactivity/implementing-shortcuts/ for details about Shortcuts. +Refer to https://docs.slack.dev/reference/events/message/ for details of `message` events. To learn available arguments for middleware/listeners, see `slack_bolt.kwargs_injection.async_args`'s API document. -**Arguments**: - -- `constraints` _Union[str, Pattern, Dict[str, Union[str, Pattern]]]_ - The conditions that match a request payload. -- `matchers` _Optional[Sequence[Callable[..., Awaitable[bool]]]]_ - A list of listener matcher functions. - Only when all the matchers return True, the listener function can be invoked. -- `middleware` _Optional[Sequence[Union[Callable, AsyncMiddleware]]]_ - A list of lister middleware functions. - Only when all the middleware call `next()` method, the listener function can be invoked. - -#### global\_shortcut - -```python -def global_shortcut( - callback_id: Union[str, Pattern], - matchers: Optional[Sequence[Callable[..., Awaitable[bool]]]] = None, - middleware: Optional[Sequence[Union[Callable, AsyncMiddleware]]] = None) -> Callable[..., Optional[Callable[..., Awaitable[Optional[BoltResponse]]]]] -``` +**Parameters:** -Registers a new global shortcut listener. +- **keyword** (Union[str, Pattern]) – The keyword to match +- **matchers** (Optional[Sequence[Callable..., [Awaitable[bool]]]]) – A list of listener matcher functions. +Only when all the matchers return True, the listener function can be invoked. +- **middleware** (Optional[Sequence[Union[Callable, AsyncMiddleware]]]) – A list of lister middleware functions. +Only when all the middleware call `next()` method, the listener function can be invoked. -#### message\_shortcut +### `message_shortcut` ```python -def message_shortcut( - callback_id: Union[str, Pattern], - matchers: Optional[Sequence[Callable[..., Awaitable[bool]]]] = None, - middleware: Optional[Sequence[Union[Callable, AsyncMiddleware]]] = None) -> Callable[..., Optional[Callable[..., Awaitable[Optional[BoltResponse]]]]] +message_shortcut(callback_id, matchers=None, middleware=None) ``` Registers a new message shortcut listener. -#### action +### `middleware` ```python -def action( - constraints: Union[str, Pattern, Dict[str, Union[str, Pattern]]], - matchers: Optional[Sequence[Callable[..., Awaitable[bool]]]] = None, - middleware: Optional[Sequence[Union[Callable, AsyncMiddleware]]] = None) -> Callable[..., Optional[Callable[..., Awaitable[Optional[BoltResponse]]]]] +middleware(*args) ``` -Registers a new action listener. This method can be used as either a decorator or a method. +Registers a new middleware to this app. + +This method can be used as either a decorator or a method. ```python # Use this method as a decorator -@app.action("approve_button") -async def update_message(ack): - await ack() +@app.middleware +async def middleware_func(logger, body, next): + logger.info(f"request body: {body}") + await next() # Pass a function to this method -app.action("approve_button")(update_message) +app.middleware(middleware_func) ``` -* Refer to https://docs.slack.dev/reference/interaction-payloads/block_actions-payload/ for actions in `blocks`. -* Refer to https://docs.slack.dev/legacy/legacy-messaging/legacy-message-buttons/ for actions in `attachments`. -* Refer to https://docs.slack.dev/legacy/legacy-dialogs/ for actions in dialogs. - To learn available arguments for middleware/listeners, see `slack_bolt.kwargs_injection.async_args`'s API document. -**Arguments**: +**Parameters:** -- `constraints` _Union[str, Pattern, Dict[str, Union[str, Pattern]]]_ - The conditions that match a request payload -- `matchers` _Optional[Sequence[Callable[..., Awaitable[bool]]]]_ - A list of listener matcher functions. - Only when all the matchers return True, the listener function can be invoked. -- `middleware` _Optional[Sequence[Union[Callable, AsyncMiddleware]]]_ - A list of lister middleware functions. - Only when all the middleware call `next()` method, the listener function can be invoked. +- ***args** – A function that works as a global middleware. -#### block\_action +### `name` ```python -def block_action( - constraints: Union[str, Pattern, Dict[str, Union[str, Pattern]]], - matchers: Optional[Sequence[Callable[..., Awaitable[bool]]]] = None, - middleware: Optional[Sequence[Union[Callable, AsyncMiddleware]]] = None) -> Callable[..., Optional[Callable[..., Awaitable[Optional[BoltResponse]]]]] +name: str ``` -Registers a new `block_actions` action listener. - -Refer to https://docs.slack.dev/reference/interaction-payloads/block_actions-payload/ for details. +The name of this app (default: the filename). -#### attachment\_action +### `oauth_flow` ```python -def attachment_action( - callback_id: Union[str, Pattern], - matchers: Optional[Sequence[Callable[..., Awaitable[bool]]]] = None, - middleware: Optional[Sequence[Union[Callable, AsyncMiddleware]]] = None) -> Callable[..., Optional[Callable[..., Awaitable[Optional[BoltResponse]]]]] +oauth_flow: Optional[AsyncOAuthFlow] ``` -Registers a new `interactive_message` action listener. - -Refer to https://docs.slack.dev/legacy/legacy-messaging/legacy-message-buttons/ for details. +Configured `OAuthFlow` object if exists. -#### dialog\_submission +### `options` ```python -def dialog_submission( - callback_id: Union[str, Pattern], - matchers: Optional[Sequence[Callable[..., Awaitable[bool]]]] = None, - middleware: Optional[Sequence[Union[Callable, AsyncMiddleware]]] = None) -> Callable[..., Optional[Callable[..., Awaitable[Optional[BoltResponse]]]]] +options(constraints, matchers=None, middleware=None) ``` -Registers a new `dialog_submission` listener. - -Refer to https://docs.slack.dev/legacy/legacy-dialogs/ for details. +Registers a new options listener. -#### dialog\_cancellation +This method can be used as either a decorator or a method. ```python -def dialog_cancellation( - callback_id: Union[str, Pattern], - matchers: Optional[Sequence[Callable[..., Awaitable[bool]]]] = None, - middleware: Optional[Sequence[Union[Callable, AsyncMiddleware]]] = None) -> Callable[..., Optional[Callable[..., Awaitable[Optional[BoltResponse]]]]] +# Use this method as a decorator +@app.options("menu_selection") +async def show_menu_options(ack): + options = [ + { + "text": {"type": "plain_text", "text": "Option 1"}, + "value": "1-1", + }, + { + "text": {"type": "plain_text", "text": "Option 2"}, + "value": "1-2", + }, + ] + await ack(options=options) + +# Pass a function to this method +app.options("menu_selection")(show_menu_options) ``` -Registers a new `dialog_cancellation` listener. +Refer to the following documents for details: -Refer to https://docs.slack.dev/legacy/legacy-dialogs/ for details. +* https://docs.slack.dev/reference/block-kit/block-elements/select-menu-element#external_select +* https://docs.slack.dev/reference/block-kit/block-elements/multi-select-menu-element#external_multi_select -#### view +To learn available arguments for middleware/listeners, see `slack_bolt.kwargs_injection.async_args`'s API document. -```python -def view( - constraints: Union[str, Pattern, Dict[str, Union[str, Pattern]]], - matchers: Optional[Sequence[Callable[..., Awaitable[bool]]]] = None, - middleware: Optional[Sequence[Union[Callable, AsyncMiddleware]]] = None) -> Callable[..., Optional[Callable[..., Awaitable[Optional[BoltResponse]]]]] -``` +**Parameters:** -Registers a new `view_submission`/`view_closed` event listener. +- **constraints** (Union[str, Pattern, Dict[str, Union[str, Pattern]]]) – The conditions that match a request payload +- **matchers** (Optional[Sequence[Callable..., [Awaitable[bool]]]]) – A list of listener matcher functions. +Only when all the matchers return True, the listener function can be invoked. +- **middleware** (Optional[Sequence[Union[Callable, AsyncMiddleware]]]) – A list of lister middleware functions. +Only when all the middleware call `next()` method, the listener function can be invoked. -This method can be used as either a decorator or a method. +### `server` ```python -# Use this method as a decorator -@app.view("view_1") -async def handle_submission(ack, body, client, view): - # Assume there's an input block with `block_c` as the block_id and `dreamy_input` - hopes_and_dreams = view["state"]["values"]["block_c"]["dreamy_input"] - user = body["user"]["id"] - # Validate the inputs - errors = {} - if hopes_and_dreams is not None and len(hopes_and_dreams) <= 5: - errors["block_c"] = "The value must be longer than 5 characters" - if len(errors) > 0: - await ack(response_action="errors", errors=errors) - return # Return early to display the validation errors to the user - # Acknowledge the view_submission event and close the modal - await ack() - # Do whatever you want with the input data - here we're saving it to a DB - -# Pass a function to this method -app.view("view_1")(handle_submission) +server(port=3000, path='/slack/events', host=None) ``` -Refer to https://docs.slack.dev/reference/interaction-payloads/view-interactions-payload for details of payloads. - -To learn available arguments for middleware/listeners, see `slack_bolt.kwargs_injection.async_args`'s API document. - -**Arguments**: - -- `constraints` _Union[str, Pattern, Dict[str, Union[str, Pattern]]]_ - The conditions that match a request payload -- `matchers` _Optional[Sequence[Callable[..., Awaitable[bool]]]]_ - A list of listener matcher functions. - Only when all the matchers return True, the listener function can be invoked. -- `middleware` _Optional[Sequence[Union[Callable, AsyncMiddleware]]]_ - A list of lister middleware functions. - Only when all the middleware call `next()` method, the listener function can be invoked. - -#### view\_submission - -```python -def view_submission( - constraints: Union[str, Pattern], - matchers: Optional[Sequence[Callable[..., Awaitable[bool]]]] = None, - middleware: Optional[Sequence[Union[Callable, AsyncMiddleware]]] = None) -> Callable[..., Optional[Callable[..., Awaitable[Optional[BoltResponse]]]]] -``` - -Registers a new `view_submission` listener. - -Refer to https://docs.slack.dev/reference/interaction-payloads/view-interactions-payload/#view_submission for -details. - -#### view\_closed +Configure a web server using AIOHTTP. -```python -def view_closed( - constraints: Union[str, Pattern], - matchers: Optional[Sequence[Callable[..., Awaitable[bool]]]] = None, - middleware: Optional[Sequence[Union[Callable, AsyncMiddleware]]] = None) -> Callable[..., Optional[Callable[..., Awaitable[Optional[BoltResponse]]]]] -``` +Refer to https://docs.aiohttp.org/ for more details about AIOHTTP. -Registers a new `view_closed` listener. +**Parameters:** -Refer to https://docs.slack.dev/reference/interaction-payloads/view-interactions-payload/#view_closed for details. +- **port** (int) – The port to listen on (Default: 3000) +- **path** (str) – The path to handle request from Slack (Default: `/slack/events`) +- **host** (Optional[str]) – The hostname to serve the web endpoints. (Default: 0.0.0.0) -#### options +### `shortcut` ```python -def options( - constraints: Union[str, Pattern, Dict[str, Union[str, Pattern]]], - matchers: Optional[Sequence[Callable[..., Awaitable[bool]]]] = None, - middleware: Optional[Sequence[Union[Callable, AsyncMiddleware]]] = None) -> Callable[..., Optional[Callable[..., Awaitable[Optional[BoltResponse]]]]] +shortcut(constraints, matchers=None, middleware=None) ``` -Registers a new options listener. +Registers a new shortcut listener. This method can be used as either a decorator or a method. ```python # Use this method as a decorator -@app.options("menu_selection") -async def show_menu_options(ack): - options = [ - { - "text": {"type": "plain_text", "text": "Option 1"}, - "value": "1-1", - }, - { - "text": {"type": "plain_text", "text": "Option 2"}, - "value": "1-2", - }, - ] - await ack(options=options) +@app.shortcut("open_modal") +async def open_modal(ack, body, client): + # Acknowledge the command request + await ack() + # Call views_open with the built-in client + await client.views_open( + # Pass a valid trigger_id within 3 seconds of receiving it + trigger_id=body["trigger_id"], + # View payload + view={ ... } + ) # Pass a function to this method -app.options("menu_selection")(show_menu_options) +app.shortcut("open_modal")(open_modal) ``` -Refer to the following documents for details: - -* https://docs.slack.dev/reference/block-kit/block-elements/select-menu-element#external_select -* https://docs.slack.dev/reference/block-kit/block-elements/multi-select-menu-element#external_multi_select +Refer to https://docs.slack.dev/interactivity/implementing-shortcuts/ for details about Shortcuts. To learn available arguments for middleware/listeners, see `slack_bolt.kwargs_injection.async_args`'s API document. -**Arguments**: +**Parameters:** -- `constraints` _Union[str, Pattern, Dict[str, Union[str, Pattern]]]_ - The conditions that match a request payload -- `matchers` _Optional[Sequence[Callable[..., Awaitable[bool]]]]_ - A list of listener matcher functions. - Only when all the matchers return True, the listener function can be invoked. -- `middleware` _Optional[Sequence[Union[Callable, AsyncMiddleware]]]_ - A list of lister middleware functions. - Only when all the middleware call `next()` method, the listener function can be invoked. +- **constraints** (Union[str, Pattern, Dict[str, Union[str, Pattern]]]) – The conditions that match a request payload. +- **matchers** (Optional[Sequence[Callable..., [Awaitable[bool]]]]) – A list of listener matcher functions. +Only when all the matchers return True, the listener function can be invoked. +- **middleware** (Optional[Sequence[Union[Callable, AsyncMiddleware]]]) – A list of lister middleware functions. +Only when all the middleware call `next()` method, the listener function can be invoked. -#### block\_suggestion +### `start` ```python -def block_suggestion( - action_id: Union[str, Pattern], - matchers: Optional[Sequence[Callable[..., Awaitable[bool]]]] = None, - middleware: Optional[Sequence[Union[Callable, AsyncMiddleware]]] = None) -> Callable[..., Optional[Callable[..., Awaitable[Optional[BoltResponse]]]]] +start(port=3000, path='/slack/events', host=None) ``` -Registers a new `block_suggestion` listener. - -#### dialog\_suggestion +Start a web server using AIOHTTP. -```python -def dialog_suggestion( - callback_id: Union[str, Pattern], - matchers: Optional[Sequence[Callable[..., Awaitable[bool]]]] = None, - middleware: Optional[Sequence[Union[Callable, AsyncMiddleware]]] = None) -> Callable[..., Optional[Callable[..., Awaitable[Optional[BoltResponse]]]]] -``` +Refer to https://docs.aiohttp.org/ for more details about AIOHTTP. -Registers a new `dialog_suggestion` listener. +**Parameters:** -Refer to https://docs.slack.dev/legacy/legacy-dialogs/ for details. +- **port** (int) – The port to listen on (Default: 3000) +- **path** (str) – The path to handle request from Slack (Default: `/slack/events`) +- **host** (Optional[str]) – The hostname to serve the web endpoints. (Default: 0.0.0.0) -#### default\_tokens\_revoked\_event\_listener +### `step` ```python -def default_tokens_revoked_event_listener( -) -> Callable[..., Awaitable[Optional[BoltResponse]]] +step(callback_id, edit=None, save=None, execute=None) ``` -#### default\_app\_uninstalled\_event\_listener - -```python -def default_app_uninstalled_event_listener( -) -> Callable[..., Awaitable[Optional[BoltResponse]]] -``` +Deprecated: register a new step from app listener. -#### enable\_token\_revocation\_listeners +Steps from apps for legacy workflows are now deprecated. +Use new custom steps: https://docs.slack.dev/workflows/workflow-steps/ -```python -def enable_token_revocation_listeners() -> None -``` +Registers a new step from app listener. -## AsyncAck Objects +Unlike others, this method doesn't behave as a decorator. +If you want to register a step from app by a decorator, use `AsyncWorkflowStepBuilder`'s methods. ```python -class AsyncAck() +# Create a new WorkflowStep instance +from slack_bolt.workflows.async_step import AsyncWorkflowStep +ws = AsyncWorkflowStep( + callback_id="add_task", + edit=edit, + save=save, + execute=execute, +) +# Pass Step to set up listeners +app.step(ws) ``` -#### response: `Optional[BoltResponse]` +Refer to https://docs.slack.dev/legacy/legacy-steps-from-apps/ for details of steps from apps. + +To learn available arguments for middleware/listeners, see `slack_bolt.kwargs_injection.async_args`'s API document. +For further information about AsyncWorkflowStep specific function arguments +such as `configure`, `update`, `complete`, and `fail`, +refer to the `async` prefixed ones in `slack_bolt.workflows.step.utilities` API documents. -#### \_\_init\_\_ +**Parameters:** -```python -def __init__() -``` +- **callback_id** (Union[str, Pattern, AsyncWorkflowStep, AsyncWorkflowStepBuilder]) – The Callback ID for this step from app +- **edit** (Optional[Union[Callable..., [Optional[BoltResponse]], AsyncListener, Sequence[Callable]]]) – The function for displaying a modal in the Workflow Builder +- **save** (Optional[Union[Callable..., [Optional[BoltResponse]], AsyncListener, Sequence[Callable]]]) – The function for handling configuration in the Workflow Builder +- **execute** (Optional[Union[Callable..., [Optional[BoltResponse]], AsyncListener, Sequence[Callable]]]) – The function for handling the step execution -## AsyncBoltContext Objects +### `use` ```python -class AsyncBoltContext(BaseContext) +use(*args) ``` -Context object associated with a request from Slack. +Refer to `AsyncApp#middleware()` method's docstring for details. -#### to\_copyable +### `view` ```python -def to_copyable() -> AsyncBoltContext +view(constraints, matchers=None, middleware=None) ``` -#### listener\_runner +Registers a new `view_submission`/`view_closed` event listener. + +This method can be used as either a decorator or a method. ```python -@property -def listener_runner() -> AsyncioListenerRunner +# Use this method as a decorator +@app.view("view_1") +async def handle_submission(ack, body, client, view): + # Assume there's an input block with `block_c` as the block_id and `dreamy_input` + hopes_and_dreams = view["state"]["values"]["block_c"]["dreamy_input"] + user = body["user"]["id"] + # Validate the inputs + errors = {} + if hopes_and_dreams is not None and len(hopes_and_dreams) <= 5: + errors["block_c"] = "The value must be longer than 5 characters" + if len(errors) > 0: + await ack(response_action="errors", errors=errors) + return # Return early to display the validation errors to the user + # Acknowledge the view_submission event and close the modal + await ack() + # Do whatever you want with the input data - here we're saving it to a DB + +# Pass a function to this method +app.view("view_1")(handle_submission) ``` -The properly configured listener_runner that is available for middleware/listeners. +Refer to https://docs.slack.dev/reference/interaction-payloads/view-interactions-payload for details of payloads. -#### client +To learn available arguments for middleware/listeners, see `slack_bolt.kwargs_injection.async_args`'s API document. -```python -@property -def client() -> AsyncWebClient -``` +**Parameters:** -The `AsyncWebClient` instance available for this request. +- **constraints** (Union[str, Pattern, Dict[str, Union[str, Pattern]]]) – The conditions that match a request payload +- **matchers** (Optional[Sequence[Callable..., [Awaitable[bool]]]]) – A list of listener matcher functions. +Only when all the matchers return True, the listener function can be invoked. +- **middleware** (Optional[Sequence[Union[Callable, AsyncMiddleware]]]) – A list of lister middleware functions. +Only when all the middleware call `next()` method, the listener function can be invoked. -```python -@app.event("app_mention") -async def handle_events(context): - await context.client.chat_postMessage( - channel=context.channel_id, - text="Thanks!", - ) +### `view_closed` -# You can access "client" this way too. -@app.event("app_mention") -async def handle_events(client, context): - await client.chat_postMessage( - channel=context.channel_id, - text="Thanks!", - ) +```python +view_closed(constraints, matchers=None, middleware=None) ``` +Registers a new `view_closed` listener. -**Returns**: - -- `AsyncWebClient` - `AsyncWebClient` instance +Refer to https://docs.slack.dev/reference/interaction-payloads/view-interactions-payload/#view_closed for details. -#### ack +### `view_submission` ```python -@property -def ack() -> AsyncAck +view_submission(constraints, matchers=None, middleware=None) ``` -`ack()` function for this request. +Registers a new `view_submission` listener. -```python -@app.action("button") -async def handle_button_clicks(context): - await context.ack() +Refer to https://docs.slack.dev/reference/interaction-payloads/view-interactions-payload/#view_submission for +details. -# You can access "ack" this way too. -@app.action("button") -async def handle_button_clicks(ack): - await ack() +### `web_app` + +```python +web_app(path='/slack/events', port=3000) ``` +Returns a `web.Application` instance for aiohttp-devtools users. -**Returns**: +```python +from slack_bolt.async_app import AsyncApp +app = AsyncApp() -- `AsyncAck` - Callable `ack()` function +@app.event("app_mention") +async def event_test(body, say, logger): + logger.info(body) + await say("What's up?") -#### say +def app_factory(): + return app.web_app() -```python -@property -def say() -> AsyncSay +# adev runserver --port 3000 --app-factory app_factory async_app.py ``` -`say()` function for this request. - -```python -@app.action("button") -async def handle_button_clicks(context): - await context.ack() - await context.say("Hi!") +**Parameters:** -# You can access "ack" this way too. -@app.action("button") -async def handle_button_clicks(ack, say): - await ack() - await say("Hi!") -``` +- **path** (str) – The path to receive incoming requests from Slack +- **port** (int) – The port to listen on (Default: 3000) +## `AsyncBoltContext` -**Returns**: +Bases: BaseContext -- `AsyncSay` - Callable `say()` function +Context object associated with a request from Slack. -#### respond +### `ack` ```python -@property -def respond() -> Optional[AsyncRespond] +ack: AsyncAck ``` -`respond()` function for this request. +`ack()` function for this request. ```python @app.action("button") async def handle_button_clicks(context): await context.ack() - await context.respond("Hi!") # You can access "ack" this way too. @app.action("button") -async def handle_button_clicks(ack, respond): +async def handle_button_clicks(ack): await ack() - await respond("Hi!") ``` +**Returns:** -**Returns**: - -- `Optional[AsyncRespond]` - Callable `respond()` function +- AsyncAck – Callable `ack()` function -#### complete +### `actor_enterprise_id` ```python -@property -def complete() -> AsyncComplete +actor_enterprise_id: Optional[str] ``` -`complete()` function for this request. +The action's actor's Enterprise Grid organization ID. -Once a custom function's state is set to complete, -any outputs the function returns will be passed along to the next step of its housing workflow, -or complete the workflow if the function is the last step in a workflow. Additionally, -any interactivity handlers associated to a function invocation will no longer be invocable. +Note that this property is especially useful for handling events in Slack Connect channels. +That being said, it's not guaranteed to have a valid ID for all events due to server-side inconsistency. -```python -@app.function("reverse") -async def handle_button_clicks(ack, complete): - await ack() - await complete(outputs={"stringReverse":"olleh"}) +### `actor_team_id` -@app.function("reverse") -async def handle_button_clicks(context): - await context.ack() - await context.complete(outputs={"stringReverse":"olleh"}) +```python +actor_team_id: Optional[str] ``` +The action's actor's workspace ID. -**Returns**: +Note that this property is especially useful for handling events in Slack Connect channels. +That being said, it's not guaranteed to have a valid ID for all events due to server-side inconsistency. -- `AsyncComplete` - Callable `complete()` function - -#### fail +### `actor_user_id` ```python -@property -def fail() -> AsyncFail +actor_user_id: Optional[str] ``` -`fail()` function for this request. +The action's actor's user ID. -Once a custom function's state is set to error, -its housing workflow will be interrupted and any provided error message will be passed -on to the end user through SlackBot. Additionally, any interactivity handlers associated -to a function invocation will no longer be invocable. +Note that this property is especially useful for handling events in Slack Connect channels. +That being said, it's not guaranteed to have a valid ID for all events due to server-side inconsistency. -```python -@app.function("reverse") -async def handle_button_clicks(ack, fail): - await ack() - await fail(error="something went wrong") +### `authorize_result` -@app.function("reverse") -async def handle_button_clicks(context): - await context.ack() - await context.fail(error="something went wrong") +```python +authorize_result: Optional[AuthorizeResult] ``` +The authorize result resolved for this request. -**Returns**: - -- `AsyncFail` - Callable `fail()` function - -#### set\_title +### `bot_id` ```python -@property -def set_title() -> Optional[AsyncSetTitle] +bot_id: Optional[str] ``` -#### set\_status - -```python -@property -def set_status() -> Optional[AsyncSetStatus] -``` +The bot ID resolved for this request. -#### set\_suggested\_prompts +### `bot_token` ```python -@property -def set_suggested_prompts() -> Optional[AsyncSetSuggestedPrompts] +bot_token: Optional[str] ``` -#### get\_thread\_context - -```python -@property -def get_thread_context() -> Optional[AsyncGetThreadContext] -``` +The bot token resolved for this request. -#### say\_stream +### `bot_user_id` ```python -@property -def say_stream() -> Optional[AsyncSayStream] +bot_user_id: Optional[str] ``` -#### save\_thread\_context - -```python -@property -def save_thread_context() -> Optional[AsyncSaveThreadContext] -``` +The bot user ID resolved for this request. -## AsyncRespond Objects +### `channel_id` ```python -class AsyncRespond() +channel_id: Optional[str] ``` -#### response\_url: `Optional[str]` - -#### proxy: `Optional[str]` - -#### ssl: `Optional[SSLContext]` +The conversation ID associated with this request. -#### \_\_init\_\_ +### `client` ```python -def __init__( - *, - response_url: Optional[str], - proxy: Optional[str] = None, - ssl: Optional[SSLContext] = None) +client: AsyncWebClient ``` -## AsyncSay Objects +The `AsyncWebClient` instance available for this request. ```python -class AsyncSay() -``` - -#### client: `Optional[AsyncWebClient]` - -#### channel: `Optional[str]` - -#### thread\_ts: `Optional[str]` +@app.event("app_mention") +async def handle_events(context): + await context.client.chat_postMessage( + channel=context.channel_id, + text="Thanks!", + ) -#### build\_metadata: `Optional[Callable[[], Awaitable[Union[Dict, Metadata]]]]` +# You can access "client" this way too. +@app.event("app_mention") +async def handle_events(client, context): + await client.chat_postMessage( + channel=context.channel_id, + text="Thanks!", + ) +``` -#### \_\_init\_\_ +**Returns:** -```python -def __init__( - client: Optional[AsyncWebClient], - channel: Optional[str], - thread_ts: Optional[str] = None, - build_metadata: Optional[Callable[[], Awaitable[Union[Dict, Metadata]]]] = None) -``` +- AsyncWebClient – `AsyncWebClient` instance -## AsyncListener Objects +### `complete` ```python -class AsyncListener() +complete: AsyncComplete ``` -#### matchers: `Sequence[AsyncListenerMatcher]` +`complete()` function for this request. -#### middleware: `Sequence[AsyncMiddleware]` +Once a custom function's state is set to complete, +any outputs the function returns will be passed along to the next step of its housing workflow, +or complete the workflow if the function is the last step in a workflow. Additionally, +any interactivity handlers associated to a function invocation will no longer be invocable. -#### ack\_function: `Callable[..., Awaitable[BoltResponse]]` +```python +@app.function("reverse") +async def handle_button_clicks(ack, complete): + await ack() + await complete(outputs={"stringReverse":"olleh"}) -#### lazy\_functions: `Sequence[Callable[..., Awaitable[None]]]` +@app.function("reverse") +async def handle_button_clicks(context): + await context.ack() + await context.complete(outputs={"stringReverse":"olleh"}) +``` -#### auto\_acknowledgement: `bool` +**Returns:** -#### ack\_timeout: `int` +- AsyncComplete – Callable `complete()` function -#### async\_matches +### `enterprise_id` ```python -async def async_matches(*, req: AsyncBoltRequest, resp: BoltResponse) -> bool +enterprise_id: Optional[str] ``` -#### run\_async\_middleware +The Enterprise Grid Organization ID of this request. + +### `fail` ```python -async def run_async_middleware( - *, - req: AsyncBoltRequest, - resp: BoltResponse) -> Tuple[Optional[BoltResponse], bool] +fail: AsyncFail ``` -Runs an async middleware. - -**Arguments**: - -- `req` _AsyncBoltRequest_ - The incoming request -- `resp` _BoltResponse_ - The current response - -**Returns**: - -- `Tuple[Optional[BoltResponse], bool]` - A tuple of the processed response and a flag indicating termination +`fail()` function for this request. -#### run\_ack\_function +Once a custom function's state is set to error, +its housing workflow will be interrupted and any provided error message will be passed +on to the end user through SlackBot. Additionally, any interactivity handlers associated +to a function invocation will no longer be invocable. ```python -async def run_ack_function( - *, - request: AsyncBoltRequest, - response: BoltResponse) -> Optional[BoltResponse] -``` - -Runs all the registered middleware and then run the listener function. - -**Arguments**: +@app.function("reverse") +async def handle_button_clicks(ack, fail): + await ack() + await fail(error="something went wrong") -- `request` _AsyncBoltRequest_ - The incoming request -- `response` _BoltResponse_ - The current response +@app.function("reverse") +async def handle_button_clicks(context): + await context.ack() + await context.fail(error="something went wrong") +``` -**Returns**: +**Returns:** -- `Optional[BoltResponse]` - The processed response +- AsyncFail – Callable `fail()` function -## AsyncCustomListenerMatcher Objects +### `function_bot_access_token` ```python -class AsyncCustomListenerMatcher(AsyncListenerMatcher) +function_bot_access_token: Optional[str] ``` -#### app\_name: `str` - -#### func: `Callable[..., Awaitable[bool]]` - -#### arg\_names: `Sequence[str]` +The bot token resolved for this function request. -#### logger: `Logger` +Only available for `function_executed` and interactivity events scoped to a custom step. -#### \_\_init\_\_ +### `function_execution_id` ```python -def __init__( - *, - app_name: str, - func: Callable[..., Awaitable[bool]], - base_logger: Optional[Logger] = None) +function_execution_id: Optional[str] ``` -#### async\_matches +The `function_execution_id` associated with this request. -```python -async def async_matches(req: AsyncBoltRequest, resp: BoltResponse) -> bool -``` +Only available for `function_executed` and interactivity events scoped to a custom step. -## AsyncBoltRequest Objects +### `inputs` ```python -class AsyncBoltRequest() +inputs: Optional[Dict[str, Any]] ``` -#### raw\_body: `str` - -#### body: `Dict[str, Any]` - -#### query: `Dict[str, Sequence[str]]` - -#### headers: `Dict[str, Sequence[str]]` - -#### content\_type: `Optional[str]` +The `inputs` associated with this request. -#### context: `AsyncBoltContext` +Only available for `function_executed` and interactivity events scoped to a custom step. -#### lazy\_only: `bool` - -#### lazy\_function\_name: `Optional[str]` - -#### mode: `str` - -#### \_\_init\_\_ +### `is_enterprise_install` ```python -def __init__( - *, - body: Union[str, dict], - query: Optional[Union[str, Dict[str, str], Dict[str, Sequence[str]]]] = None, - headers: Optional[Dict[str, Union[str, Sequence[str]]]] = None, - context: Optional[Dict[str, Any]] = None, - mode: str = 'http') +is_enterprise_install: Optional[bool] ``` -Request to a Bolt app. - -**Arguments**: - -- `body` _Union[str, dict]_ - The raw request body (only plain text is supported for "http" mode) -- `query` _Optional[Union[str, Dict[str, str], Dict[str, Sequence[str]]]]_ - The query string data in any data format. -- `headers` _Optional[Dict[str, Union[str, Sequence[str]]]]_ - The request headers. -- `context` _Optional[Dict[str, Any]]_ - The context in this request. -- `mode` _str_ - The mode used for this request. (either "http" or "socket_mode") +True if the request is associated with an Org-wide installation. -#### to\_copyable +### `listener_runner` ```python -def to_copyable() -> AsyncBoltRequest +listener_runner: AsyncioListenerRunner ``` -## AsyncAssistant Objects +The properly configured listener_runner that is available for middleware/listeners. + +### `logger` ```python -class AsyncAssistant(AsyncMiddleware) +logger: Logger ``` -#### thread\_context\_store: `Optional[AsyncAssistantThreadContextStore]` - -#### base\_logger: `Optional[logging.Logger]` +The properly configured logger that is available for middleware/listeners. -#### \_\_init\_\_ +### `matches` ```python -def __init__( - *, - app_name: str = 'assistant', - thread_context_store: Optional[AsyncAssistantThreadContextStore] = None, - logger: Optional[logging.Logger] = None) +matches: Optional[Tuple] ``` -#### thread\_started +Returns all the matched parts in message listener's regexp. -```python -def thread_started( - *args, - matchers: Optional[Union[Callable[..., bool], AsyncListenerMatcher]] = None, - middleware: Optional[Union[Callable, AsyncMiddleware]] = None, - lazy: Optional[List[Callable[..., None]]] = None) -``` - -#### user\_message +### `respond` ```python -def user_message( - *args, - matchers: Optional[Union[Callable[..., bool], AsyncListenerMatcher]] = None, - middleware: Optional[Union[Callable, AsyncMiddleware]] = None, - lazy: Optional[List[Callable[..., None]]] = None) +respond: Optional[AsyncRespond] ``` -#### bot\_message +`respond()` function for this request. ```python -def bot_message( - *args, - matchers: Optional[Union[Callable[..., bool], AsyncListenerMatcher]] = None, - middleware: Optional[Union[Callable, AsyncMiddleware]] = None, - lazy: Optional[List[Callable[..., None]]] = None) -``` - -#### thread\_context\_changed +@app.action("button") +async def handle_button_clicks(context): + await context.ack() + await context.respond("Hi!") -```python -def thread_context_changed( - *args, - matchers: Optional[Union[Callable[..., bool], AsyncListenerMatcher]] = None, - middleware: Optional[Union[Callable, AsyncMiddleware]] = None, - lazy: Optional[List[Callable[..., None]]] = None) +# You can access "ack" this way too. +@app.action("button") +async def handle_button_clicks(ack, respond): + await ack() + await respond("Hi!") ``` -#### default\_thread\_context\_changed +**Returns:** -```python -async def default_thread_context_changed( - save_thread_context: AsyncSaveThreadContext, - payload: dict) -``` +- Optional[AsyncRespond] – Callable `respond()` function -#### async\_process +### `response_url` ```python -async def async_process( - *, - req: AsyncBoltRequest, - resp: BoltResponse, - next: Callable[[], Awaitable[BoltResponse]]) -> Optional[BoltResponse] +response_url: Optional[str] ``` -#### build\_listener +The `response_url` associated with this request. + +### `say` ```python -def build_listener( - listener_or_functions: Union[AsyncListener, Callable, List[Callable]], - matchers: Optional[List[Union[AsyncListenerMatcher, Callable[..., Awaitable[bool]]]]] = None, - middleware: Optional[List[AsyncMiddleware]] = None, - base_logger: Optional[Logger] = None) -> AsyncListener +say: AsyncSay ``` -## AsyncSetStatus Objects +`say()` function for this request. ```python -class AsyncSetStatus() -``` +@app.action("button") +async def handle_button_clicks(context): + await context.ack() + await context.say("Hi!") -#### client: `AsyncWebClient` +# You can access "ack" this way too. +@app.action("button") +async def handle_button_clicks(ack, say): + await ack() + await say("Hi!") +``` -#### channel\_id: `str` +**Returns:** -#### thread\_ts: `str` +- AsyncSay – Callable `say()` function -#### \_\_init\_\_ +### `team_id` ```python -def __init__(client: AsyncWebClient, channel_id: str, thread_ts: str) +team_id: Optional[str] ``` -## AsyncSetTitle Objects +The Workspace ID of this request. + +### `thread_ts` ```python -class AsyncSetTitle() +thread_ts: Optional[str] ``` -#### client: `AsyncWebClient` - -#### channel\_id: `str` - -#### thread\_ts: `str` +The conversation thread's ID associated with this request. -#### \_\_init\_\_ +### `token` ```python -def __init__(client: AsyncWebClient, channel_id: str, thread_ts: str) +token: Optional[str] ``` -## AsyncSetSuggestedPrompts Objects +The (bot/user) token resolved for this request. + +### `user_id` ```python -class AsyncSetSuggestedPrompts() +user_id: Optional[str] ``` -#### client: `AsyncWebClient` - -#### channel\_id: `str` - -#### thread\_ts: `Optional[str]` +The user ID associated ith this request. -#### \_\_init\_\_ +### `user_token` ```python -def __init__(client: AsyncWebClient, channel_id: str, thread_ts: Optional[str] = None) +user_token: Optional[str] ``` -## AsyncGetThreadContext Objects +The user token resolved for this request. + +## `AsyncBoltRequest` ```python -class AsyncGetThreadContext() +AsyncBoltRequest(*, body, query=None, headers=None, context=None, mode='http') ``` -#### thread\_context\_store: `AsyncAssistantThreadContextStore` - -#### payload: `dict` +Request to a Bolt app. -#### channel\_id: `str` +**Parameters:** -#### thread\_ts: `str` +- **body** (Union[str, dict]) – The raw request body (only plain text is supported for "http" mode) +- **query** (Optional[Union[str, Dict[str, str], Dict[str, Sequence[str]]]]) – The query string data in any data format. +- **headers** (Optional[Dict[str, Union[str, Sequence[str]]]]) – The request headers. +- **context** (Optional[Dict[str, Any]]) – The context in this request. +- **mode** (str) – The mode used for this request. (either "http" or "socket_mode") -#### thread\_context\_loaded: `bool` +## `AsyncListener` -#### \_\_init\_\_ +### `run_ack_function` ```python -def __init__( - thread_context_store: AsyncAssistantThreadContextStore, - channel_id: str, - thread_ts: str, - payload: dict) +run_ack_function(*, request, response) ``` -## AsyncSaveThreadContext Objects - -```python -class AsyncSaveThreadContext() -``` +Runs all the registered middleware and then run the listener function. -#### thread\_context\_store: `AsyncAssistantThreadContextStore` +**Parameters:** -#### channel\_id: `str` +- **request** (AsyncBoltRequest) – The incoming request +- **response** (BoltResponse) – The current response -#### thread\_ts: `str` +**Returns:** -#### \_\_init\_\_ +- Optional[BoltResponse] – The processed response -```python -def __init__( - thread_context_store: AsyncAssistantThreadContextStore, - channel_id: str, - thread_ts: str) -``` - -## AsyncSayStream Objects +### `run_async_middleware` ```python -class AsyncSayStream() +run_async_middleware(*, req, resp) ``` -#### client: `AsyncWebClient` +Runs an async middleware. -#### channel: `Optional[str]` +**Parameters:** -#### recipient\_team\_id: `Optional[str]` +- **req** (AsyncBoltRequest) – The incoming request +- **resp** (BoltResponse) – The current response -#### recipient\_user\_id: `Optional[str]` +**Returns:** -#### thread\_ts: `Optional[str]` +- Tuple[Optional[BoltResponse], bool] – A tuple of the processed response and a flag indicating termination -#### \_\_init\_\_ +## `AsyncSayStream` ```python -def __init__( - *, - client: AsyncWebClient, - channel: Optional[str] = None, - recipient_team_id: Optional[str] = None, - recipient_user_id: Optional[str] = None, - thread_ts: Optional[str] = None) +AsyncSayStream(*, client, channel=None, recipient_team_id=None, recipient_user_id=None, thread_ts=None) ``` diff --git a/docs/english/reference/authorization/async_authorize.md b/docs/english/reference/authorization/async_authorize.md index bc8f94ff2..fc29ebe2e 100644 --- a/docs/english/reference/authorization/async_authorize.md +++ b/docs/english/reference/authorization/async_authorize.md @@ -3,69 +3,33 @@ sidebar_label: async_authorize title: slack_bolt.authorization.async_authorize --- -## AsyncAuthorize Objects +## `AsyncAuthorize` ```python -class AsyncAuthorize() +AsyncAuthorize() ``` This provides authorize function that returns AuthorizeResult for an incoming request from Slack. -#### \_\_init\_\_ +## `AsyncCallableAuthorize` ```python -def __init__() +AsyncCallableAuthorize(*, logger, func) ``` -## AsyncCallableAuthorize Objects - -```python -class AsyncCallableAuthorize(AsyncAuthorize) -``` +Bases: AsyncAuthorize When you pass the `authorize` argument in AsyncApp constructor, this `authorize` implementation will be used. -#### \_\_init\_\_ +## `AsyncInstallationStoreAuthorize` ```python -def __init__(*, logger: Logger, func: Callable[..., Awaitable[AuthorizeResult]]) +AsyncInstallationStoreAuthorize(*, logger, installation_store, client_id=None, client_secret=None, token_rotation_expiration_minutes=None, bot_only=False, cache_enabled=False, client=None, user_token_resolution='authed_user') ``` -## AsyncInstallationStoreAuthorize Objects - -```python -class AsyncInstallationStoreAuthorize(AsyncAuthorize) -``` +Bases: AsyncAuthorize If you use the OAuth flow settings, this authorize implementation will be used. As long as your own InstallationStore (or the built-in ones) works as you expect, you can expect that the authorize layer should work for you without any customization. - -#### authorize\_result\_cache: `Dict[str, AuthorizeResult]` - -#### bot\_only: `bool` - -#### user\_token\_resolution: `str` - -#### find\_installation\_available: `Optional[bool]` - -#### find\_bot\_available: `Optional[bool]` - -#### token\_rotator: `Optional[AsyncTokenRotator]` - -#### \_\_init\_\_ - -```python -def __init__( - *, - logger: Logger, - installation_store: AsyncInstallationStore, - client_id: Optional[str] = None, - client_secret: Optional[str] = None, - token_rotation_expiration_minutes: Optional[int] = None, - bot_only: bool = False, - cache_enabled: bool = False, - client: Optional[AsyncWebClient] = None, - user_token_resolution: str = 'authed_user') -``` diff --git a/docs/english/reference/authorization/async_authorize_args.md b/docs/english/reference/authorization/async_authorize_args.md index df35a1e87..f121f840f 100644 --- a/docs/english/reference/authorization/async_authorize_args.md +++ b/docs/english/reference/authorization/async_authorize_args.md @@ -3,40 +3,17 @@ sidebar_label: async_authorize_args title: slack_bolt.authorization.async_authorize_args --- -## AsyncAuthorizeArgs Objects +## `AsyncAuthorizeArgs` ```python -class AsyncAuthorizeArgs() -``` - -#### context: `AsyncBoltContext` - -#### logger: `Logger` - -#### client: `AsyncWebClient` - -#### enterprise\_id: `Optional[str]` - -#### team\_id: `Optional[str]` - -#### user\_id: `Optional[str]` - -#### \_\_init\_\_ - -```python -def __init__( - *, - context: AsyncBoltContext, - enterprise_id: Optional[str], - team_id: Optional[str], - user_id: Optional[str]) +AsyncAuthorizeArgs(*, context, enterprise_id, team_id, user_id) ``` The full list of the arguments passed to `authorize` function. -**Arguments**: +**Parameters:** -- `context` _AsyncBoltContext_ - The request context -- `enterprise_id` _Optional[str]_ - The Organization ID (Enterprise Grid) -- `team_id` _Optional[str]_ - The workspace ID -- `user_id` _Optional[str]_ - The request user ID +- **context** (AsyncBoltContext) – The request context +- **enterprise_id** (Optional[str]) – The Organization ID (Enterprise Grid) +- **team_id** (Optional[str]) – The workspace ID +- **user_id** (Optional[str]) – The request user ID diff --git a/docs/english/reference/authorization/authorize.md b/docs/english/reference/authorization/authorize.md index 1912932c4..039604922 100644 --- a/docs/english/reference/authorization/authorize.md +++ b/docs/english/reference/authorization/authorize.md @@ -3,69 +3,33 @@ sidebar_label: authorize title: slack_bolt.authorization.authorize --- -## Authorize Objects +## `Authorize` ```python -class Authorize() +Authorize() ``` This provides authorize function that returns AuthorizeResult for an incoming request from Slack. -#### \_\_init\_\_ +## `CallableAuthorize` ```python -def __init__() +CallableAuthorize(*, logger, func) ``` -## CallableAuthorize Objects - -```python -class CallableAuthorize(Authorize) -``` +Bases: Authorize When you pass the `authorize` argument in App constructor, this `authorize` implementation will be used. -#### \_\_init\_\_ +## `InstallationStoreAuthorize` ```python -def __init__(*, logger: Logger, func: Callable[..., AuthorizeResult]) +InstallationStoreAuthorize(*, logger, installation_store, client_id=None, client_secret=None, token_rotation_expiration_minutes=None, bot_only=False, cache_enabled=False, client=None, user_token_resolution='authed_user') ``` -## InstallationStoreAuthorize Objects - -```python -class InstallationStoreAuthorize(Authorize) -``` +Bases: Authorize If you use the OAuth flow settings, this `authorize` implementation will be used. As long as your own InstallationStore (or the built-in ones) works as you expect, you can expect that the `authorize` layer should work for you without any customization. - -#### authorize\_result\_cache: `Dict[str, AuthorizeResult]` - -#### bot\_only: `bool` - -#### user\_token\_resolution: `str` - -#### find\_installation\_available: `bool` - -#### find\_bot\_available: `bool` - -#### token\_rotator: `Optional[TokenRotator]` - -#### \_\_init\_\_ - -```python -def __init__( - *, - logger: Logger, - installation_store: InstallationStore, - client_id: Optional[str] = None, - client_secret: Optional[str] = None, - token_rotation_expiration_minutes: Optional[int] = None, - bot_only: bool = False, - cache_enabled: bool = False, - client: Optional[WebClient] = None, - user_token_resolution: str = 'authed_user') -``` diff --git a/docs/english/reference/authorization/authorize_args.md b/docs/english/reference/authorization/authorize_args.md index e5ae33a82..6be652aff 100644 --- a/docs/english/reference/authorization/authorize_args.md +++ b/docs/english/reference/authorization/authorize_args.md @@ -3,40 +3,17 @@ sidebar_label: authorize_args title: slack_bolt.authorization.authorize_args --- -## AuthorizeArgs Objects +## `AuthorizeArgs` ```python -class AuthorizeArgs() -``` - -#### context: `BoltContext` - -#### logger: `Logger` - -#### client: `WebClient` - -#### enterprise\_id: `Optional[str]` - -#### team\_id: `Optional[str]` - -#### user\_id: `Optional[str]` - -#### \_\_init\_\_ - -```python -def __init__( - *, - context: BoltContext, - enterprise_id: Optional[str], - team_id: Optional[str], - user_id: Optional[str]) +AuthorizeArgs(*, context, enterprise_id, team_id, user_id) ``` The full list of the arguments passed to `authorize` function. -**Arguments**: +**Parameters:** -- `context` _BoltContext_ - The request context -- `enterprise_id` _Optional[str]_ - The Organization ID (Enterprise Grid) -- `team_id` _Optional[str]_ - The workspace ID -- `user_id` _Optional[str]_ - The request user ID +- **context** (BoltContext) – The request context +- **enterprise_id** (Optional[str]) – The Organization ID (Enterprise Grid) +- **team_id** (Optional[str]) – The workspace ID +- **user_id** (Optional[str]) – The request user ID diff --git a/docs/english/reference/authorization/authorize_result.md b/docs/english/reference/authorization/authorize_result.md index f8a2aa33d..8e1678f30 100644 --- a/docs/english/reference/authorization/authorize_result.md +++ b/docs/english/reference/authorization/authorize_result.md @@ -3,83 +3,29 @@ sidebar_label: authorize_result title: slack_bolt.authorization.authorize_result --- -## AuthorizeResult Objects +## `AuthorizeResult` ```python -class AuthorizeResult(dict) +AuthorizeResult(*, enterprise_id, team_id, team=None, url=None, bot_user_id=None, bot_id=None, bot_token=None, bot_scopes=None, user_id=None, user=None, user_token=None, user_scopes=None) ``` -Authorize function call result. - -#### enterprise\_id: `Optional[str]` - -#### team\_id: `Optional[str]` - -#### team: `Optional[str]` - -#### url: `Optional[str]` - -#### bot\_id: `Optional[str]` - -#### bot\_user\_id: `Optional[str]` - -#### bot\_token: `Optional[str]` - -#### bot\_scopes: `Optional[Sequence[str]]` - -#### user\_id: `Optional[str]` - -#### user: `Optional[str]` +Bases: dict -#### user\_token: `Optional[str]` - -#### user\_scopes: `Optional[Sequence[str]]` - -#### \_\_init\_\_ - -```python -def __init__( - *, - enterprise_id: Optional[str], - team_id: Optional[str], - team: Optional[str] = None, - url: Optional[str] = None, - bot_user_id: Optional[str] = None, - bot_id: Optional[str] = None, - bot_token: Optional[str] = None, - bot_scopes: Optional[Union[Sequence[str], str]] = None, - user_id: Optional[str] = None, - user: Optional[str] = None, - user_token: Optional[str] = None, - user_scopes: Optional[Union[Sequence[str], str]] = None) -``` +Authorize function call result. Initialize the authorize function call result. -**Arguments**: - -- `enterprise_id` _Optional[str]_ - Organization ID (Enterprise Grid) starting with `E` -- `team_id` _Optional[str]_ - Workspace ID starting with `T` -- `team` _Optional[str]_ - Workspace name -- `url` _Optional[str]_ - Workspace slack.com URL -- `bot_user_id` _Optional[str]_ - Bot user's User ID starting with either `U` or `W` -- `bot_id` _Optional[str]_ - Bot ID starting with `B` -- `bot_token` _Optional[str]_ - Bot user access token starting with `xoxb-` -- `bot_scopes` _Optional[Union[Sequence[str], str]]_ - The scopes associated with the bot token -- `user_id` _Optional[str]_ - The request user ID -- `user` _Optional[str]_ - The request user's name -- `user_token` _Optional[str]_ - User access token starting with `xoxp-` -- `user_scopes` _Optional[Union[Sequence[str], str]]_ - The scopes associated with the user token - -#### from\_auth\_test\_response - -```python -def from_auth_test_response( - *, - bot_token: Optional[str] = None, - user_token: Optional[str] = None, - bot_scopes: Optional[Union[Sequence[str], str]] = None, - user_scopes: Optional[Union[Sequence[str], str]] = None, - auth_test_response: Union[SlackResponse, AsyncSlackResponse], - user_auth_test_response: Optional[Union[SlackResponse, AsyncSlackResponse]] = None) -> AuthorizeResult -``` +**Parameters:** + +- **enterprise_id** (Optional[str]) – Organization ID (Enterprise Grid) starting with `E` +- **team_id** (Optional[str]) – Workspace ID starting with `T` +- **team** (Optional[str]) – Workspace name +- **url** (Optional[str]) – Workspace slack.com URL +- **bot_user_id** (Optional[str]) – Bot user's User ID starting with either `U` or `W` +- **bot_id** (Optional[str]) – Bot ID starting with `B` +- **bot_token** (Optional[str]) – Bot user access token starting with `xoxb-` +- **bot_scopes** (Optional[Union[Sequence[str], str]]) – The scopes associated with the bot token +- **user_id** (Optional[str]) – The request user ID +- **user** (Optional[str]) – The request user's name +- **user_token** (Optional[str]) – User access token starting with `xoxp-` +- **user_scopes** (Optional[Union[Sequence[str], str]]) – The scopes associated with the user token diff --git a/docs/english/reference/authorization/index.md b/docs/english/reference/authorization/index.md index 40fdc492d..795c34899 100644 --- a/docs/english/reference/authorization/index.md +++ b/docs/english/reference/authorization/index.md @@ -7,91 +7,37 @@ Authorization determines which Slack credentials should be available while proce Refer to https://docs.slack.dev/tools/bolt-python/concepts/authorization for details. -## Submodules - -- [slack_bolt.authorization.async_authorize](/tools/bolt-python/reference/authorization/async_authorize) -- [slack_bolt.authorization.async_authorize_args](/tools/bolt-python/reference/authorization/async_authorize_args) -- [slack_bolt.authorization.authorize](/tools/bolt-python/reference/authorization/authorize) -- [slack_bolt.authorization.authorize_args](/tools/bolt-python/reference/authorization/authorize_args) -- [slack_bolt.authorization.authorize_result](/tools/bolt-python/reference/authorization/authorize_result) - -## AuthorizeResult Objects +## `AuthorizeResult` ```python -class AuthorizeResult(dict) +AuthorizeResult(*, enterprise_id, team_id, team=None, url=None, bot_user_id=None, bot_id=None, bot_token=None, bot_scopes=None, user_id=None, user=None, user_token=None, user_scopes=None) ``` -Authorize function call result. - -#### enterprise\_id: `Optional[str]` - -#### team\_id: `Optional[str]` - -#### team: `Optional[str]` - -#### url: `Optional[str]` - -#### bot\_id: `Optional[str]` - -#### bot\_user\_id: `Optional[str]` - -#### bot\_token: `Optional[str]` - -#### bot\_scopes: `Optional[Sequence[str]]` +Bases: dict -#### user\_id: `Optional[str]` - -#### user: `Optional[str]` - -#### user\_token: `Optional[str]` - -#### user\_scopes: `Optional[Sequence[str]]` - -#### \_\_init\_\_ - -```python -def __init__( - *, - enterprise_id: Optional[str], - team_id: Optional[str], - team: Optional[str] = None, - url: Optional[str] = None, - bot_user_id: Optional[str] = None, - bot_id: Optional[str] = None, - bot_token: Optional[str] = None, - bot_scopes: Optional[Union[Sequence[str], str]] = None, - user_id: Optional[str] = None, - user: Optional[str] = None, - user_token: Optional[str] = None, - user_scopes: Optional[Union[Sequence[str], str]] = None) -``` +Authorize function call result. Initialize the authorize function call result. -**Arguments**: - -- `enterprise_id` _Optional[str]_ - Organization ID (Enterprise Grid) starting with `E` -- `team_id` _Optional[str]_ - Workspace ID starting with `T` -- `team` _Optional[str]_ - Workspace name -- `url` _Optional[str]_ - Workspace slack.com URL -- `bot_user_id` _Optional[str]_ - Bot user's User ID starting with either `U` or `W` -- `bot_id` _Optional[str]_ - Bot ID starting with `B` -- `bot_token` _Optional[str]_ - Bot user access token starting with `xoxb-` -- `bot_scopes` _Optional[Union[Sequence[str], str]]_ - The scopes associated with the bot token -- `user_id` _Optional[str]_ - The request user ID -- `user` _Optional[str]_ - The request user's name -- `user_token` _Optional[str]_ - User access token starting with `xoxp-` -- `user_scopes` _Optional[Union[Sequence[str], str]]_ - The scopes associated with the user token +**Parameters:** + +- **enterprise_id** (Optional[str]) – Organization ID (Enterprise Grid) starting with `E` +- **team_id** (Optional[str]) – Workspace ID starting with `T` +- **team** (Optional[str]) – Workspace name +- **url** (Optional[str]) – Workspace slack.com URL +- **bot_user_id** (Optional[str]) – Bot user's User ID starting with either `U` or `W` +- **bot_id** (Optional[str]) – Bot ID starting with `B` +- **bot_token** (Optional[str]) – Bot user access token starting with `xoxb-` +- **bot_scopes** (Optional[Union[Sequence[str], str]]) – The scopes associated with the bot token +- **user_id** (Optional[str]) – The request user ID +- **user** (Optional[str]) – The request user's name +- **user_token** (Optional[str]) – User access token starting with `xoxp-` +- **user_scopes** (Optional[Union[Sequence[str], str]]) – The scopes associated with the user token -#### from\_auth\_test\_response +## Submodules -```python -def from_auth_test_response( - *, - bot_token: Optional[str] = None, - user_token: Optional[str] = None, - bot_scopes: Optional[Union[Sequence[str], str]] = None, - user_scopes: Optional[Union[Sequence[str], str]] = None, - auth_test_response: Union[SlackResponse, AsyncSlackResponse], - user_auth_test_response: Optional[Union[SlackResponse, AsyncSlackResponse]] = None) -> AuthorizeResult -``` +- [slack_bolt.authorization.async_authorize](/tools/bolt-python/reference/authorization/async_authorize) +- [slack_bolt.authorization.async_authorize_args](/tools/bolt-python/reference/authorization/async_authorize_args) +- [slack_bolt.authorization.authorize](/tools/bolt-python/reference/authorization/authorize) +- [slack_bolt.authorization.authorize_args](/tools/bolt-python/reference/authorization/authorize_args) +- [slack_bolt.authorization.authorize_result](/tools/bolt-python/reference/authorization/authorize_result) diff --git a/docs/english/reference/context/ack/ack.md b/docs/english/reference/context/ack/ack.md index c8ef3f5b9..e25f2ac3b 100644 --- a/docs/english/reference/context/ack/ack.md +++ b/docs/english/reference/context/ack/ack.md @@ -4,16 +4,4 @@ title: slack_bolt.context.ack.ack slug: ack --- -## Ack Objects -```python -class Ack() -``` - -#### response: `Optional[BoltResponse]` - -#### \_\_init\_\_ - -```python -def __init__() -``` diff --git a/docs/english/reference/context/ack/async_ack.md b/docs/english/reference/context/ack/async_ack.md index 5f8d84fca..e0a8db656 100644 --- a/docs/english/reference/context/ack/async_ack.md +++ b/docs/english/reference/context/ack/async_ack.md @@ -3,16 +3,4 @@ sidebar_label: async_ack title: slack_bolt.context.ack.async_ack --- -## AsyncAck Objects -```python -class AsyncAck() -``` - -#### response: `Optional[BoltResponse]` - -#### \_\_init\_\_ - -```python -def __init__() -``` diff --git a/docs/english/reference/context/ack/index.md b/docs/english/reference/context/ack/index.md index c46e6053c..d06649e56 100644 --- a/docs/english/reference/context/ack/index.md +++ b/docs/english/reference/context/ack/index.md @@ -8,17 +8,3 @@ title: slack_bolt.context.ack - [slack_bolt.context.ack.ack](/tools/bolt-python/reference/context/ack/ack) - [slack_bolt.context.ack.async_ack](/tools/bolt-python/reference/context/ack/async_ack) - [slack_bolt.context.ack.internals](/tools/bolt-python/reference/context/ack/internals) - -## Ack Objects - -```python -class Ack() -``` - -#### response: `Optional[BoltResponse]` - -#### \_\_init\_\_ - -```python -def __init__() -``` diff --git a/docs/english/reference/context/assistant/assistant_utilities.md b/docs/english/reference/context/assistant/assistant_utilities.md index 6fb13353e..5a8a13ff2 100644 --- a/docs/english/reference/context/assistant/assistant_utilities.md +++ b/docs/english/reference/context/assistant/assistant_utilities.md @@ -3,56 +3,4 @@ sidebar_label: assistant_utilities title: slack_bolt.context.assistant.assistant_utilities --- -## AssistantUtilities Objects -```python -class AssistantUtilities() -``` - -#### payload: `dict` - -#### client: `WebClient` - -#### channel\_id: `str` - -#### thread\_ts: `str` - -#### thread\_context\_store: `AssistantThreadContextStore` - -#### \_\_init\_\_ - -```python -def __init__( - *, - payload: dict, - context: BoltContext, - thread_context_store: Optional[AssistantThreadContextStore] = None) -``` - -#### set\_title - -```python -@property -def set_title() -> SetTitle -``` - -#### say - -```python -@property -def say() -> Say -``` - -#### get\_thread\_context - -```python -@property -def get_thread_context() -> GetThreadContext -``` - -#### save\_thread\_context - -```python -@property -def save_thread_context() -> SaveThreadContext -``` diff --git a/docs/english/reference/context/assistant/async_assistant_utilities.md b/docs/english/reference/context/assistant/async_assistant_utilities.md index d5d0bd046..db307f344 100644 --- a/docs/english/reference/context/assistant/async_assistant_utilities.md +++ b/docs/english/reference/context/assistant/async_assistant_utilities.md @@ -3,56 +3,4 @@ sidebar_label: async_assistant_utilities title: slack_bolt.context.assistant.async_assistant_utilities --- -## AsyncAssistantUtilities Objects -```python -class AsyncAssistantUtilities() -``` - -#### payload: `dict` - -#### client: `AsyncWebClient` - -#### channel\_id: `str` - -#### thread\_ts: `str` - -#### thread\_context\_store: `AsyncAssistantThreadContextStore` - -#### \_\_init\_\_ - -```python -def __init__( - *, - payload: dict, - context: AsyncBoltContext, - thread_context_store: Optional[AsyncAssistantThreadContextStore] = None) -``` - -#### set\_title - -```python -@property -def set_title() -> AsyncSetTitle -``` - -#### say - -```python -@property -def say() -> AsyncSay -``` - -#### get\_thread\_context - -```python -@property -def get_thread_context() -> AsyncGetThreadContext -``` - -#### save\_thread\_context - -```python -@property -def save_thread_context() -> AsyncSaveThreadContext -``` diff --git a/docs/english/reference/context/assistant/internals.md b/docs/english/reference/context/assistant/internals.md index 0b5d88e9b..ae403bc9a 100644 --- a/docs/english/reference/context/assistant/internals.md +++ b/docs/english/reference/context/assistant/internals.md @@ -3,10 +3,10 @@ sidebar_label: internals title: slack_bolt.context.assistant.internals --- -#### has\_channel\_id\_and\_thread\_ts +## `has_channel_id_and_thread_ts` ```python -def has_channel_id_and_thread_ts(payload: dict) -> bool +has_channel_id_and_thread_ts(payload) ``` Verifies if the given payload has both channel_id and thread_ts under assistant_thread property. diff --git a/docs/english/reference/context/assistant/thread_context/index.md b/docs/english/reference/context/assistant/thread_context/index.md index 9aa64ee48..7e321f12c 100644 --- a/docs/english/reference/context/assistant/thread_context/index.md +++ b/docs/english/reference/context/assistant/thread_context/index.md @@ -3,20 +3,4 @@ sidebar_label: thread_context title: slack_bolt.context.assistant.thread_context --- -## AssistantThreadContext Objects -```python -class AssistantThreadContext(dict) -``` - -#### enterprise\_id: `Optional[str]` - -#### team\_id: `Optional[str]` - -#### channel\_id: `str` - -#### \_\_init\_\_ - -```python -def __init__(payload: dict) -``` diff --git a/docs/english/reference/context/assistant/thread_context_store/async_store.md b/docs/english/reference/context/assistant/thread_context_store/async_store.md index 77ce5c62c..7456d47d8 100644 --- a/docs/english/reference/context/assistant/thread_context_store/async_store.md +++ b/docs/english/reference/context/assistant/thread_context_store/async_store.md @@ -3,20 +3,4 @@ sidebar_label: async_store title: slack_bolt.context.assistant.thread_context_store.async_store --- -## AsyncAssistantThreadContextStore Objects -```python -class AsyncAssistantThreadContextStore() -``` - -#### save - -```python -async def save(*, channel_id: str, thread_ts: str, context: Dict[str, str]) -> None -``` - -#### find - -```python -async def find(*, channel_id: str, thread_ts: str) -> Optional[AssistantThreadContext] -``` diff --git a/docs/english/reference/context/assistant/thread_context_store/default_async_store.md b/docs/english/reference/context/assistant/thread_context_store/default_async_store.md index a49c34e47..0a00d8f9e 100644 --- a/docs/english/reference/context/assistant/thread_context_store/default_async_store.md +++ b/docs/english/reference/context/assistant/thread_context_store/default_async_store.md @@ -3,30 +3,4 @@ sidebar_label: default_async_store title: slack_bolt.context.assistant.thread_context_store.default_async_store --- -## DefaultAsyncAssistantThreadContextStore Objects -```python -class DefaultAsyncAssistantThreadContextStore(AsyncAssistantThreadContextStore) -``` - -#### client: `AsyncWebClient` - -#### context: `AsyncBoltContext` - -#### \_\_init\_\_ - -```python -def __init__(context: AsyncBoltContext) -``` - -#### save - -```python -async def save(*, channel_id: str, thread_ts: str, context: Dict[str, str]) -> None -``` - -#### find - -```python -async def find(*, channel_id: str, thread_ts: str) -> Optional[AssistantThreadContext] -``` diff --git a/docs/english/reference/context/assistant/thread_context_store/default_store.md b/docs/english/reference/context/assistant/thread_context_store/default_store.md index 107f29805..fe046c4c6 100644 --- a/docs/english/reference/context/assistant/thread_context_store/default_store.md +++ b/docs/english/reference/context/assistant/thread_context_store/default_store.md @@ -3,30 +3,4 @@ sidebar_label: default_store title: slack_bolt.context.assistant.thread_context_store.default_store --- -## DefaultAssistantThreadContextStore Objects -```python -class DefaultAssistantThreadContextStore(AssistantThreadContextStore) -``` - -#### client: `WebClient` - -#### context: `BoltContext` - -#### \_\_init\_\_ - -```python -def __init__(context: BoltContext) -``` - -#### save - -```python -def save(*, channel_id: str, thread_ts: str, context: Dict[str, str]) -> None -``` - -#### find - -```python -def find(*, channel_id: str, thread_ts: str) -> Optional[AssistantThreadContext] -``` diff --git a/docs/english/reference/context/assistant/thread_context_store/file/index.md b/docs/english/reference/context/assistant/thread_context_store/file/index.md index cb56ee10b..b9165d437 100644 --- a/docs/english/reference/context/assistant/thread_context_store/file/index.md +++ b/docs/english/reference/context/assistant/thread_context_store/file/index.md @@ -3,26 +3,4 @@ sidebar_label: file title: slack_bolt.context.assistant.thread_context_store.file --- -## FileAssistantThreadContextStore Objects -```python -class FileAssistantThreadContextStore(AssistantThreadContextStore) -``` - -#### \_\_init\_\_ - -```python -def __init__(base_dir: str = str(Path.home()) + '/.bolt-app-assistant-thread-contexts') -``` - -#### save - -```python -def save(*, channel_id: str, thread_ts: str, context: Dict[str, str]) -> None -``` - -#### find - -```python -def find(*, channel_id: str, thread_ts: str) -> Optional[AssistantThreadContext] -``` diff --git a/docs/english/reference/context/assistant/thread_context_store/store.md b/docs/english/reference/context/assistant/thread_context_store/store.md index 491fbc849..c2e98f996 100644 --- a/docs/english/reference/context/assistant/thread_context_store/store.md +++ b/docs/english/reference/context/assistant/thread_context_store/store.md @@ -3,20 +3,4 @@ sidebar_label: store title: slack_bolt.context.assistant.thread_context_store.store --- -## AssistantThreadContextStore Objects -```python -class AssistantThreadContextStore() -``` - -#### save - -```python -def save(*, channel_id: str, thread_ts: str, context: Dict[str, str]) -> None -``` - -#### find - -```python -def find(*, channel_id: str, thread_ts: str) -> Optional[AssistantThreadContext] -``` diff --git a/docs/english/reference/context/async_context.md b/docs/english/reference/context/async_context.md index 5379854e6..4d9e0bc7b 100644 --- a/docs/english/reference/context/async_context.md +++ b/docs/english/reference/context/async_context.md @@ -3,144 +3,141 @@ sidebar_label: async_context title: slack_bolt.context.async_context --- -## AsyncBoltContext Objects +## `AsyncBoltContext` -```python -class AsyncBoltContext(BaseContext) -``` +Bases: BaseContext Context object associated with a request from Slack. -#### to\_copyable +### `ack` ```python -def to_copyable() -> AsyncBoltContext +ack: AsyncAck ``` -#### listener\_runner +`ack()` function for this request. ```python -@property -def listener_runner() -> AsyncioListenerRunner +@app.action("button") +async def handle_button_clicks(context): + await context.ack() + +# You can access "ack" this way too. +@app.action("button") +async def handle_button_clicks(ack): + await ack() ``` -The properly configured listener_runner that is available for middleware/listeners. +**Returns:** + +- AsyncAck – Callable `ack()` function -#### client +### `actor_enterprise_id` ```python -@property -def client() -> AsyncWebClient +actor_enterprise_id: Optional[str] ``` -The `AsyncWebClient` instance available for this request. +The action's actor's Enterprise Grid organization ID. -```python -@app.event("app_mention") -async def handle_events(context): - await context.client.chat_postMessage( - channel=context.channel_id, - text="Thanks!", - ) +Note that this property is especially useful for handling events in Slack Connect channels. +That being said, it's not guaranteed to have a valid ID for all events due to server-side inconsistency. -# You can access "client" this way too. -@app.event("app_mention") -async def handle_events(client, context): - await client.chat_postMessage( - channel=context.channel_id, - text="Thanks!", - ) -``` +### `actor_team_id` +```python +actor_team_id: Optional[str] +``` -**Returns**: +The action's actor's workspace ID. -- `AsyncWebClient` - `AsyncWebClient` instance +Note that this property is especially useful for handling events in Slack Connect channels. +That being said, it's not guaranteed to have a valid ID for all events due to server-side inconsistency. -#### ack +### `actor_user_id` ```python -@property -def ack() -> AsyncAck +actor_user_id: Optional[str] ``` -`ack()` function for this request. +The action's actor's user ID. -```python -@app.action("button") -async def handle_button_clicks(context): - await context.ack() +Note that this property is especially useful for handling events in Slack Connect channels. +That being said, it's not guaranteed to have a valid ID for all events due to server-side inconsistency. -# You can access "ack" this way too. -@app.action("button") -async def handle_button_clicks(ack): - await ack() +### `authorize_result` + +```python +authorize_result: Optional[AuthorizeResult] ``` +The authorize result resolved for this request. -**Returns**: +### `bot_id` + +```python +bot_id: Optional[str] +``` -- `AsyncAck` - Callable `ack()` function +The bot ID resolved for this request. -#### say +### `bot_token` ```python -@property -def say() -> AsyncSay +bot_token: Optional[str] ``` -`say()` function for this request. +The bot token resolved for this request. -```python -@app.action("button") -async def handle_button_clicks(context): - await context.ack() - await context.say("Hi!") +### `bot_user_id` -# You can access "ack" this way too. -@app.action("button") -async def handle_button_clicks(ack, say): - await ack() - await say("Hi!") +```python +bot_user_id: Optional[str] ``` +The bot user ID resolved for this request. + +### `channel_id` -**Returns**: +```python +channel_id: Optional[str] +``` -- `AsyncSay` - Callable `say()` function +The conversation ID associated with this request. -#### respond +### `client` ```python -@property -def respond() -> Optional[AsyncRespond] +client: AsyncWebClient ``` -`respond()` function for this request. +The `AsyncWebClient` instance available for this request. ```python -@app.action("button") -async def handle_button_clicks(context): - await context.ack() - await context.respond("Hi!") +@app.event("app_mention") +async def handle_events(context): + await context.client.chat_postMessage( + channel=context.channel_id, + text="Thanks!", + ) -# You can access "ack" this way too. -@app.action("button") -async def handle_button_clicks(ack, respond): - await ack() - await respond("Hi!") +# You can access "client" this way too. +@app.event("app_mention") +async def handle_events(client, context): + await client.chat_postMessage( + channel=context.channel_id, + text="Thanks!", + ) ``` +**Returns:** -**Returns**: - -- `Optional[AsyncRespond]` - Callable `respond()` function +- AsyncWebClient – `AsyncWebClient` instance -#### complete +### `complete` ```python -@property -def complete() -> AsyncComplete +complete: AsyncComplete ``` `complete()` function for this request. @@ -162,16 +159,22 @@ async def handle_button_clicks(context): await context.complete(outputs={"stringReverse":"olleh"}) ``` +**Returns:** + +- AsyncComplete – Callable `complete()` function -**Returns**: +### `enterprise_id` -- `AsyncComplete` - Callable `complete()` function +```python +enterprise_id: Optional[str] +``` -#### fail +The Enterprise Grid Organization ID of this request. + +### `fail` ```python -@property -def fail() -> AsyncFail +fail: AsyncFail ``` `fail()` function for this request. @@ -193,49 +196,166 @@ async def handle_button_clicks(context): await context.fail(error="something went wrong") ``` +**Returns:** + +- AsyncFail – Callable `fail()` function + +### `function_bot_access_token` + +```python +function_bot_access_token: Optional[str] +``` + +The bot token resolved for this function request. + +Only available for `function_executed` and interactivity events scoped to a custom step. + +### `function_execution_id` + +```python +function_execution_id: Optional[str] +``` + +The `function_execution_id` associated with this request. + +Only available for `function_executed` and interactivity events scoped to a custom step. -**Returns**: +### `inputs` + +```python +inputs: Optional[Dict[str, Any]] +``` + +The `inputs` associated with this request. + +Only available for `function_executed` and interactivity events scoped to a custom step. + +### `is_enterprise_install` + +```python +is_enterprise_install: Optional[bool] +``` -- `AsyncFail` - Callable `fail()` function +True if the request is associated with an Org-wide installation. -#### set\_title +### `listener_runner` ```python -@property -def set_title() -> Optional[AsyncSetTitle] +listener_runner: AsyncioListenerRunner ``` -#### set\_status +The properly configured listener_runner that is available for middleware/listeners. + +### `logger` ```python -@property -def set_status() -> Optional[AsyncSetStatus] +logger: Logger ``` -#### set\_suggested\_prompts +The properly configured logger that is available for middleware/listeners. + +### `matches` ```python -@property -def set_suggested_prompts() -> Optional[AsyncSetSuggestedPrompts] +matches: Optional[Tuple] ``` -#### get\_thread\_context +Returns all the matched parts in message listener's regexp. + +### `respond` ```python -@property -def get_thread_context() -> Optional[AsyncGetThreadContext] +respond: Optional[AsyncRespond] ``` -#### say\_stream +`respond()` function for this request. ```python -@property -def say_stream() -> Optional[AsyncSayStream] +@app.action("button") +async def handle_button_clicks(context): + await context.ack() + await context.respond("Hi!") + +# You can access "ack" this way too. +@app.action("button") +async def handle_button_clicks(ack, respond): + await ack() + await respond("Hi!") ``` -#### save\_thread\_context +**Returns:** + +- Optional[AsyncRespond] – Callable `respond()` function + +### `response_url` ```python -@property -def save_thread_context() -> Optional[AsyncSaveThreadContext] +response_url: Optional[str] ``` + +The `response_url` associated with this request. + +### `say` + +```python +say: AsyncSay +``` + +`say()` function for this request. + +```python +@app.action("button") +async def handle_button_clicks(context): + await context.ack() + await context.say("Hi!") + +# You can access "ack" this way too. +@app.action("button") +async def handle_button_clicks(ack, say): + await ack() + await say("Hi!") +``` + +**Returns:** + +- AsyncSay – Callable `say()` function + +### `team_id` + +```python +team_id: Optional[str] +``` + +The Workspace ID of this request. + +### `thread_ts` + +```python +thread_ts: Optional[str] +``` + +The conversation thread's ID associated with this request. + +### `token` + +```python +token: Optional[str] +``` + +The (bot/user) token resolved for this request. + +### `user_id` + +```python +user_id: Optional[str] +``` + +The user ID associated ith this request. + +### `user_token` + +```python +user_token: Optional[str] +``` + +The user token resolved for this request. diff --git a/docs/english/reference/context/base_context.md b/docs/english/reference/context/base_context.md index db5a6879e..590461cd0 100644 --- a/docs/english/reference/context/base_context.md +++ b/docs/english/reference/context/base_context.md @@ -3,226 +3,191 @@ sidebar_label: base_context title: slack_bolt.context.base_context --- -## BaseContext Objects +## `BaseContext` -```python -class BaseContext(dict) -``` +Bases: dict Context object associated with a request from Slack. -#### copyable\_standard\_property\_names - -#### non\_copyable\_standard\_property\_names - -#### standard\_property\_names - -#### logger +### `actor_enterprise_id` ```python -@property -def logger() -> Logger +actor_enterprise_id: Optional[str] ``` -The properly configured logger that is available for middleware/listeners. +The action's actor's Enterprise Grid organization ID. + +Note that this property is especially useful for handling events in Slack Connect channels. +That being said, it's not guaranteed to have a valid ID for all events due to server-side inconsistency. -#### token +### `actor_team_id` ```python -@property -def token() -> Optional[str] +actor_team_id: Optional[str] ``` -The (bot/user) token resolved for this request. +The action's actor's workspace ID. + +Note that this property is especially useful for handling events in Slack Connect channels. +That being said, it's not guaranteed to have a valid ID for all events due to server-side inconsistency. -#### enterprise\_id +### `actor_user_id` ```python -@property -def enterprise_id() -> Optional[str] +actor_user_id: Optional[str] ``` -The Enterprise Grid Organization ID of this request. +The action's actor's user ID. + +Note that this property is especially useful for handling events in Slack Connect channels. +That being said, it's not guaranteed to have a valid ID for all events due to server-side inconsistency. -#### is\_enterprise\_install +### `authorize_result` ```python -@property -def is_enterprise_install() -> Optional[bool] +authorize_result: Optional[AuthorizeResult] ``` -True if the request is associated with an Org-wide installation. +The authorize result resolved for this request. -#### team\_id +### `bot_id` ```python -@property -def team_id() -> Optional[str] +bot_id: Optional[str] ``` -The Workspace ID of this request. +The bot ID resolved for this request. -#### user\_id +### `bot_token` ```python -@property -def user_id() -> Optional[str] +bot_token: Optional[str] ``` -The user ID associated ith this request. +The bot token resolved for this request. -#### actor\_enterprise\_id +### `bot_user_id` ```python -@property -def actor_enterprise_id() -> Optional[str] +bot_user_id: Optional[str] ``` -The action's actor's Enterprise Grid organization ID. - -Note that this property is especially useful for handling events in Slack Connect channels. -That being said, it's not guaranteed to have a valid ID for all events due to server-side inconsistency. +The bot user ID resolved for this request. -#### actor\_team\_id +### `channel_id` ```python -@property -def actor_team_id() -> Optional[str] +channel_id: Optional[str] ``` -The action's actor's workspace ID. - -Note that this property is especially useful for handling events in Slack Connect channels. -That being said, it's not guaranteed to have a valid ID for all events due to server-side inconsistency. +The conversation ID associated with this request. -#### actor\_user\_id +### `enterprise_id` ```python -@property -def actor_user_id() -> Optional[str] +enterprise_id: Optional[str] ``` -The action's actor's user ID. - -Note that this property is especially useful for handling events in Slack Connect channels. -That being said, it's not guaranteed to have a valid ID for all events due to server-side inconsistency. +The Enterprise Grid Organization ID of this request. -#### channel\_id +### `function_bot_access_token` ```python -@property -def channel_id() -> Optional[str] +function_bot_access_token: Optional[str] ``` -The conversation ID associated with this request. +The bot token resolved for this function request. + +Only available for `function_executed` and interactivity events scoped to a custom step. -#### thread\_ts +### `function_execution_id` ```python -@property -def thread_ts() -> Optional[str] +function_execution_id: Optional[str] ``` -The conversation thread's ID associated with this request. +The `function_execution_id` associated with this request. -#### response\_url +Only available for `function_executed` and interactivity events scoped to a custom step. + +### `inputs` ```python -@property -def response_url() -> Optional[str] +inputs: Optional[Dict[str, Any]] ``` -The `response_url` associated with this request. +The `inputs` associated with this request. + +Only available for `function_executed` and interactivity events scoped to a custom step. -#### matches +### `is_enterprise_install` ```python -@property -def matches() -> Optional[Tuple] +is_enterprise_install: Optional[bool] ``` -Returns all the matched parts in message listener's regexp. +True if the request is associated with an Org-wide installation. -#### function\_execution\_id +### `logger` ```python -@property -def function_execution_id() -> Optional[str] +logger: Logger ``` -The `function_execution_id` associated with this request. - -Only available for `function_executed` and interactivity events scoped to a custom step. +The properly configured logger that is available for middleware/listeners. -#### inputs +### `matches` ```python -@property -def inputs() -> Optional[Dict[str, Any]] +matches: Optional[Tuple] ``` -The `inputs` associated with this request. - -Only available for `function_executed` and interactivity events scoped to a custom step. +Returns all the matched parts in message listener's regexp. -#### authorize\_result +### `response_url` ```python -@property -def authorize_result() -> Optional[AuthorizeResult] +response_url: Optional[str] ``` -The authorize result resolved for this request. +The `response_url` associated with this request. -#### function\_bot\_access\_token +### `team_id` ```python -@property -def function_bot_access_token() -> Optional[str] +team_id: Optional[str] ``` -The bot token resolved for this function request. - -Only available for `function_executed` and interactivity events scoped to a custom step. +The Workspace ID of this request. -#### bot\_token +### `thread_ts` ```python -@property -def bot_token() -> Optional[str] +thread_ts: Optional[str] ``` -The bot token resolved for this request. +The conversation thread's ID associated with this request. -#### bot\_id +### `token` ```python -@property -def bot_id() -> Optional[str] +token: Optional[str] ``` -The bot ID resolved for this request. +The (bot/user) token resolved for this request. -#### bot\_user\_id +### `user_id` ```python -@property -def bot_user_id() -> Optional[str] +user_id: Optional[str] ``` -The bot user ID resolved for this request. +The user ID associated ith this request. -#### user\_token +### `user_token` ```python -@property -def user_token() -> Optional[str] +user_token: Optional[str] ``` The user token resolved for this request. - -#### set\_authorize\_result - -```python -def set_authorize_result(authorize_result: AuthorizeResult) -``` diff --git a/docs/english/reference/context/complete/async_complete.md b/docs/english/reference/context/complete/async_complete.md index ee982f1ae..7564b3f7a 100644 --- a/docs/english/reference/context/complete/async_complete.md +++ b/docs/english/reference/context/complete/async_complete.md @@ -3,30 +3,20 @@ sidebar_label: async_complete title: slack_bolt.context.complete.async_complete --- -## AsyncComplete Objects +## `AsyncComplete` ```python -class AsyncComplete() +AsyncComplete(client, function_execution_id) ``` -#### client: `AsyncWebClient` - -#### function\_execution\_id: `Optional[str]` - -#### \_\_init\_\_ - -```python -def __init__(client: AsyncWebClient, function_execution_id: Optional[str]) -``` - -#### has\_been\_called +### `has_been_called` ```python -def has_been_called() -> bool +has_been_called() ``` Check if this complete function has been called. -**Returns**: +**Returns:** -- `bool` - True if the complete function has been called, False otherwise. +- **bool** (bool) – True if the complete function has been called, False otherwise. diff --git a/docs/english/reference/context/complete/complete.md b/docs/english/reference/context/complete/complete.md index 3660d34f0..19f6a3237 100644 --- a/docs/english/reference/context/complete/complete.md +++ b/docs/english/reference/context/complete/complete.md @@ -4,30 +4,20 @@ title: slack_bolt.context.complete.complete slug: complete --- -## Complete Objects +## `Complete` ```python -class Complete() +Complete(client, function_execution_id) ``` -#### client: `WebClient` - -#### function\_execution\_id: `Optional[str]` - -#### \_\_init\_\_ - -```python -def __init__(client: WebClient, function_execution_id: Optional[str]) -``` - -#### has\_been\_called +### `has_been_called` ```python -def has_been_called() -> bool +has_been_called() ``` Check if this complete function has been called. -**Returns**: +**Returns:** -- `bool` - True if the complete function has been called, False otherwise. +- **bool** (bool) – True if the complete function has been called, False otherwise. diff --git a/docs/english/reference/context/complete/index.md b/docs/english/reference/context/complete/index.md index 756072e10..fb9571d2f 100644 --- a/docs/english/reference/context/complete/index.md +++ b/docs/english/reference/context/complete/index.md @@ -3,35 +3,25 @@ sidebar_label: complete title: slack_bolt.context.complete --- -## Submodules - -- [slack_bolt.context.complete.async_complete](/tools/bolt-python/reference/context/complete/async_complete) -- [slack_bolt.context.complete.complete](/tools/bolt-python/reference/context/complete/complete) - -## Complete Objects +## `Complete` ```python -class Complete() +Complete(client, function_execution_id) ``` -#### client: `WebClient` - -#### function\_execution\_id: `Optional[str]` - -#### \_\_init\_\_ +### `has_been_called` ```python -def __init__(client: WebClient, function_execution_id: Optional[str]) +has_been_called() ``` -#### has\_been\_called +Check if this complete function has been called. -```python -def has_been_called() -> bool -``` +**Returns:** -Check if this complete function has been called. +- **bool** (bool) – True if the complete function has been called, False otherwise. -**Returns**: +## Submodules -- `bool` - True if the complete function has been called, False otherwise. +- [slack_bolt.context.complete.async_complete](/tools/bolt-python/reference/context/complete/async_complete) +- [slack_bolt.context.complete.complete](/tools/bolt-python/reference/context/complete/complete) diff --git a/docs/english/reference/context/context.md b/docs/english/reference/context/context.md index df8b1a7fe..3b17fe29b 100644 --- a/docs/english/reference/context/context.md +++ b/docs/english/reference/context/context.md @@ -4,144 +4,141 @@ title: slack_bolt.context.context slug: context --- -## BoltContext Objects +## `BoltContext` -```python -class BoltContext(BaseContext) -``` +Bases: BaseContext Context object associated with a request from Slack. -#### to\_copyable +### `ack` ```python -def to_copyable() -> BoltContext +ack: Ack ``` -#### listener\_runner +`ack()` function for this request. ```python -@property -def listener_runner() -> ThreadListenerRunner +@app.action("button") +def handle_button_clicks(context): + context.ack() + +# You can access "ack" this way too. +@app.action("button") +def handle_button_clicks(ack): + ack() ``` -The properly configured listener_runner that is available for middleware/listeners. +**Returns:** + +- Ack – Callable `ack()` function -#### client +### `actor_enterprise_id` ```python -@property -def client() -> WebClient +actor_enterprise_id: Optional[str] ``` -The `WebClient` instance available for this request. +The action's actor's Enterprise Grid organization ID. -```python -@app.event("app_mention") -def handle_events(context): - context.client.chat_postMessage( - channel=context.channel_id, - text="Thanks!", - ) +Note that this property is especially useful for handling events in Slack Connect channels. +That being said, it's not guaranteed to have a valid ID for all events due to server-side inconsistency. -# You can access "client" this way too. -@app.event("app_mention") -def handle_events(client, context): - client.chat_postMessage( - channel=context.channel_id, - text="Thanks!", - ) -``` +### `actor_team_id` +```python +actor_team_id: Optional[str] +``` -**Returns**: +The action's actor's workspace ID. -- `WebClient` - `WebClient` instance +Note that this property is especially useful for handling events in Slack Connect channels. +That being said, it's not guaranteed to have a valid ID for all events due to server-side inconsistency. -#### ack +### `actor_user_id` ```python -@property -def ack() -> Ack +actor_user_id: Optional[str] ``` -`ack()` function for this request. +The action's actor's user ID. -```python -@app.action("button") -def handle_button_clicks(context): - context.ack() +Note that this property is especially useful for handling events in Slack Connect channels. +That being said, it's not guaranteed to have a valid ID for all events due to server-side inconsistency. -# You can access "ack" this way too. -@app.action("button") -def handle_button_clicks(ack): - ack() +### `authorize_result` + +```python +authorize_result: Optional[AuthorizeResult] ``` +The authorize result resolved for this request. -**Returns**: +### `bot_id` + +```python +bot_id: Optional[str] +``` -- `Ack` - Callable `ack()` function +The bot ID resolved for this request. -#### say +### `bot_token` ```python -@property -def say() -> Say +bot_token: Optional[str] ``` -`say()` function for this request. +The bot token resolved for this request. -```python -@app.action("button") -def handle_button_clicks(context): - context.ack() - context.say("Hi!") +### `bot_user_id` -# You can access "ack" this way too. -@app.action("button") -def handle_button_clicks(ack, say): - ack() - say("Hi!") +```python +bot_user_id: Optional[str] ``` +The bot user ID resolved for this request. + +### `channel_id` -**Returns**: +```python +channel_id: Optional[str] +``` -- `Say` - Callable `say()` function +The conversation ID associated with this request. -#### respond +### `client` ```python -@property -def respond() -> Optional[Respond] +client: WebClient ``` -`respond()` function for this request. +The `WebClient` instance available for this request. ```python -@app.action("button") -def handle_button_clicks(context): - context.ack() - context.respond("Hi!") +@app.event("app_mention") +def handle_events(context): + context.client.chat_postMessage( + channel=context.channel_id, + text="Thanks!", + ) -# You can access "ack" this way too. -@app.action("button") -def handle_button_clicks(ack, respond): - ack() - respond("Hi!") +# You can access "client" this way too. +@app.event("app_mention") +def handle_events(client, context): + client.chat_postMessage( + channel=context.channel_id, + text="Thanks!", + ) ``` +**Returns:** -**Returns**: - -- `Optional[Respond]` - Callable `respond()` function +- WebClient – `WebClient` instance -#### complete +### `complete` ```python -@property -def complete() -> Complete +complete: Complete ``` `complete()` function for this request. @@ -163,16 +160,22 @@ def handle_button_clicks(context): context.complete(outputs={"stringReverse":"olleh"}) ``` +**Returns:** + +- Complete – Callable `complete()` function -**Returns**: +### `enterprise_id` -- `Complete` - Callable `complete()` function +```python +enterprise_id: Optional[str] +``` -#### fail +The Enterprise Grid Organization ID of this request. + +### `fail` ```python -@property -def fail() -> Fail +fail: Fail ``` `fail()` function for this request. @@ -194,49 +197,166 @@ def handle_button_clicks(context): context.fail(error="something went wrong") ``` +**Returns:** + +- Fail – Callable `fail()` function + +### `function_bot_access_token` + +```python +function_bot_access_token: Optional[str] +``` + +The bot token resolved for this function request. + +Only available for `function_executed` and interactivity events scoped to a custom step. + +### `function_execution_id` + +```python +function_execution_id: Optional[str] +``` + +The `function_execution_id` associated with this request. + +Only available for `function_executed` and interactivity events scoped to a custom step. -**Returns**: +### `inputs` + +```python +inputs: Optional[Dict[str, Any]] +``` + +The `inputs` associated with this request. + +Only available for `function_executed` and interactivity events scoped to a custom step. + +### `is_enterprise_install` + +```python +is_enterprise_install: Optional[bool] +``` -- `Fail` - Callable `fail()` function +True if the request is associated with an Org-wide installation. -#### set\_title +### `listener_runner` ```python -@property -def set_title() -> Optional[SetTitle] +listener_runner: ThreadListenerRunner ``` -#### set\_status +The properly configured listener_runner that is available for middleware/listeners. + +### `logger` ```python -@property -def set_status() -> Optional[SetStatus] +logger: Logger ``` -#### set\_suggested\_prompts +The properly configured logger that is available for middleware/listeners. + +### `matches` ```python -@property -def set_suggested_prompts() -> Optional[SetSuggestedPrompts] +matches: Optional[Tuple] ``` -#### get\_thread\_context +Returns all the matched parts in message listener's regexp. + +### `respond` ```python -@property -def get_thread_context() -> Optional[GetThreadContext] +respond: Optional[Respond] ``` -#### say\_stream +`respond()` function for this request. ```python -@property -def say_stream() -> Optional[SayStream] +@app.action("button") +def handle_button_clicks(context): + context.ack() + context.respond("Hi!") + +# You can access "ack" this way too. +@app.action("button") +def handle_button_clicks(ack, respond): + ack() + respond("Hi!") ``` -#### save\_thread\_context +**Returns:** + +- Optional[Respond] – Callable `respond()` function + +### `response_url` ```python -@property -def save_thread_context() -> Optional[SaveThreadContext] +response_url: Optional[str] ``` + +The `response_url` associated with this request. + +### `say` + +```python +say: Say +``` + +`say()` function for this request. + +```python +@app.action("button") +def handle_button_clicks(context): + context.ack() + context.say("Hi!") + +# You can access "ack" this way too. +@app.action("button") +def handle_button_clicks(ack, say): + ack() + say("Hi!") +``` + +**Returns:** + +- Say – Callable `say()` function + +### `team_id` + +```python +team_id: Optional[str] +``` + +The Workspace ID of this request. + +### `thread_ts` + +```python +thread_ts: Optional[str] +``` + +The conversation thread's ID associated with this request. + +### `token` + +```python +token: Optional[str] +``` + +The (bot/user) token resolved for this request. + +### `user_id` + +```python +user_id: Optional[str] +``` + +The user ID associated ith this request. + +### `user_token` + +```python +user_token: Optional[str] +``` + +The user token resolved for this request. diff --git a/docs/english/reference/context/fail/async_fail.md b/docs/english/reference/context/fail/async_fail.md index 8924e0a45..bf1e1c100 100644 --- a/docs/english/reference/context/fail/async_fail.md +++ b/docs/english/reference/context/fail/async_fail.md @@ -3,30 +3,20 @@ sidebar_label: async_fail title: slack_bolt.context.fail.async_fail --- -## AsyncFail Objects +## `AsyncFail` ```python -class AsyncFail() +AsyncFail(client, function_execution_id) ``` -#### client: `AsyncWebClient` - -#### function\_execution\_id: `Optional[str]` - -#### \_\_init\_\_ - -```python -def __init__(client: AsyncWebClient, function_execution_id: Optional[str]) -``` - -#### has\_been\_called +### `has_been_called` ```python -def has_been_called() -> bool +has_been_called() ``` Check if this fail function has been called. -**Returns**: +**Returns:** -- `bool` - True if the fail function has been called, False otherwise. +- **bool** (bool) – True if the fail function has been called, False otherwise. diff --git a/docs/english/reference/context/fail/fail.md b/docs/english/reference/context/fail/fail.md index 6d0dcd169..fd7be3c48 100644 --- a/docs/english/reference/context/fail/fail.md +++ b/docs/english/reference/context/fail/fail.md @@ -4,30 +4,20 @@ title: slack_bolt.context.fail.fail slug: fail --- -## Fail Objects +## `Fail` ```python -class Fail() +Fail(client, function_execution_id) ``` -#### client: `WebClient` - -#### function\_execution\_id: `Optional[str]` - -#### \_\_init\_\_ - -```python -def __init__(client: WebClient, function_execution_id: Optional[str]) -``` - -#### has\_been\_called +### `has_been_called` ```python -def has_been_called() -> bool +has_been_called() ``` Check if this fail function has been called. -**Returns**: +**Returns:** -- `bool` - True if the fail function has been called, False otherwise. +- **bool** (bool) – True if the fail function has been called, False otherwise. diff --git a/docs/english/reference/context/fail/index.md b/docs/english/reference/context/fail/index.md index b09e7a710..20437d850 100644 --- a/docs/english/reference/context/fail/index.md +++ b/docs/english/reference/context/fail/index.md @@ -3,35 +3,25 @@ sidebar_label: fail title: slack_bolt.context.fail --- -## Submodules - -- [slack_bolt.context.fail.async_fail](/tools/bolt-python/reference/context/fail/async_fail) -- [slack_bolt.context.fail.fail](/tools/bolt-python/reference/context/fail/fail) - -## Fail Objects +## `Fail` ```python -class Fail() +Fail(client, function_execution_id) ``` -#### client: `WebClient` - -#### function\_execution\_id: `Optional[str]` - -#### \_\_init\_\_ +### `has_been_called` ```python -def __init__(client: WebClient, function_execution_id: Optional[str]) +has_been_called() ``` -#### has\_been\_called +Check if this fail function has been called. -```python -def has_been_called() -> bool -``` +**Returns:** -Check if this fail function has been called. +- **bool** (bool) – True if the fail function has been called, False otherwise. -**Returns**: +## Submodules -- `bool` - True if the fail function has been called, False otherwise. +- [slack_bolt.context.fail.async_fail](/tools/bolt-python/reference/context/fail/async_fail) +- [slack_bolt.context.fail.fail](/tools/bolt-python/reference/context/fail/fail) diff --git a/docs/english/reference/context/get_thread_context/async_get_thread_context.md b/docs/english/reference/context/get_thread_context/async_get_thread_context.md index bcdf17dd6..17345e511 100644 --- a/docs/english/reference/context/get_thread_context/async_get_thread_context.md +++ b/docs/english/reference/context/get_thread_context/async_get_thread_context.md @@ -3,28 +3,4 @@ sidebar_label: async_get_thread_context title: slack_bolt.context.get_thread_context.async_get_thread_context --- -## AsyncGetThreadContext Objects -```python -class AsyncGetThreadContext() -``` - -#### thread\_context\_store: `AsyncAssistantThreadContextStore` - -#### payload: `dict` - -#### channel\_id: `str` - -#### thread\_ts: `str` - -#### thread\_context\_loaded: `bool` - -#### \_\_init\_\_ - -```python -def __init__( - thread_context_store: AsyncAssistantThreadContextStore, - channel_id: str, - thread_ts: str, - payload: dict) -``` diff --git a/docs/english/reference/context/get_thread_context/get_thread_context.md b/docs/english/reference/context/get_thread_context/get_thread_context.md index 40c64f686..832987ad1 100644 --- a/docs/english/reference/context/get_thread_context/get_thread_context.md +++ b/docs/english/reference/context/get_thread_context/get_thread_context.md @@ -4,28 +4,4 @@ title: slack_bolt.context.get_thread_context.get_thread_context slug: get_thread_context --- -## GetThreadContext Objects -```python -class GetThreadContext() -``` - -#### thread\_context\_store: `AssistantThreadContextStore` - -#### payload: `dict` - -#### channel\_id: `str` - -#### thread\_ts: `str` - -#### thread\_context\_loaded: `bool` - -#### \_\_init\_\_ - -```python -def __init__( - thread_context_store: AssistantThreadContextStore, - channel_id: str, - thread_ts: str, - payload: dict) -``` diff --git a/docs/english/reference/context/get_thread_context/index.md b/docs/english/reference/context/get_thread_context/index.md index 8d5f92375..35443e851 100644 --- a/docs/english/reference/context/get_thread_context/index.md +++ b/docs/english/reference/context/get_thread_context/index.md @@ -7,29 +7,3 @@ title: slack_bolt.context.get_thread_context - [slack_bolt.context.get_thread_context.async_get_thread_context](/tools/bolt-python/reference/context/get_thread_context/async_get_thread_context) - [slack_bolt.context.get_thread_context.get_thread_context](/tools/bolt-python/reference/context/get_thread_context/get_thread_context) - -## GetThreadContext Objects - -```python -class GetThreadContext() -``` - -#### thread\_context\_store: `AssistantThreadContextStore` - -#### payload: `dict` - -#### channel\_id: `str` - -#### thread\_ts: `str` - -#### thread\_context\_loaded: `bool` - -#### \_\_init\_\_ - -```python -def __init__( - thread_context_store: AssistantThreadContextStore, - channel_id: str, - thread_ts: str, - payload: dict) -``` diff --git a/docs/english/reference/context/index.md b/docs/english/reference/context/index.md index dedca40ba..8e7cf5c8d 100644 --- a/docs/english/reference/context/index.md +++ b/docs/english/reference/context/index.md @@ -10,162 +10,141 @@ like `user_id`, `team_id`, `channel_id`, and `enterprise_id`. Refer to https://docs.slack.dev/tools/bolt-python/concepts/context for details. -## Submodules +## `BoltContext` -- [slack_bolt.context.ack](/tools/bolt-python/reference/context/ack) -- [slack_bolt.context.assistant](/tools/bolt-python/reference/context/assistant) -- [slack_bolt.context.async_context](/tools/bolt-python/reference/context/async_context) -- [slack_bolt.context.base_context](/tools/bolt-python/reference/context/base_context) -- [slack_bolt.context.complete](/tools/bolt-python/reference/context/complete) -- [slack_bolt.context.context](/tools/bolt-python/reference/context/context) -- [slack_bolt.context.fail](/tools/bolt-python/reference/context/fail) -- [slack_bolt.context.get_thread_context](/tools/bolt-python/reference/context/get_thread_context) -- [slack_bolt.context.respond](/tools/bolt-python/reference/context/respond) -- [slack_bolt.context.save_thread_context](/tools/bolt-python/reference/context/save_thread_context) -- [slack_bolt.context.say](/tools/bolt-python/reference/context/say) -- [slack_bolt.context.say_stream](/tools/bolt-python/reference/context/say_stream) -- [slack_bolt.context.set_status](/tools/bolt-python/reference/context/set_status) -- [slack_bolt.context.set_suggested_prompts](/tools/bolt-python/reference/context/set_suggested_prompts) -- [slack_bolt.context.set_title](/tools/bolt-python/reference/context/set_title) - -## BoltContext Objects - -```python -class BoltContext(BaseContext) -``` +Bases: BaseContext Context object associated with a request from Slack. -#### to\_copyable +### `ack` ```python -def to_copyable() -> BoltContext +ack: Ack ``` -#### listener\_runner +`ack()` function for this request. ```python -@property -def listener_runner() -> ThreadListenerRunner +@app.action("button") +def handle_button_clicks(context): + context.ack() + +# You can access "ack" this way too. +@app.action("button") +def handle_button_clicks(ack): + ack() ``` -The properly configured listener_runner that is available for middleware/listeners. +**Returns:** + +- Ack – Callable `ack()` function -#### client +### `actor_enterprise_id` ```python -@property -def client() -> WebClient +actor_enterprise_id: Optional[str] ``` -The `WebClient` instance available for this request. +The action's actor's Enterprise Grid organization ID. -```python -@app.event("app_mention") -def handle_events(context): - context.client.chat_postMessage( - channel=context.channel_id, - text="Thanks!", - ) +Note that this property is especially useful for handling events in Slack Connect channels. +That being said, it's not guaranteed to have a valid ID for all events due to server-side inconsistency. -# You can access "client" this way too. -@app.event("app_mention") -def handle_events(client, context): - client.chat_postMessage( - channel=context.channel_id, - text="Thanks!", - ) -``` +### `actor_team_id` +```python +actor_team_id: Optional[str] +``` -**Returns**: +The action's actor's workspace ID. -- `WebClient` - `WebClient` instance +Note that this property is especially useful for handling events in Slack Connect channels. +That being said, it's not guaranteed to have a valid ID for all events due to server-side inconsistency. -#### ack +### `actor_user_id` ```python -@property -def ack() -> Ack +actor_user_id: Optional[str] ``` -`ack()` function for this request. +The action's actor's user ID. -```python -@app.action("button") -def handle_button_clicks(context): - context.ack() +Note that this property is especially useful for handling events in Slack Connect channels. +That being said, it's not guaranteed to have a valid ID for all events due to server-side inconsistency. -# You can access "ack" this way too. -@app.action("button") -def handle_button_clicks(ack): - ack() +### `authorize_result` + +```python +authorize_result: Optional[AuthorizeResult] ``` +The authorize result resolved for this request. -**Returns**: +### `bot_id` -- `Ack` - Callable `ack()` function +```python +bot_id: Optional[str] +``` -#### say +The bot ID resolved for this request. + +### `bot_token` ```python -@property -def say() -> Say +bot_token: Optional[str] ``` -`say()` function for this request. +The bot token resolved for this request. -```python -@app.action("button") -def handle_button_clicks(context): - context.ack() - context.say("Hi!") +### `bot_user_id` -# You can access "ack" this way too. -@app.action("button") -def handle_button_clicks(ack, say): - ack() - say("Hi!") +```python +bot_user_id: Optional[str] ``` +The bot user ID resolved for this request. + +### `channel_id` -**Returns**: +```python +channel_id: Optional[str] +``` -- `Say` - Callable `say()` function +The conversation ID associated with this request. -#### respond +### `client` ```python -@property -def respond() -> Optional[Respond] +client: WebClient ``` -`respond()` function for this request. +The `WebClient` instance available for this request. ```python -@app.action("button") -def handle_button_clicks(context): - context.ack() - context.respond("Hi!") +@app.event("app_mention") +def handle_events(context): + context.client.chat_postMessage( + channel=context.channel_id, + text="Thanks!", + ) -# You can access "ack" this way too. -@app.action("button") -def handle_button_clicks(ack, respond): - ack() - respond("Hi!") +# You can access "client" this way too. +@app.event("app_mention") +def handle_events(client, context): + client.chat_postMessage( + channel=context.channel_id, + text="Thanks!", + ) ``` +**Returns:** -**Returns**: - -- `Optional[Respond]` - Callable `respond()` function +- WebClient – `WebClient` instance -#### complete +### `complete` ```python -@property -def complete() -> Complete +complete: Complete ``` `complete()` function for this request. @@ -187,16 +166,22 @@ def handle_button_clicks(context): context.complete(outputs={"stringReverse":"olleh"}) ``` +**Returns:** -**Returns**: +- Complete – Callable `complete()` function -- `Complete` - Callable `complete()` function +### `enterprise_id` + +```python +enterprise_id: Optional[str] +``` -#### fail +The Enterprise Grid Organization ID of this request. + +### `fail` ```python -@property -def fail() -> Fail +fail: Fail ``` `fail()` function for this request. @@ -218,49 +203,184 @@ def handle_button_clicks(context): context.fail(error="something went wrong") ``` +**Returns:** + +- Fail – Callable `fail()` function -**Returns**: +### `function_bot_access_token` -- `Fail` - Callable `fail()` function +```python +function_bot_access_token: Optional[str] +``` -#### set\_title +The bot token resolved for this function request. + +Only available for `function_executed` and interactivity events scoped to a custom step. + +### `function_execution_id` ```python -@property -def set_title() -> Optional[SetTitle] +function_execution_id: Optional[str] ``` -#### set\_status +The `function_execution_id` associated with this request. + +Only available for `function_executed` and interactivity events scoped to a custom step. + +### `inputs` ```python -@property -def set_status() -> Optional[SetStatus] +inputs: Optional[Dict[str, Any]] ``` -#### set\_suggested\_prompts +The `inputs` associated with this request. + +Only available for `function_executed` and interactivity events scoped to a custom step. + +### `is_enterprise_install` ```python -@property -def set_suggested_prompts() -> Optional[SetSuggestedPrompts] +is_enterprise_install: Optional[bool] ``` -#### get\_thread\_context +True if the request is associated with an Org-wide installation. + +### `listener_runner` ```python -@property -def get_thread_context() -> Optional[GetThreadContext] +listener_runner: ThreadListenerRunner ``` -#### say\_stream +The properly configured listener_runner that is available for middleware/listeners. + +### `logger` ```python -@property -def say_stream() -> Optional[SayStream] +logger: Logger ``` -#### save\_thread\_context +The properly configured logger that is available for middleware/listeners. + +### `matches` ```python -@property -def save_thread_context() -> Optional[SaveThreadContext] +matches: Optional[Tuple] ``` + +Returns all the matched parts in message listener's regexp. + +### `respond` + +```python +respond: Optional[Respond] +``` + +`respond()` function for this request. + +```python +@app.action("button") +def handle_button_clicks(context): + context.ack() + context.respond("Hi!") + +# You can access "ack" this way too. +@app.action("button") +def handle_button_clicks(ack, respond): + ack() + respond("Hi!") +``` + +**Returns:** + +- Optional[Respond] – Callable `respond()` function + +### `response_url` + +```python +response_url: Optional[str] +``` + +The `response_url` associated with this request. + +### `say` + +```python +say: Say +``` + +`say()` function for this request. + +```python +@app.action("button") +def handle_button_clicks(context): + context.ack() + context.say("Hi!") + +# You can access "ack" this way too. +@app.action("button") +def handle_button_clicks(ack, say): + ack() + say("Hi!") +``` + +**Returns:** + +- Say – Callable `say()` function + +### `team_id` + +```python +team_id: Optional[str] +``` + +The Workspace ID of this request. + +### `thread_ts` + +```python +thread_ts: Optional[str] +``` + +The conversation thread's ID associated with this request. + +### `token` + +```python +token: Optional[str] +``` + +The (bot/user) token resolved for this request. + +### `user_id` + +```python +user_id: Optional[str] +``` + +The user ID associated ith this request. + +### `user_token` + +```python +user_token: Optional[str] +``` + +The user token resolved for this request. + +## Submodules + +- [slack_bolt.context.ack](/tools/bolt-python/reference/context/ack) +- [slack_bolt.context.assistant](/tools/bolt-python/reference/context/assistant) +- [slack_bolt.context.async_context](/tools/bolt-python/reference/context/async_context) +- [slack_bolt.context.base_context](/tools/bolt-python/reference/context/base_context) +- [slack_bolt.context.complete](/tools/bolt-python/reference/context/complete) +- [slack_bolt.context.context](/tools/bolt-python/reference/context/context) +- [slack_bolt.context.fail](/tools/bolt-python/reference/context/fail) +- [slack_bolt.context.get_thread_context](/tools/bolt-python/reference/context/get_thread_context) +- [slack_bolt.context.respond](/tools/bolt-python/reference/context/respond) +- [slack_bolt.context.save_thread_context](/tools/bolt-python/reference/context/save_thread_context) +- [slack_bolt.context.say](/tools/bolt-python/reference/context/say) +- [slack_bolt.context.say_stream](/tools/bolt-python/reference/context/say_stream) +- [slack_bolt.context.set_status](/tools/bolt-python/reference/context/set_status) +- [slack_bolt.context.set_suggested_prompts](/tools/bolt-python/reference/context/set_suggested_prompts) +- [slack_bolt.context.set_title](/tools/bolt-python/reference/context/set_title) diff --git a/docs/english/reference/context/respond/async_respond.md b/docs/english/reference/context/respond/async_respond.md index 606e33495..49e5369c3 100644 --- a/docs/english/reference/context/respond/async_respond.md +++ b/docs/english/reference/context/respond/async_respond.md @@ -3,24 +3,4 @@ sidebar_label: async_respond title: slack_bolt.context.respond.async_respond --- -## AsyncRespond Objects -```python -class AsyncRespond() -``` - -#### response\_url: `Optional[str]` - -#### proxy: `Optional[str]` - -#### ssl: `Optional[SSLContext]` - -#### \_\_init\_\_ - -```python -def __init__( - *, - response_url: Optional[str], - proxy: Optional[str] = None, - ssl: Optional[SSLContext] = None) -``` diff --git a/docs/english/reference/context/respond/index.md b/docs/english/reference/context/respond/index.md index e6d911a31..d490634f8 100644 --- a/docs/english/reference/context/respond/index.md +++ b/docs/english/reference/context/respond/index.md @@ -8,25 +8,3 @@ title: slack_bolt.context.respond - [slack_bolt.context.respond.async_respond](/tools/bolt-python/reference/context/respond/async_respond) - [slack_bolt.context.respond.internals](/tools/bolt-python/reference/context/respond/internals) - [slack_bolt.context.respond.respond](/tools/bolt-python/reference/context/respond/respond) - -## Respond Objects - -```python -class Respond() -``` - -#### response\_url: `Optional[str]` - -#### proxy: `Optional[str]` - -#### ssl: `Optional[SSLContext]` - -#### \_\_init\_\_ - -```python -def __init__( - *, - response_url: Optional[str], - proxy: Optional[str] = None, - ssl: Optional[SSLContext] = None) -``` diff --git a/docs/english/reference/context/respond/respond.md b/docs/english/reference/context/respond/respond.md index b210c12a2..ee4aa7260 100644 --- a/docs/english/reference/context/respond/respond.md +++ b/docs/english/reference/context/respond/respond.md @@ -4,24 +4,4 @@ title: slack_bolt.context.respond.respond slug: respond --- -## Respond Objects -```python -class Respond() -``` - -#### response\_url: `Optional[str]` - -#### proxy: `Optional[str]` - -#### ssl: `Optional[SSLContext]` - -#### \_\_init\_\_ - -```python -def __init__( - *, - response_url: Optional[str], - proxy: Optional[str] = None, - ssl: Optional[SSLContext] = None) -``` diff --git a/docs/english/reference/context/save_thread_context/async_save_thread_context.md b/docs/english/reference/context/save_thread_context/async_save_thread_context.md index 43694625e..277177169 100644 --- a/docs/english/reference/context/save_thread_context/async_save_thread_context.md +++ b/docs/english/reference/context/save_thread_context/async_save_thread_context.md @@ -3,23 +3,4 @@ sidebar_label: async_save_thread_context title: slack_bolt.context.save_thread_context.async_save_thread_context --- -## AsyncSaveThreadContext Objects -```python -class AsyncSaveThreadContext() -``` - -#### thread\_context\_store: `AsyncAssistantThreadContextStore` - -#### channel\_id: `str` - -#### thread\_ts: `str` - -#### \_\_init\_\_ - -```python -def __init__( - thread_context_store: AsyncAssistantThreadContextStore, - channel_id: str, - thread_ts: str) -``` diff --git a/docs/english/reference/context/save_thread_context/index.md b/docs/english/reference/context/save_thread_context/index.md index 8410a7db8..8ba46eea8 100644 --- a/docs/english/reference/context/save_thread_context/index.md +++ b/docs/english/reference/context/save_thread_context/index.md @@ -7,24 +7,3 @@ title: slack_bolt.context.save_thread_context - [slack_bolt.context.save_thread_context.async_save_thread_context](/tools/bolt-python/reference/context/save_thread_context/async_save_thread_context) - [slack_bolt.context.save_thread_context.save_thread_context](/tools/bolt-python/reference/context/save_thread_context/save_thread_context) - -## SaveThreadContext Objects - -```python -class SaveThreadContext() -``` - -#### thread\_context\_store: `AssistantThreadContextStore` - -#### channel\_id: `str` - -#### thread\_ts: `str` - -#### \_\_init\_\_ - -```python -def __init__( - thread_context_store: AssistantThreadContextStore, - channel_id: str, - thread_ts: str) -``` diff --git a/docs/english/reference/context/save_thread_context/save_thread_context.md b/docs/english/reference/context/save_thread_context/save_thread_context.md index 3223b355a..a6aec850b 100644 --- a/docs/english/reference/context/save_thread_context/save_thread_context.md +++ b/docs/english/reference/context/save_thread_context/save_thread_context.md @@ -4,23 +4,4 @@ title: slack_bolt.context.save_thread_context.save_thread_context slug: save_thread_context --- -## SaveThreadContext Objects -```python -class SaveThreadContext() -``` - -#### thread\_context\_store: `AssistantThreadContextStore` - -#### channel\_id: `str` - -#### thread\_ts: `str` - -#### \_\_init\_\_ - -```python -def __init__( - thread_context_store: AssistantThreadContextStore, - channel_id: str, - thread_ts: str) -``` diff --git a/docs/english/reference/context/say/async_say.md b/docs/english/reference/context/say/async_say.md index 9d461bcb8..b32f56e2a 100644 --- a/docs/english/reference/context/say/async_say.md +++ b/docs/english/reference/context/say/async_say.md @@ -3,26 +3,4 @@ sidebar_label: async_say title: slack_bolt.context.say.async_say --- -## AsyncSay Objects -```python -class AsyncSay() -``` - -#### client: `Optional[AsyncWebClient]` - -#### channel: `Optional[str]` - -#### thread\_ts: `Optional[str]` - -#### build\_metadata: `Optional[Callable[[], Awaitable[Union[Dict, Metadata]]]]` - -#### \_\_init\_\_ - -```python -def __init__( - client: Optional[AsyncWebClient], - channel: Optional[str], - thread_ts: Optional[str] = None, - build_metadata: Optional[Callable[[], Awaitable[Union[Dict, Metadata]]]] = None) -``` diff --git a/docs/english/reference/context/say/index.md b/docs/english/reference/context/say/index.md index ee6f647d8..67ffdb551 100644 --- a/docs/english/reference/context/say/index.md +++ b/docs/english/reference/context/say/index.md @@ -8,30 +8,3 @@ title: slack_bolt.context.say - [slack_bolt.context.say.async_say](/tools/bolt-python/reference/context/say/async_say) - [slack_bolt.context.say.internals](/tools/bolt-python/reference/context/say/internals) - [slack_bolt.context.say.say](/tools/bolt-python/reference/context/say/say) - -## Say Objects - -```python -class Say() -``` - -#### client: `Optional[WebClient]` - -#### channel: `Optional[str]` - -#### thread\_ts: `Optional[str]` - -#### metadata: `Optional[Union[Dict, Metadata]]` - -#### build\_metadata: `Optional[Callable[[], Optional[Union[Dict, Metadata]]]]` - -#### \_\_init\_\_ - -```python -def __init__( - client: Optional[WebClient], - channel: Optional[str], - thread_ts: Optional[str] = None, - metadata: Optional[Union[Dict, Metadata]] = None, - build_metadata: Optional[Callable[[], Optional[Union[Dict, Metadata]]]] = None) -``` diff --git a/docs/english/reference/context/say/say.md b/docs/english/reference/context/say/say.md index 8bbaddd9b..f0b94466b 100644 --- a/docs/english/reference/context/say/say.md +++ b/docs/english/reference/context/say/say.md @@ -4,29 +4,4 @@ title: slack_bolt.context.say.say slug: say --- -## Say Objects -```python -class Say() -``` - -#### client: `Optional[WebClient]` - -#### channel: `Optional[str]` - -#### thread\_ts: `Optional[str]` - -#### metadata: `Optional[Union[Dict, Metadata]]` - -#### build\_metadata: `Optional[Callable[[], Optional[Union[Dict, Metadata]]]]` - -#### \_\_init\_\_ - -```python -def __init__( - client: Optional[WebClient], - channel: Optional[str], - thread_ts: Optional[str] = None, - metadata: Optional[Union[Dict, Metadata]] = None, - build_metadata: Optional[Callable[[], Optional[Union[Dict, Metadata]]]] = None) -``` diff --git a/docs/english/reference/context/say_stream/async_say_stream.md b/docs/english/reference/context/say_stream/async_say_stream.md index f6c4954b6..a1bd26bbd 100644 --- a/docs/english/reference/context/say_stream/async_say_stream.md +++ b/docs/english/reference/context/say_stream/async_say_stream.md @@ -3,30 +3,8 @@ sidebar_label: async_say_stream title: slack_bolt.context.say_stream.async_say_stream --- -## AsyncSayStream Objects +## `AsyncSayStream` ```python -class AsyncSayStream() -``` - -#### client: `AsyncWebClient` - -#### channel: `Optional[str]` - -#### recipient\_team\_id: `Optional[str]` - -#### recipient\_user\_id: `Optional[str]` - -#### thread\_ts: `Optional[str]` - -#### \_\_init\_\_ - -```python -def __init__( - *, - client: AsyncWebClient, - channel: Optional[str] = None, - recipient_team_id: Optional[str] = None, - recipient_user_id: Optional[str] = None, - thread_ts: Optional[str] = None) +AsyncSayStream(*, client, channel=None, recipient_team_id=None, recipient_user_id=None, thread_ts=None) ``` diff --git a/docs/english/reference/context/say_stream/index.md b/docs/english/reference/context/say_stream/index.md index aed711da9..a4fa245ac 100644 --- a/docs/english/reference/context/say_stream/index.md +++ b/docs/english/reference/context/say_stream/index.md @@ -3,35 +3,13 @@ sidebar_label: say_stream title: slack_bolt.context.say_stream --- -## Submodules - -- [slack_bolt.context.say_stream.async_say_stream](/tools/bolt-python/reference/context/say_stream/async_say_stream) -- [slack_bolt.context.say_stream.say_stream](/tools/bolt-python/reference/context/say_stream/say_stream) - -## SayStream Objects +## `SayStream` ```python -class SayStream() +SayStream(*, client, channel=None, recipient_team_id=None, recipient_user_id=None, thread_ts=None) ``` -#### client: `WebClient` - -#### channel: `Optional[str]` - -#### recipient\_team\_id: `Optional[str]` - -#### recipient\_user\_id: `Optional[str]` - -#### thread\_ts: `Optional[str]` - -#### \_\_init\_\_ +## Submodules -```python -def __init__( - *, - client: WebClient, - channel: Optional[str] = None, - recipient_team_id: Optional[str] = None, - recipient_user_id: Optional[str] = None, - thread_ts: Optional[str] = None) -``` +- [slack_bolt.context.say_stream.async_say_stream](/tools/bolt-python/reference/context/say_stream/async_say_stream) +- [slack_bolt.context.say_stream.say_stream](/tools/bolt-python/reference/context/say_stream/say_stream) diff --git a/docs/english/reference/context/say_stream/say_stream.md b/docs/english/reference/context/say_stream/say_stream.md index e78c8394f..87f3bc276 100644 --- a/docs/english/reference/context/say_stream/say_stream.md +++ b/docs/english/reference/context/say_stream/say_stream.md @@ -4,30 +4,8 @@ title: slack_bolt.context.say_stream.say_stream slug: say_stream --- -## SayStream Objects +## `SayStream` ```python -class SayStream() -``` - -#### client: `WebClient` - -#### channel: `Optional[str]` - -#### recipient\_team\_id: `Optional[str]` - -#### recipient\_user\_id: `Optional[str]` - -#### thread\_ts: `Optional[str]` - -#### \_\_init\_\_ - -```python -def __init__( - *, - client: WebClient, - channel: Optional[str] = None, - recipient_team_id: Optional[str] = None, - recipient_user_id: Optional[str] = None, - thread_ts: Optional[str] = None) +SayStream(*, client, channel=None, recipient_team_id=None, recipient_user_id=None, thread_ts=None) ``` diff --git a/docs/english/reference/context/set_status/async_set_status.md b/docs/english/reference/context/set_status/async_set_status.md index 5886090d5..d4918d3f5 100644 --- a/docs/english/reference/context/set_status/async_set_status.md +++ b/docs/english/reference/context/set_status/async_set_status.md @@ -3,20 +3,4 @@ sidebar_label: async_set_status title: slack_bolt.context.set_status.async_set_status --- -## AsyncSetStatus Objects -```python -class AsyncSetStatus() -``` - -#### client: `AsyncWebClient` - -#### channel\_id: `str` - -#### thread\_ts: `str` - -#### \_\_init\_\_ - -```python -def __init__(client: AsyncWebClient, channel_id: str, thread_ts: str) -``` diff --git a/docs/english/reference/context/set_status/index.md b/docs/english/reference/context/set_status/index.md index e6df8ffee..d7e708193 100644 --- a/docs/english/reference/context/set_status/index.md +++ b/docs/english/reference/context/set_status/index.md @@ -7,21 +7,3 @@ title: slack_bolt.context.set_status - [slack_bolt.context.set_status.async_set_status](/tools/bolt-python/reference/context/set_status/async_set_status) - [slack_bolt.context.set_status.set_status](/tools/bolt-python/reference/context/set_status/set_status) - -## SetStatus Objects - -```python -class SetStatus() -``` - -#### client: `WebClient` - -#### channel\_id: `str` - -#### thread\_ts: `str` - -#### \_\_init\_\_ - -```python -def __init__(client: WebClient, channel_id: str, thread_ts: str) -``` diff --git a/docs/english/reference/context/set_status/set_status.md b/docs/english/reference/context/set_status/set_status.md index 70308efbd..5d984c8ae 100644 --- a/docs/english/reference/context/set_status/set_status.md +++ b/docs/english/reference/context/set_status/set_status.md @@ -4,20 +4,4 @@ title: slack_bolt.context.set_status.set_status slug: set_status --- -## SetStatus Objects -```python -class SetStatus() -``` - -#### client: `WebClient` - -#### channel\_id: `str` - -#### thread\_ts: `str` - -#### \_\_init\_\_ - -```python -def __init__(client: WebClient, channel_id: str, thread_ts: str) -``` diff --git a/docs/english/reference/context/set_suggested_prompts/async_set_suggested_prompts.md b/docs/english/reference/context/set_suggested_prompts/async_set_suggested_prompts.md index 061926f3c..b6788651a 100644 --- a/docs/english/reference/context/set_suggested_prompts/async_set_suggested_prompts.md +++ b/docs/english/reference/context/set_suggested_prompts/async_set_suggested_prompts.md @@ -3,20 +3,4 @@ sidebar_label: async_set_suggested_prompts title: slack_bolt.context.set_suggested_prompts.async_set_suggested_prompts --- -## AsyncSetSuggestedPrompts Objects -```python -class AsyncSetSuggestedPrompts() -``` - -#### client: `AsyncWebClient` - -#### channel\_id: `str` - -#### thread\_ts: `Optional[str]` - -#### \_\_init\_\_ - -```python -def __init__(client: AsyncWebClient, channel_id: str, thread_ts: Optional[str] = None) -``` diff --git a/docs/english/reference/context/set_suggested_prompts/index.md b/docs/english/reference/context/set_suggested_prompts/index.md index 860d92c11..9fd57f089 100644 --- a/docs/english/reference/context/set_suggested_prompts/index.md +++ b/docs/english/reference/context/set_suggested_prompts/index.md @@ -7,21 +7,3 @@ title: slack_bolt.context.set_suggested_prompts - [slack_bolt.context.set_suggested_prompts.async_set_suggested_prompts](/tools/bolt-python/reference/context/set_suggested_prompts/async_set_suggested_prompts) - [slack_bolt.context.set_suggested_prompts.set_suggested_prompts](/tools/bolt-python/reference/context/set_suggested_prompts/set_suggested_prompts) - -## SetSuggestedPrompts Objects - -```python -class SetSuggestedPrompts() -``` - -#### client: `WebClient` - -#### channel\_id: `str` - -#### thread\_ts: `Optional[str]` - -#### \_\_init\_\_ - -```python -def __init__(client: WebClient, channel_id: str, thread_ts: Optional[str] = None) -``` diff --git a/docs/english/reference/context/set_suggested_prompts/set_suggested_prompts.md b/docs/english/reference/context/set_suggested_prompts/set_suggested_prompts.md index d8ea84fea..e93509e3c 100644 --- a/docs/english/reference/context/set_suggested_prompts/set_suggested_prompts.md +++ b/docs/english/reference/context/set_suggested_prompts/set_suggested_prompts.md @@ -4,20 +4,4 @@ title: slack_bolt.context.set_suggested_prompts.set_suggested_prompts slug: set_suggested_prompts --- -## SetSuggestedPrompts Objects -```python -class SetSuggestedPrompts() -``` - -#### client: `WebClient` - -#### channel\_id: `str` - -#### thread\_ts: `Optional[str]` - -#### \_\_init\_\_ - -```python -def __init__(client: WebClient, channel_id: str, thread_ts: Optional[str] = None) -``` diff --git a/docs/english/reference/context/set_title/async_set_title.md b/docs/english/reference/context/set_title/async_set_title.md index 2b3fa124a..7613af9cb 100644 --- a/docs/english/reference/context/set_title/async_set_title.md +++ b/docs/english/reference/context/set_title/async_set_title.md @@ -3,20 +3,4 @@ sidebar_label: async_set_title title: slack_bolt.context.set_title.async_set_title --- -## AsyncSetTitle Objects -```python -class AsyncSetTitle() -``` - -#### client: `AsyncWebClient` - -#### channel\_id: `str` - -#### thread\_ts: `str` - -#### \_\_init\_\_ - -```python -def __init__(client: AsyncWebClient, channel_id: str, thread_ts: str) -``` diff --git a/docs/english/reference/context/set_title/index.md b/docs/english/reference/context/set_title/index.md index 56b593c75..6ffb7ba6e 100644 --- a/docs/english/reference/context/set_title/index.md +++ b/docs/english/reference/context/set_title/index.md @@ -7,21 +7,3 @@ title: slack_bolt.context.set_title - [slack_bolt.context.set_title.async_set_title](/tools/bolt-python/reference/context/set_title/async_set_title) - [slack_bolt.context.set_title.set_title](/tools/bolt-python/reference/context/set_title/set_title) - -## SetTitle Objects - -```python -class SetTitle() -``` - -#### client: `WebClient` - -#### channel\_id: `str` - -#### thread\_ts: `str` - -#### \_\_init\_\_ - -```python -def __init__(client: WebClient, channel_id: str, thread_ts: str) -``` diff --git a/docs/english/reference/context/set_title/set_title.md b/docs/english/reference/context/set_title/set_title.md index a749267b2..f82cf35f0 100644 --- a/docs/english/reference/context/set_title/set_title.md +++ b/docs/english/reference/context/set_title/set_title.md @@ -4,20 +4,4 @@ title: slack_bolt.context.set_title.set_title slug: set_title --- -## SetTitle Objects -```python -class SetTitle() -``` - -#### client: `WebClient` - -#### channel\_id: `str` - -#### thread\_ts: `str` - -#### \_\_init\_\_ - -```python -def __init__(client: WebClient, channel_id: str, thread_ts: str) -``` diff --git a/docs/english/reference/error/index.md b/docs/english/reference/error/index.md index 20ae702f2..abba3b3c6 100644 --- a/docs/english/reference/error/index.md +++ b/docs/english/reference/error/index.md @@ -5,34 +5,8 @@ title: slack_bolt.error Bolt specific error types. -## BoltError Objects +## `BoltError` -```python -class BoltError(Exception) -``` +Bases: Exception General class in a Bolt app. - -## BoltUnhandledRequestError Objects - -```python -class BoltUnhandledRequestError(BoltError) -``` - -#### request: `BoltRequest` - -#### body: `dict` - -#### current\_response: `Optional[BoltResponse]` - -#### last\_global\_middleware\_name: `Optional[str]` - -#### \_\_init\_\_ - -```python -def __init__( - *, - request: Union[BoltRequest, AsyncBoltRequest], - current_response: Optional[BoltResponse], - last_global_middleware_name: Optional[str] = None) -``` diff --git a/docs/english/reference/index.md b/docs/english/reference/index.md index 760cc16f2..54a4a41e0 100644 --- a/docs/english/reference/index.md +++ b/docs/english/reference/index.md @@ -1,6 +1,7 @@ --- sidebar_label: slack_bolt title: slack_bolt +sidebar_position: 1 --- A Python framework to build Slack apps in a flash with the latest platform features. Read the [getting started guide](https://docs.slack.dev/tools/bolt-python/creating-an-app) and look at our [code examples](https://github.com/slackapi/bolt-python/tree/main/examples) to learn how to build apps using Bolt. @@ -9,308 +10,1438 @@ A Python framework to build Slack apps in a flash with the latest platform featu * GitHub repository: https://github.com/slackapi/bolt-python * The class representing a Bolt app: `slack_bolt.app.app` -## Submodules +## `App` + +```python +App(*, logger=None, name=None, process_before_response=False, raise_error_for_unhandled_request=False, signing_secret=None, token=None, token_verification_enabled=True, client=None, before_authorize=None, authorize=None, user_facing_authorize_error_message=None, installation_store=None, installation_store_bot_only=None, request_verification_enabled=True, ignoring_self_events_enabled=True, ignoring_self_assistant_message_events_enabled=True, ssl_check_enabled=True, url_verification_enabled=True, attaching_function_token_enabled=True, oauth_settings=None, oauth_flow=None, verification_token=None, listener_executor=None, assistant_thread_context_store=None, attaching_conversation_kwargs_enabled=True) +``` + +Bolt App that provides functionalities to register middleware/listeners. + +```python +import os +from slack_bolt import App + +# Initializes your app with your bot token and signing secret +app = App( + token=os.environ.get("SLACK_BOT_TOKEN"), + signing_secret=os.environ.get("SLACK_SIGNING_SECRET") +) + +# Listens to incoming messages that contain "hello" +@app.message("hello") +def message_hello(message, say): + # say() sends a message to the channel where the event was triggered + say(f"Hey there <@{message['user']}>!") + +# Start your app +if __name__ == "__main__": + app.start(port=int(os.environ.get("PORT", 3000))) +``` + +Refer to https://docs.slack.dev/tools/bolt-python/creating-an-app for details. + +If you would like to build an OAuth app for enabling the app to run with multiple workspaces, +refer to https://docs.slack.dev/tools/bolt-python/concepts/authenticating-oauth to learn how to configure the app. + +**Parameters:** + +- **logger** (Optional[Logger]) – The custom logger that can be used in this app. +- **name** (Optional[str]) – The application name that will be used in logging. If absent, the source file name will be used. +- **process_before_response** (bool) – True if this app runs on Function as a Service. (Default: False) +- **raise_error_for_unhandled_request** (bool) – True if you want to raise exceptions for unhandled requests +and use @app.error listeners instead of +the built-in handler, which pints warning logs and returns 404 to Slack (Default: False) +- **signing_secret** (Optional[str]) – The Signing Secret value used for verifying requests from Slack. +- **token** (Optional[str]) – The bot/user access token required only for single-workspace app. +- **token_verification_enabled** (bool) – Verifies the validity of the given token if True. +- **client** (Optional[WebClient]) – The singleton `slack_sdk.WebClient` instance for this app. +- **before_authorize** (Optional[Union[Middleware, Callable..., [Any]]]) – A global middleware that can be executed right before authorize function +- **authorize** (Optional[Callable..., [AuthorizeResult]]) – The function to authorize an incoming request from Slack +by checking if there is a team/user in the installation data. +- **user_facing_authorize_error_message** (Optional[str]) – The user-facing error message to display +when the app is installed but the installation is not managed by this app's installation store +- **installation_store** (Optional[InstallationStore]) – The module offering save/find operations of installation data +- **installation_store_bot_only** (Optional[bool]) – Use `InstallationStore#find_bot()` if True (Default: False) +- **request_verification_enabled** (bool) – False if you would like to disable the built-in middleware (Default: True). +`RequestVerification` is a built-in middleware that verifies the signature in HTTP Mode requests. +Make sure if it's safe enough when you turn a built-in middleware off. +We strongly recommend using RequestVerification for better security. +If you have a proxy that verifies request signature in front of the Bolt app, +it's totally fine to disable RequestVerification to avoid duplication of work. +Don't turn it off just for easiness of development. +- **ignoring_self_events_enabled** (bool) – False if you would like to disable the built-in middleware (Default: True). +`IgnoringSelfEvents` is a built-in middleware that enables Bolt apps to easily skip the events +generated by this app's bot user (this is useful for avoiding code error causing an infinite loop). +- **ignoring_self_assistant_message_events_enabled** (bool) – False if you would like to disable the built-in middleware. +`IgnoringSelfEvents` for this app's bot user message events within an assistant thread +This is useful for avoiding code error causing an infinite loop; Default: True +- **url_verification_enabled** (bool) – False if you would like to disable the built-in middleware (Default: True). +`UrlVerification` is a built-in middleware that handles url_verification requests +that verify the endpoint for Events API in HTTP Mode requests. +- **attaching_function_token_enabled** (bool) – False if you would like to disable the built-in middleware (Default: True). +`AttachingFunctionToken` is a built-in middleware that injects the just-in-time workflow-execution tokens +when your app receives `function_executed` or interactivity events scoped to a custom step. +- **ssl_check_enabled** (bool) – bool = False if you would like to disable the built-in middleware (Default: True). +`SslCheck` is a built-in middleware that handles ssl_check requests from Slack. +- **oauth_settings** (Optional[OAuthSettings]) – The settings related to Slack app installation flow (OAuth flow) +- **oauth_flow** (Optional[OAuthFlow]) – Instantiated `slack_bolt.oauth.OAuthFlow`. This is always prioritized over oauth_settings. +- **verification_token** (Optional[str]) – Deprecated verification mechanism. This can be used only for ssl_check requests. +- **listener_executor** (Optional[Executor]) – Custom executor to run background tasks. If absent, the default `ThreadPoolExecutor` will +be used. +- **assistant_thread_context_store** (Optional[AssistantThreadContextStore]) – Custom AssistantThreadContext store (Default: the built-in implementation, +which uses a parent message's metadata to store the latest context) +- **attaching_conversation_kwargs_enabled** (bool) – False if you would like to disable the built-in +middleware (Default: True). `AttachingConversationKwargs` is a built-in middleware that attaches +conversation-specific listener arguments (such as `say`, `set_status`, `say_stream`, and +`set_suggested_prompts`) for assistant thread and direct message events. + +### `action` + +```python +action(constraints, matchers=None, middleware=None) +``` + +Registers a new action listener. This method can be used as either a decorator or a method. + +```python +# Use this method as a decorator +@app.action("approve_button") +def update_message(ack): + ack() + +# Pass a function to this method +app.action("approve_button")(update_message) +``` + +* Refer to https://docs.slack.dev/reference/interaction-payloads/block_actions-payload/ for actions in `blocks`. +* Refer to https://docs.slack.dev/legacy/legacy-messaging/legacy-message-buttons/ for actions in `attachments`. +* Refer to https://docs.slack.dev/legacy/legacy-dialogs/ for actions in dialogs. + +To learn available arguments for middleware/listeners, see `slack_bolt.kwargs_injection.args`'s API document. + +**Parameters:** + +- **constraints** (Union[str, Pattern, Dict[str, Union[str, Pattern]]]) – The conditions that match a request payload +- **matchers** (Optional[Sequence[Callable..., [bool]]]) – A list of listener matcher functions. +Only when all the matchers return True, the listener function can be invoked. +- **middleware** (Optional[Sequence[Union[Callable, Middleware]]]) – A list of lister middleware functions. +Only when all the middleware call `next()` method, the listener function can be invoked. + +### `attachment_action` + +```python +attachment_action(callback_id, matchers=None, middleware=None) +``` + +Registers a new `interactive_message` action listener. + +Refer to https://docs.slack.dev/legacy/legacy-messaging/legacy-message-buttons/ for details. + +### `block_action` + +```python +block_action(constraints, matchers=None, middleware=None) +``` + +Registers a new `block_actions` action listener. + +Refer to https://docs.slack.dev/reference/interaction-payloads/block_actions-payload/ for details. + +### `block_suggestion` + +```python +block_suggestion(action_id, matchers=None, middleware=None) +``` + +Registers a new `block_suggestion` listener. + +### `client` + +```python +client: WebClient +``` + +The singleton `slack_sdk.WebClient` instance in this app. + +### `command` + +```python +command(command, matchers=None, middleware=None) +``` + +Registers a new slash command listener. + +This method can be used as either a decorator or a method. + +```python +# Use this method as a decorator +@app.command("/echo") +def repeat_text(ack, say, command): + # Acknowledge command request + ack() + say(f"{command['text']}") + +# Pass a function to this method +app.command("/echo")(repeat_text) +``` + +Refer to https://docs.slack.dev/interactivity/implementing-slash-commands/ for details of Slash Commands. + +To learn available arguments for middleware/listeners, see `slack_bolt.kwargs_injection.args`'s API document. + +**Parameters:** + +- **command** (Union[str, Pattern]) – The conditions that match a request payload +- **matchers** (Optional[Sequence[Callable..., [bool]]]) – A list of listener matcher functions. +Only when all the matchers return True, the listener function can be invoked. +- **middleware** (Optional[Sequence[Union[Callable, Middleware]]]) – A list of lister middleware functions. +Only when all the middleware call `next()` method, the listener function can be invoked. + +### `dialog_cancellation` + +```python +dialog_cancellation(callback_id, matchers=None, middleware=None) +``` + +Registers a new `dialog_cancellation` listener. + +Refer to https://docs.slack.dev/legacy/legacy-dialogs/ for details. + +### `dialog_submission` + +```python +dialog_submission(callback_id, matchers=None, middleware=None) +``` + +Registers a new `dialog_submission` listener. + +Refer to https://docs.slack.dev/legacy/legacy-dialogs/ for details. + +### `dialog_suggestion` + +```python +dialog_suggestion(callback_id, matchers=None, middleware=None) +``` + +Registers a new `dialog_suggestion` listener. + +Refer to https://docs.slack.dev/legacy/legacy-dialogs/ for details. + +### `dispatch` + +```python +dispatch(req) +``` + +Applies all middleware and dispatches an incoming request from Slack to the right code path. + +**Parameters:** + +- **req** (BoltRequest) – An incoming request from Slack + +**Returns:** + +- BoltResponse – The response generated by this Bolt app + +### `error` + +```python +error(func) +``` + +Updates the global error handler. This method can be used as either a decorator or a method. + +```python +# Use this method as a decorator +@app.error +def custom_error_handler(error, body, logger): + logger.exception(f"Error: {error}") + logger.info(f"Request body: {body}") + +# Pass a function to this method +app.error(custom_error_handler) +``` + +To learn available arguments for middleware/listeners, see `slack_bolt.kwargs_injection.args`'s API document. + +**Parameters:** + +- **func** (Callable..., [Optional[BoltResponse]]) – The function that is supposed to be executed +when getting an unhandled error in Bolt app. + +### `event` + +```python +event(event, matchers=None, middleware=None) +``` + +Registers a new event listener. This method can be used as either a decorator or a method. + +```python +# Use this method as a decorator +@app.event("team_join") +def ask_for_introduction(event, say): + welcome_channel_id = "C12345" + user_id = event["user"] + text = f"Welcome to the team, <@{user_id}>! :tada: You can introduce yourself in this channel." + say(text=text, channel=welcome_channel_id) + +# Pass a function to this method +app.event("team_join")(ask_for_introduction) +``` + +Refer to https://docs.slack.dev/apis/events-api/ for details of Events API. + +To learn available arguments for middleware/listeners, see `slack_bolt.kwargs_injection.args`'s API document. + +**Parameters:** + +- **event** (Union[str, Pattern, Dict[str, Optional[Union[str, Sequence[Optional[Union[str, Pattern]]]]]]]) – The conditions that match a request payload. +If you pass a dict for this, you can have type, subtype in the constraint. +- **matchers** (Optional[Sequence[Callable..., [bool]]]) – A list of listener matcher functions. +Only when all the matchers return True, the listener function can be invoked. +- **middleware** (Optional[Sequence[Union[Callable, Middleware]]]) – A list of lister middleware functions. +Only when all the middleware call `next()` method, the listener function can be invoked. + +### `function` + +```python +function(callback_id, matchers=None, middleware=None, auto_acknowledge=True, ack_timeout=3) +``` + +Registers a new Function listener. + +This method can be used as either a decorator or a method. + +```python +# Use this method as a decorator +@app.function("reverse") +def reverse_string(ack: Ack, inputs: dict, complete: Complete, fail: Fail): + try: + ack() + string_to_reverse = inputs["stringToReverse"] + complete(outputs={"reverseString": string_to_reverse[::-1]}) + except Exception as e: + fail(f"Cannot reverse string (error: {e})") + raise e + +# Pass a function to this method +app.function("reverse")(reverse_string) +``` + +To learn available arguments for middleware/listeners, see `slack_bolt.kwargs_injection.args`'s API document. + +**Parameters:** + +- **callback_id** (Union[str, Pattern]) – The callback id to identify the function +- **matchers** (Optional[Sequence[Callable..., [bool]]]) – A list of listener matcher functions. +Only when all the matchers return True, the listener function can be invoked. +- **middleware** (Optional[Sequence[Union[Callable, Middleware]]]) – A list of lister middleware functions. +Only when all the middleware call `next()` method, the listener function can be invoked. +- **auto_acknowledge** (bool) – Whether Bolt automatically acknowledges the function execution event on the +listener's behalf. When False, your listener must call `ack()` itself within `ack_timeout` +seconds (Default: True). +- **ack_timeout** (int) – The number of seconds to wait for the listener to call `ack()`. +Only takes effect when `auto_acknowledge` is False (Default: 3). + +### `global_shortcut` + +```python +global_shortcut(callback_id, matchers=None, middleware=None) +``` + +Registers a new global shortcut listener. + +### `installation_store` + +```python +installation_store: Optional[InstallationStore] +``` + +The `slack_sdk.oauth.InstallationStore` that can be used in the `authorize` middleware. + +### `listener_runner` + +```python +listener_runner: ThreadListenerRunner +``` + +The thread executor for asynchronously running listeners. + +### `logger` + +```python +logger: logging.Logger +``` + +The logger this app uses. + +### `message` + +```python +message(keyword='', matchers=None, middleware=None) +``` + +Registers a new message event listener. This method can be used as either a decorator or a method. + +Check the `App#event` method's docstring for details. + +```python +# Use this method as a decorator +@app.message(":wave:") +def say_hello(message, say): + user = message['user'] + say(f"Hi there, <@{user}>!") + +# Pass a function to this method +app.message(":wave:")(say_hello) +``` + +Refer to https://docs.slack.dev/reference/events/message/ for details of `message` events. + +To learn available arguments for middleware/listeners, see `slack_bolt.kwargs_injection.args`'s API document. + +**Parameters:** + +- **keyword** (Union[str, Pattern]) – The keyword to match +- **matchers** (Optional[Sequence[Callable..., [bool]]]) – A list of listener matcher functions. +Only when all the matchers return True, the listener function can be invoked. +- **middleware** (Optional[Sequence[Union[Callable, Middleware]]]) – A list of lister middleware functions. +Only when all the middleware call `next()` method, the listener function can be invoked. + +### `message_shortcut` + +```python +message_shortcut(callback_id, matchers=None, middleware=None) +``` + +Registers a new message shortcut listener. + +### `middleware` + +```python +middleware(*args) +``` + +Registers a new middleware to this app. + +This method can be used as either a decorator or a method. + +```python +# Use this method as a decorator +@app.middleware +def middleware_func(logger, body, next): + logger.info(f"request body: {body}") + next() + +# Pass a function to this method +app.middleware(middleware_func) +``` + +Refer to https://docs.slack.dev/tools/bolt-python/concepts/global-middleware for details. + +To learn available arguments for middleware/listeners, see `slack_bolt.kwargs_injection.args`'s API document. + +**Parameters:** + +- ***args** – A function that works as a global middleware. + +### `name` + +```python +name: str +``` + +The name of this app (default: the filename). + +### `oauth_flow` + +```python +oauth_flow: Optional[OAuthFlow] +``` + +Configured `OAuthFlow` object if exists. + +### `options` + +```python +options(constraints, matchers=None, middleware=None) +``` + +Registers a new options listener. + +This method can be used as either a decorator or a method. + +```python +# Use this method as a decorator +@app.options("menu_selection") +def show_menu_options(ack): + options = [ + { + "text": {"type": "plain_text", "text": "Option 1"}, + "value": "1-1", + }, + { + "text": {"type": "plain_text", "text": "Option 2"}, + "value": "1-2", + }, + ] + ack(options=options) + +# Pass a function to this method +app.options("menu_selection")(show_menu_options) +``` + +Refer to the following documents for details: + +* https://docs.slack.dev/reference/block-kit/block-elements/select-menu-element#external_select +* https://docs.slack.dev/reference/block-kit/block-elements/multi-select-menu-element#external_multi_select + +To learn available arguments for middleware/listeners, see `slack_bolt.kwargs_injection.args`'s API document. + +**Parameters:** + +- **constraints** (Union[str, Pattern, Dict[str, Union[str, Pattern]]]) – The conditions that match a request payload +- **matchers** (Optional[Sequence[Callable..., [bool]]]) – A list of listener matcher functions. +Only when all the matchers return True, the listener function can be invoked. +- **middleware** (Optional[Sequence[Union[Callable, Middleware]]]) – A list of lister middleware functions. +Only when all the middleware call `next()` method, the listener function can be invoked. + +### `shortcut` + +```python +shortcut(constraints, matchers=None, middleware=None) +``` + +Registers a new shortcut listener. + +This method can be used as either a decorator or a method. + +```python +# Use this method as a decorator +@app.shortcut("open_modal") +def open_modal(ack, body, client): + # Acknowledge the command request + ack() + # Call views_open with the built-in client + client.views_open( + # Pass a valid trigger_id within 3 seconds of receiving it + trigger_id=body["trigger_id"], + # View payload + view={ ... } + ) + +# Pass a function to this method +app.shortcut("open_modal")(open_modal) +``` + +Refer to https://docs.slack.dev/interactivity/implementing-shortcuts/ for details about Shortcuts. + +To learn available arguments for middleware/listeners, see `slack_bolt.kwargs_injection.args`'s API document. + +**Parameters:** + +- **constraints** (Union[str, Pattern, Dict[str, Union[str, Pattern]]]) – The conditions that match a request payload. +- **matchers** (Optional[Sequence[Callable..., [bool]]]) – A list of listener matcher functions. +Only when all the matchers return True, the listener function can be invoked. +- **middleware** (Optional[Sequence[Union[Callable, Middleware]]]) – A list of lister middleware functions. +Only when all the middleware call `next()` method, the listener function can be invoked. + +### `start` + +```python +start(port=3000, path='/slack/events', http_server_logger_enabled=True) +``` + +Starts a web server for local development. + +```python +# With the default settings, `http://localhost:3000/slack/events` +# is available for handling incoming requests from Slack +app.start() +``` + +This method internally starts a Web server process built with the `http.server` module. +For production, consider using a production-ready WSGI server such as Gunicorn. + +**Parameters:** + +- **port** (int) – The port to listen on (Default: 3000) +- **path** (str) – The path to handle request from Slack (Default: `/slack/events`) +- **http_server_logger_enabled** (bool) – The flag to enable http.server logging if True (Default: True) + +### `step` + +```python +step(callback_id, edit=None, save=None, execute=None) +``` + +Deprecated: register a new step from app listener. + +Steps from apps for legacy workflows are now deprecated. +Use new custom steps: https://docs.slack.dev/workflows/workflow-steps/ + +Registers a new step from app listener. + +Unlike others, this method doesn't behave as a decorator. +If you want to register a step from app by a decorator, use `WorkflowStepBuilder`'s methods. + +```python +# Create a new WorkflowStep instance +from slack_bolt.workflows.step import WorkflowStep +ws = WorkflowStep( + callback_id="add_task", + edit=edit, + save=save, + execute=execute, +) +# Pass Step to set up listeners +app.step(ws) +``` + +Refer to https://docs.slack.dev/legacy/legacy-steps-from-apps/ for details of steps from apps. + +To learn available arguments for middleware/listeners, see `slack_bolt.kwargs_injection.args`'s API document. + +For further information about WorkflowStep specific function arguments +such as `configure`, `update`, `complete`, and `fail`, +refer to `slack_bolt.workflows.step.utilities` API documents. + +**Parameters:** + +- **callback_id** (Union[str, Pattern, WorkflowStep, WorkflowStepBuilder]) – The Callback ID for this step from app +- **edit** (Optional[Union[Callable..., [Optional[BoltResponse]], Listener, Sequence[Callable]]]) – The function for displaying a modal in the Workflow Builder +- **save** (Optional[Union[Callable..., [Optional[BoltResponse]], Listener, Sequence[Callable]]]) – The function for handling configuration in the Workflow Builder +- **execute** (Optional[Union[Callable..., [Optional[BoltResponse]], Listener, Sequence[Callable]]]) – The function for handling the step execution + +### `use` + +```python +use(*args) +``` + +Registers a new global middleware to this app. This method can be used as either a decorator or a method. + +Refer to `App#middleware()` method's docstring for details. + +### `view` + +```python +view(constraints, matchers=None, middleware=None) +``` + +Registers a new `view_submission`/`view_closed` event listener. + +This method can be used as either a decorator or a method. + +```python +# Use this method as a decorator +@app.view("view_1") +def handle_submission(ack, body, client, view): + # Assume there's an input block with `block_c` as the block_id and `dreamy_input` + hopes_and_dreams = view["state"]["values"]["block_c"]["dreamy_input"] + user = body["user"]["id"] + # Validate the inputs + errors = {} + if hopes_and_dreams is not None and len(hopes_and_dreams) <= 5: + errors["block_c"] = "The value must be longer than 5 characters" + if len(errors) > 0: + ack(response_action="errors", errors=errors) + return # Return early to display the validation errors to the user + # Acknowledge the view_submission event and close the modal + ack() + # Do whatever you want with the input data - here we're saving it to a DB + +# Pass a function to this method +app.view("view_1")(handle_submission) +``` + +Refer to https://docs.slack.dev/reference/interaction-payloads/view-interactions-payload for details of payloads. + +To learn available arguments for middleware/listeners, see `slack_bolt.kwargs_injection.args`'s API document. + +**Parameters:** + +- **constraints** (Union[str, Pattern, Dict[str, Union[str, Pattern]]]) – The conditions that match a request payload +- **matchers** (Optional[Sequence[Callable..., [bool]]]) – A list of listener matcher functions. +Only when all the matchers return True, the listener function can be invoked. +- **middleware** (Optional[Sequence[Union[Callable, Middleware]]]) – A list of lister middleware functions. +Only when all the middleware call `next()` method, the listener function can be invoked. + +### `view_closed` + +```python +view_closed(constraints, matchers=None, middleware=None) +``` + +Registers a new `view_closed` listener. + +Refer to https://docs.slack.dev/reference/interaction-payloads/view-interactions-payload/#view_closed for details. + +### `view_submission` + +```python +view_submission(constraints, matchers=None, middleware=None) +``` + +Registers a new `view_submission` listener. + +Refer to https://docs.slack.dev/reference/interaction-payloads/view-interactions-payload/#view_submission for +details. + +## `Args` + +```python +Args(*, logger, client, req, resp, context, body, payload, options=None, shortcut=None, action=None, view=None, command=None, event=None, message=None, ack, say, respond, complete, fail, set_status=None, set_title=None, set_suggested_prompts=None, get_thread_context=None, save_thread_context=None, say_stream=None, next, **kwargs) +``` + +All the arguments in this class are available in any middleware / listeners. + +You can inject the named variables in the argument list in arbitrary order. + +```python +@app.action("link_button") +def handle_buttons(ack, respond, logger, context, body, client): + logger.info(f"request body: {body}") + ack() + if context.channel_id is not None: + respond("Hi!") + client.views_open( + trigger_id=body["trigger_id"], + view={ ... } + ) +``` + +Alternatively, you can include a parameter named `args` and it will be injected with an instance of this class. + +```python +@app.action("link_button") +def handle_buttons(args): + args.logger.info(f"request body: {args.body}") + args.ack() + if args.context.channel_id is not None: + args.respond("Hi!") + args.client.views_open( + trigger_id=args.body["trigger_id"], + view={ ... } + ) +``` + +### `ack` + +```python +ack: Ack = ack +``` + +`ack()` utility function, which returns acknowledgement to the Slack servers + +### `action` + +```python +action: Optional[Dict[str, Any]] = action +``` + +An alias for payload in an `@app.action` listener + +### `body` + +```python +body: Dict[str, Any] = body +``` + +Parsed request body data + +### `client` + +```python +client: WebClient = client +``` + +`slack_sdk.web.WebClient` instance with a valid token + +### `command` + +```python +command: Optional[Dict[str, Any]] = command +``` + +An alias for payload in an `@app.command` listener + +### `complete` + +```python +complete: Complete = complete +``` + +`complete()` utility function, signals a successful completion of the custom function + +### `context` + +```python +context: BoltContext = context +``` + +Context data associated with the incoming request + +### `event` + +```python +event: Optional[Dict[str, Any]] = event +``` + +An alias for payload in an `@app.event` listener + +### `fail` + +```python +fail: Fail = fail +``` -- [slack_bolt.adapter](/tools/bolt-python/reference/adapter) -- [slack_bolt.app](/tools/bolt-python/reference/app) -- [slack_bolt.async_app](/tools/bolt-python/reference/async_app) -- [slack_bolt.authorization](/tools/bolt-python/reference/authorization) -- [slack_bolt.context](/tools/bolt-python/reference/context) -- [slack_bolt.error](/tools/bolt-python/reference/error) -- [slack_bolt.kwargs_injection](/tools/bolt-python/reference/kwargs_injection) -- [slack_bolt.lazy_listener](/tools/bolt-python/reference/lazy_listener) -- [slack_bolt.listener](/tools/bolt-python/reference/listener) -- [slack_bolt.listener_matcher](/tools/bolt-python/reference/listener_matcher) -- [slack_bolt.logger](/tools/bolt-python/reference/logger) -- [slack_bolt.middleware](/tools/bolt-python/reference/middleware) -- [slack_bolt.oauth](/tools/bolt-python/reference/oauth) -- [slack_bolt.request](/tools/bolt-python/reference/request) -- [slack_bolt.response](/tools/bolt-python/reference/response) -- [slack_bolt.util](/tools/bolt-python/reference/util) -- [slack_bolt.version](/tools/bolt-python/reference/version) -- [slack_bolt.workflows](/tools/bolt-python/reference/workflows) +`fail()` utility function, signal that the custom function failed to complete -## App Objects +### `get_thread_context` ```python -class App() +get_thread_context: Optional[GetThreadContext] = get_thread_context ``` -## BoltContext Objects +`get_thread_context()` utility function for AI Agents & Assistants + +### `logger` ```python -class BoltContext(BaseContext) +logger: logging.Logger = logger ``` -Context object associated with a request from Slack. +Logger instance -## Ack Objects +### `message` ```python -class Ack() +message: Optional[Dict[str, Any]] = message ``` -## Complete Objects +An alias for payload in an `@app.message` listener + +### `next` ```python -class Complete() +next: Callable[[], None] = next ``` -## Fail Objects +`next()` utility function, which tells the middleware chain that it can continue with the next one + +### `next_` ```python -class Fail() +next_: Callable[[], None] = next ``` -## Respond Objects +An alias of `next()` for avoiding the Python built-in method overrides in middleware functions + +### `options` ```python -class Respond() +options: Optional[Dict[str, Any]] = options ``` -## Say Objects +An alias for payload in an `@app.options` listener + +### `payload` ```python -class Say() +payload: Dict[str, Any] = payload ``` -## SayStream Objects +The unwrapped core data in the request body + +### `req` ```python -class SayStream() +req: BoltRequest = req ``` -## Args Objects +Incoming request from Slack + +### `request` ```python -class Args() +request: BoltRequest = req ``` -All the arguments in this class are available in any middleware / listeners. +Incoming request from Slack -You can inject the named variables in the argument list in arbitrary order. +### `resp` ```python -@app.action("link_button") -def handle_buttons(ack, respond, logger, context, body, client): - logger.info(f"request body: {body}") +resp: BoltResponse = resp +``` + +Response representation + +### `respond` + +```python +respond: Respond = respond +``` + +`respond()` utility function, which utilizes the associated `response_url` + +### `response` + +```python +response: BoltResponse = resp +``` + +Response representation + +### `save_thread_context` + +```python +save_thread_context: Optional[SaveThreadContext] = save_thread_context +``` + +`save_thread_context()` utility function for AI Agents & Assistants + +### `say` + +```python +say: Say = say +``` + +`say()` utility function, which calls `chat.postMessage` API with the associated channel ID + +### `say_stream` + +```python +say_stream: Optional[SayStream] = say_stream +``` + +`say_stream()` utility function for conversations, AI Agents & Assistants + +### `set_status` + +```python +set_status: Optional[SetStatus] = set_status +``` + +`set_status()` utility function for AI Agents & Assistants + +### `set_suggested_prompts` + +```python +set_suggested_prompts: Optional[SetSuggestedPrompts] = set_suggested_prompts +``` + +`set_suggested_prompts()` utility function for AI Agents & Assistants + +### `set_title` + +```python +set_title: Optional[SetTitle] = set_title +``` + +`set_title()` utility function for AI Agents & Assistants + +### `shortcut` + +```python +shortcut: Optional[Dict[str, Any]] = shortcut +``` + +An alias for payload in an `@app.shortcut` listener + +### `view` + +```python +view: Optional[Dict[str, Any]] = view +``` + +An alias for payload in an `@app.view` listener + +## `BoltContext` + +Bases: BaseContext + +Context object associated with a request from Slack. + +### `ack` + +```python +ack: Ack +``` + +`ack()` function for this request. + +```python +@app.action("button") +def handle_button_clicks(context): + context.ack() + +# You can access "ack" this way too. +@app.action("button") +def handle_button_clicks(ack): ack() - if context.channel_id is not None: - respond("Hi!") - client.views_open( - trigger_id=body["trigger_id"], - view={ ... } - ) ``` -Alternatively, you can include a parameter named `args` and it will be injected with an instance of this class. +**Returns:** + +- Ack – Callable `ack()` function + +### `actor_enterprise_id` ```python -@app.action("link_button") -def handle_buttons(args): - args.logger.info(f"request body: {args.body}") - args.ack() - if args.context.channel_id is not None: - args.respond("Hi!") - args.client.views_open( - trigger_id=args.body["trigger_id"], - view={ ... } +actor_enterprise_id: Optional[str] +``` + +The action's actor's Enterprise Grid organization ID. + +Note that this property is especially useful for handling events in Slack Connect channels. +That being said, it's not guaranteed to have a valid ID for all events due to server-side inconsistency. + +### `actor_team_id` + +```python +actor_team_id: Optional[str] +``` + +The action's actor's workspace ID. + +Note that this property is especially useful for handling events in Slack Connect channels. +That being said, it's not guaranteed to have a valid ID for all events due to server-side inconsistency. + +### `actor_user_id` + +```python +actor_user_id: Optional[str] +``` + +The action's actor's user ID. + +Note that this property is especially useful for handling events in Slack Connect channels. +That being said, it's not guaranteed to have a valid ID for all events due to server-side inconsistency. + +### `authorize_result` + +```python +authorize_result: Optional[AuthorizeResult] +``` + +The authorize result resolved for this request. + +### `bot_id` + +```python +bot_id: Optional[str] +``` + +The bot ID resolved for this request. + +### `bot_token` + +```python +bot_token: Optional[str] +``` + +The bot token resolved for this request. + +### `bot_user_id` + +```python +bot_user_id: Optional[str] +``` + +The bot user ID resolved for this request. + +### `channel_id` + +```python +channel_id: Optional[str] +``` + +The conversation ID associated with this request. + +### `client` + +```python +client: WebClient +``` + +The `WebClient` instance available for this request. + +```python +@app.event("app_mention") +def handle_events(context): + context.client.chat_postMessage( + channel=context.channel_id, + text="Thanks!", + ) + +# You can access "client" this way too. +@app.event("app_mention") +def handle_events(client, context): + client.chat_postMessage( + channel=context.channel_id, + text="Thanks!", ) ``` +**Returns:** + +- WebClient – `WebClient` instance + +### `complete` + +```python +complete: Complete +``` + +`complete()` function for this request. + +Once a custom function's state is set to complete, +any outputs the function returns will be passed along to the next step of its housing workflow, +or complete the workflow if the function is the last step in a workflow. Additionally, +any interactivity handlers associated to a function invocation will no longer be invocable. + +```python +@app.function("reverse") +def handle_button_clicks(ack, complete): + ack() + complete(outputs={"stringReverse":"olleh"}) + +@app.function("reverse") +def handle_button_clicks(context): + context.ack() + context.complete(outputs={"stringReverse":"olleh"}) +``` + +**Returns:** -## Listener Objects +- Complete – Callable `complete()` function + +### `enterprise_id` + +```python +enterprise_id: Optional[str] +``` + +The Enterprise Grid Organization ID of this request. + +### `fail` ```python -class Listener() +fail: Fail ``` -## CustomListenerMatcher Objects +`fail()` function for this request. + +Once a custom function's state is set to error, +its housing workflow will be interrupted and any provided error message will be passed +on to the end user through SlackBot. Additionally, any interactivity handlers associated +to a function invocation will no longer be invocable. ```python -class CustomListenerMatcher(ListenerMatcher) +@app.function("reverse") +def handle_button_clicks(ack, fail): + ack() + fail(error="something went wrong") + +@app.function("reverse") +def handle_button_clicks(context): + context.ack() + context.fail(error="something went wrong") ``` -## BoltRequest Objects +**Returns:** + +- Fail – Callable `fail()` function + +### `function_bot_access_token` ```python -class BoltRequest() +function_bot_access_token: Optional[str] ``` -## BoltResponse Objects +The bot token resolved for this function request. + +Only available for `function_executed` and interactivity events scoped to a custom step. + +### `function_execution_id` ```python -class BoltResponse() +function_execution_id: Optional[str] ``` -## Assistant Objects +The `function_execution_id` associated with this request. + +Only available for `function_executed` and interactivity events scoped to a custom step. + +### `inputs` ```python -class Assistant(Middleware) +inputs: Optional[Dict[str, Any]] ``` -#### thread\_context\_store: `Optional[AssistantThreadContextStore]` +The `inputs` associated with this request. + +Only available for `function_executed` and interactivity events scoped to a custom step. -#### base\_logger: `Optional[logging.Logger]` +### `is_enterprise_install` -#### \_\_init\_\_ +```python +is_enterprise_install: Optional[bool] +``` + +True if the request is associated with an Org-wide installation. + +### `listener_runner` ```python -def __init__( - *, - app_name: str = 'assistant', - thread_context_store: Optional[AssistantThreadContextStore] = None, - logger: Optional[logging.Logger] = None) +listener_runner: ThreadListenerRunner ``` -#### thread\_started +The properly configured listener_runner that is available for middleware/listeners. + +### `logger` ```python -def thread_started( - *args, - matchers: Optional[Union[Callable[..., bool], ListenerMatcher]] = None, - middleware: Optional[Union[Callable, Middleware]] = None, - lazy: Optional[List[Callable[..., None]]] = None) +logger: Logger ``` -#### user\_message +The properly configured logger that is available for middleware/listeners. + +### `matches` ```python -def user_message( - *args, - matchers: Optional[Union[Callable[..., bool], ListenerMatcher]] = None, - middleware: Optional[Union[Callable, Middleware]] = None, - lazy: Optional[List[Callable[..., None]]] = None) +matches: Optional[Tuple] ``` -#### bot\_message +Returns all the matched parts in message listener's regexp. + +### `respond` ```python -def bot_message( - *args, - matchers: Optional[Union[Callable[..., bool], ListenerMatcher]] = None, - middleware: Optional[Union[Callable, Middleware]] = None, - lazy: Optional[List[Callable[..., None]]] = None) +respond: Optional[Respond] ``` -#### thread\_context\_changed +`respond()` function for this request. ```python -def thread_context_changed( - *args, - matchers: Optional[Union[Callable[..., bool], ListenerMatcher]] = None, - middleware: Optional[Union[Callable, Middleware]] = None, - lazy: Optional[List[Callable[..., None]]] = None) +@app.action("button") +def handle_button_clicks(context): + context.ack() + context.respond("Hi!") + +# You can access "ack" this way too. +@app.action("button") +def handle_button_clicks(ack, respond): + ack() + respond("Hi!") ``` -#### default\_thread\_context\_changed +**Returns:** + +- Optional[Respond] – Callable `respond()` function + +### `response_url` ```python -def default_thread_context_changed( - save_thread_context: SaveThreadContext, - payload: dict) +response_url: Optional[str] ``` -#### process +The `response_url` associated with this request. + +### `say` ```python -def process( - *, - req: BoltRequest, - resp: BoltResponse, - next: Callable[[], BoltResponse]) -> Optional[BoltResponse] +say: Say ``` -#### build\_listener +`say()` function for this request. ```python -def build_listener( - listener_or_functions: Union[Listener, Callable, List[Callable]], - matchers: Optional[List[Union[ListenerMatcher, Callable[..., bool]]]] = None, - middleware: Optional[List[Middleware]] = None, - base_logger: Optional[Logger] = None) -> Listener +@app.action("button") +def handle_button_clicks(context): + context.ack() + context.say("Hi!") + +# You can access "ack" this way too. +@app.action("button") +def handle_button_clicks(ack, say): + ack() + say("Hi!") ``` -## AssistantThreadContext Objects +**Returns:** + +- Say – Callable `say()` function + +### `team_id` ```python -class AssistantThreadContext(dict) +team_id: Optional[str] ``` -#### enterprise\_id: `Optional[str]` +The Workspace ID of this request. -#### team\_id: `Optional[str]` +### `thread_ts` + +```python +thread_ts: Optional[str] +``` -#### channel\_id: `str` +The conversation thread's ID associated with this request. -#### \_\_init\_\_ +### `token` ```python -def __init__(payload: dict) +token: Optional[str] ``` -## AssistantThreadContextStore Objects +The (bot/user) token resolved for this request. + +### `user_id` ```python -class AssistantThreadContextStore() +user_id: Optional[str] ``` -#### save +The user ID associated ith this request. + +### `user_token` ```python -def save(*, channel_id: str, thread_ts: str, context: Dict[str, str]) -> None +user_token: Optional[str] ``` -#### find +The user token resolved for this request. + +## `BoltRequest` ```python -def find(*, channel_id: str, thread_ts: str) -> Optional[AssistantThreadContext] +BoltRequest(*, body, query=None, headers=None, context=None, mode='http') ``` -## FileAssistantThreadContextStore Objects +Request to a Bolt app. + +**Parameters:** + +- **body** (Union[str, dict]) – The raw request body (only plain text is supported for "http" mode) +- **query** (Optional[Union[str, Dict[str, str], Dict[str, Sequence[str]]]]) – The query string data in any data format. +- **headers** (Optional[Dict[str, Union[str, Sequence[str]]]]) – The request headers. +- **context** (Optional[Dict[str, Any]]) – The context in this request. +- **mode** (str) – The mode used for this request. (either "http" or "socket_mode") + +## `BoltResponse` ```python -class FileAssistantThreadContextStore(AssistantThreadContextStore) +BoltResponse(*, status, body='', headers=None) ``` -#### \_\_init\_\_ +The response from a Bolt app. + +**Parameters:** + +- **status** (int) – HTTP status code +- **body** (Union[str, dict]) – The response body (dict and str are supported) +- **headers** (Optional[Dict[str, Union[str, Sequence[str]]]]) – The response headers. + +## `Complete` ```python -def __init__(base_dir: str = str(Path.home()) + '/.bolt-app-assistant-thread-contexts') +Complete(client, function_execution_id) ``` -#### save +### `has_been_called` ```python -def save(*, channel_id: str, thread_ts: str, context: Dict[str, str]) -> None +has_been_called() ``` -#### find +Check if this complete function has been called. + +**Returns:** + +- **bool** (bool) – True if the complete function has been called, False otherwise. + +## `Fail` ```python -def find(*, channel_id: str, thread_ts: str) -> Optional[AssistantThreadContext] +Fail(client, function_execution_id) ``` -## SetStatus Objects +### `has_been_called` ```python -class SetStatus() +has_been_called() ``` -## SetTitle Objects +Check if this fail function has been called. + +**Returns:** + +- **bool** (bool) – True if the fail function has been called, False otherwise. + +## `Listener` + +### `run_ack_function` ```python -class SetTitle() +run_ack_function(*, request, response) ``` -## SetSuggestedPrompts Objects +Runs all the registered middleware and then run the listener function. + +**Parameters:** + +- **request** (BoltRequest) – The incoming request +- **response** (BoltResponse) – The current response + +**Returns:** + +- Optional[BoltResponse] – The processed response + +### `run_middleware` ```python -class SetSuggestedPrompts() +run_middleware(*, req, resp) ``` -## SaveThreadContext Objects +Runs a middleware. + +**Parameters:** + +- **req** (BoltRequest) – The incoming request +- **resp** (BoltResponse) – The current response + +**Returns:** + +- Tuple[Optional[BoltResponse], bool] – A tuple of the processed response and a flag indicating termination + +## `SayStream` ```python -class SaveThreadContext() +SayStream(*, client, channel=None, recipient_team_id=None, recipient_user_id=None, thread_ts=None) ``` + +## Submodules + +- [slack_bolt.adapter](/tools/bolt-python/reference/adapter) +- [slack_bolt.app](/tools/bolt-python/reference/app) +- [slack_bolt.async_app](/tools/bolt-python/reference/async_app) +- [slack_bolt.authorization](/tools/bolt-python/reference/authorization) +- [slack_bolt.context](/tools/bolt-python/reference/context) +- [slack_bolt.error](/tools/bolt-python/reference/error) +- [slack_bolt.kwargs_injection](/tools/bolt-python/reference/kwargs_injection) +- [slack_bolt.lazy_listener](/tools/bolt-python/reference/lazy_listener) +- [slack_bolt.listener](/tools/bolt-python/reference/listener) +- [slack_bolt.listener_matcher](/tools/bolt-python/reference/listener_matcher) +- [slack_bolt.logger](/tools/bolt-python/reference/logger) +- [slack_bolt.middleware](/tools/bolt-python/reference/middleware) +- [slack_bolt.oauth](/tools/bolt-python/reference/oauth) +- [slack_bolt.request](/tools/bolt-python/reference/request) +- [slack_bolt.response](/tools/bolt-python/reference/response) +- [slack_bolt.util](/tools/bolt-python/reference/util) +- [slack_bolt.version](/tools/bolt-python/reference/version) +- [slack_bolt.workflows](/tools/bolt-python/reference/workflows) diff --git a/docs/english/reference/kwargs_injection/args.md b/docs/english/reference/kwargs_injection/args.md index c47ccc6a5..086da65a9 100644 --- a/docs/english/reference/kwargs_injection/args.md +++ b/docs/english/reference/kwargs_injection/args.md @@ -3,10 +3,10 @@ sidebar_label: args title: slack_bolt.kwargs_injection.args --- -## Args Objects +## `Args` ```python -class Args() +Args(*, logger, client, req, resp, context, body, payload, options=None, shortcut=None, action=None, view=None, command=None, event=None, message=None, ack, say, respond, complete, fail, set_status=None, set_title=None, set_suggested_prompts=None, get_thread_context=None, save_thread_context=None, say_stream=None, next, **kwargs) ``` All the arguments in this class are available in any middleware / listeners. @@ -41,153 +41,234 @@ def handle_buttons(args): ) ``` +### `ack` -#### client: `WebClient` +```python +ack: Ack = ack +``` -`slack_sdk.web.WebClient` instance with a valid token +`ack()` utility function, which returns acknowledgement to the Slack servers -#### logger: `logging.Logger` +### `action` -Logger instance +```python +action: Optional[Dict[str, Any]] = action +``` -#### req: `BoltRequest` +An alias for payload in an `@app.action` listener -Incoming request from Slack +### `body` -#### resp: `BoltResponse` +```python +body: Dict[str, Any] = body +``` -Response representation +Parsed request body data -#### request: `BoltRequest` +### `client` -Incoming request from Slack +```python +client: WebClient = client +``` -#### response: `BoltResponse` +`slack_sdk.web.WebClient` instance with a valid token -Response representation +### `command` -#### context: `BoltContext` +```python +command: Optional[Dict[str, Any]] = command +``` -Context data associated with the incoming request +An alias for payload in an `@app.command` listener -#### body: `Dict[str, Any]` +### `complete` -Parsed request body data +```python +complete: Complete = complete +``` -#### payload: `Dict[str, Any]` +`complete()` utility function, signals a successful completion of the custom function -The unwrapped core data in the request body +### `context` -#### options: `Optional[Dict[str, Any]]` +```python +context: BoltContext = context +``` -An alias for payload in an `@app.options` listener +Context data associated with the incoming request -#### shortcut: `Optional[Dict[str, Any]]` +### `event` -An alias for payload in an `@app.shortcut` listener +```python +event: Optional[Dict[str, Any]] = event +``` -#### action: `Optional[Dict[str, Any]]` +An alias for payload in an `@app.event` listener -An alias for payload in an `@app.action` listener +### `fail` -#### view: `Optional[Dict[str, Any]]` +```python +fail: Fail = fail +``` -An alias for payload in an `@app.view` listener +`fail()` utility function, signal that the custom function failed to complete -#### command: `Optional[Dict[str, Any]]` +### `get_thread_context` -An alias for payload in an `@app.command` listener +```python +get_thread_context: Optional[GetThreadContext] = get_thread_context +``` -#### event: `Optional[Dict[str, Any]]` +`get_thread_context()` utility function for AI Agents & Assistants -An alias for payload in an `@app.event` listener +### `logger` + +```python +logger: logging.Logger = logger +``` + +Logger instance + +### `message` -#### message: `Optional[Dict[str, Any]]` +```python +message: Optional[Dict[str, Any]] = message +``` An alias for payload in an `@app.message` listener -#### ack: `Ack` +### `next` -`ack()` utility function, which returns acknowledgement to the Slack servers +```python +next: Callable[[], None] = next +``` -#### say: `Say` +`next()` utility function, which tells the middleware chain that it can continue with the next one -`say()` utility function, which calls `chat.postMessage` API with the associated channel ID +### `next_` -#### respond: `Respond` +```python +next_: Callable[[], None] = next +``` -`respond()` utility function, which utilizes the associated `response_url` +An alias of `next()` for avoiding the Python built-in method overrides in middleware functions -#### complete: `Complete` +### `options` -`complete()` utility function, signals a successful completion of the custom function +```python +options: Optional[Dict[str, Any]] = options +``` + +An alias for payload in an `@app.options` listener -#### fail: `Fail` +### `payload` -`fail()` utility function, signal that the custom function failed to complete +```python +payload: Dict[str, Any] = payload +``` -#### set\_status: `Optional[SetStatus]` +The unwrapped core data in the request body -`set_status()` utility function for AI Agents & Assistants +### `req` -#### set\_title: `Optional[SetTitle]` +```python +req: BoltRequest = req +``` -`set_title()` utility function for AI Agents & Assistants +Incoming request from Slack -#### set\_suggested\_prompts: `Optional[SetSuggestedPrompts]` +### `request` -`set_suggested_prompts()` utility function for AI Agents & Assistants +```python +request: BoltRequest = req +``` -#### get\_thread\_context: `Optional[GetThreadContext]` +Incoming request from Slack -`get_thread_context()` utility function for AI Agents & Assistants +### `resp` + +```python +resp: BoltResponse = resp +``` + +Response representation -#### save\_thread\_context: `Optional[SaveThreadContext]` +### `respond` + +```python +respond: Respond = respond +``` + +`respond()` utility function, which utilizes the associated `response_url` + +### `response` + +```python +response: BoltResponse = resp +``` + +Response representation + +### `save_thread_context` + +```python +save_thread_context: Optional[SaveThreadContext] = save_thread_context +``` `save_thread_context()` utility function for AI Agents & Assistants -#### say\_stream: `Optional[SayStream]` +### `say` + +```python +say: Say = say +``` + +`say()` utility function, which calls `chat.postMessage` API with the associated channel ID + +### `say_stream` + +```python +say_stream: Optional[SayStream] = say_stream +``` `say_stream()` utility function for conversations, AI Agents & Assistants -#### next: `Callable[[], None]` +### `set_status` -`next()` utility function, which tells the middleware chain that it can continue with the next one +```python +set_status: Optional[SetStatus] = set_status +``` -#### next\_: `Callable[[], None]` +`set_status()` utility function for AI Agents & Assistants -An alias of `next()` for avoiding the Python built-in method overrides in middleware functions +### `set_suggested_prompts` + +```python +set_suggested_prompts: Optional[SetSuggestedPrompts] = set_suggested_prompts +``` + +`set_suggested_prompts()` utility function for AI Agents & Assistants + +### `set_title` + +```python +set_title: Optional[SetTitle] = set_title +``` -#### \_\_init\_\_ - -```python -def __init__( - *, - logger: logging.Logger, - client: WebClient, - req: BoltRequest, - resp: BoltResponse, - context: BoltContext, - body: Dict[str, Any], - payload: Dict[str, Any], - options: Optional[Dict[str, Any]] = None, - shortcut: Optional[Dict[str, Any]] = None, - action: Optional[Dict[str, Any]] = None, - view: Optional[Dict[str, Any]] = None, - command: Optional[Dict[str, Any]] = None, - event: Optional[Dict[str, Any]] = None, - message: Optional[Dict[str, Any]] = None, - ack: Ack, - say: Say, - respond: Respond, - complete: Complete, - fail: Fail, - set_status: Optional[SetStatus] = None, - set_title: Optional[SetTitle] = None, - set_suggested_prompts: Optional[SetSuggestedPrompts] = None, - get_thread_context: Optional[GetThreadContext] = None, - save_thread_context: Optional[SaveThreadContext] = None, - say_stream: Optional[SayStream] = None, - next: Callable[[], None], - **kwargs) +`set_title()` utility function for AI Agents & Assistants + +### `shortcut` + +```python +shortcut: Optional[Dict[str, Any]] = shortcut ``` + +An alias for payload in an `@app.shortcut` listener + +### `view` + +```python +view: Optional[Dict[str, Any]] = view +``` + +An alias for payload in an `@app.view` listener diff --git a/docs/english/reference/kwargs_injection/async_args.md b/docs/english/reference/kwargs_injection/async_args.md index 2ae53a62a..b3581b5c2 100644 --- a/docs/english/reference/kwargs_injection/async_args.md +++ b/docs/english/reference/kwargs_injection/async_args.md @@ -3,10 +3,10 @@ sidebar_label: async_args title: slack_bolt.kwargs_injection.async_args --- -## AsyncArgs Objects +## `AsyncArgs` ```python -class AsyncArgs() +AsyncArgs(*, logger, client, req, resp, context, body, payload, options=None, shortcut=None, action=None, view=None, command=None, event=None, message=None, ack, say, respond, complete, fail, set_status=None, set_title=None, set_suggested_prompts=None, get_thread_context=None, save_thread_context=None, say_stream=None, next, **kwargs) ``` All the arguments in this class are available in any middleware / listeners. @@ -41,153 +41,234 @@ async def handle_buttons(args): ) ``` +### `ack` -#### logger: `Logger` +```python +ack: AsyncAck = ack +``` -Logger instance +`ack()` utility function, which returns acknowledgement to the Slack servers -#### client: `AsyncWebClient` +### `action` -`slack_sdk.web.async_client.AsyncWebClient` instance with a valid token +```python +action: Optional[Dict[str, Any]] = action +``` -#### req: `AsyncBoltRequest` +An alias for payload in an `@app.action` listener -Incoming request from Slack +### `body` -#### resp: `BoltResponse` +```python +body: Dict[str, Any] = body +``` -Response representation +Parsed request body data -#### request: `AsyncBoltRequest` +### `client` -Incoming request from Slack +```python +client: AsyncWebClient = client +``` -#### response: `BoltResponse` +`slack_sdk.web.async_client.AsyncWebClient` instance with a valid token -Response representation +### `command` -#### context: `AsyncBoltContext` +```python +command: Optional[Dict[str, Any]] = command +``` -Context data associated with the incoming request +An alias for payload in an `@app.command` listener -#### body: `Dict[str, Any]` +### `complete` -Parsed request body data +```python +complete: AsyncComplete = complete +``` -#### payload: `Dict[str, Any]` +`complete()` utility function, signals a successful completion of the custom function -The unwrapped core data in the request body +### `context` -#### options: `Optional[Dict[str, Any]]` +```python +context: AsyncBoltContext = context +``` -An alias for payload in an `@app.options` listener +Context data associated with the incoming request -#### shortcut: `Optional[Dict[str, Any]]` +### `event` -An alias for payload in an `@app.shortcut` listener +```python +event: Optional[Dict[str, Any]] = event +``` -#### action: `Optional[Dict[str, Any]]` +An alias for payload in an `@app.event` listener -An alias for payload in an `@app.action` listener +### `fail` -#### view: `Optional[Dict[str, Any]]` +```python +fail: AsyncFail = fail +``` -An alias for payload in an `@app.view` listener +`fail()` utility function, signal that the custom function failed to complete -#### command: `Optional[Dict[str, Any]]` +### `get_thread_context` -An alias for payload in an `@app.command` listener +```python +get_thread_context: Optional[AsyncGetThreadContext] = get_thread_context +``` -#### event: `Optional[Dict[str, Any]]` +`get_thread_context()` utility function for AI Agents & Assistants -An alias for payload in an `@app.event` listener +### `logger` + +```python +logger: Logger = logger +``` + +Logger instance + +### `message` -#### message: `Optional[Dict[str, Any]]` +```python +message: Optional[Dict[str, Any]] = message +``` An alias for payload in an `@app.message` listener -#### ack: `AsyncAck` +### `next` -`ack()` utility function, which returns acknowledgement to the Slack servers +```python +next: Callable[[], Awaitable[None]] = next +``` -#### say: `AsyncSay` +`next()` utility function, which tells the middleware chain that it can continue with the next one -`say()` utility function, which calls chat.postMessage API with the associated channel ID +### `next_` -#### respond: `AsyncRespond` +```python +next_: Callable[[], Awaitable[None]] = next +``` -`respond()` utility function, which utilizes the associated `response_url` +An alias of `next()` for avoiding the Python built-in method overrides in middleware functions -#### complete: `AsyncComplete` +### `options` -`complete()` utility function, signals a successful completion of the custom function +```python +options: Optional[Dict[str, Any]] = options +``` + +An alias for payload in an `@app.options` listener -#### fail: `AsyncFail` +### `payload` -`fail()` utility function, signal that the custom function failed to complete +```python +payload: Dict[str, Any] = payload +``` -#### set\_status: `Optional[AsyncSetStatus]` +The unwrapped core data in the request body -`set_status()` utility function for AI Agents & Assistants +### `req` -#### set\_title: `Optional[AsyncSetTitle]` +```python +req: AsyncBoltRequest = req +``` -`set_title()` utility function for AI Agents & Assistants +Incoming request from Slack -#### set\_suggested\_prompts: `Optional[AsyncSetSuggestedPrompts]` +### `request` -`set_suggested_prompts()` utility function for AI Agents & Assistants +```python +request: AsyncBoltRequest = req +``` -#### get\_thread\_context: `Optional[AsyncGetThreadContext]` +Incoming request from Slack -`get_thread_context()` utility function for AI Agents & Assistants +### `resp` + +```python +resp: BoltResponse = resp +``` + +Response representation -#### save\_thread\_context: `Optional[AsyncSaveThreadContext]` +### `respond` + +```python +respond: AsyncRespond = respond +``` + +`respond()` utility function, which utilizes the associated `response_url` + +### `response` + +```python +response: BoltResponse = resp +``` + +Response representation + +### `save_thread_context` + +```python +save_thread_context: Optional[AsyncSaveThreadContext] = save_thread_context +``` `save_thread_context()` utility function for AI Agents & Assistants -#### say\_stream: `Optional[AsyncSayStream]` +### `say` + +```python +say: AsyncSay = say +``` + +`say()` utility function, which calls chat.postMessage API with the associated channel ID + +### `say_stream` + +```python +say_stream: Optional[AsyncSayStream] = say_stream +``` `say_stream()` utility function for AI Agents & Assistants -#### next: `Callable[[], Awaitable[None]]` +### `set_status` -`next()` utility function, which tells the middleware chain that it can continue with the next one +```python +set_status: Optional[AsyncSetStatus] = set_status +``` -#### next\_: `Callable[[], Awaitable[None]]` +`set_status()` utility function for AI Agents & Assistants -An alias of `next()` for avoiding the Python built-in method overrides in middleware functions +### `set_suggested_prompts` + +```python +set_suggested_prompts: Optional[AsyncSetSuggestedPrompts] = set_suggested_prompts +``` + +`set_suggested_prompts()` utility function for AI Agents & Assistants + +### `set_title` + +```python +set_title: Optional[AsyncSetTitle] = set_title +``` -#### \_\_init\_\_ - -```python -def __init__( - *, - logger: Logger, - client: AsyncWebClient, - req: AsyncBoltRequest, - resp: BoltResponse, - context: AsyncBoltContext, - body: Dict[str, Any], - payload: Dict[str, Any], - options: Optional[Dict[str, Any]] = None, - shortcut: Optional[Dict[str, Any]] = None, - action: Optional[Dict[str, Any]] = None, - view: Optional[Dict[str, Any]] = None, - command: Optional[Dict[str, Any]] = None, - event: Optional[Dict[str, Any]] = None, - message: Optional[Dict[str, Any]] = None, - ack: AsyncAck, - say: AsyncSay, - respond: AsyncRespond, - complete: AsyncComplete, - fail: AsyncFail, - set_status: Optional[AsyncSetStatus] = None, - set_title: Optional[AsyncSetTitle] = None, - set_suggested_prompts: Optional[AsyncSetSuggestedPrompts] = None, - get_thread_context: Optional[AsyncGetThreadContext] = None, - save_thread_context: Optional[AsyncSaveThreadContext] = None, - say_stream: Optional[AsyncSayStream] = None, - next: Callable[[], Awaitable[None]], - **kwargs) +`set_title()` utility function for AI Agents & Assistants + +### `shortcut` + +```python +shortcut: Optional[Dict[str, Any]] = shortcut ``` + +An alias for payload in an `@app.shortcut` listener + +### `view` + +```python +view: Optional[Dict[str, Any]] = view +``` + +An alias for payload in an `@app.view` listener diff --git a/docs/english/reference/kwargs_injection/async_utils.md b/docs/english/reference/kwargs_injection/async_utils.md index a1a772abf..369d29652 100644 --- a/docs/english/reference/kwargs_injection/async_utils.md +++ b/docs/english/reference/kwargs_injection/async_utils.md @@ -3,17 +3,4 @@ sidebar_label: async_utils title: slack_bolt.kwargs_injection.async_utils --- -#### build\_async\_required\_kwargs -```python -def build_async_required_kwargs( - *, - logger: logging.Logger, - required_arg_names: MutableSequence[str], - request: AsyncBoltRequest, - response: Optional[BoltResponse], - next_func: Optional[Callable[[], None]] = None, - this_func: Optional[Callable] = None, - error: Optional[Exception] = None, - next_keys_required: bool = True) -> Dict[str, Any] -``` diff --git a/docs/english/reference/kwargs_injection/index.md b/docs/english/reference/kwargs_injection/index.md index 84f3c123e..9b8e333da 100644 --- a/docs/english/reference/kwargs_injection/index.md +++ b/docs/english/reference/kwargs_injection/index.md @@ -8,17 +8,10 @@ For middleware/listener arguments, Bolt does flexible data injection in accordan To learn the available arguments, check `slack_bolt.kwargs_injection.args`'s API document. For steps from apps, checking `slack_bolt.workflows.step.utilities` as well should be helpful. -## Submodules - -- [slack_bolt.kwargs_injection.args](/tools/bolt-python/reference/kwargs_injection/args) -- [slack_bolt.kwargs_injection.async_args](/tools/bolt-python/reference/kwargs_injection/async_args) -- [slack_bolt.kwargs_injection.async_utils](/tools/bolt-python/reference/kwargs_injection/async_utils) -- [slack_bolt.kwargs_injection.utils](/tools/bolt-python/reference/kwargs_injection/utils) - -## Args Objects +## `Args` ```python -class Args() +Args(*, logger, client, req, resp, context, body, payload, options=None, shortcut=None, action=None, view=None, command=None, event=None, message=None, ack, say, respond, complete, fail, set_status=None, set_title=None, set_suggested_prompts=None, get_thread_context=None, save_thread_context=None, say_stream=None, next, **kwargs) ``` All the arguments in this class are available in any middleware / listeners. @@ -53,168 +46,241 @@ def handle_buttons(args): ) ``` +### `ack` -#### client: `WebClient` +```python +ack: Ack = ack +``` -`slack_sdk.web.WebClient` instance with a valid token +`ack()` utility function, which returns acknowledgement to the Slack servers -#### logger: `logging.Logger` +### `action` -Logger instance +```python +action: Optional[Dict[str, Any]] = action +``` -#### req: `BoltRequest` +An alias for payload in an `@app.action` listener -Incoming request from Slack +### `body` -#### resp: `BoltResponse` +```python +body: Dict[str, Any] = body +``` -Response representation +Parsed request body data -#### request: `BoltRequest` +### `client` -Incoming request from Slack +```python +client: WebClient = client +``` -#### response: `BoltResponse` +`slack_sdk.web.WebClient` instance with a valid token -Response representation +### `command` -#### context: `BoltContext` +```python +command: Optional[Dict[str, Any]] = command +``` -Context data associated with the incoming request +An alias for payload in an `@app.command` listener -#### body: `Dict[str, Any]` +### `complete` -Parsed request body data +```python +complete: Complete = complete +``` -#### payload: `Dict[str, Any]` +`complete()` utility function, signals a successful completion of the custom function -The unwrapped core data in the request body +### `context` -#### options: `Optional[Dict[str, Any]]` +```python +context: BoltContext = context +``` -An alias for payload in an `@app.options` listener +Context data associated with the incoming request -#### shortcut: `Optional[Dict[str, Any]]` +### `event` -An alias for payload in an `@app.shortcut` listener +```python +event: Optional[Dict[str, Any]] = event +``` -#### action: `Optional[Dict[str, Any]]` +An alias for payload in an `@app.event` listener -An alias for payload in an `@app.action` listener +### `fail` -#### view: `Optional[Dict[str, Any]]` +```python +fail: Fail = fail +``` -An alias for payload in an `@app.view` listener +`fail()` utility function, signal that the custom function failed to complete -#### command: `Optional[Dict[str, Any]]` +### `get_thread_context` -An alias for payload in an `@app.command` listener +```python +get_thread_context: Optional[GetThreadContext] = get_thread_context +``` -#### event: `Optional[Dict[str, Any]]` +`get_thread_context()` utility function for AI Agents & Assistants -An alias for payload in an `@app.event` listener +### `logger` + +```python +logger: logging.Logger = logger +``` + +Logger instance -#### message: `Optional[Dict[str, Any]]` +### `message` + +```python +message: Optional[Dict[str, Any]] = message +``` An alias for payload in an `@app.message` listener -#### ack: `Ack` +### `next` -`ack()` utility function, which returns acknowledgement to the Slack servers +```python +next: Callable[[], None] = next +``` + +`next()` utility function, which tells the middleware chain that it can continue with the next one -#### say: `Say` +### `next_` -`say()` utility function, which calls `chat.postMessage` API with the associated channel ID +```python +next_: Callable[[], None] = next +``` -#### respond: `Respond` +An alias of `next()` for avoiding the Python built-in method overrides in middleware functions -`respond()` utility function, which utilizes the associated `response_url` +### `options` -#### complete: `Complete` +```python +options: Optional[Dict[str, Any]] = options +``` -`complete()` utility function, signals a successful completion of the custom function +An alias for payload in an `@app.options` listener -#### fail: `Fail` +### `payload` -`fail()` utility function, signal that the custom function failed to complete +```python +payload: Dict[str, Any] = payload +``` -#### set\_status: `Optional[SetStatus]` +The unwrapped core data in the request body -`set_status()` utility function for AI Agents & Assistants +### `req` -#### set\_title: `Optional[SetTitle]` +```python +req: BoltRequest = req +``` -`set_title()` utility function for AI Agents & Assistants +Incoming request from Slack -#### set\_suggested\_prompts: `Optional[SetSuggestedPrompts]` +### `request` -`set_suggested_prompts()` utility function for AI Agents & Assistants +```python +request: BoltRequest = req +``` -#### get\_thread\_context: `Optional[GetThreadContext]` +Incoming request from Slack -`get_thread_context()` utility function for AI Agents & Assistants +### `resp` + +```python +resp: BoltResponse = resp +``` + +Response representation + +### `respond` -#### save\_thread\_context: `Optional[SaveThreadContext]` +```python +respond: Respond = respond +``` + +`respond()` utility function, which utilizes the associated `response_url` + +### `response` + +```python +response: BoltResponse = resp +``` + +Response representation + +### `save_thread_context` + +```python +save_thread_context: Optional[SaveThreadContext] = save_thread_context +``` `save_thread_context()` utility function for AI Agents & Assistants -#### say\_stream: `Optional[SayStream]` +### `say` + +```python +say: Say = say +``` + +`say()` utility function, which calls `chat.postMessage` API with the associated channel ID + +### `say_stream` + +```python +say_stream: Optional[SayStream] = say_stream +``` `say_stream()` utility function for conversations, AI Agents & Assistants -#### next: `Callable[[], None]` +### `set_status` -`next()` utility function, which tells the middleware chain that it can continue with the next one +```python +set_status: Optional[SetStatus] = set_status +``` -#### next\_: `Callable[[], None]` +`set_status()` utility function for AI Agents & Assistants -An alias of `next()` for avoiding the Python built-in method overrides in middleware functions +### `set_suggested_prompts` -#### \_\_init\_\_ - -```python -def __init__( - *, - logger: logging.Logger, - client: WebClient, - req: BoltRequest, - resp: BoltResponse, - context: BoltContext, - body: Dict[str, Any], - payload: Dict[str, Any], - options: Optional[Dict[str, Any]] = None, - shortcut: Optional[Dict[str, Any]] = None, - action: Optional[Dict[str, Any]] = None, - view: Optional[Dict[str, Any]] = None, - command: Optional[Dict[str, Any]] = None, - event: Optional[Dict[str, Any]] = None, - message: Optional[Dict[str, Any]] = None, - ack: Ack, - say: Say, - respond: Respond, - complete: Complete, - fail: Fail, - set_status: Optional[SetStatus] = None, - set_title: Optional[SetTitle] = None, - set_suggested_prompts: Optional[SetSuggestedPrompts] = None, - get_thread_context: Optional[GetThreadContext] = None, - save_thread_context: Optional[SaveThreadContext] = None, - say_stream: Optional[SayStream] = None, - next: Callable[[], None], - **kwargs) -``` - -#### build\_required\_kwargs - -```python -def build_required_kwargs( - *, - logger: logging.Logger, - required_arg_names: MutableSequence[str], - request: BoltRequest, - response: Optional[BoltResponse], - next_func: Optional[Callable[[], None]] = None, - this_func: Optional[Callable] = None, - error: Optional[Exception] = None, - next_keys_required: bool = True) -> Dict[str, Any] +```python +set_suggested_prompts: Optional[SetSuggestedPrompts] = set_suggested_prompts ``` + +`set_suggested_prompts()` utility function for AI Agents & Assistants + +### `set_title` + +```python +set_title: Optional[SetTitle] = set_title +``` + +`set_title()` utility function for AI Agents & Assistants + +### `shortcut` + +```python +shortcut: Optional[Dict[str, Any]] = shortcut +``` + +An alias for payload in an `@app.shortcut` listener + +### `view` + +```python +view: Optional[Dict[str, Any]] = view +``` + +An alias for payload in an `@app.view` listener + +## Submodules + +- [slack_bolt.kwargs_injection.args](/tools/bolt-python/reference/kwargs_injection/args) +- [slack_bolt.kwargs_injection.async_args](/tools/bolt-python/reference/kwargs_injection/async_args) +- [slack_bolt.kwargs_injection.async_utils](/tools/bolt-python/reference/kwargs_injection/async_utils) +- [slack_bolt.kwargs_injection.utils](/tools/bolt-python/reference/kwargs_injection/utils) diff --git a/docs/english/reference/kwargs_injection/utils.md b/docs/english/reference/kwargs_injection/utils.md index 359c27274..2e3eb0f09 100644 --- a/docs/english/reference/kwargs_injection/utils.md +++ b/docs/english/reference/kwargs_injection/utils.md @@ -3,17 +3,4 @@ sidebar_label: utils title: slack_bolt.kwargs_injection.utils --- -#### build\_required\_kwargs -```python -def build_required_kwargs( - *, - logger: logging.Logger, - required_arg_names: MutableSequence[str], - request: BoltRequest, - response: Optional[BoltResponse], - next_func: Optional[Callable[[], None]] = None, - this_func: Optional[Callable] = None, - error: Optional[Exception] = None, - next_keys_required: bool = True) -> Dict[str, Any] -``` diff --git a/docs/english/reference/lazy_listener/async_internals.md b/docs/english/reference/lazy_listener/async_internals.md index c3e827f57..c9dbb3ef7 100644 --- a/docs/english/reference/lazy_listener/async_internals.md +++ b/docs/english/reference/lazy_listener/async_internals.md @@ -3,11 +3,4 @@ sidebar_label: async_internals title: slack_bolt.lazy_listener.async_internals --- -#### to\_runnable\_function -```python -async def to_runnable_function( - internal_func: Callable[..., Awaitable[None]], - logger: Logger, - request: AsyncBoltRequest) -``` diff --git a/docs/english/reference/lazy_listener/async_runner.md b/docs/english/reference/lazy_listener/async_runner.md index d0fe904c8..9adfc9620 100644 --- a/docs/english/reference/lazy_listener/async_runner.md +++ b/docs/english/reference/lazy_listener/async_runner.md @@ -3,38 +3,30 @@ sidebar_label: async_runner title: slack_bolt.lazy_listener.async_runner --- -## AsyncLazyListenerRunner Objects +## `AsyncLazyListenerRunner` -```python -class AsyncLazyListenerRunner() -``` - -#### logger: `Logger` - -#### start +### `run` ```python -def start(function: Callable[..., Awaitable[None]], request: AsyncBoltRequest) -> None +run(function, request) ``` -Starts a new lazy listener execution. +Synchronously run the function with a given request data. -**Arguments**: +**Parameters:** -- `function` _Callable[..., Awaitable[None]]_ - The function to run. -- `request` _AsyncBoltRequest_ - The request to pass to the function. The object must be thread-safe. +- **function** (Callable..., [Awaitable[None]]) – The function to run. +- **request** (AsyncBoltRequest) – The request to pass to the function. The object must be thread-safe. -#### run +### `start` ```python -async def run( - function: Callable[..., Awaitable[None]], - request: AsyncBoltRequest) -> None +start(function, request) ``` -Synchronously run the function with a given request data. +Starts a new lazy listener execution. -**Arguments**: +**Parameters:** -- `function` _Callable[..., Awaitable[None]]_ - The function to run. -- `request` _AsyncBoltRequest_ - The request to pass to the function. The object must be thread-safe. +- **function** (Callable..., [Awaitable[None]]) – The function to run. +- **request** (AsyncBoltRequest) – The request to pass to the function. The object must be thread-safe. diff --git a/docs/english/reference/lazy_listener/asyncio_runner.md b/docs/english/reference/lazy_listener/asyncio_runner.md index 71f586c56..68fc713e3 100644 --- a/docs/english/reference/lazy_listener/asyncio_runner.md +++ b/docs/english/reference/lazy_listener/asyncio_runner.md @@ -3,22 +3,4 @@ sidebar_label: asyncio_runner title: slack_bolt.lazy_listener.asyncio_runner --- -## AsyncioLazyListenerRunner Objects -```python -class AsyncioLazyListenerRunner(AsyncLazyListenerRunner) -``` - -#### logger: `Logger` - -#### \_\_init\_\_ - -```python -def __init__(logger: Logger) -``` - -#### start - -```python -def start(function: Callable[..., Awaitable[None]], request: AsyncBoltRequest) -> None -``` diff --git a/docs/english/reference/lazy_listener/index.md b/docs/english/reference/lazy_listener/index.md index 16bba61b6..69c0b4856 100644 --- a/docs/english/reference/lazy_listener/index.md +++ b/docs/english/reference/lazy_listener/index.md @@ -28,65 +28,39 @@ app.command("/start-process")( Refer to https://docs.slack.dev/tools/bolt-python/concepts/lazy-listeners for more details. -## Submodules +## `LazyListenerRunner` -- [slack_bolt.lazy_listener.async_internals](/tools/bolt-python/reference/lazy_listener/async_internals) -- [slack_bolt.lazy_listener.async_runner](/tools/bolt-python/reference/lazy_listener/async_runner) -- [slack_bolt.lazy_listener.asyncio_runner](/tools/bolt-python/reference/lazy_listener/asyncio_runner) -- [slack_bolt.lazy_listener.internals](/tools/bolt-python/reference/lazy_listener/internals) -- [slack_bolt.lazy_listener.runner](/tools/bolt-python/reference/lazy_listener/runner) -- [slack_bolt.lazy_listener.thread_runner](/tools/bolt-python/reference/lazy_listener/thread_runner) - -## LazyListenerRunner Objects +### `run` ```python -class LazyListenerRunner() -``` - -#### logger: `Logger` - -#### start - -```python -def start(function: Callable[..., None], request: BoltRequest) -> None -``` - -Starts a new lazy listener execution. - -**Arguments**: - -- `function` _Callable[..., None]_ - The function to run. -- `request` _BoltRequest_ - The request to pass to the function. The object must be thread-safe. - -#### run - -```python -def run(function: Callable[..., None], request: BoltRequest) -> None +run(function, request) ``` Synchronously runs the function with a given request data. -**Arguments**: +**Parameters:** -- `function` _Callable[..., None]_ - The function to run. -- `request` _BoltRequest_ - The request to pass to the function. The object must be thread-safe. +- **function** (Callable[..., None]) – The function to run. +- **request** (BoltRequest) – The request to pass to the function. The object must be thread-safe. -## ThreadLazyListenerRunner Objects +### `start` ```python -class ThreadLazyListenerRunner(LazyListenerRunner) +start(function, request) ``` -#### logger: `Logger` +Starts a new lazy listener execution. -#### \_\_init\_\_ +**Parameters:** -```python -def __init__(logger: Logger, executor: Executor) -``` +- **function** (Callable[..., None]) – The function to run. +- **request** (BoltRequest) – The request to pass to the function. The object must be thread-safe. -#### start +## Submodules -```python -def start(function: Callable[..., None], request: BoltRequest) -> None -``` +- [slack_bolt.lazy_listener.async_internals](/tools/bolt-python/reference/lazy_listener/async_internals) +- [slack_bolt.lazy_listener.async_runner](/tools/bolt-python/reference/lazy_listener/async_runner) +- [slack_bolt.lazy_listener.asyncio_runner](/tools/bolt-python/reference/lazy_listener/asyncio_runner) +- [slack_bolt.lazy_listener.internals](/tools/bolt-python/reference/lazy_listener/internals) +- [slack_bolt.lazy_listener.runner](/tools/bolt-python/reference/lazy_listener/runner) +- [slack_bolt.lazy_listener.thread_runner](/tools/bolt-python/reference/lazy_listener/thread_runner) diff --git a/docs/english/reference/lazy_listener/internals.md b/docs/english/reference/lazy_listener/internals.md index 0c6399765..6fd5a3f05 100644 --- a/docs/english/reference/lazy_listener/internals.md +++ b/docs/english/reference/lazy_listener/internals.md @@ -3,11 +3,4 @@ sidebar_label: internals title: slack_bolt.lazy_listener.internals --- -#### build\_runnable\_function -```python -def build_runnable_function( - func: Callable[..., None], - logger: Logger, - request: BoltRequest) -> Callable[[], None] -``` diff --git a/docs/english/reference/lazy_listener/runner.md b/docs/english/reference/lazy_listener/runner.md index 132251b21..d875dcda2 100644 --- a/docs/english/reference/lazy_listener/runner.md +++ b/docs/english/reference/lazy_listener/runner.md @@ -3,36 +3,30 @@ sidebar_label: runner title: slack_bolt.lazy_listener.runner --- -## LazyListenerRunner Objects +## `LazyListenerRunner` -```python -class LazyListenerRunner() -``` - -#### logger: `Logger` - -#### start +### `run` ```python -def start(function: Callable[..., None], request: BoltRequest) -> None +run(function, request) ``` -Starts a new lazy listener execution. +Synchronously runs the function with a given request data. -**Arguments**: +**Parameters:** -- `function` _Callable[..., None]_ - The function to run. -- `request` _BoltRequest_ - The request to pass to the function. The object must be thread-safe. +- **function** (Callable[..., None]) – The function to run. +- **request** (BoltRequest) – The request to pass to the function. The object must be thread-safe. -#### run +### `start` ```python -def run(function: Callable[..., None], request: BoltRequest) -> None +start(function, request) ``` -Synchronously runs the function with a given request data. +Starts a new lazy listener execution. -**Arguments**: +**Parameters:** -- `function` _Callable[..., None]_ - The function to run. -- `request` _BoltRequest_ - The request to pass to the function. The object must be thread-safe. +- **function** (Callable[..., None]) – The function to run. +- **request** (BoltRequest) – The request to pass to the function. The object must be thread-safe. diff --git a/docs/english/reference/lazy_listener/thread_runner.md b/docs/english/reference/lazy_listener/thread_runner.md index 0b8e2e8af..270c46a0c 100644 --- a/docs/english/reference/lazy_listener/thread_runner.md +++ b/docs/english/reference/lazy_listener/thread_runner.md @@ -3,22 +3,4 @@ sidebar_label: thread_runner title: slack_bolt.lazy_listener.thread_runner --- -## ThreadLazyListenerRunner Objects -```python -class ThreadLazyListenerRunner(LazyListenerRunner) -``` - -#### logger: `Logger` - -#### \_\_init\_\_ - -```python -def __init__(logger: Logger, executor: Executor) -``` - -#### start - -```python -def start(function: Callable[..., None], request: BoltRequest) -> None -``` diff --git a/docs/english/reference/listener/async_builtins.md b/docs/english/reference/listener/async_builtins.md index eae0be0f0..4b650ed13 100644 --- a/docs/english/reference/listener/async_builtins.md +++ b/docs/english/reference/listener/async_builtins.md @@ -3,30 +3,10 @@ sidebar_label: async_builtins title: slack_bolt.listener.async_builtins --- -## AsyncTokenRevocationListeners Objects +## `AsyncTokenRevocationListeners` ```python -class AsyncTokenRevocationListeners() +AsyncTokenRevocationListeners(installation_store) ``` Listener functions to handle token revocation / uninstallation events. - -#### installation\_store: `AsyncInstallationStore` - -#### \_\_init\_\_ - -```python -def __init__(installation_store: AsyncInstallationStore) -``` - -#### handle\_tokens\_revoked\_events - -```python -async def handle_tokens_revoked_events(event: dict, context: AsyncBoltContext) -> None -``` - -#### handle\_app\_uninstalled\_events - -```python -async def handle_app_uninstalled_events(context: AsyncBoltContext) -> None -``` diff --git a/docs/english/reference/listener/async_listener.md b/docs/english/reference/listener/async_listener.md index 3971da968..b0d5f944d 100644 --- a/docs/english/reference/listener/async_listener.md +++ b/docs/english/reference/listener/async_listener.md @@ -3,116 +3,38 @@ sidebar_label: async_listener title: slack_bolt.listener.async_listener --- -## AsyncListener Objects +## `AsyncListener` -```python -class AsyncListener() -``` - -#### matchers: `Sequence[AsyncListenerMatcher]` - -#### middleware: `Sequence[AsyncMiddleware]` - -#### ack\_function: `Callable[..., Awaitable[BoltResponse]]` - -#### lazy\_functions: `Sequence[Callable[..., Awaitable[None]]]` - -#### auto\_acknowledgement: `bool` - -#### ack\_timeout: `int` - -#### async\_matches +### `run_ack_function` ```python -async def async_matches(*, req: AsyncBoltRequest, resp: BoltResponse) -> bool -``` - -#### run\_async\_middleware - -```python -async def run_async_middleware( - *, - req: AsyncBoltRequest, - resp: BoltResponse) -> Tuple[Optional[BoltResponse], bool] -``` - -Runs an async middleware. - -**Arguments**: - -- `req` _AsyncBoltRequest_ - The incoming request -- `resp` _BoltResponse_ - The current response - -**Returns**: - -- `Tuple[Optional[BoltResponse], bool]` - A tuple of the processed response and a flag indicating termination - -#### run\_ack\_function - -```python -async def run_ack_function( - *, - request: AsyncBoltRequest, - response: BoltResponse) -> Optional[BoltResponse] +run_ack_function(*, request, response) ``` Runs all the registered middleware and then run the listener function. -**Arguments**: +**Parameters:** -- `request` _AsyncBoltRequest_ - The incoming request -- `response` _BoltResponse_ - The current response +- **request** (AsyncBoltRequest) – The incoming request +- **response** (BoltResponse) – The current response -**Returns**: +**Returns:** -- `Optional[BoltResponse]` - The processed response +- Optional[BoltResponse] – The processed response -## AsyncCustomListener Objects +### `run_async_middleware` ```python -class AsyncCustomListener(AsyncListener) +run_async_middleware(*, req, resp) ``` -#### app\_name: `str` - -#### ack\_function: `Callable[..., Awaitable[Optional[BoltResponse]]]` - -#### lazy\_functions: `Sequence[Callable[..., Awaitable[None]]]` - -#### matchers: `Sequence[AsyncListenerMatcher]` - -#### middleware: `Sequence[AsyncMiddleware]` - -#### auto\_acknowledgement: `bool` - -#### ack\_timeout: `int` - -#### arg\_names: `MutableSequence[str]` +Runs an async middleware. -#### logger: `Logger` +**Parameters:** -#### \_\_init\_\_ +- **req** (AsyncBoltRequest) – The incoming request +- **resp** (BoltResponse) – The current response -```python -def __init__( - *, - app_name: str, - ack_function: Callable[..., Awaitable[Optional[BoltResponse]]], - lazy_functions: Sequence[Callable[..., Awaitable[None]]], - matchers: Sequence[AsyncListenerMatcher], - middleware: Sequence[AsyncMiddleware], - auto_acknowledgement: bool = False, - ack_timeout: int = 3, - base_logger: Optional[Logger] = None) -``` - -#### run\_ack\_function - -```python -async def run_ack_function( - *, - request: AsyncBoltRequest, - response: BoltResponse) -> Optional[BoltResponse] -``` +**Returns:** -#### builtin\_async\_listener\_classes +- Tuple[Optional[BoltResponse], bool] – A tuple of the processed response and a flag indicating termination diff --git a/docs/english/reference/listener/async_listener_completion_handler.md b/docs/english/reference/listener/async_listener_completion_handler.md index 05c082390..dca94bf2d 100644 --- a/docs/english/reference/listener/async_listener_completion_handler.md +++ b/docs/english/reference/listener/async_listener_completion_handler.md @@ -3,57 +3,17 @@ sidebar_label: async_listener_completion_handler title: slack_bolt.listener.async_listener_completion_handler --- -## AsyncListenerCompletionHandler Objects +## `AsyncListenerCompletionHandler` -```python -class AsyncListenerCompletionHandler() -``` - -#### handle +### `handle` ```python -async def handle(request: AsyncBoltRequest, response: Optional[BoltResponse]) -> None +handle(request, response) ``` Do something extra after the listener execution. -**Arguments**: - -- `request` _AsyncBoltRequest_ - The request. -- `response` _Optional[BoltResponse]_ - The response. - -## AsyncCustomListenerCompletionHandler Objects - -```python -class AsyncCustomListenerCompletionHandler(AsyncListenerCompletionHandler) -``` - -#### \_\_init\_\_ +**Parameters:** -```python -def __init__(logger: Logger, func: Callable[..., Awaitable[None]]) -``` - -#### handle - -```python -async def handle(request: AsyncBoltRequest, response: Optional[BoltResponse]) -> None -``` - -## AsyncDefaultListenerCompletionHandler Objects - -```python -class AsyncDefaultListenerCompletionHandler(AsyncListenerCompletionHandler) -``` - -#### \_\_init\_\_ - -```python -def __init__(logger: Logger) -``` - -#### handle - -```python -async def handle(request: AsyncBoltRequest, response: Optional[BoltResponse]) -``` +- **request** (AsyncBoltRequest) – The request. +- **response** (Optional[BoltResponse]) – The response. diff --git a/docs/english/reference/listener/async_listener_error_handler.md b/docs/english/reference/listener/async_listener_error_handler.md index f42137530..fdf83e21f 100644 --- a/docs/english/reference/listener/async_listener_error_handler.md +++ b/docs/english/reference/listener/async_listener_error_handler.md @@ -3,67 +3,18 @@ sidebar_label: async_listener_error_handler title: slack_bolt.listener.async_listener_error_handler --- -## AsyncListenerErrorHandler Objects +## `AsyncListenerErrorHandler` -```python -class AsyncListenerErrorHandler() -``` - -#### handle +### `handle` ```python -async def handle( - error: Exception, - request: AsyncBoltRequest, - response: Optional[BoltResponse]) -> None +handle(error, request, response) ``` Handles an unhandled exception. -**Arguments**: - -- `error` _Exception_ - The raised exception. -- `request` _AsyncBoltRequest_ - The request. -- `response` _Optional[BoltResponse]_ - The response. - -## AsyncCustomListenerErrorHandler Objects - -```python -class AsyncCustomListenerErrorHandler(AsyncListenerErrorHandler) -``` - -#### \_\_init\_\_ +**Parameters:** -```python -def __init__(logger: Logger, func: Callable[..., Awaitable[Optional[BoltResponse]]]) -``` - -#### handle - -```python -async def handle( - error: Exception, - request: AsyncBoltRequest, - response: Optional[BoltResponse]) -> None -``` - -## AsyncDefaultListenerErrorHandler Objects - -```python -class AsyncDefaultListenerErrorHandler(AsyncListenerErrorHandler) -``` - -#### \_\_init\_\_ - -```python -def __init__(logger: Logger) -``` - -#### handle - -```python -async def handle( - error: Exception, - request: AsyncBoltRequest, - response: Optional[BoltResponse]) -``` +- **error** (Exception) – The raised exception. +- **request** (AsyncBoltRequest) – The request. +- **response** (Optional[BoltResponse]) – The response. diff --git a/docs/english/reference/listener/async_listener_start_handler.md b/docs/english/reference/listener/async_listener_start_handler.md index ffb24f647..10db84904 100644 --- a/docs/english/reference/listener/async_listener_start_handler.md +++ b/docs/english/reference/listener/async_listener_start_handler.md @@ -3,57 +3,17 @@ sidebar_label: async_listener_start_handler title: slack_bolt.listener.async_listener_start_handler --- -## AsyncListenerStartHandler Objects +## `AsyncListenerStartHandler` -```python -class AsyncListenerStartHandler() -``` - -#### handle +### `handle` ```python -async def handle(request: AsyncBoltRequest, response: Optional[BoltResponse]) -> None +handle(request, response) ``` Do something extra before the listener execution. -**Arguments**: - -- `request` _AsyncBoltRequest_ - The request. -- `response` _Optional[BoltResponse]_ - The response. - -## AsyncCustomListenerStartHandler Objects - -```python -class AsyncCustomListenerStartHandler(AsyncListenerStartHandler) -``` - -#### \_\_init\_\_ +**Parameters:** -```python -def __init__(logger: Logger, func: Callable[..., Awaitable[None]]) -``` - -#### handle - -```python -async def handle(request: AsyncBoltRequest, response: Optional[BoltResponse]) -> None -``` - -## AsyncDefaultListenerStartHandler Objects - -```python -class AsyncDefaultListenerStartHandler(AsyncListenerStartHandler) -``` - -#### \_\_init\_\_ - -```python -def __init__(logger: Logger) -``` - -#### handle - -```python -async def handle(request: AsyncBoltRequest, response: Optional[BoltResponse]) -``` +- **request** (AsyncBoltRequest) – The request. +- **response** (Optional[BoltResponse]) – The response. diff --git a/docs/english/reference/listener/asyncio_runner.md b/docs/english/reference/listener/asyncio_runner.md index 4abcd0711..a9eef3846 100644 --- a/docs/english/reference/listener/asyncio_runner.md +++ b/docs/english/reference/listener/asyncio_runner.md @@ -3,43 +3,4 @@ sidebar_label: asyncio_runner title: slack_bolt.listener.asyncio_runner --- -## AsyncioListenerRunner Objects -```python -class AsyncioListenerRunner() -``` - -#### logger: `Logger` - -#### process\_before\_response: `bool` - -#### listener\_error\_handler: `AsyncListenerErrorHandler` - -#### listener\_start\_handler: `AsyncListenerStartHandler` - -#### listener\_completion\_handler: `AsyncListenerCompletionHandler` - -#### lazy\_listener\_runner: `AsyncLazyListenerRunner` - -#### \_\_init\_\_ - -```python -def __init__( - logger: Logger, - process_before_response: bool, - listener_error_handler: AsyncListenerErrorHandler, - listener_start_handler: AsyncListenerStartHandler, - listener_completion_handler: AsyncListenerCompletionHandler, - lazy_listener_runner: AsyncLazyListenerRunner) -``` - -#### run - -```python -async def run( - request: AsyncBoltRequest, - response: BoltResponse, - listener_name: str, - listener: AsyncListener, - starting_time: Optional[float] = None) -> Optional[BoltResponse] -``` diff --git a/docs/english/reference/listener/builtins.md b/docs/english/reference/listener/builtins.md index c7cc38fbf..24ecda593 100644 --- a/docs/english/reference/listener/builtins.md +++ b/docs/english/reference/listener/builtins.md @@ -3,30 +3,10 @@ sidebar_label: builtins title: slack_bolt.listener.builtins --- -## TokenRevocationListeners Objects +## `TokenRevocationListeners` ```python -class TokenRevocationListeners() +TokenRevocationListeners(installation_store) ``` Listener functions to handle token revocation / uninstallation events. - -#### installation\_store: `InstallationStore` - -#### \_\_init\_\_ - -```python -def __init__(installation_store: InstallationStore) -``` - -#### handle\_tokens\_revoked\_events - -```python -def handle_tokens_revoked_events(event: dict, context: BoltContext) -> None -``` - -#### handle\_app\_uninstalled\_events - -```python -def handle_app_uninstalled_events(context: BoltContext) -> None -``` diff --git a/docs/english/reference/listener/custom_listener.md b/docs/english/reference/listener/custom_listener.md index 30504b959..fcce46baf 100644 --- a/docs/english/reference/listener/custom_listener.md +++ b/docs/english/reference/listener/custom_listener.md @@ -3,50 +3,4 @@ sidebar_label: custom_listener title: slack_bolt.listener.custom_listener --- -## CustomListener Objects -```python -class CustomListener(Listener) -``` - -#### app\_name: `str` - -#### ack\_function: `Callable[..., Optional[BoltResponse]]` - -#### lazy\_functions: `Sequence[Callable[..., None]]` - -#### matchers: `Sequence[ListenerMatcher]` - -#### middleware: `Sequence[Middleware]` - -#### auto\_acknowledgement: `bool` - -#### ack\_timeout: `int` - -#### arg\_names: `MutableSequence[str]` - -#### logger: `Logger` - -#### \_\_init\_\_ - -```python -def __init__( - *, - app_name: str, - ack_function: Callable[..., Optional[BoltResponse]], - lazy_functions: Sequence[Callable[..., None]], - matchers: Sequence[ListenerMatcher], - middleware: Sequence[Middleware], - auto_acknowledgement: bool = False, - ack_timeout: int = 3, - base_logger: Optional[Logger] = None) -``` - -#### run\_ack\_function - -```python -def run_ack_function( - *, - request: BoltRequest, - response: BoltResponse) -> Optional[BoltResponse] -``` diff --git a/docs/english/reference/listener/index.md b/docs/english/reference/listener/index.md index 25d77026f..f86522f4b 100644 --- a/docs/english/reference/listener/index.md +++ b/docs/english/reference/listener/index.md @@ -8,132 +8,54 @@ Listeners process incoming requests from Slack. A listener runs when the request's type or data structure matches its predefined conditions. Typically, a listener acknowledges the request, processes its data, and may send a response back to Slack. -## Submodules +## `Listener` -- [slack_bolt.listener.async_builtins](/tools/bolt-python/reference/listener/async_builtins) -- [slack_bolt.listener.async_listener](/tools/bolt-python/reference/listener/async_listener) -- [slack_bolt.listener.async_listener_completion_handler](/tools/bolt-python/reference/listener/async_listener_completion_handler) -- [slack_bolt.listener.async_listener_error_handler](/tools/bolt-python/reference/listener/async_listener_error_handler) -- [slack_bolt.listener.async_listener_start_handler](/tools/bolt-python/reference/listener/async_listener_start_handler) -- [slack_bolt.listener.asyncio_runner](/tools/bolt-python/reference/listener/asyncio_runner) -- [slack_bolt.listener.builtins](/tools/bolt-python/reference/listener/builtins) -- [slack_bolt.listener.custom_listener](/tools/bolt-python/reference/listener/custom_listener) -- [slack_bolt.listener.listener](/tools/bolt-python/reference/listener/listener) -- [slack_bolt.listener.listener_completion_handler](/tools/bolt-python/reference/listener/listener_completion_handler) -- [slack_bolt.listener.listener_error_handler](/tools/bolt-python/reference/listener/listener_error_handler) -- [slack_bolt.listener.listener_start_handler](/tools/bolt-python/reference/listener/listener_start_handler) -- [slack_bolt.listener.thread_runner](/tools/bolt-python/reference/listener/thread_runner) - -## CustomListener Objects +### `run_ack_function` ```python -class CustomListener(Listener) +run_ack_function(*, request, response) ``` -#### app\_name: `str` - -#### ack\_function: `Callable[..., Optional[BoltResponse]]` - -#### lazy\_functions: `Sequence[Callable[..., None]]` - -#### matchers: `Sequence[ListenerMatcher]` - -#### middleware: `Sequence[Middleware]` - -#### auto\_acknowledgement: `bool` - -#### ack\_timeout: `int` - -#### arg\_names: `MutableSequence[str]` - -#### logger: `Logger` - -#### \_\_init\_\_ - -```python -def __init__( - *, - app_name: str, - ack_function: Callable[..., Optional[BoltResponse]], - lazy_functions: Sequence[Callable[..., None]], - matchers: Sequence[ListenerMatcher], - middleware: Sequence[Middleware], - auto_acknowledgement: bool = False, - ack_timeout: int = 3, - base_logger: Optional[Logger] = None) -``` - -#### run\_ack\_function - -```python -def run_ack_function( - *, - request: BoltRequest, - response: BoltResponse) -> Optional[BoltResponse] -``` - -## Listener Objects - -```python -class Listener() -``` - -#### matchers: `Sequence[ListenerMatcher]` - -#### middleware: `Sequence[Middleware]` - -#### ack\_function: `Callable[..., BoltResponse]` - -#### lazy\_functions: `Sequence[Callable[..., None]]` +Runs all the registered middleware and then run the listener function. -#### auto\_acknowledgement: `bool` +**Parameters:** -#### ack\_timeout: `int` +- **request** (BoltRequest) – The incoming request +- **response** (BoltResponse) – The current response -#### matches +**Returns:** -```python -def matches(*, req: BoltRequest, resp: BoltResponse) -> bool -``` +- Optional[BoltResponse] – The processed response -#### run\_middleware +### `run_middleware` ```python -def run_middleware( - *, - req: BoltRequest, - resp: BoltResponse) -> Tuple[Optional[BoltResponse], bool] +run_middleware(*, req, resp) ``` Runs a middleware. -**Arguments**: - -- `req` _BoltRequest_ - The incoming request -- `resp` _BoltResponse_ - The current response - -**Returns**: - -- `Tuple[Optional[BoltResponse], bool]` - A tuple of the processed response and a flag indicating termination - -#### run\_ack\_function - -```python -def run_ack_function( - *, - request: BoltRequest, - response: BoltResponse) -> Optional[BoltResponse] -``` - -Runs all the registered middleware and then run the listener function. +**Parameters:** -**Arguments**: +- **req** (BoltRequest) – The incoming request +- **resp** (BoltResponse) – The current response -- `request` _BoltRequest_ - The incoming request -- `response` _BoltResponse_ - The current response +**Returns:** -**Returns**: +- Tuple[Optional[BoltResponse], bool] – A tuple of the processed response and a flag indicating termination -- `Optional[BoltResponse]` - The processed response +## Submodules -#### builtin\_listener\_classes +- [slack_bolt.listener.async_builtins](/tools/bolt-python/reference/listener/async_builtins) +- [slack_bolt.listener.async_listener](/tools/bolt-python/reference/listener/async_listener) +- [slack_bolt.listener.async_listener_completion_handler](/tools/bolt-python/reference/listener/async_listener_completion_handler) +- [slack_bolt.listener.async_listener_error_handler](/tools/bolt-python/reference/listener/async_listener_error_handler) +- [slack_bolt.listener.async_listener_start_handler](/tools/bolt-python/reference/listener/async_listener_start_handler) +- [slack_bolt.listener.asyncio_runner](/tools/bolt-python/reference/listener/asyncio_runner) +- [slack_bolt.listener.builtins](/tools/bolt-python/reference/listener/builtins) +- [slack_bolt.listener.custom_listener](/tools/bolt-python/reference/listener/custom_listener) +- [slack_bolt.listener.listener](/tools/bolt-python/reference/listener/listener) +- [slack_bolt.listener.listener_completion_handler](/tools/bolt-python/reference/listener/listener_completion_handler) +- [slack_bolt.listener.listener_error_handler](/tools/bolt-python/reference/listener/listener_error_handler) +- [slack_bolt.listener.listener_start_handler](/tools/bolt-python/reference/listener/listener_start_handler) +- [slack_bolt.listener.thread_runner](/tools/bolt-python/reference/listener/thread_runner) diff --git a/docs/english/reference/listener/listener.md b/docs/english/reference/listener/listener.md index f868d7bf6..1a5a0098f 100644 --- a/docs/english/reference/listener/listener.md +++ b/docs/english/reference/listener/listener.md @@ -4,66 +4,38 @@ title: slack_bolt.listener.listener slug: listener --- -## Listener Objects +## `Listener` -```python -class Listener() -``` - -#### matchers: `Sequence[ListenerMatcher]` - -#### middleware: `Sequence[Middleware]` - -#### ack\_function: `Callable[..., BoltResponse]` - -#### lazy\_functions: `Sequence[Callable[..., None]]` - -#### auto\_acknowledgement: `bool` - -#### ack\_timeout: `int` - -#### matches +### `run_ack_function` ```python -def matches(*, req: BoltRequest, resp: BoltResponse) -> bool +run_ack_function(*, request, response) ``` -#### run\_middleware - -```python -def run_middleware( - *, - req: BoltRequest, - resp: BoltResponse) -> Tuple[Optional[BoltResponse], bool] -``` - -Runs a middleware. +Runs all the registered middleware and then run the listener function. -**Arguments**: +**Parameters:** -- `req` _BoltRequest_ - The incoming request -- `resp` _BoltResponse_ - The current response +- **request** (BoltRequest) – The incoming request +- **response** (BoltResponse) – The current response -**Returns**: +**Returns:** -- `Tuple[Optional[BoltResponse], bool]` - A tuple of the processed response and a flag indicating termination +- Optional[BoltResponse] – The processed response -#### run\_ack\_function +### `run_middleware` ```python -def run_ack_function( - *, - request: BoltRequest, - response: BoltResponse) -> Optional[BoltResponse] +run_middleware(*, req, resp) ``` -Runs all the registered middleware and then run the listener function. +Runs a middleware. -**Arguments**: +**Parameters:** -- `request` _BoltRequest_ - The incoming request -- `response` _BoltResponse_ - The current response +- **req** (BoltRequest) – The incoming request +- **resp** (BoltResponse) – The current response -**Returns**: +**Returns:** -- `Optional[BoltResponse]` - The processed response +- Tuple[Optional[BoltResponse], bool] – A tuple of the processed response and a flag indicating termination diff --git a/docs/english/reference/listener/listener_completion_handler.md b/docs/english/reference/listener/listener_completion_handler.md index 3730de7e7..adb3af8ce 100644 --- a/docs/english/reference/listener/listener_completion_handler.md +++ b/docs/english/reference/listener/listener_completion_handler.md @@ -3,57 +3,17 @@ sidebar_label: listener_completion_handler title: slack_bolt.listener.listener_completion_handler --- -## ListenerCompletionHandler Objects +## `ListenerCompletionHandler` -```python -class ListenerCompletionHandler() -``` - -#### handle +### `handle` ```python -def handle(request: BoltRequest, response: Optional[BoltResponse]) -> None +handle(request, response) ``` Do something extra after the listener execution. -**Arguments**: - -- `request` _BoltRequest_ - The request. -- `response` _Optional[BoltResponse]_ - The response. - -## CustomListenerCompletionHandler Objects - -```python -class CustomListenerCompletionHandler(ListenerCompletionHandler) -``` - -#### \_\_init\_\_ +**Parameters:** -```python -def __init__(logger: Logger, func: Callable[..., None]) -``` - -#### handle - -```python -def handle(request: BoltRequest, response: Optional[BoltResponse]) -``` - -## DefaultListenerCompletionHandler Objects - -```python -class DefaultListenerCompletionHandler(ListenerCompletionHandler) -``` - -#### \_\_init\_\_ - -```python -def __init__(logger: Logger) -``` - -#### handle - -```python -def handle(request: BoltRequest, response: Optional[BoltResponse]) -``` +- **request** (BoltRequest) – The request. +- **response** (Optional[BoltResponse]) – The response. diff --git a/docs/english/reference/listener/listener_error_handler.md b/docs/english/reference/listener/listener_error_handler.md index 1f846b1f0..a2e9228aa 100644 --- a/docs/english/reference/listener/listener_error_handler.md +++ b/docs/english/reference/listener/listener_error_handler.md @@ -3,61 +3,18 @@ sidebar_label: listener_error_handler title: slack_bolt.listener.listener_error_handler --- -## ListenerErrorHandler Objects +## `ListenerErrorHandler` -```python -class ListenerErrorHandler() -``` - -#### handle +### `handle` ```python -def handle( - error: Exception, - request: BoltRequest, - response: Optional[BoltResponse]) -> None +handle(error, request, response) ``` Handles an unhandled exception. -**Arguments**: - -- `error` _Exception_ - The raised exception. -- `request` _BoltRequest_ - The request. -- `response` _Optional[BoltResponse]_ - The response. - -## CustomListenerErrorHandler Objects - -```python -class CustomListenerErrorHandler(ListenerErrorHandler) -``` - -#### \_\_init\_\_ +**Parameters:** -```python -def __init__(logger: Logger, func: Callable[..., Optional[BoltResponse]]) -``` - -#### handle - -```python -def handle(error: Exception, request: BoltRequest, response: Optional[BoltResponse]) -``` - -## DefaultListenerErrorHandler Objects - -```python -class DefaultListenerErrorHandler(ListenerErrorHandler) -``` - -#### \_\_init\_\_ - -```python -def __init__(logger: Logger) -``` - -#### handle - -```python -def handle(error: Exception, request: BoltRequest, response: Optional[BoltResponse]) -``` +- **error** (Exception) – The raised exception. +- **request** (BoltRequest) – The request. +- **response** (Optional[BoltResponse]) – The response. diff --git a/docs/english/reference/listener/listener_start_handler.md b/docs/english/reference/listener/listener_start_handler.md index fc4844fca..9ee7af9b3 100644 --- a/docs/english/reference/listener/listener_start_handler.md +++ b/docs/english/reference/listener/listener_start_handler.md @@ -3,16 +3,12 @@ sidebar_label: listener_start_handler title: slack_bolt.listener.listener_start_handler --- -## ListenerStartHandler Objects +## `ListenerStartHandler` -```python -class ListenerStartHandler() -``` - -#### handle +### `handle` ```python -def handle(request: BoltRequest, response: Optional[BoltResponse]) -> None +handle(request, response) ``` Do something extra before the listener execution. @@ -21,43 +17,7 @@ This handler is useful if a developer needs to maintain/clean up thread-local resources such as Django ORM database connections before a listener execution starts. -**Arguments**: - -- `request` _BoltRequest_ - The request. -- `response` _Optional[BoltResponse]_ - The response. - -## CustomListenerStartHandler Objects - -```python -class CustomListenerStartHandler(ListenerStartHandler) -``` - -#### \_\_init\_\_ +**Parameters:** -```python -def __init__(logger: Logger, func: Callable[..., None]) -``` - -#### handle - -```python -def handle(request: BoltRequest, response: Optional[BoltResponse]) -``` - -## DefaultListenerStartHandler Objects - -```python -class DefaultListenerStartHandler(ListenerStartHandler) -``` - -#### \_\_init\_\_ - -```python -def __init__(logger: Logger) -``` - -#### handle - -```python -def handle(request: BoltRequest, response: Optional[BoltResponse]) -``` +- **request** (BoltRequest) – The request. +- **response** (Optional[BoltResponse]) – The response. diff --git a/docs/english/reference/listener/thread_runner.md b/docs/english/reference/listener/thread_runner.md index 105f81260..6d708591f 100644 --- a/docs/english/reference/listener/thread_runner.md +++ b/docs/english/reference/listener/thread_runner.md @@ -3,46 +3,4 @@ sidebar_label: thread_runner title: slack_bolt.listener.thread_runner --- -## ThreadListenerRunner Objects -```python -class ThreadListenerRunner() -``` - -#### logger: `Logger` - -#### process\_before\_response: `bool` - -#### listener\_error\_handler: `ListenerErrorHandler` - -#### listener\_start\_handler: `ListenerStartHandler` - -#### listener\_completion\_handler: `ListenerCompletionHandler` - -#### listener\_executor: `Executor` - -#### lazy\_listener\_runner: `LazyListenerRunner` - -#### \_\_init\_\_ - -```python -def __init__( - logger: Logger, - process_before_response: bool, - listener_error_handler: ListenerErrorHandler, - listener_start_handler: ListenerStartHandler, - listener_completion_handler: ListenerCompletionHandler, - listener_executor: Executor, - lazy_listener_runner: LazyListenerRunner) -``` - -#### run - -```python -def run( - request: BoltRequest, - response: BoltResponse, - listener_name: str, - listener: Listener, - starting_time: Optional[float] = None) -> Optional[BoltResponse] -``` diff --git a/docs/english/reference/listener_matcher/async_builtins.md b/docs/english/reference/listener_matcher/async_builtins.md index 0f1c9d444..9cd4d4180 100644 --- a/docs/english/reference/listener_matcher/async_builtins.md +++ b/docs/english/reference/listener_matcher/async_builtins.md @@ -3,14 +3,4 @@ sidebar_label: async_builtins title: slack_bolt.listener_matcher.async_builtins --- -## AsyncBuiltinListenerMatcher Objects -```python -class AsyncBuiltinListenerMatcher(BuiltinListenerMatcher, AsyncListenerMatcher) -``` - -#### async\_matches - -```python -async def async_matches(req: AsyncBoltRequest, resp: BoltResponse) -> bool -``` diff --git a/docs/english/reference/listener_matcher/async_listener_matcher.md b/docs/english/reference/listener_matcher/async_listener_matcher.md index 9dab3172a..48135cefc 100644 --- a/docs/english/reference/listener_matcher/async_listener_matcher.md +++ b/docs/english/reference/listener_matcher/async_listener_matcher.md @@ -3,57 +3,21 @@ sidebar_label: async_listener_matcher title: slack_bolt.listener_matcher.async_listener_matcher --- -## AsyncListenerMatcher Objects +## `AsyncListenerMatcher` -```python -class AsyncListenerMatcher() -``` - -#### async\_matches +### `async_matches` ```python -async def async_matches(req: AsyncBoltRequest, resp: BoltResponse) -> bool +async_matches(req, resp) ``` Matches against the request and returns True if matched. -**Arguments**: - -- `req` _AsyncBoltRequest_ - The request -- `resp` _BoltResponse_ - The response - -**Returns**: - -- `bool` - True if matched - -## AsyncCustomListenerMatcher Objects - -```python -class AsyncCustomListenerMatcher(AsyncListenerMatcher) -``` - -#### app\_name: `str` - -#### func: `Callable[..., Awaitable[bool]]` - -#### arg\_names: `Sequence[str]` - -#### logger: `Logger` - -#### \_\_init\_\_ +**Parameters:** -```python -def __init__( - *, - app_name: str, - func: Callable[..., Awaitable[bool]], - base_logger: Optional[Logger] = None) -``` - -#### async\_matches +- **req** (AsyncBoltRequest) – The request +- **resp** (BoltResponse) – The response -```python -async def async_matches(req: AsyncBoltRequest, resp: BoltResponse) -> bool -``` +**Returns:** -#### builtin\_async\_listener\_matcher\_classes +- bool – True if matched diff --git a/docs/english/reference/listener_matcher/builtins.md b/docs/english/reference/listener_matcher/builtins.md index 571b4476f..c4006c432 100644 --- a/docs/english/reference/listener_matcher/builtins.md +++ b/docs/english/reference/listener_matcher/builtins.md @@ -3,222 +3,4 @@ sidebar_label: builtins title: slack_bolt.listener_matcher.builtins --- -## BuiltinListenerMatcher Objects -```python -class BuiltinListenerMatcher(ListenerMatcher) -``` - -#### \_\_init\_\_ - -```python -def __init__( - *, - func: Callable[..., Union[bool, Awaitable[bool]]], - base_logger: Optional[Logger] = None) -``` - -#### matches - -```python -def matches(req: BoltRequest, resp: BoltResponse) -> bool -``` - -#### build\_listener\_matcher - -```python -def build_listener_matcher( - func: Callable[..., bool], - asyncio: bool, - base_logger: Optional[Logger] = None) -> Union[ListenerMatcher, AsyncListenerMatcher] -``` - -#### event - -```python -def event( - constraints: Union[str, Pattern, Dict[str, Optional[Union[str, Sequence[Optional[Union[str, Pattern]]]]]]], - asyncio: bool = False, - base_logger: Optional[Logger] = None) -> Union[ListenerMatcher, AsyncListenerMatcher] -``` - -#### message\_event - -```python -def message_event( - constraints: Dict[str, Optional[Union[str, Sequence[Optional[Union[str, Pattern]]]]]], - keyword: Union[str, Pattern], - asyncio: bool = False, - base_logger: Optional[Logger] = None) -> Union[ListenerMatcher, AsyncListenerMatcher] -``` - -#### function\_executed - -```python -def function_executed( - callback_id: Union[str, Pattern], - asyncio: bool = False, - base_logger: Optional[Logger] = None) -> Union[ListenerMatcher, AsyncListenerMatcher] -``` - -#### workflow\_step\_execute - -```python -def workflow_step_execute( - callback_id: Union[str, Pattern], - asyncio: bool = False, - base_logger: Optional[Logger] = None) -> Union[ListenerMatcher, AsyncListenerMatcher] -``` - -#### command - -```python -def command( - command: Union[str, Pattern], - asyncio: bool = False, - base_logger: Optional[Logger] = None) -> Union[ListenerMatcher, AsyncListenerMatcher] -``` - -#### shortcut - -```python -def shortcut( - constraints: Union[str, Pattern, Dict[str, Union[str, Pattern]]], - asyncio: bool = False, - base_logger: Optional[Logger] = None) -> Union[ListenerMatcher, AsyncListenerMatcher] -``` - -#### global\_shortcut - -```python -def global_shortcut( - callback_id: Union[str, Pattern], - asyncio: bool = False, - base_logger: Optional[Logger] = None) -> Union[ListenerMatcher, AsyncListenerMatcher] -``` - -#### message\_shortcut - -```python -def message_shortcut( - callback_id: Union[str, Pattern], - asyncio: bool = False, - base_logger: Optional[Logger] = None) -> Union[ListenerMatcher, AsyncListenerMatcher] -``` - -#### action - -```python -def action( - constraints: Union[str, Pattern, Dict[str, Union[str, Pattern]]], - asyncio: bool = False, - base_logger: Optional[Logger] = None) -> Union[ListenerMatcher, AsyncListenerMatcher] -``` - -#### block\_action - -```python -def block_action( - constraints: Union[str, Pattern, Dict[str, Union[str, Pattern]]], - asyncio: bool = False, - base_logger: Optional[Logger] = None) -> Union[ListenerMatcher, AsyncListenerMatcher] -``` - -#### attachment\_action - -```python -def attachment_action( - callback_id: Union[str, Pattern], - asyncio: bool = False, - base_logger: Optional[Logger] = None) -> Union[ListenerMatcher, AsyncListenerMatcher] -``` - -#### dialog\_submission - -```python -def dialog_submission( - callback_id: Union[str, Pattern], - asyncio: bool = False, - base_logger: Optional[Logger] = None) -> Union[ListenerMatcher, AsyncListenerMatcher] -``` - -#### dialog\_cancellation - -```python -def dialog_cancellation( - callback_id: Union[str, Pattern], - asyncio: bool = False, - base_logger: Optional[Logger] = None) -> Union[ListenerMatcher, AsyncListenerMatcher] -``` - -#### workflow\_step\_edit - -```python -def workflow_step_edit( - callback_id: Union[str, Pattern], - asyncio: bool = False, - base_logger: Optional[Logger] = None) -> Union[ListenerMatcher, AsyncListenerMatcher] -``` - -#### view - -```python -def view( - constraints: Union[str, Pattern, Dict[str, Union[str, Pattern]]], - asyncio: bool = False, - base_logger: Optional[Logger] = None) -> Union[ListenerMatcher, AsyncListenerMatcher] -``` - -#### view\_submission - -```python -def view_submission( - callback_id: Union[str, Pattern], - asyncio: bool = False, - base_logger: Optional[Logger] = None) -> Union[ListenerMatcher, AsyncListenerMatcher] -``` - -#### view\_closed - -```python -def view_closed( - callback_id: Union[str, Pattern], - asyncio: bool = False, - base_logger: Optional[Logger] = None) -> Union[ListenerMatcher, AsyncListenerMatcher] -``` - -#### workflow\_step\_save - -```python -def workflow_step_save( - callback_id: Union[str, Pattern], - asyncio: bool = False, - base_logger: Optional[Logger] = None) -> Union[ListenerMatcher, AsyncListenerMatcher] -``` - -#### options - -```python -def options( - constraints: Union[str, Pattern, Dict[str, Union[str, Pattern]]], - asyncio: bool = False, - base_logger: Optional[Logger] = None) -> Union[ListenerMatcher, AsyncListenerMatcher] -``` - -#### block\_suggestion - -```python -def block_suggestion( - action_id: Union[str, Pattern], - asyncio: bool = False, - base_logger: Optional[Logger] = None) -> Union[ListenerMatcher, AsyncListenerMatcher] -``` - -#### dialog\_suggestion - -```python -def dialog_suggestion( - callback_id: Union[str, Pattern], - asyncio: bool = False, - base_logger: Optional[Logger] = None) -> Union[ListenerMatcher, AsyncListenerMatcher] -``` diff --git a/docs/english/reference/listener_matcher/custom_listener_matcher.md b/docs/english/reference/listener_matcher/custom_listener_matcher.md index 1b38b6460..7a984d0fa 100644 --- a/docs/english/reference/listener_matcher/custom_listener_matcher.md +++ b/docs/english/reference/listener_matcher/custom_listener_matcher.md @@ -3,32 +3,4 @@ sidebar_label: custom_listener_matcher title: slack_bolt.listener_matcher.custom_listener_matcher --- -## CustomListenerMatcher Objects -```python -class CustomListenerMatcher(ListenerMatcher) -``` - -#### app\_name: `str` - -#### func: `Callable[..., bool]` - -#### arg\_names: `MutableSequence[str]` - -#### logger: `Logger` - -#### \_\_init\_\_ - -```python -def __init__( - *, - app_name: str, - func: Callable[..., bool], - base_logger: Optional[Logger] = None) -``` - -#### matches - -```python -def matches(req: BoltRequest, resp: BoltResponse) -> bool -``` diff --git a/docs/english/reference/listener_matcher/index.md b/docs/english/reference/listener_matcher/index.md index f24f19b70..0ce5056d2 100644 --- a/docs/english/reference/listener_matcher/index.md +++ b/docs/english/reference/listener_matcher/index.md @@ -8,65 +8,29 @@ A listener matcher is a simplified version of listener middleware. A listener matcher function returns bool value instead of `next()` method invocation inside. This interface enables developers to utilize simple predicate functions for additional listener conditions. -## Submodules - -- [slack_bolt.listener_matcher.async_builtins](/tools/bolt-python/reference/listener_matcher/async_builtins) -- [slack_bolt.listener_matcher.async_listener_matcher](/tools/bolt-python/reference/listener_matcher/async_listener_matcher) -- [slack_bolt.listener_matcher.builtins](/tools/bolt-python/reference/listener_matcher/builtins) -- [slack_bolt.listener_matcher.custom_listener_matcher](/tools/bolt-python/reference/listener_matcher/custom_listener_matcher) -- [slack_bolt.listener_matcher.listener_matcher](/tools/bolt-python/reference/listener_matcher/listener_matcher) - -## CustomListenerMatcher Objects - -```python -class CustomListenerMatcher(ListenerMatcher) -``` - -#### app\_name: `str` - -#### func: `Callable[..., bool]` - -#### arg\_names: `MutableSequence[str]` - -#### logger: `Logger` - -#### \_\_init\_\_ - -```python -def __init__( - *, - app_name: str, - func: Callable[..., bool], - base_logger: Optional[Logger] = None) -``` +## `ListenerMatcher` -#### matches +### `matches` ```python -def matches(req: BoltRequest, resp: BoltResponse) -> bool -``` - -## ListenerMatcher Objects - -```python -class ListenerMatcher() -``` - -#### matches - -```python -def matches(req: BoltRequest, resp: BoltResponse) -> bool +matches(req, resp) ``` Matches against the request and returns True if matched. -**Arguments**: +**Parameters:** + +- **req** (BoltRequest) – The request +- **resp** (BoltResponse) – The response -- `req` _BoltRequest_ - The request -- `resp` _BoltResponse_ - The response +**Returns:** -**Returns**: +- bool – True if matched. -- `bool` - True if matched. +## Submodules -#### builtin\_listener\_matcher\_classes +- [slack_bolt.listener_matcher.async_builtins](/tools/bolt-python/reference/listener_matcher/async_builtins) +- [slack_bolt.listener_matcher.async_listener_matcher](/tools/bolt-python/reference/listener_matcher/async_listener_matcher) +- [slack_bolt.listener_matcher.builtins](/tools/bolt-python/reference/listener_matcher/builtins) +- [slack_bolt.listener_matcher.custom_listener_matcher](/tools/bolt-python/reference/listener_matcher/custom_listener_matcher) +- [slack_bolt.listener_matcher.listener_matcher](/tools/bolt-python/reference/listener_matcher/listener_matcher) diff --git a/docs/english/reference/listener_matcher/listener_matcher.md b/docs/english/reference/listener_matcher/listener_matcher.md index 5827a6b03..6e7c48358 100644 --- a/docs/english/reference/listener_matcher/listener_matcher.md +++ b/docs/english/reference/listener_matcher/listener_matcher.md @@ -4,25 +4,21 @@ title: slack_bolt.listener_matcher.listener_matcher slug: listener_matcher --- -## ListenerMatcher Objects +## `ListenerMatcher` -```python -class ListenerMatcher() -``` - -#### matches +### `matches` ```python -def matches(req: BoltRequest, resp: BoltResponse) -> bool +matches(req, resp) ``` Matches against the request and returns True if matched. -**Arguments**: +**Parameters:** -- `req` _BoltRequest_ - The request -- `resp` _BoltResponse_ - The response +- **req** (BoltRequest) – The request +- **resp** (BoltResponse) – The response -**Returns**: +**Returns:** -- `bool` - True if matched. +- bool – True if matched. diff --git a/docs/english/reference/logger/index.md b/docs/english/reference/logger/index.md index c1d106177..cd19a2a81 100644 --- a/docs/english/reference/logger/index.md +++ b/docs/english/reference/logger/index.md @@ -8,18 +8,3 @@ Bolt for Python relies on the standard `logging` module. ## Submodules - [slack_bolt.logger.messages](/tools/bolt-python/reference/logger/messages) - -#### get\_bolt\_logger - -```python -def get_bolt_logger(cls: Any, base_logger: Optional[Logger] = None) -> Logger -``` - -#### get\_bolt\_app\_logger - -```python -def get_bolt_app_logger( - app_name: str, - cls: object = None, - base_logger: Optional[Logger] = None) -> Logger -``` diff --git a/docs/english/reference/logger/messages.md b/docs/english/reference/logger/messages.md index 367dc6c3a..2b8b4e613 100644 --- a/docs/english/reference/logger/messages.md +++ b/docs/english/reference/logger/messages.md @@ -3,178 +3,4 @@ sidebar_label: messages title: slack_bolt.logger.messages --- -#### error\_client\_invalid\_type -```python -def error_client_invalid_type() -> str -``` - -#### error\_client\_invalid\_type\_async - -```python -def error_client_invalid_type_async() -> str -``` - -#### error\_oauth\_flow\_invalid\_type\_async - -```python -def error_oauth_flow_invalid_type_async() -> str -``` - -#### error\_oauth\_settings\_invalid\_type\_async - -```python -def error_oauth_settings_invalid_type_async() -> str -``` - -#### error\_auth\_test\_failure - -```python -def error_auth_test_failure(error_response: SlackResponse) -> str -``` - -#### error\_token\_required - -```python -def error_token_required() -> str -``` - -#### error\_unexpected\_listener\_middleware - -```python -def error_unexpected_listener_middleware(middleware_type) -> str -``` - -#### error\_listener\_function\_must\_be\_coro\_func - -```python -def error_listener_function_must_be_coro_func(func_name: str) -> str -``` - -#### error\_authorize\_conflicts - -```python -def error_authorize_conflicts() -> str -``` - -#### error\_message\_event\_type - -```python -def error_message_event_type(event_type: Union[str, Pattern]) -> str -``` - -#### error\_installation\_store\_required\_for\_builtin\_listeners - -```python -def error_installation_store_required_for_builtin_listeners() -> str -``` - -#### error\_oauth\_flow\_or\_authorize\_required - -```python -def error_oauth_flow_or_authorize_required() -> str -``` - -#### warning\_client\_prioritized\_and\_token\_skipped - -```python -def warning_client_prioritized_and_token_skipped() -> str -``` - -#### warning\_token\_skipped - -```python -def warning_token_skipped() -> str -``` - -#### warning\_installation\_store\_conflicts - -```python -def warning_installation_store_conflicts() -> str -``` - -#### warning\_unhandled\_by\_global\_middleware - -```python -def warning_unhandled_by_global_middleware( - name: str, - req: Union[BoltRequest, AsyncBoltRequest]) -> str -``` - -#### warning\_unhandled\_request - -```python -def warning_unhandled_request(req: Union[BoltRequest, AsyncBoltRequest]) -> str -``` - -#### warning\_did\_not\_call\_ack - -```python -def warning_did_not_call_ack(listener_name: str) -> str -``` - -#### warning\_bot\_only\_conflicts - -```python -def warning_bot_only_conflicts() -> str -``` - -#### warning\_skip\_uncommon\_arg\_name - -```python -def warning_skip_uncommon_arg_name(arg_name: str) -> str -``` - -#### warning\_ack\_timeout\_has\_no\_effect - -```python -def warning_ack_timeout_has_no_effect( - identifier: Union[str, Pattern], - ack_timeout: int) -> str -``` - -#### info\_default\_oauth\_settings\_loaded - -```python -def info_default_oauth_settings_loaded() -> str -``` - -#### debug\_applying\_middleware - -```python -def debug_applying_middleware(middleware_name: str) -> str -``` - -#### debug\_checking\_listener - -```python -def debug_checking_listener(listener_name: str) -> str -``` - -#### debug\_running\_listener - -```python -def debug_running_listener(listener_name: str) -> str -``` - -#### debug\_running\_lazy\_listener - -```python -def debug_running_lazy_listener(func_name: str) -> str -``` - -#### debug\_responding - -```python -def debug_responding(status: int, body: str, millis: int) -> str -``` - -#### debug\_return\_listener\_middleware\_response - -```python -def debug_return_listener_middleware_response( - listener_name: str, - status: int, - body: str, - starting_time: float) -> str -``` diff --git a/docs/english/reference/middleware/assistant/assistant.md b/docs/english/reference/middleware/assistant/assistant.md index 0d67911e2..a07b2130f 100644 --- a/docs/english/reference/middleware/assistant/assistant.md +++ b/docs/english/reference/middleware/assistant/assistant.md @@ -4,90 +4,4 @@ title: slack_bolt.middleware.assistant.assistant slug: assistant --- -## Assistant Objects -```python -class Assistant(Middleware) -``` - -#### thread\_context\_store: `Optional[AssistantThreadContextStore]` - -#### base\_logger: `Optional[logging.Logger]` - -#### \_\_init\_\_ - -```python -def __init__( - *, - app_name: str = 'assistant', - thread_context_store: Optional[AssistantThreadContextStore] = None, - logger: Optional[logging.Logger] = None) -``` - -#### thread\_started - -```python -def thread_started( - *args, - matchers: Optional[Union[Callable[..., bool], ListenerMatcher]] = None, - middleware: Optional[Union[Callable, Middleware]] = None, - lazy: Optional[List[Callable[..., None]]] = None) -``` - -#### user\_message - -```python -def user_message( - *args, - matchers: Optional[Union[Callable[..., bool], ListenerMatcher]] = None, - middleware: Optional[Union[Callable, Middleware]] = None, - lazy: Optional[List[Callable[..., None]]] = None) -``` - -#### bot\_message - -```python -def bot_message( - *args, - matchers: Optional[Union[Callable[..., bool], ListenerMatcher]] = None, - middleware: Optional[Union[Callable, Middleware]] = None, - lazy: Optional[List[Callable[..., None]]] = None) -``` - -#### thread\_context\_changed - -```python -def thread_context_changed( - *args, - matchers: Optional[Union[Callable[..., bool], ListenerMatcher]] = None, - middleware: Optional[Union[Callable, Middleware]] = None, - lazy: Optional[List[Callable[..., None]]] = None) -``` - -#### default\_thread\_context\_changed - -```python -def default_thread_context_changed( - save_thread_context: SaveThreadContext, - payload: dict) -``` - -#### process - -```python -def process( - *, - req: BoltRequest, - resp: BoltResponse, - next: Callable[[], BoltResponse]) -> Optional[BoltResponse] -``` - -#### build\_listener - -```python -def build_listener( - listener_or_functions: Union[Listener, Callable, List[Callable]], - matchers: Optional[List[Union[ListenerMatcher, Callable[..., bool]]]] = None, - middleware: Optional[List[Middleware]] = None, - base_logger: Optional[Logger] = None) -> Listener -``` diff --git a/docs/english/reference/middleware/assistant/async_assistant.md b/docs/english/reference/middleware/assistant/async_assistant.md index 1b4fa1f8e..bce338e64 100644 --- a/docs/english/reference/middleware/assistant/async_assistant.md +++ b/docs/english/reference/middleware/assistant/async_assistant.md @@ -3,90 +3,4 @@ sidebar_label: async_assistant title: slack_bolt.middleware.assistant.async_assistant --- -## AsyncAssistant Objects -```python -class AsyncAssistant(AsyncMiddleware) -``` - -#### thread\_context\_store: `Optional[AsyncAssistantThreadContextStore]` - -#### base\_logger: `Optional[logging.Logger]` - -#### \_\_init\_\_ - -```python -def __init__( - *, - app_name: str = 'assistant', - thread_context_store: Optional[AsyncAssistantThreadContextStore] = None, - logger: Optional[logging.Logger] = None) -``` - -#### thread\_started - -```python -def thread_started( - *args, - matchers: Optional[Union[Callable[..., bool], AsyncListenerMatcher]] = None, - middleware: Optional[Union[Callable, AsyncMiddleware]] = None, - lazy: Optional[List[Callable[..., None]]] = None) -``` - -#### user\_message - -```python -def user_message( - *args, - matchers: Optional[Union[Callable[..., bool], AsyncListenerMatcher]] = None, - middleware: Optional[Union[Callable, AsyncMiddleware]] = None, - lazy: Optional[List[Callable[..., None]]] = None) -``` - -#### bot\_message - -```python -def bot_message( - *args, - matchers: Optional[Union[Callable[..., bool], AsyncListenerMatcher]] = None, - middleware: Optional[Union[Callable, AsyncMiddleware]] = None, - lazy: Optional[List[Callable[..., None]]] = None) -``` - -#### thread\_context\_changed - -```python -def thread_context_changed( - *args, - matchers: Optional[Union[Callable[..., bool], AsyncListenerMatcher]] = None, - middleware: Optional[Union[Callable, AsyncMiddleware]] = None, - lazy: Optional[List[Callable[..., None]]] = None) -``` - -#### default\_thread\_context\_changed - -```python -async def default_thread_context_changed( - save_thread_context: AsyncSaveThreadContext, - payload: dict) -``` - -#### async\_process - -```python -async def async_process( - *, - req: AsyncBoltRequest, - resp: BoltResponse, - next: Callable[[], Awaitable[BoltResponse]]) -> Optional[BoltResponse] -``` - -#### build\_listener - -```python -def build_listener( - listener_or_functions: Union[AsyncListener, Callable, List[Callable]], - matchers: Optional[List[Union[AsyncListenerMatcher, Callable[..., Awaitable[bool]]]]] = None, - middleware: Optional[List[AsyncMiddleware]] = None, - base_logger: Optional[Logger] = None) -> AsyncListener -``` diff --git a/docs/english/reference/middleware/assistant/index.md b/docs/english/reference/middleware/assistant/index.md index 5d94bc94f..eebd4f0ca 100644 --- a/docs/english/reference/middleware/assistant/index.md +++ b/docs/english/reference/middleware/assistant/index.md @@ -7,91 +7,3 @@ title: slack_bolt.middleware.assistant - [slack_bolt.middleware.assistant.assistant](/tools/bolt-python/reference/middleware/assistant/assistant) - [slack_bolt.middleware.assistant.async_assistant](/tools/bolt-python/reference/middleware/assistant/async_assistant) - -## Assistant Objects - -```python -class Assistant(Middleware) -``` - -#### thread\_context\_store: `Optional[AssistantThreadContextStore]` - -#### base\_logger: `Optional[logging.Logger]` - -#### \_\_init\_\_ - -```python -def __init__( - *, - app_name: str = 'assistant', - thread_context_store: Optional[AssistantThreadContextStore] = None, - logger: Optional[logging.Logger] = None) -``` - -#### thread\_started - -```python -def thread_started( - *args, - matchers: Optional[Union[Callable[..., bool], ListenerMatcher]] = None, - middleware: Optional[Union[Callable, Middleware]] = None, - lazy: Optional[List[Callable[..., None]]] = None) -``` - -#### user\_message - -```python -def user_message( - *args, - matchers: Optional[Union[Callable[..., bool], ListenerMatcher]] = None, - middleware: Optional[Union[Callable, Middleware]] = None, - lazy: Optional[List[Callable[..., None]]] = None) -``` - -#### bot\_message - -```python -def bot_message( - *args, - matchers: Optional[Union[Callable[..., bool], ListenerMatcher]] = None, - middleware: Optional[Union[Callable, Middleware]] = None, - lazy: Optional[List[Callable[..., None]]] = None) -``` - -#### thread\_context\_changed - -```python -def thread_context_changed( - *args, - matchers: Optional[Union[Callable[..., bool], ListenerMatcher]] = None, - middleware: Optional[Union[Callable, Middleware]] = None, - lazy: Optional[List[Callable[..., None]]] = None) -``` - -#### default\_thread\_context\_changed - -```python -def default_thread_context_changed( - save_thread_context: SaveThreadContext, - payload: dict) -``` - -#### process - -```python -def process( - *, - req: BoltRequest, - resp: BoltResponse, - next: Callable[[], BoltResponse]) -> Optional[BoltResponse] -``` - -#### build\_listener - -```python -def build_listener( - listener_or_functions: Union[Listener, Callable, List[Callable]], - matchers: Optional[List[Union[ListenerMatcher, Callable[..., bool]]]] = None, - middleware: Optional[List[Middleware]] = None, - base_logger: Optional[Logger] = None) -> Listener -``` diff --git a/docs/english/reference/middleware/async_builtins.md b/docs/english/reference/middleware/async_builtins.md index 3b512ce7d..43881536a 100644 --- a/docs/english/reference/middleware/async_builtins.md +++ b/docs/english/reference/middleware/async_builtins.md @@ -3,142 +3,38 @@ sidebar_label: async_builtins title: slack_bolt.middleware.async_builtins --- -## AsyncIgnoringSelfEvents Objects +## `AsyncMessageListenerMatches` ```python -class AsyncIgnoringSelfEvents(IgnoringSelfEvents, AsyncMiddleware) +AsyncMessageListenerMatches(keyword) ``` -#### async\_process - -```python -async def async_process( - *, - req: AsyncBoltRequest, - resp: BoltResponse, - next: Callable[[], Awaitable[BoltResponse]]) -> BoltResponse -``` - -## AsyncRequestVerification Objects - -```python -class AsyncRequestVerification(RequestVerification, AsyncMiddleware) -``` - -Verifies an incoming request from Slack. - -Checks the validity of `x-slack-signature`, `x-slack-request-timestamp`, and the request body data. - -Refer to https://docs.slack.dev/authentication/verifying-requests-from-slack/ for details. - -#### async\_process - -```python -async def async_process( - *, - req: AsyncBoltRequest, - resp: BoltResponse, - next: Callable[[], Awaitable[BoltResponse]]) -> BoltResponse -``` - -## AsyncSslCheck Objects - -```python -class AsyncSslCheck(SslCheck, AsyncMiddleware) -``` - -#### async\_process - -```python -async def async_process( - *, - req: AsyncBoltRequest, - resp: BoltResponse, - next: Callable[[], Awaitable[BoltResponse]]) -> BoltResponse -``` - -## AsyncUrlVerification Objects - -```python -class AsyncUrlVerification(UrlVerification, AsyncMiddleware) -``` - -#### \_\_init\_\_ - -```python -def __init__(base_logger: Optional[Logger] = None) -``` - -#### async\_process - -```python -async def async_process( - *, - req: AsyncBoltRequest, - resp: BoltResponse, - next: Callable[[], Awaitable[BoltResponse]]) -> BoltResponse -``` - -## AsyncMessageListenerMatches Objects - -```python -class AsyncMessageListenerMatches(AsyncMiddleware) -``` - -#### \_\_init\_\_ - -```python -def __init__(keyword: Union[str, Pattern]) -``` +Bases: AsyncMiddleware Captures matched keywords and saves the values in context. -#### async\_process +### `name` ```python -async def async_process( - *, - req: AsyncBoltRequest, - resp: BoltResponse, - next: Callable[[], Awaitable[BoltResponse]]) -> BoltResponse +name: str ``` -## AsyncAttachingFunctionToken Objects +The name of this middleware. -```python -class AsyncAttachingFunctionToken(AsyncMiddleware) -``` +## `AsyncRequestVerification` -#### async\_process +Bases: RequestVerification, AsyncMiddleware -```python -async def async_process( - *, - req: AsyncBoltRequest, - resp: BoltResponse, - next: Callable[[], Awaitable[BoltResponse]]) -> BoltResponse -``` - -## AsyncAttachingConversationKwargs Objects +Verifies an incoming request from Slack. -```python -class AsyncAttachingConversationKwargs(AsyncMiddleware) -``` +Checks the validity of `x-slack-signature`, `x-slack-request-timestamp`, and the request body data. -#### thread\_context\_store: `Optional[AsyncAssistantThreadContextStore]` +Refer to https://docs.slack.dev/authentication/verifying-requests-from-slack/ for details. -#### \_\_init\_\_ +### `name` ```python -def __init__(thread_context_store: Optional[AsyncAssistantThreadContextStore] = None) +name: str ``` -#### async\_process - -```python -async def async_process( - *, - req: AsyncBoltRequest, - resp: BoltResponse, - next: Callable[[], Awaitable[BoltResponse]]) -> Optional[BoltResponse] -``` +The name of this middleware. diff --git a/docs/english/reference/middleware/async_custom_middleware.md b/docs/english/reference/middleware/async_custom_middleware.md index 825532aef..4599f78e3 100644 --- a/docs/english/reference/middleware/async_custom_middleware.md +++ b/docs/english/reference/middleware/async_custom_middleware.md @@ -3,43 +3,4 @@ sidebar_label: async_custom_middleware title: slack_bolt.middleware.async_custom_middleware --- -## AsyncCustomMiddleware Objects -```python -class AsyncCustomMiddleware(AsyncMiddleware) -``` - -#### app\_name: `str` - -#### func: `Callable[..., Awaitable[Any]]` - -#### arg\_names: `MutableSequence[str]` - -#### logger: `Logger` - -#### \_\_init\_\_ - -```python -def __init__( - *, - app_name: str, - func: Callable[..., Awaitable[Any]], - base_logger: Optional[Logger] = None) -``` - -#### async\_process - -```python -async def async_process( - *, - req: AsyncBoltRequest, - resp: BoltResponse, - next: Callable[[], Awaitable[BoltResponse]]) -> BoltResponse -``` - -#### name - -```python -@property -def name() -> str -``` diff --git a/docs/english/reference/middleware/async_middleware.md b/docs/english/reference/middleware/async_middleware.md index d4f13b25e..5c199d68e 100644 --- a/docs/english/reference/middleware/async_middleware.md +++ b/docs/english/reference/middleware/async_middleware.md @@ -3,22 +3,14 @@ sidebar_label: async_middleware title: slack_bolt.middleware.async_middleware --- -## AsyncMiddleware Objects - -```python -class AsyncMiddleware() -``` +## `AsyncMiddleware` A middleware can process request data before other middleware and listener functions. -#### async\_process +### `async_process` ```python -async def async_process( - *, - req: AsyncBoltRequest, - resp: BoltResponse, - next: Callable[[], Awaitable[BoltResponse]]) -> Optional[BoltResponse] +async_process(*, req, resp, next) ``` Processes a request data before other middleware and listeners. @@ -42,22 +34,20 @@ async def simple_middleware(req, resp, next_): await next_() ``` +**Parameters:** -**Arguments**: - -- `req` _AsyncBoltRequest_ - The incoming request -- `resp` _BoltResponse_ - The response -- `next` _Callable[[], Awaitable[BoltResponse]]_ - The function to tell the chain that it can continue +- **req** (AsyncBoltRequest) – The incoming request +- **resp** (BoltResponse) – The response +- **next** (Callable[[], Awaitable[BoltResponse]]) – The function to tell the chain that it can continue -**Returns**: +**Returns:** -- `Optional[BoltResponse]` - Processed response (optional) +- Optional[BoltResponse] – Processed response (optional) -#### name +### `name` ```python -@property -def name() -> str +name: str ``` The name of this middleware. diff --git a/docs/english/reference/middleware/async_middleware_error_handler.md b/docs/english/reference/middleware/async_middleware_error_handler.md index acbe7b4e4..4aa03952b 100644 --- a/docs/english/reference/middleware/async_middleware_error_handler.md +++ b/docs/english/reference/middleware/async_middleware_error_handler.md @@ -3,67 +3,18 @@ sidebar_label: async_middleware_error_handler title: slack_bolt.middleware.async_middleware_error_handler --- -## AsyncMiddlewareErrorHandler Objects +## `AsyncMiddlewareErrorHandler` -```python -class AsyncMiddlewareErrorHandler() -``` - -#### handle +### `handle` ```python -async def handle( - error: Exception, - request: AsyncBoltRequest, - response: Optional[BoltResponse]) -> None +handle(error, request, response) ``` Handles an unhandled exception. -**Arguments**: - -- `error` _Exception_ - The raised exception. -- `request` _AsyncBoltRequest_ - The request. -- `response` _Optional[BoltResponse]_ - The response. - -## AsyncCustomMiddlewareErrorHandler Objects - -```python -class AsyncCustomMiddlewareErrorHandler(AsyncMiddlewareErrorHandler) -``` - -#### \_\_init\_\_ +**Parameters:** -```python -def __init__(logger: Logger, func: Callable[..., Awaitable[Optional[BoltResponse]]]) -``` - -#### handle - -```python -async def handle( - error: Exception, - request: AsyncBoltRequest, - response: Optional[BoltResponse]) -> None -``` - -## AsyncDefaultMiddlewareErrorHandler Objects - -```python -class AsyncDefaultMiddlewareErrorHandler(AsyncMiddlewareErrorHandler) -``` - -#### \_\_init\_\_ - -```python -def __init__(logger: Logger) -``` - -#### handle - -```python -async def handle( - error: Exception, - request: AsyncBoltRequest, - response: Optional[BoltResponse]) -``` +- **error** (Exception) – The raised exception. +- **request** (AsyncBoltRequest) – The request. +- **response** (Optional[BoltResponse]) – The response. diff --git a/docs/english/reference/middleware/attaching_conversation_kwargs/async_attaching_conversation_kwargs.md b/docs/english/reference/middleware/attaching_conversation_kwargs/async_attaching_conversation_kwargs.md index e209ed415..080f9978e 100644 --- a/docs/english/reference/middleware/attaching_conversation_kwargs/async_attaching_conversation_kwargs.md +++ b/docs/english/reference/middleware/attaching_conversation_kwargs/async_attaching_conversation_kwargs.md @@ -3,26 +3,4 @@ sidebar_label: async_attaching_conversation_kwargs title: slack_bolt.middleware.attaching_conversation_kwargs.async_attaching_conversation_kwargs --- -## AsyncAttachingConversationKwargs Objects -```python -class AsyncAttachingConversationKwargs(AsyncMiddleware) -``` - -#### thread\_context\_store: `Optional[AsyncAssistantThreadContextStore]` - -#### \_\_init\_\_ - -```python -def __init__(thread_context_store: Optional[AsyncAssistantThreadContextStore] = None) -``` - -#### async\_process - -```python -async def async_process( - *, - req: AsyncBoltRequest, - resp: BoltResponse, - next: Callable[[], Awaitable[BoltResponse]]) -> Optional[BoltResponse] -``` diff --git a/docs/english/reference/middleware/attaching_conversation_kwargs/attaching_conversation_kwargs.md b/docs/english/reference/middleware/attaching_conversation_kwargs/attaching_conversation_kwargs.md index c3e38e7eb..763150e05 100644 --- a/docs/english/reference/middleware/attaching_conversation_kwargs/attaching_conversation_kwargs.md +++ b/docs/english/reference/middleware/attaching_conversation_kwargs/attaching_conversation_kwargs.md @@ -4,26 +4,4 @@ title: slack_bolt.middleware.attaching_conversation_kwargs.attaching_conversatio slug: attaching_conversation_kwargs --- -## AttachingConversationKwargs Objects -```python -class AttachingConversationKwargs(Middleware) -``` - -#### thread\_context\_store: `Optional[AssistantThreadContextStore]` - -#### \_\_init\_\_ - -```python -def __init__(thread_context_store: Optional[AssistantThreadContextStore] = None) -``` - -#### process - -```python -def process( - *, - req: BoltRequest, - resp: BoltResponse, - next: Callable[[], BoltResponse]) -> Optional[BoltResponse] -``` diff --git a/docs/english/reference/middleware/attaching_conversation_kwargs/index.md b/docs/english/reference/middleware/attaching_conversation_kwargs/index.md index 3fa0850c1..50c1994fe 100644 --- a/docs/english/reference/middleware/attaching_conversation_kwargs/index.md +++ b/docs/english/reference/middleware/attaching_conversation_kwargs/index.md @@ -7,27 +7,3 @@ title: slack_bolt.middleware.attaching_conversation_kwargs - [slack_bolt.middleware.attaching_conversation_kwargs.async_attaching_conversation_kwargs](/tools/bolt-python/reference/middleware/attaching_conversation_kwargs/async_attaching_conversation_kwargs) - [slack_bolt.middleware.attaching_conversation_kwargs.attaching_conversation_kwargs](/tools/bolt-python/reference/middleware/attaching_conversation_kwargs/attaching_conversation_kwargs) - -## AttachingConversationKwargs Objects - -```python -class AttachingConversationKwargs(Middleware) -``` - -#### thread\_context\_store: `Optional[AssistantThreadContextStore]` - -#### \_\_init\_\_ - -```python -def __init__(thread_context_store: Optional[AssistantThreadContextStore] = None) -``` - -#### process - -```python -def process( - *, - req: BoltRequest, - resp: BoltResponse, - next: Callable[[], BoltResponse]) -> Optional[BoltResponse] -``` diff --git a/docs/english/reference/middleware/attaching_function_token/async_attaching_function_token.md b/docs/english/reference/middleware/attaching_function_token/async_attaching_function_token.md index 98f90a3f3..28ddc7f81 100644 --- a/docs/english/reference/middleware/attaching_function_token/async_attaching_function_token.md +++ b/docs/english/reference/middleware/attaching_function_token/async_attaching_function_token.md @@ -3,18 +3,4 @@ sidebar_label: async_attaching_function_token title: slack_bolt.middleware.attaching_function_token.async_attaching_function_token --- -## AsyncAttachingFunctionToken Objects -```python -class AsyncAttachingFunctionToken(AsyncMiddleware) -``` - -#### async\_process - -```python -async def async_process( - *, - req: AsyncBoltRequest, - resp: BoltResponse, - next: Callable[[], Awaitable[BoltResponse]]) -> BoltResponse -``` diff --git a/docs/english/reference/middleware/attaching_function_token/attaching_function_token.md b/docs/english/reference/middleware/attaching_function_token/attaching_function_token.md index 1670e92ae..d65004a85 100644 --- a/docs/english/reference/middleware/attaching_function_token/attaching_function_token.md +++ b/docs/english/reference/middleware/attaching_function_token/attaching_function_token.md @@ -4,18 +4,4 @@ title: slack_bolt.middleware.attaching_function_token.attaching_function_token slug: attaching_function_token --- -## AttachingFunctionToken Objects -```python -class AttachingFunctionToken(Middleware) -``` - -#### process - -```python -def process( - *, - req: BoltRequest, - resp: BoltResponse, - next: Callable[[], BoltResponse]) -> BoltResponse -``` diff --git a/docs/english/reference/middleware/attaching_function_token/index.md b/docs/english/reference/middleware/attaching_function_token/index.md index 48b531ef2..96e2a5a75 100644 --- a/docs/english/reference/middleware/attaching_function_token/index.md +++ b/docs/english/reference/middleware/attaching_function_token/index.md @@ -7,19 +7,3 @@ title: slack_bolt.middleware.attaching_function_token - [slack_bolt.middleware.attaching_function_token.async_attaching_function_token](/tools/bolt-python/reference/middleware/attaching_function_token/async_attaching_function_token) - [slack_bolt.middleware.attaching_function_token.attaching_function_token](/tools/bolt-python/reference/middleware/attaching_function_token/attaching_function_token) - -## AttachingFunctionToken Objects - -```python -class AttachingFunctionToken(Middleware) -``` - -#### process - -```python -def process( - *, - req: BoltRequest, - resp: BoltResponse, - next: Callable[[], BoltResponse]) -> BoltResponse -``` diff --git a/docs/english/reference/middleware/authorization/async_authorization.md b/docs/english/reference/middleware/authorization/async_authorization.md index c583ddedc..f12e00d55 100644 --- a/docs/english/reference/middleware/authorization/async_authorization.md +++ b/docs/english/reference/middleware/authorization/async_authorization.md @@ -3,8 +3,4 @@ sidebar_label: async_authorization title: slack_bolt.middleware.authorization.async_authorization --- -## AsyncAuthorization Objects -```python -class AsyncAuthorization(AsyncMiddleware, ABC) -``` diff --git a/docs/english/reference/middleware/authorization/async_multi_teams_authorization.md b/docs/english/reference/middleware/authorization/async_multi_teams_authorization.md index 4a9bf9c86..40093211f 100644 --- a/docs/english/reference/middleware/authorization/async_multi_teams_authorization.md +++ b/docs/english/reference/middleware/authorization/async_multi_teams_authorization.md @@ -3,41 +3,27 @@ sidebar_label: async_multi_teams_authorization title: slack_bolt.middleware.authorization.async_multi_teams_authorization --- -## AsyncMultiTeamsAuthorization Objects +## `AsyncMultiTeamsAuthorization` ```python -class AsyncMultiTeamsAuthorization(AsyncAuthorization) +AsyncMultiTeamsAuthorization(authorize, base_logger=None, user_token_resolution='authed_user', user_facing_authorize_error_message=None) ``` -#### authorize: `AsyncAuthorize` - -#### user\_token\_resolution: `str` - -#### \_\_init\_\_ - -```python -def __init__( - authorize: AsyncAuthorize, - base_logger: Optional[Logger] = None, - user_token_resolution: str = 'authed_user', - user_facing_authorize_error_message: Optional[str] = None) -``` +Bases: AsyncAuthorization Multi-workspace authorization. -**Arguments**: +**Parameters:** -- `authorize` _AsyncAuthorize_ - The function to authorize incoming requests from Slack. -- `base_logger` _Optional[Logger]_ - The base logger -- `user_token_resolution` _str_ - "authed_user" or "actor" -- `user_facing_authorize_error_message` _Optional[str]_ - The user-facing error message when installation is not found +- **authorize** (AsyncAuthorize) – The function to authorize incoming requests from Slack. +- **base_logger** (Optional[Logger]) – The base logger +- **user_token_resolution** (str) – "authed_user" or "actor" +- **user_facing_authorize_error_message** (Optional[str]) – The user-facing error message when installation is not found -#### async\_process +### `name` ```python -async def async_process( - *, - req: AsyncBoltRequest, - resp: BoltResponse, - next: Callable[[], Awaitable[BoltResponse]]) -> BoltResponse +name: str ``` + +The name of this middleware. diff --git a/docs/english/reference/middleware/authorization/async_single_team_authorization.md b/docs/english/reference/middleware/authorization/async_single_team_authorization.md index 0ab9b05f5..d9fbbab05 100644 --- a/docs/english/reference/middleware/authorization/async_single_team_authorization.md +++ b/docs/english/reference/middleware/authorization/async_single_team_authorization.md @@ -3,30 +3,20 @@ sidebar_label: async_single_team_authorization title: slack_bolt.middleware.authorization.async_single_team_authorization --- -## AsyncSingleTeamAuthorization Objects +## `AsyncSingleTeamAuthorization` ```python -class AsyncSingleTeamAuthorization(AsyncAuthorization) +AsyncSingleTeamAuthorization(base_logger=None, user_facing_authorize_error_message=None) ``` -#### \_\_init\_\_ - -```python -def __init__( - base_logger: Optional[Logger] = None, - user_facing_authorize_error_message: Optional[str] = None) -``` +Bases: AsyncAuthorization Single-workspace authorization. -#### auth\_test\_result: `Optional[AsyncSlackResponse]` - -#### async\_process +### `name` ```python -async def async_process( - *, - req: AsyncBoltRequest, - resp: BoltResponse, - next: Callable[[], Awaitable[BoltResponse]]) -> BoltResponse +name: str ``` + +The name of this middleware. diff --git a/docs/english/reference/middleware/authorization/authorization.md b/docs/english/reference/middleware/authorization/authorization.md index 421f49eb5..dc26576a9 100644 --- a/docs/english/reference/middleware/authorization/authorization.md +++ b/docs/english/reference/middleware/authorization/authorization.md @@ -4,8 +4,4 @@ title: slack_bolt.middleware.authorization.authorization slug: authorization --- -## Authorization Objects -```python -class Authorization(Middleware) -``` diff --git a/docs/english/reference/middleware/authorization/index.md b/docs/english/reference/middleware/authorization/index.md index 08e6e43b4..71f4d204b 100644 --- a/docs/english/reference/middleware/authorization/index.md +++ b/docs/english/reference/middleware/authorization/index.md @@ -3,93 +3,62 @@ sidebar_label: authorization title: slack_bolt.middleware.authorization --- -## Submodules - -- [slack_bolt.middleware.authorization.async_authorization](/tools/bolt-python/reference/middleware/authorization/async_authorization) -- [slack_bolt.middleware.authorization.async_internals](/tools/bolt-python/reference/middleware/authorization/async_internals) -- [slack_bolt.middleware.authorization.async_multi_teams_authorization](/tools/bolt-python/reference/middleware/authorization/async_multi_teams_authorization) -- [slack_bolt.middleware.authorization.async_single_team_authorization](/tools/bolt-python/reference/middleware/authorization/async_single_team_authorization) -- [slack_bolt.middleware.authorization.authorization](/tools/bolt-python/reference/middleware/authorization/authorization) -- [slack_bolt.middleware.authorization.internals](/tools/bolt-python/reference/middleware/authorization/internals) -- [slack_bolt.middleware.authorization.multi_teams_authorization](/tools/bolt-python/reference/middleware/authorization/multi_teams_authorization) -- [slack_bolt.middleware.authorization.single_team_authorization](/tools/bolt-python/reference/middleware/authorization/single_team_authorization) - -## Authorization Objects +## `MultiTeamsAuthorization` ```python -class Authorization(Middleware) +MultiTeamsAuthorization(*, authorize, base_logger=None, user_token_resolution='authed_user', user_facing_authorize_error_message=None) ``` -## MultiTeamsAuthorization Objects - -```python -class MultiTeamsAuthorization(Authorization) -``` - -#### authorize: `Authorize` - -#### user\_token\_resolution: `str` - -#### \_\_init\_\_ - -```python -def __init__( - *, - authorize: Authorize, - base_logger: Optional[Logger] = None, - user_token_resolution: str = 'authed_user', - user_facing_authorize_error_message: Optional[str] = None) -``` +Bases: Authorization Multi-workspace authorization. -**Arguments**: +**Parameters:** -- `authorize` _Authorize_ - The function to authorize incoming requests from Slack. -- `base_logger` _Optional[Logger]_ - The base logger -- `user_token_resolution` _str_ - "authed_user" or "actor" -- `user_facing_authorize_error_message` _Optional[str]_ - The user-facing error message when installation is not found +- **authorize** (Authorize) – The function to authorize incoming requests from Slack. +- **base_logger** (Optional[Logger]) – The base logger +- **user_token_resolution** (str) – "authed_user" or "actor" +- **user_facing_authorize_error_message** (Optional[str]) – The user-facing error message when installation is not found -#### process +### `name` ```python -def process( - *, - req: BoltRequest, - resp: BoltResponse, - next: Callable[[], BoltResponse]) -> BoltResponse +name: str ``` -## SingleTeamAuthorization Objects - -```python -class SingleTeamAuthorization(Authorization) -``` +The name of this middleware. -#### \_\_init\_\_ +## `SingleTeamAuthorization` ```python -def __init__( - *, - auth_test_result: Optional[SlackResponse] = None, - base_logger: Optional[Logger] = None, - user_facing_authorize_error_message: Optional[str] = None) +SingleTeamAuthorization(*, auth_test_result=None, base_logger=None, user_facing_authorize_error_message=None) ``` +Bases: Authorization + Single-workspace authorization. -**Arguments**: +**Parameters:** -- `auth_test_result` _Optional[SlackResponse]_ - The initial `auth.test` API call result. -- `base_logger` _Optional[Logger]_ - The base logger -- `user_facing_authorize_error_message` _Optional[str]_ - The message shown to the end-user when authorization fails +- **auth_test_result** (Optional[SlackResponse]) – The initial `auth.test` API call result. +- **base_logger** (Optional[Logger]) – The base logger +- **user_facing_authorize_error_message** (Optional[str]) – The message shown to the end-user when authorization fails -#### process +### `name` ```python -def process( - *, - req: BoltRequest, - resp: BoltResponse, - next: Callable[[], BoltResponse]) -> BoltResponse +name: str ``` + +The name of this middleware. + +## Submodules + +- [slack_bolt.middleware.authorization.async_authorization](/tools/bolt-python/reference/middleware/authorization/async_authorization) +- [slack_bolt.middleware.authorization.async_internals](/tools/bolt-python/reference/middleware/authorization/async_internals) +- [slack_bolt.middleware.authorization.async_multi_teams_authorization](/tools/bolt-python/reference/middleware/authorization/async_multi_teams_authorization) +- [slack_bolt.middleware.authorization.async_single_team_authorization](/tools/bolt-python/reference/middleware/authorization/async_single_team_authorization) +- [slack_bolt.middleware.authorization.authorization](/tools/bolt-python/reference/middleware/authorization/authorization) +- [slack_bolt.middleware.authorization.internals](/tools/bolt-python/reference/middleware/authorization/internals) +- [slack_bolt.middleware.authorization.multi_teams_authorization](/tools/bolt-python/reference/middleware/authorization/multi_teams_authorization) +- [slack_bolt.middleware.authorization.single_team_authorization](/tools/bolt-python/reference/middleware/authorization/single_team_authorization) diff --git a/docs/english/reference/middleware/authorization/internals.md b/docs/english/reference/middleware/authorization/internals.md index 7309240da..879a44291 100644 --- a/docs/english/reference/middleware/authorization/internals.md +++ b/docs/english/reference/middleware/authorization/internals.md @@ -3,4 +3,4 @@ sidebar_label: internals title: slack_bolt.middleware.authorization.internals --- -#### no\_auth\_test\_events + diff --git a/docs/english/reference/middleware/authorization/multi_teams_authorization.md b/docs/english/reference/middleware/authorization/multi_teams_authorization.md index ae8865577..4e33b4756 100644 --- a/docs/english/reference/middleware/authorization/multi_teams_authorization.md +++ b/docs/english/reference/middleware/authorization/multi_teams_authorization.md @@ -3,42 +3,27 @@ sidebar_label: multi_teams_authorization title: slack_bolt.middleware.authorization.multi_teams_authorization --- -## MultiTeamsAuthorization Objects +## `MultiTeamsAuthorization` ```python -class MultiTeamsAuthorization(Authorization) +MultiTeamsAuthorization(*, authorize, base_logger=None, user_token_resolution='authed_user', user_facing_authorize_error_message=None) ``` -#### authorize: `Authorize` - -#### user\_token\_resolution: `str` - -#### \_\_init\_\_ - -```python -def __init__( - *, - authorize: Authorize, - base_logger: Optional[Logger] = None, - user_token_resolution: str = 'authed_user', - user_facing_authorize_error_message: Optional[str] = None) -``` +Bases: Authorization Multi-workspace authorization. -**Arguments**: +**Parameters:** -- `authorize` _Authorize_ - The function to authorize incoming requests from Slack. -- `base_logger` _Optional[Logger]_ - The base logger -- `user_token_resolution` _str_ - "authed_user" or "actor" -- `user_facing_authorize_error_message` _Optional[str]_ - The user-facing error message when installation is not found +- **authorize** (Authorize) – The function to authorize incoming requests from Slack. +- **base_logger** (Optional[Logger]) – The base logger +- **user_token_resolution** (str) – "authed_user" or "actor" +- **user_facing_authorize_error_message** (Optional[str]) – The user-facing error message when installation is not found -#### process +### `name` ```python -def process( - *, - req: BoltRequest, - resp: BoltResponse, - next: Callable[[], BoltResponse]) -> BoltResponse +name: str ``` + +The name of this middleware. diff --git a/docs/english/reference/middleware/authorization/single_team_authorization.md b/docs/english/reference/middleware/authorization/single_team_authorization.md index c240f856a..0c3789b9e 100644 --- a/docs/english/reference/middleware/authorization/single_team_authorization.md +++ b/docs/english/reference/middleware/authorization/single_team_authorization.md @@ -3,36 +3,26 @@ sidebar_label: single_team_authorization title: slack_bolt.middleware.authorization.single_team_authorization --- -## SingleTeamAuthorization Objects +## `SingleTeamAuthorization` ```python -class SingleTeamAuthorization(Authorization) +SingleTeamAuthorization(*, auth_test_result=None, base_logger=None, user_facing_authorize_error_message=None) ``` -#### \_\_init\_\_ - -```python -def __init__( - *, - auth_test_result: Optional[SlackResponse] = None, - base_logger: Optional[Logger] = None, - user_facing_authorize_error_message: Optional[str] = None) -``` +Bases: Authorization Single-workspace authorization. -**Arguments**: +**Parameters:** -- `auth_test_result` _Optional[SlackResponse]_ - The initial `auth.test` API call result. -- `base_logger` _Optional[Logger]_ - The base logger -- `user_facing_authorize_error_message` _Optional[str]_ - The message shown to the end-user when authorization fails +- **auth_test_result** (Optional[SlackResponse]) – The initial `auth.test` API call result. +- **base_logger** (Optional[Logger]) – The base logger +- **user_facing_authorize_error_message** (Optional[str]) – The message shown to the end-user when authorization fails -#### process +### `name` ```python -def process( - *, - req: BoltRequest, - resp: BoltResponse, - next: Callable[[], BoltResponse]) -> BoltResponse +name: str ``` + +The name of this middleware. diff --git a/docs/english/reference/middleware/custom_middleware.md b/docs/english/reference/middleware/custom_middleware.md index b65b9ee44..4027402cd 100644 --- a/docs/english/reference/middleware/custom_middleware.md +++ b/docs/english/reference/middleware/custom_middleware.md @@ -3,39 +3,4 @@ sidebar_label: custom_middleware title: slack_bolt.middleware.custom_middleware --- -## CustomMiddleware Objects -```python -class CustomMiddleware(Middleware) -``` - -#### app\_name: `str` - -#### func: `Callable[..., Any]` - -#### arg\_names: `MutableSequence[str]` - -#### logger: `Logger` - -#### \_\_init\_\_ - -```python -def __init__(*, app_name: str, func: Callable, base_logger: Optional[Logger] = None) -``` - -#### process - -```python -def process( - *, - req: BoltRequest, - resp: BoltResponse, - next: Callable[[], BoltResponse]) -> BoltResponse -``` - -#### name - -```python -@property -def name() -> str -``` diff --git a/docs/english/reference/middleware/ignoring_self_events/async_ignoring_self_events.md b/docs/english/reference/middleware/ignoring_self_events/async_ignoring_self_events.md index a3eb92dc3..d08fb86f1 100644 --- a/docs/english/reference/middleware/ignoring_self_events/async_ignoring_self_events.md +++ b/docs/english/reference/middleware/ignoring_self_events/async_ignoring_self_events.md @@ -3,18 +3,4 @@ sidebar_label: async_ignoring_self_events title: slack_bolt.middleware.ignoring_self_events.async_ignoring_self_events --- -## AsyncIgnoringSelfEvents Objects -```python -class AsyncIgnoringSelfEvents(IgnoringSelfEvents, AsyncMiddleware) -``` - -#### async\_process - -```python -async def async_process( - *, - req: AsyncBoltRequest, - resp: BoltResponse, - next: Callable[[], Awaitable[BoltResponse]]) -> BoltResponse -``` diff --git a/docs/english/reference/middleware/ignoring_self_events/ignoring_self_events.md b/docs/english/reference/middleware/ignoring_self_events/ignoring_self_events.md index 816a153bb..a2367afdd 100644 --- a/docs/english/reference/middleware/ignoring_self_events/ignoring_self_events.md +++ b/docs/english/reference/middleware/ignoring_self_events/ignoring_self_events.md @@ -4,30 +4,20 @@ title: slack_bolt.middleware.ignoring_self_events.ignoring_self_events slug: ignoring_self_events --- -## IgnoringSelfEvents Objects +## `IgnoringSelfEvents` ```python -class IgnoringSelfEvents(Middleware) +IgnoringSelfEvents(base_logger=None, ignoring_self_assistant_message_events_enabled=True) ``` -#### \_\_init\_\_ - -```python -def __init__( - base_logger: Optional[logging.Logger] = None, - ignoring_self_assistant_message_events_enabled: bool = True) -``` +Bases: Middleware Ignores the events generated by this bot user itself. -#### process +### `name` ```python -def process( - *, - req: BoltRequest, - resp: BoltResponse, - next: Callable[[], BoltResponse]) -> BoltResponse +name: str ``` -#### events\_that\_should\_be\_kept +The name of this middleware. diff --git a/docs/english/reference/middleware/ignoring_self_events/index.md b/docs/english/reference/middleware/ignoring_self_events/index.md index 3d9badbbc..d2977bf85 100644 --- a/docs/english/reference/middleware/ignoring_self_events/index.md +++ b/docs/english/reference/middleware/ignoring_self_events/index.md @@ -3,35 +3,25 @@ sidebar_label: ignoring_self_events title: slack_bolt.middleware.ignoring_self_events --- -## Submodules - -- [slack_bolt.middleware.ignoring_self_events.async_ignoring_self_events](/tools/bolt-python/reference/middleware/ignoring_self_events/async_ignoring_self_events) -- [slack_bolt.middleware.ignoring_self_events.ignoring_self_events](/tools/bolt-python/reference/middleware/ignoring_self_events/ignoring_self_events) - -## IgnoringSelfEvents Objects +## `IgnoringSelfEvents` ```python -class IgnoringSelfEvents(Middleware) +IgnoringSelfEvents(base_logger=None, ignoring_self_assistant_message_events_enabled=True) ``` -#### \_\_init\_\_ - -```python -def __init__( - base_logger: Optional[logging.Logger] = None, - ignoring_self_assistant_message_events_enabled: bool = True) -``` +Bases: Middleware Ignores the events generated by this bot user itself. -#### process +### `name` ```python -def process( - *, - req: BoltRequest, - resp: BoltResponse, - next: Callable[[], BoltResponse]) -> BoltResponse +name: str ``` -#### events\_that\_should\_be\_kept +The name of this middleware. + +## Submodules + +- [slack_bolt.middleware.ignoring_self_events.async_ignoring_self_events](/tools/bolt-python/reference/middleware/ignoring_self_events/async_ignoring_self_events) +- [slack_bolt.middleware.ignoring_self_events.ignoring_self_events](/tools/bolt-python/reference/middleware/ignoring_self_events/ignoring_self_events) diff --git a/docs/english/reference/middleware/index.md b/docs/english/reference/middleware/index.md index 81c65872c..baf36f827 100644 --- a/docs/english/reference/middleware/index.md +++ b/docs/english/reference/middleware/index.md @@ -10,167 +10,214 @@ Call the `next()` method if the execution chain should continue running the foll Middleware can be used globally before all listener executions. It's also possible to run a middleware only for a particular listener. -## Submodules - -- [slack_bolt.middleware.assistant](/tools/bolt-python/reference/middleware/assistant) -- [slack_bolt.middleware.async_builtins](/tools/bolt-python/reference/middleware/async_builtins) -- [slack_bolt.middleware.async_custom_middleware](/tools/bolt-python/reference/middleware/async_custom_middleware) -- [slack_bolt.middleware.async_middleware](/tools/bolt-python/reference/middleware/async_middleware) -- [slack_bolt.middleware.async_middleware_error_handler](/tools/bolt-python/reference/middleware/async_middleware_error_handler) -- [slack_bolt.middleware.attaching_conversation_kwargs](/tools/bolt-python/reference/middleware/attaching_conversation_kwargs) -- [slack_bolt.middleware.attaching_function_token](/tools/bolt-python/reference/middleware/attaching_function_token) -- [slack_bolt.middleware.authorization](/tools/bolt-python/reference/middleware/authorization) -- [slack_bolt.middleware.custom_middleware](/tools/bolt-python/reference/middleware/custom_middleware) -- [slack_bolt.middleware.ignoring_self_events](/tools/bolt-python/reference/middleware/ignoring_self_events) -- [slack_bolt.middleware.message_listener_matches](/tools/bolt-python/reference/middleware/message_listener_matches) -- [slack_bolt.middleware.middleware](/tools/bolt-python/reference/middleware/middleware) -- [slack_bolt.middleware.middleware_error_handler](/tools/bolt-python/reference/middleware/middleware_error_handler) -- [slack_bolt.middleware.request_verification](/tools/bolt-python/reference/middleware/request_verification) -- [slack_bolt.middleware.ssl_check](/tools/bolt-python/reference/middleware/ssl_check) -- [slack_bolt.middleware.url_verification](/tools/bolt-python/reference/middleware/url_verification) - -## SingleTeamAuthorization Objects +## `IgnoringSelfEvents` ```python -class SingleTeamAuthorization(Authorization) +IgnoringSelfEvents(base_logger=None, ignoring_self_assistant_message_events_enabled=True) ``` -## MultiTeamsAuthorization Objects +Bases: Middleware -```python -class MultiTeamsAuthorization(Authorization) -``` +Ignores the events generated by this bot user itself. -## CustomMiddleware Objects +### `name` ```python -class CustomMiddleware(Middleware) +name: str ``` -#### app\_name: `str` - -#### func: `Callable[..., Any]` +The name of this middleware. -#### arg\_names: `MutableSequence[str]` +## `Middleware` -#### logger: `Logger` +A middleware can process request data before other middleware and listener functions. -#### \_\_init\_\_ +### `name` ```python -def __init__(*, app_name: str, func: Callable, base_logger: Optional[Logger] = None) +name: str ``` -#### process +The name of this middleware. + +### `process` ```python -def process( - *, - req: BoltRequest, - resp: BoltResponse, - next: Callable[[], BoltResponse]) -> BoltResponse +process(*, req, resp, next) ``` -#### name +Processes a request data before other middleware and listeners. + +A middleware calls `next()` function if the chain should continue. ```python -@property -def name() -> str +@app.middleware +def simple_middleware(req, resp, next): + # do something here + next() ``` -## IgnoringSelfEvents Objects +This `process(req, resp, next)` method is supposed to be invoked only inside bolt-python. +If you want to avoid the name `next()` in your middleware functions, you can use `next_()` method instead. ```python -class IgnoringSelfEvents(Middleware) +@app.middleware +def simple_middleware(req, resp, next_): + # do something here + next_() ``` -## Middleware Objects +**Parameters:** -```python -class Middleware() -``` +- **req** (BoltRequest) – The incoming request +- **resp** (BoltResponse) – The response +- **next** (Callable[[], BoltResponse]) – The function to tell the chain that it can continue -A middleware can process request data before other middleware and listener functions. +**Returns:** + +- Optional[BoltResponse] – Processed response (optional) -#### process +## `MultiTeamsAuthorization` ```python -def process( - *, - req: BoltRequest, - resp: BoltResponse, - next: Callable[[], BoltResponse]) -> Optional[BoltResponse] +MultiTeamsAuthorization(*, authorize, base_logger=None, user_token_resolution='authed_user', user_facing_authorize_error_message=None) ``` -Processes a request data before other middleware and listeners. +Bases: Authorization -A middleware calls `next()` function if the chain should continue. +Multi-workspace authorization. + +**Parameters:** + +- **authorize** (Authorize) – The function to authorize incoming requests from Slack. +- **base_logger** (Optional[Logger]) – The base logger +- **user_token_resolution** (str) – "authed_user" or "actor" +- **user_facing_authorize_error_message** (Optional[str]) – The user-facing error message when installation is not found + +### `name` ```python -@app.middleware -def simple_middleware(req, resp, next): - # do something here - next() +name: str ``` -This `process(req, resp, next)` method is supposed to be invoked only inside bolt-python. -If you want to avoid the name `next()` in your middleware functions, you can use `next_()` method instead. +The name of this middleware. + +## `RequestVerification` ```python -@app.middleware -def simple_middleware(req, resp, next_): - # do something here - next_() +RequestVerification(signing_secret, base_logger=None) ``` +Bases: Middleware + +Verifies an incoming request from Slack. -**Arguments**: +Checks the validity of `x-slack-signature`, `x-slack-request-timestamp`, and the request body data. -- `req` _BoltRequest_ - The incoming request -- `resp` _BoltResponse_ - The response -- `next` _Callable[[], BoltResponse]_ - The function to tell the chain that it can continue +Refer to https://docs.slack.dev/authentication/verifying-requests-from-slack/ for details. -**Returns**: +**Parameters:** -- `Optional[BoltResponse]` - Processed response (optional) +- **signing_secret** (str) – The signing secret +- **base_logger** (Optional[Logger]) – The base logger -#### name +### `name` ```python -@property -def name() -> str +name: str ``` The name of this middleware. -## RequestVerification Objects +## `SingleTeamAuthorization` ```python -class RequestVerification(Middleware) +SingleTeamAuthorization(*, auth_test_result=None, base_logger=None, user_facing_authorize_error_message=None) ``` -## SslCheck Objects +Bases: Authorization + +Single-workspace authorization. + +**Parameters:** + +- **auth_test_result** (Optional[SlackResponse]) – The initial `auth.test` API call result. +- **base_logger** (Optional[Logger]) – The base logger +- **user_facing_authorize_error_message** (Optional[str]) – The message shown to the end-user when authorization fails + +### `name` ```python -class SslCheck(Middleware) +name: str ``` -## UrlVerification Objects +The name of this middleware. + +## `SslCheck` ```python -class UrlVerification(Middleware) +SslCheck(verification_token=None, base_logger=None) ``` -## AttachingFunctionToken Objects +Bases: Middleware + +Handles `ssl_check` requests. + +Refer to https://docs.slack.dev/interactivity/implementing-slash-commands/ for details. + +**Parameters:** + +- **verification_token** (Optional[str]) – The verification token to check +(optional as it's already deprecated - https://docs.slack.dev/authentication/verifying-requests-from-slack/#deprecation) +- **base_logger** (Optional[Logger]) – The base logger + +### `name` ```python -class AttachingFunctionToken(Middleware) +name: str ``` -## AttachingConversationKwargs Objects +The name of this middleware. + +## `UrlVerification` ```python -class AttachingConversationKwargs(Middleware) +UrlVerification(base_logger=None) ``` -#### builtin\_middleware\_classes +Bases: Middleware + +Handles url_verification requests. + +Refer to https://docs.slack.dev/reference/events/url_verification/ for details. + +**Parameters:** + +- **base_logger** (Optional[Logger]) – The base logger + +### `name` + +```python +name: str +``` + +The name of this middleware. + +## Submodules + +- [slack_bolt.middleware.assistant](/tools/bolt-python/reference/middleware/assistant) +- [slack_bolt.middleware.async_builtins](/tools/bolt-python/reference/middleware/async_builtins) +- [slack_bolt.middleware.async_custom_middleware](/tools/bolt-python/reference/middleware/async_custom_middleware) +- [slack_bolt.middleware.async_middleware](/tools/bolt-python/reference/middleware/async_middleware) +- [slack_bolt.middleware.async_middleware_error_handler](/tools/bolt-python/reference/middleware/async_middleware_error_handler) +- [slack_bolt.middleware.attaching_conversation_kwargs](/tools/bolt-python/reference/middleware/attaching_conversation_kwargs) +- [slack_bolt.middleware.attaching_function_token](/tools/bolt-python/reference/middleware/attaching_function_token) +- [slack_bolt.middleware.authorization](/tools/bolt-python/reference/middleware/authorization) +- [slack_bolt.middleware.custom_middleware](/tools/bolt-python/reference/middleware/custom_middleware) +- [slack_bolt.middleware.ignoring_self_events](/tools/bolt-python/reference/middleware/ignoring_self_events) +- [slack_bolt.middleware.message_listener_matches](/tools/bolt-python/reference/middleware/message_listener_matches) +- [slack_bolt.middleware.middleware](/tools/bolt-python/reference/middleware/middleware) +- [slack_bolt.middleware.middleware_error_handler](/tools/bolt-python/reference/middleware/middleware_error_handler) +- [slack_bolt.middleware.request_verification](/tools/bolt-python/reference/middleware/request_verification) +- [slack_bolt.middleware.ssl_check](/tools/bolt-python/reference/middleware/ssl_check) +- [slack_bolt.middleware.url_verification](/tools/bolt-python/reference/middleware/url_verification) diff --git a/docs/english/reference/middleware/message_listener_matches/async_message_listener_matches.md b/docs/english/reference/middleware/message_listener_matches/async_message_listener_matches.md index 48a06af5e..62ead6881 100644 --- a/docs/english/reference/middleware/message_listener_matches/async_message_listener_matches.md +++ b/docs/english/reference/middleware/message_listener_matches/async_message_listener_matches.md @@ -3,26 +3,20 @@ sidebar_label: async_message_listener_matches title: slack_bolt.middleware.message_listener_matches.async_message_listener_matches --- -## AsyncMessageListenerMatches Objects +## `AsyncMessageListenerMatches` ```python -class AsyncMessageListenerMatches(AsyncMiddleware) +AsyncMessageListenerMatches(keyword) ``` -#### \_\_init\_\_ - -```python -def __init__(keyword: Union[str, Pattern]) -``` +Bases: AsyncMiddleware Captures matched keywords and saves the values in context. -#### async\_process +### `name` ```python -async def async_process( - *, - req: AsyncBoltRequest, - resp: BoltResponse, - next: Callable[[], Awaitable[BoltResponse]]) -> BoltResponse +name: str ``` + +The name of this middleware. diff --git a/docs/english/reference/middleware/message_listener_matches/index.md b/docs/english/reference/middleware/message_listener_matches/index.md index 5e61fb235..ab10a521d 100644 --- a/docs/english/reference/middleware/message_listener_matches/index.md +++ b/docs/english/reference/middleware/message_listener_matches/index.md @@ -3,31 +3,25 @@ sidebar_label: message_listener_matches title: slack_bolt.middleware.message_listener_matches --- -## Submodules - -- [slack_bolt.middleware.message_listener_matches.async_message_listener_matches](/tools/bolt-python/reference/middleware/message_listener_matches/async_message_listener_matches) -- [slack_bolt.middleware.message_listener_matches.message_listener_matches](/tools/bolt-python/reference/middleware/message_listener_matches/message_listener_matches) - -## MessageListenerMatches Objects +## `MessageListenerMatches` ```python -class MessageListenerMatches(Middleware) +MessageListenerMatches(keyword) ``` -#### \_\_init\_\_ - -```python -def __init__(keyword: Union[str, Pattern]) -``` +Bases: Middleware Captures matched keywords and saves the values in context. -#### process +### `name` ```python -def process( - *, - req: BoltRequest, - resp: BoltResponse, - next: Callable[[], BoltResponse]) -> BoltResponse +name: str ``` + +The name of this middleware. + +## Submodules + +- [slack_bolt.middleware.message_listener_matches.async_message_listener_matches](/tools/bolt-python/reference/middleware/message_listener_matches/async_message_listener_matches) +- [slack_bolt.middleware.message_listener_matches.message_listener_matches](/tools/bolt-python/reference/middleware/message_listener_matches/message_listener_matches) diff --git a/docs/english/reference/middleware/message_listener_matches/message_listener_matches.md b/docs/english/reference/middleware/message_listener_matches/message_listener_matches.md index 04536976d..0136441f7 100644 --- a/docs/english/reference/middleware/message_listener_matches/message_listener_matches.md +++ b/docs/english/reference/middleware/message_listener_matches/message_listener_matches.md @@ -4,26 +4,20 @@ title: slack_bolt.middleware.message_listener_matches.message_listener_matches slug: message_listener_matches --- -## MessageListenerMatches Objects +## `MessageListenerMatches` ```python -class MessageListenerMatches(Middleware) +MessageListenerMatches(keyword) ``` -#### \_\_init\_\_ - -```python -def __init__(keyword: Union[str, Pattern]) -``` +Bases: Middleware Captures matched keywords and saves the values in context. -#### process +### `name` ```python -def process( - *, - req: BoltRequest, - resp: BoltResponse, - next: Callable[[], BoltResponse]) -> BoltResponse +name: str ``` + +The name of this middleware. diff --git a/docs/english/reference/middleware/middleware.md b/docs/english/reference/middleware/middleware.md index 39efeca02..e7d1492fb 100644 --- a/docs/english/reference/middleware/middleware.md +++ b/docs/english/reference/middleware/middleware.md @@ -4,22 +4,22 @@ title: slack_bolt.middleware.middleware slug: middleware --- -## Middleware Objects +## `Middleware` + +A middleware can process request data before other middleware and listener functions. + +### `name` ```python -class Middleware() +name: str ``` -A middleware can process request data before other middleware and listener functions. +The name of this middleware. -#### process +### `process` ```python -def process( - *, - req: BoltRequest, - resp: BoltResponse, - next: Callable[[], BoltResponse]) -> Optional[BoltResponse] +process(*, req, resp, next) ``` Processes a request data before other middleware and listeners. @@ -43,22 +43,12 @@ def simple_middleware(req, resp, next_): next_() ``` +**Parameters:** -**Arguments**: - -- `req` _BoltRequest_ - The incoming request -- `resp` _BoltResponse_ - The response -- `next` _Callable[[], BoltResponse]_ - The function to tell the chain that it can continue +- **req** (BoltRequest) – The incoming request +- **resp** (BoltResponse) – The response +- **next** (Callable[[], BoltResponse]) – The function to tell the chain that it can continue -**Returns**: +**Returns:** -- `Optional[BoltResponse]` - Processed response (optional) - -#### name - -```python -@property -def name() -> str -``` - -The name of this middleware. +- Optional[BoltResponse] – Processed response (optional) diff --git a/docs/english/reference/middleware/middleware_error_handler.md b/docs/english/reference/middleware/middleware_error_handler.md index 2cde0622b..06cff6d06 100644 --- a/docs/english/reference/middleware/middleware_error_handler.md +++ b/docs/english/reference/middleware/middleware_error_handler.md @@ -3,61 +3,18 @@ sidebar_label: middleware_error_handler title: slack_bolt.middleware.middleware_error_handler --- -## MiddlewareErrorHandler Objects +## `MiddlewareErrorHandler` -```python -class MiddlewareErrorHandler() -``` - -#### handle +### `handle` ```python -def handle( - error: Exception, - request: BoltRequest, - response: Optional[BoltResponse]) -> None +handle(error, request, response) ``` Handles an unhandled exception. -**Arguments**: - -- `error` _Exception_ - The raised exception. -- `request` _BoltRequest_ - The request. -- `response` _Optional[BoltResponse]_ - The response. - -## CustomMiddlewareErrorHandler Objects - -```python -class CustomMiddlewareErrorHandler(MiddlewareErrorHandler) -``` - -#### \_\_init\_\_ +**Parameters:** -```python -def __init__(logger: Logger, func: Callable[..., Optional[BoltResponse]]) -``` - -#### handle - -```python -def handle(error: Exception, request: BoltRequest, response: Optional[BoltResponse]) -``` - -## DefaultMiddlewareErrorHandler Objects - -```python -class DefaultMiddlewareErrorHandler(MiddlewareErrorHandler) -``` - -#### \_\_init\_\_ - -```python -def __init__(logger: Logger) -``` - -#### handle - -```python -def handle(error: Exception, request: BoltRequest, response: Optional[BoltResponse]) -``` +- **error** (Exception) – The raised exception. +- **request** (BoltRequest) – The request. +- **response** (Optional[BoltResponse]) – The response. diff --git a/docs/english/reference/middleware/request_verification/async_request_verification.md b/docs/english/reference/middleware/request_verification/async_request_verification.md index 0f3286483..8519927d8 100644 --- a/docs/english/reference/middleware/request_verification/async_request_verification.md +++ b/docs/english/reference/middleware/request_verification/async_request_verification.md @@ -3,11 +3,9 @@ sidebar_label: async_request_verification title: slack_bolt.middleware.request_verification.async_request_verification --- -## AsyncRequestVerification Objects +## `AsyncRequestVerification` -```python -class AsyncRequestVerification(RequestVerification, AsyncMiddleware) -``` +Bases: RequestVerification, AsyncMiddleware Verifies an incoming request from Slack. @@ -15,12 +13,10 @@ Checks the validity of `x-slack-signature`, `x-slack-request-timestamp`, and the Refer to https://docs.slack.dev/authentication/verifying-requests-from-slack/ for details. -#### async\_process +### `name` ```python -async def async_process( - *, - req: AsyncBoltRequest, - resp: BoltResponse, - next: Callable[[], Awaitable[BoltResponse]]) -> BoltResponse +name: str ``` + +The name of this middleware. diff --git a/docs/english/reference/middleware/request_verification/index.md b/docs/english/reference/middleware/request_verification/index.md index dc593da96..0403a6039 100644 --- a/docs/english/reference/middleware/request_verification/index.md +++ b/docs/english/reference/middleware/request_verification/index.md @@ -3,22 +3,13 @@ sidebar_label: request_verification title: slack_bolt.middleware.request_verification --- -## Submodules - -- [slack_bolt.middleware.request_verification.async_request_verification](/tools/bolt-python/reference/middleware/request_verification/async_request_verification) -- [slack_bolt.middleware.request_verification.request_verification](/tools/bolt-python/reference/middleware/request_verification/request_verification) - -## RequestVerification Objects +## `RequestVerification` ```python -class RequestVerification(Middleware) +RequestVerification(signing_secret, base_logger=None) ``` -#### \_\_init\_\_ - -```python -def __init__(signing_secret: str, base_logger: Optional[Logger] = None) -``` +Bases: Middleware Verifies an incoming request from Slack. @@ -26,24 +17,20 @@ Checks the validity of `x-slack-signature`, `x-slack-request-timestamp`, and the Refer to https://docs.slack.dev/authentication/verifying-requests-from-slack/ for details. -**Arguments**: +**Parameters:** -- `signing_secret` _str_ - The signing secret -- `base_logger` _Optional[Logger]_ - The base logger +- **signing_secret** (str) – The signing secret +- **base_logger** (Optional[Logger]) – The base logger -#### verifier +### `name` ```python -@property -def verifier() -> SignatureVerifier +name: str ``` -#### process +The name of this middleware. -```python -def process( - *, - req: BoltRequest, - resp: BoltResponse, - next: Callable[[], BoltResponse]) -> BoltResponse -``` +## Submodules + +- [slack_bolt.middleware.request_verification.async_request_verification](/tools/bolt-python/reference/middleware/request_verification/async_request_verification) +- [slack_bolt.middleware.request_verification.request_verification](/tools/bolt-python/reference/middleware/request_verification/request_verification) diff --git a/docs/english/reference/middleware/request_verification/request_verification.md b/docs/english/reference/middleware/request_verification/request_verification.md index 14c67c06c..fd43a5bb7 100644 --- a/docs/english/reference/middleware/request_verification/request_verification.md +++ b/docs/english/reference/middleware/request_verification/request_verification.md @@ -4,17 +4,13 @@ title: slack_bolt.middleware.request_verification.request_verification slug: request_verification --- -## RequestVerification Objects +## `RequestVerification` ```python -class RequestVerification(Middleware) +RequestVerification(signing_secret, base_logger=None) ``` -#### \_\_init\_\_ - -```python -def __init__(signing_secret: str, base_logger: Optional[Logger] = None) -``` +Bases: Middleware Verifies an incoming request from Slack. @@ -22,24 +18,15 @@ Checks the validity of `x-slack-signature`, `x-slack-request-timestamp`, and the Refer to https://docs.slack.dev/authentication/verifying-requests-from-slack/ for details. -**Arguments**: +**Parameters:** -- `signing_secret` _str_ - The signing secret -- `base_logger` _Optional[Logger]_ - The base logger +- **signing_secret** (str) – The signing secret +- **base_logger** (Optional[Logger]) – The base logger -#### verifier +### `name` ```python -@property -def verifier() -> SignatureVerifier +name: str ``` -#### process - -```python -def process( - *, - req: BoltRequest, - resp: BoltResponse, - next: Callable[[], BoltResponse]) -> BoltResponse -``` +The name of this middleware. diff --git a/docs/english/reference/middleware/ssl_check/async_ssl_check.md b/docs/english/reference/middleware/ssl_check/async_ssl_check.md index c6b1ad56a..e5fffa11d 100644 --- a/docs/english/reference/middleware/ssl_check/async_ssl_check.md +++ b/docs/english/reference/middleware/ssl_check/async_ssl_check.md @@ -3,18 +3,4 @@ sidebar_label: async_ssl_check title: slack_bolt.middleware.ssl_check.async_ssl_check --- -## AsyncSslCheck Objects -```python -class AsyncSslCheck(SslCheck, AsyncMiddleware) -``` - -#### async\_process - -```python -async def async_process( - *, - req: AsyncBoltRequest, - resp: BoltResponse, - next: Callable[[], Awaitable[BoltResponse]]) -> BoltResponse -``` diff --git a/docs/english/reference/middleware/ssl_check/index.md b/docs/english/reference/middleware/ssl_check/index.md index 99171ad4b..8fa86d585 100644 --- a/docs/english/reference/middleware/ssl_check/index.md +++ b/docs/english/reference/middleware/ssl_check/index.md @@ -3,45 +3,33 @@ sidebar_label: ssl_check title: slack_bolt.middleware.ssl_check --- -## Submodules - -- [slack_bolt.middleware.ssl_check.async_ssl_check](/tools/bolt-python/reference/middleware/ssl_check/async_ssl_check) -- [slack_bolt.middleware.ssl_check.ssl_check](/tools/bolt-python/reference/middleware/ssl_check/ssl_check) - -## SslCheck Objects +## `SslCheck` ```python -class SslCheck(Middleware) +SslCheck(verification_token=None, base_logger=None) ``` -#### verification\_token: `Optional[str]` - -#### logger: `Logger` - -#### \_\_init\_\_ - -```python -def __init__( - verification_token: Optional[str] = None, - base_logger: Optional[Logger] = None) -``` +Bases: Middleware Handles `ssl_check` requests. Refer to https://docs.slack.dev/interactivity/implementing-slash-commands/ for details. -**Arguments**: +**Parameters:** -- `verification_token` _Optional[str]_ - The verification token to check - (optional as it's already deprecated - https://docs.slack.dev/authentication/verifying-requests-from-slack/#deprecation) -- `base_logger` _Optional[Logger]_ - The base logger +- **verification_token** (Optional[str]) – The verification token to check +(optional as it's already deprecated - https://docs.slack.dev/authentication/verifying-requests-from-slack/#deprecation) +- **base_logger** (Optional[Logger]) – The base logger -#### process +### `name` ```python -def process( - *, - req: BoltRequest, - resp: BoltResponse, - next: Callable[[], BoltResponse]) -> BoltResponse +name: str ``` + +The name of this middleware. + +## Submodules + +- [slack_bolt.middleware.ssl_check.async_ssl_check](/tools/bolt-python/reference/middleware/ssl_check/async_ssl_check) +- [slack_bolt.middleware.ssl_check.ssl_check](/tools/bolt-python/reference/middleware/ssl_check/ssl_check) diff --git a/docs/english/reference/middleware/ssl_check/ssl_check.md b/docs/english/reference/middleware/ssl_check/ssl_check.md index b22b8aba1..f8e7f9aca 100644 --- a/docs/english/reference/middleware/ssl_check/ssl_check.md +++ b/docs/english/reference/middleware/ssl_check/ssl_check.md @@ -4,40 +4,28 @@ title: slack_bolt.middleware.ssl_check.ssl_check slug: ssl_check --- -## SslCheck Objects +## `SslCheck` ```python -class SslCheck(Middleware) +SslCheck(verification_token=None, base_logger=None) ``` -#### verification\_token: `Optional[str]` - -#### logger: `Logger` - -#### \_\_init\_\_ - -```python -def __init__( - verification_token: Optional[str] = None, - base_logger: Optional[Logger] = None) -``` +Bases: Middleware Handles `ssl_check` requests. Refer to https://docs.slack.dev/interactivity/implementing-slash-commands/ for details. -**Arguments**: +**Parameters:** -- `verification_token` _Optional[str]_ - The verification token to check - (optional as it's already deprecated - https://docs.slack.dev/authentication/verifying-requests-from-slack/#deprecation) -- `base_logger` _Optional[Logger]_ - The base logger +- **verification_token** (Optional[str]) – The verification token to check +(optional as it's already deprecated - https://docs.slack.dev/authentication/verifying-requests-from-slack/#deprecation) +- **base_logger** (Optional[Logger]) – The base logger -#### process +### `name` ```python -def process( - *, - req: BoltRequest, - resp: BoltResponse, - next: Callable[[], BoltResponse]) -> BoltResponse +name: str ``` + +The name of this middleware. diff --git a/docs/english/reference/middleware/url_verification/async_url_verification.md b/docs/english/reference/middleware/url_verification/async_url_verification.md index f74152f77..760ccf15b 100644 --- a/docs/english/reference/middleware/url_verification/async_url_verification.md +++ b/docs/english/reference/middleware/url_verification/async_url_verification.md @@ -3,24 +3,4 @@ sidebar_label: async_url_verification title: slack_bolt.middleware.url_verification.async_url_verification --- -## AsyncUrlVerification Objects -```python -class AsyncUrlVerification(UrlVerification, AsyncMiddleware) -``` - -#### \_\_init\_\_ - -```python -def __init__(base_logger: Optional[Logger] = None) -``` - -#### async\_process - -```python -async def async_process( - *, - req: AsyncBoltRequest, - resp: BoltResponse, - next: Callable[[], Awaitable[BoltResponse]]) -> BoltResponse -``` diff --git a/docs/english/reference/middleware/url_verification/index.md b/docs/english/reference/middleware/url_verification/index.md index ce2b8bd4f..3eb6ce388 100644 --- a/docs/english/reference/middleware/url_verification/index.md +++ b/docs/english/reference/middleware/url_verification/index.md @@ -3,37 +3,31 @@ sidebar_label: url_verification title: slack_bolt.middleware.url_verification --- -## Submodules - -- [slack_bolt.middleware.url_verification.async_url_verification](/tools/bolt-python/reference/middleware/url_verification/async_url_verification) -- [slack_bolt.middleware.url_verification.url_verification](/tools/bolt-python/reference/middleware/url_verification/url_verification) - -## UrlVerification Objects +## `UrlVerification` ```python -class UrlVerification(Middleware) +UrlVerification(base_logger=None) ``` -#### \_\_init\_\_ - -```python -def __init__(base_logger: Optional[Logger] = None) -``` +Bases: Middleware Handles url_verification requests. Refer to https://docs.slack.dev/reference/events/url_verification/ for details. -**Arguments**: +**Parameters:** -- `base_logger` _Optional[Logger]_ - The base logger +- **base_logger** (Optional[Logger]) – The base logger -#### process +### `name` ```python -def process( - *, - req: BoltRequest, - resp: BoltResponse, - next: Callable[[], BoltResponse]) -> BoltResponse +name: str ``` + +The name of this middleware. + +## Submodules + +- [slack_bolt.middleware.url_verification.async_url_verification](/tools/bolt-python/reference/middleware/url_verification/async_url_verification) +- [slack_bolt.middleware.url_verification.url_verification](/tools/bolt-python/reference/middleware/url_verification/url_verification) diff --git a/docs/english/reference/middleware/url_verification/url_verification.md b/docs/english/reference/middleware/url_verification/url_verification.md index a54d70ba2..76c3a5d13 100644 --- a/docs/english/reference/middleware/url_verification/url_verification.md +++ b/docs/english/reference/middleware/url_verification/url_verification.md @@ -4,32 +4,26 @@ title: slack_bolt.middleware.url_verification.url_verification slug: url_verification --- -## UrlVerification Objects +## `UrlVerification` ```python -class UrlVerification(Middleware) +UrlVerification(base_logger=None) ``` -#### \_\_init\_\_ - -```python -def __init__(base_logger: Optional[Logger] = None) -``` +Bases: Middleware Handles url_verification requests. Refer to https://docs.slack.dev/reference/events/url_verification/ for details. -**Arguments**: +**Parameters:** -- `base_logger` _Optional[Logger]_ - The base logger +- **base_logger** (Optional[Logger]) – The base logger -#### process +### `name` ```python -def process( - *, - req: BoltRequest, - resp: BoltResponse, - next: Callable[[], BoltResponse]) -> BoltResponse +name: str ``` + +The name of this middleware. diff --git a/docs/english/reference/oauth/async_callback_options.md b/docs/english/reference/oauth/async_callback_options.md index 344fad325..c62ddf5b8 100644 --- a/docs/english/reference/oauth/async_callback_options.md +++ b/docs/english/reference/oauth/async_callback_options.md @@ -3,96 +3,34 @@ sidebar_label: async_callback_options title: slack_bolt.oauth.async_callback_options --- -## AsyncSuccessArgs Objects +## `AsyncFailureArgs` ```python -class AsyncSuccessArgs() -``` - -#### \_\_init\_\_ - -```python -def __init__( - *, - request: AsyncBoltRequest, - installation: Installation, - settings: AsyncOAuthSettings, - default: AsyncCallbackOptions) -``` - -The arguments for a success function. - -**Arguments**: - -- `request` _AsyncBoltRequest_ - The request. -- `installation` _Installation_ - The installation data. -- `settings` _AsyncOAuthSettings_ - The settings for Slack OAuth flow. -- `default` _AsyncCallbackOptions_ - The default `AsyncCallbackOptions`. - -## AsyncFailureArgs Objects - -```python -class AsyncFailureArgs() -``` - -#### \_\_init\_\_ - -```python -def __init__( - *, - request: AsyncBoltRequest, - reason: str, - error: Optional[Exception] = None, - suggested_status_code: int, - settings: AsyncOAuthSettings, - default: AsyncCallbackOptions) +AsyncFailureArgs(*, request, reason, error=None, suggested_status_code, settings, default) ``` The arguments for a failure function. -**Arguments**: - -- `request` _AsyncBoltRequest_ - The request. -- `reason` _str_ - The response. -- `error` _Optional[Exception]_ - An exception if exists. -- `suggested_status_code` _int_ - The recommended HTTP status code for the failure. -- `settings` _AsyncOAuthSettings_ - The settings for Slack OAuth flow. -- `default` _AsyncCallbackOptions_ - The default `AsyncCallbackOptions`. - -## AsyncCallbackOptions Objects - -```python -class AsyncCallbackOptions() -``` +**Parameters:** -#### success: `Callable[[AsyncSuccessArgs], Awaitable[BoltResponse]]` +- **request** (AsyncBoltRequest) – The request. +- **reason** (str) – The response. +- **error** (Optional[Exception]) – An exception if exists. +- **suggested_status_code** (int) – The recommended HTTP status code for the failure. +- **settings** (AsyncOAuthSettings) – The settings for Slack OAuth flow. +- **default** (AsyncCallbackOptions) – The default `AsyncCallbackOptions`. -#### failure: `Callable[[AsyncFailureArgs], Awaitable[BoltResponse]]` - -#### \_\_init\_\_ +## `AsyncSuccessArgs` ```python -def __init__( - success: Callable[[AsyncSuccessArgs], Awaitable[BoltResponse]], - failure: Callable[[AsyncFailureArgs], Awaitable[BoltResponse]]) +AsyncSuccessArgs(*, request, installation, settings, default) ``` -## DefaultAsyncCallbackOptions Objects - -```python -class DefaultAsyncCallbackOptions(AsyncCallbackOptions) -``` - -#### success: `Callable[[AsyncSuccessArgs], Awaitable[BoltResponse]]` - -#### failure: `Callable[[AsyncFailureArgs], Awaitable[BoltResponse]]` +The arguments for a success function. -#### \_\_init\_\_ +**Parameters:** -```python -def __init__( - *, - logger: Logger, - state_utils: OAuthStateUtils, - redirect_uri_page_renderer: RedirectUriPageRenderer) -``` +- **request** (AsyncBoltRequest) – The request. +- **installation** (Installation) – The installation data. +- **settings** (AsyncOAuthSettings) – The settings for Slack OAuth flow. +- **default** (AsyncCallbackOptions) – The default `AsyncCallbackOptions`. diff --git a/docs/english/reference/oauth/async_internals.md b/docs/english/reference/oauth/async_internals.md index e0e3d5098..0f5f9b135 100644 --- a/docs/english/reference/oauth/async_internals.md +++ b/docs/english/reference/oauth/async_internals.md @@ -3,20 +3,4 @@ sidebar_label: async_internals title: slack_bolt.oauth.async_internals --- -#### default\_installation\_stores: `Dict[str, AsyncInstallationStore]` -#### get\_or\_create\_default\_installation\_store - -```python -def get_or_create_default_installation_store(client_id: str) -> AsyncInstallationStore -``` - -#### select\_consistent\_installation\_store - -```python -def select_consistent_installation_store( - client_id: str, - app_store: Optional[AsyncInstallationStore], - oauth_flow_store: Optional[AsyncInstallationStore], - logger: Logger) -> Optional[AsyncInstallationStore] -``` diff --git a/docs/english/reference/oauth/async_oauth_flow.md b/docs/english/reference/oauth/async_oauth_flow.md index 49c49453d..f9738c2dc 100644 --- a/docs/english/reference/oauth/async_oauth_flow.md +++ b/docs/english/reference/oauth/async_oauth_flow.md @@ -3,125 +3,16 @@ sidebar_label: async_oauth_flow title: slack_bolt.oauth.async_oauth_flow --- -## AsyncOAuthFlow Objects +## `AsyncOAuthFlow` ```python -class AsyncOAuthFlow() -``` - -#### settings: `AsyncOAuthSettings` - -#### client\_id: `str` - -#### redirect\_uri: `Optional[str]` - -#### install\_path: `str` - -#### redirect\_uri\_path: `str` - -#### success\_handler: `Callable[[AsyncSuccessArgs], Awaitable[BoltResponse]]` - -#### failure\_handler: `Callable[[AsyncFailureArgs], Awaitable[BoltResponse]]` - -#### \_\_init\_\_ - -```python -def __init__( - *, - client: Optional[AsyncWebClient] = None, - logger: Optional[Logger] = None, - settings: AsyncOAuthSettings) +AsyncOAuthFlow(*, client=None, logger=None, settings) ``` The module to run the Slack app installation flow (OAuth flow). -**Arguments**: - -- `client` _Optional[AsyncWebClient]_ - The `slack_sdk.web.async_client.AsyncWebClient` instance. -- `logger` _Optional[Logger]_ - The logger. -- `settings` _AsyncOAuthSettings_ - OAuth settings to configure this module. - -#### client - -```python -@property -def client() -> AsyncWebClient -``` - -#### logger - -```python -@property -def logger() -> Logger -``` - -#### sqlite3 - -```python -def sqlite3( - database: str, - authorization_url: Optional[str] = None, - client_id: Optional[str] = None, - client_secret: Optional[str] = None, - scopes: Optional[Sequence[str]] = None, - user_scopes: Optional[Sequence[str]] = None, - redirect_uri: Optional[str] = None, - install_path: Optional[str] = None, - redirect_uri_path: Optional[str] = None, - callback_options: Optional[AsyncCallbackOptions] = None, - success_url: Optional[str] = None, - failure_url: Optional[str] = None, - state_cookie_name: str = OAuthStateUtils.default_cookie_name, - state_expiration_seconds: int = OAuthStateUtils.default_expiration_seconds, - installation_store_bot_only: bool = False, - client: Optional[AsyncWebClient] = None, - logger: Optional[Logger] = None) -> AsyncOAuthFlow -``` - -#### handle\_installation - -```python -async def handle_installation(request: AsyncBoltRequest) -> BoltResponse -``` +**Parameters:** -#### issue\_new\_state - -```python -async def issue_new_state(request: AsyncBoltRequest) -> str -``` - -#### build\_authorize\_url - -```python -async def build_authorize_url(state: str, request: AsyncBoltRequest) -> str -``` - -#### build\_install\_page\_html - -```python -async def build_install_page_html(url: str, request: AsyncBoltRequest) -> str -``` - -#### append\_set\_cookie\_headers - -```python -async def append_set_cookie_headers(headers: dict, set_cookie_value: Optional[str]) -``` - -#### handle\_callback - -```python -async def handle_callback(request: AsyncBoltRequest) -> BoltResponse -``` - -#### run\_installation - -```python -async def run_installation(code: str) -> Optional[Installation] -``` - -#### store\_installation - -```python -async def store_installation(request: AsyncBoltRequest, installation: Installation) -``` +- **client** (Optional[AsyncWebClient]) – The `slack_sdk.web.async_client.AsyncWebClient` instance. +- **logger** (Optional[Logger]) – The logger. +- **settings** (AsyncOAuthSettings) – OAuth settings to configure this module. diff --git a/docs/english/reference/oauth/async_oauth_settings.md b/docs/english/reference/oauth/async_oauth_settings.md index fca5fd18f..79f6fad7d 100644 --- a/docs/english/reference/oauth/async_oauth_settings.md +++ b/docs/english/reference/oauth/async_oauth_settings.md @@ -3,116 +3,38 @@ sidebar_label: async_oauth_settings title: slack_bolt.oauth.async_oauth_settings --- -## AsyncOAuthSettings Objects +## `AsyncOAuthSettings` ```python -class AsyncOAuthSettings() -``` - -#### client\_id: `str` - -#### client\_secret: `str` - -#### scopes: `Optional[Sequence[str]]` - -#### user\_scopes: `Optional[Sequence[str]]` - -#### redirect\_uri: `Optional[str]` - -#### install\_path: `str` - -#### install\_page\_rendering\_enabled: `bool` - -#### redirect\_uri\_path: `str` - -#### callback\_options: `Optional[AsyncCallbackOptions]` - -#### success\_url: `Optional[str]` - -#### failure\_url: `Optional[str]` - -#### authorization\_url: `str` - -#### installation\_store: `AsyncInstallationStore` - -#### installation\_store\_bot\_only: `bool` - -#### token\_rotation\_expiration\_minutes: `int` - -#### user\_token\_resolution: `str` - -#### authorize: `AsyncAuthorize` - -#### state\_validation\_enabled: `bool` - -#### state\_store: `AsyncOAuthStateStore` - -#### state\_cookie\_name: `str` - -#### state\_expiration\_seconds: `int` - -#### state\_utils: `OAuthStateUtils` - -#### authorize\_url\_generator: `AuthorizeUrlGenerator` - -#### redirect\_uri\_page\_renderer: `RedirectUriPageRenderer` - -#### logger: `Logger` - -#### \_\_init\_\_ - -```python -def __init__( - *, - client_id: Optional[str] = None, - client_secret: Optional[str] = None, - scopes: Optional[Union[Sequence[str], str]] = None, - user_scopes: Optional[Union[Sequence[str], str]] = None, - redirect_uri: Optional[str] = None, - install_path: str = '/slack/install', - install_page_rendering_enabled: bool = True, - redirect_uri_path: str = '/slack/oauth_redirect', - callback_options: Optional[AsyncCallbackOptions] = None, - success_url: Optional[str] = None, - failure_url: Optional[str] = None, - authorization_url: Optional[str] = None, - installation_store: Optional[AsyncInstallationStore] = None, - installation_store_bot_only: bool = False, - token_rotation_expiration_minutes: int = 120, - user_token_resolution: str = 'authed_user', - state_validation_enabled: bool = True, - state_store: Optional[AsyncOAuthStateStore] = None, - state_cookie_name: str = OAuthStateUtils.default_cookie_name, - state_expiration_seconds: int = OAuthStateUtils.default_expiration_seconds, - logger: Logger = logging.getLogger(__name__)) +AsyncOAuthSettings(*, client_id=None, client_secret=None, scopes=None, user_scopes=None, redirect_uri=None, install_path='/slack/install', install_page_rendering_enabled=True, redirect_uri_path='/slack/oauth_redirect', callback_options=None, success_url=None, failure_url=None, authorization_url=None, installation_store=None, installation_store_bot_only=False, token_rotation_expiration_minutes=120, user_token_resolution='authed_user', state_validation_enabled=True, state_store=None, state_cookie_name=OAuthStateUtils.default_cookie_name, state_expiration_seconds=OAuthStateUtils.default_expiration_seconds, logger=logging.getLogger(__name__)) ``` The settings for Slack App installation (OAuth flow). -**Arguments**: - -- `client_id` _Optional[str]_ - Check the value in Settings > Basic Information > App Credentials -- `client_secret` _Optional[str]_ - Check the value in Settings > Basic Information > App Credentials -- `scopes` _Optional[Union[Sequence[str], str]]_ - Check the value in Settings > Manage Distribution -- `user_scopes` _Optional[Union[Sequence[str], str]]_ - Check the value in Settings > Manage Distribution -- `redirect_uri` _Optional[str]_ - Check the value in Features > OAuth & Permissions > Redirect URLs -- `install_path` _str_ - The endpoint to start an OAuth flow (Default: `/slack/install`) -- `install_page_rendering_enabled` _bool_ - Renders a web page for install_path access if True -- `redirect_uri_path` _str_ - The path of Redirect URL (Default: `/slack/oauth_redirect`) -- `callback_options` _Optional[AsyncCallbackOptions]_ - Give success/failure functions f you want to customize callback functions. -- `success_url` _Optional[str]_ - Set a complete URL if you want to redirect end-users when an installation completes. -- `failure_url` _Optional[str]_ - Set a complete URL if you want to redirect end-users when an installation fails. -- `authorization_url` _Optional[str]_ - Set a URL if you want to customize the URL `https://slack.com/oauth/v2/authorize` -- `installation_store` _Optional[AsyncInstallationStore]_ - Specify the instance of `InstallationStore` (Default: `FileInstallationStore`) -- `installation_store_bot_only` _bool_ - Use `InstallationStore#find_bot()` if True (Default: False) -- `token_rotation_expiration_minutes` _int_ - Minutes before refreshing tokens (Default: 2 hours) -- `user_token_resolution` _str_ - The option to pick up a user token per request (Default: authed_user) - The available values are "authed_user" and "actor". When you want to resolve the user token per request - using the event's actor IDs, you can set "actor" instead. With this option, bolt-python tries to resolve - a user token for context.actor_enterprise/team/user_id. This can be useful for events in Slack Connect - channels. Note that actor IDs can be absent in some scenarios. -- `state_validation_enabled` _bool_ - Set False if your OAuth flow omits the state parameter validation (Default: True) -- `state_store` _Optional[AsyncOAuthStateStore]_ - Specify the instance of `InstallationStore` (Default: `FileOAuthStateStore`) -- `state_cookie_name` _str_ - The cookie name that is set for installers' browser. (Default: "slack-app-oauth-state") -- `state_expiration_seconds` _int_ - The seconds that the state value is alive (Default: 600 seconds) -- `logger` _Logger_ - The logger that will be used internally +**Parameters:** + +- **client_id** (Optional[str]) – Check the value in Settings > Basic Information > App Credentials +- **client_secret** (Optional[str]) – Check the value in Settings > Basic Information > App Credentials +- **scopes** (Optional[Union[Sequence[str], str]]) – Check the value in Settings > Manage Distribution +- **user_scopes** (Optional[Union[Sequence[str], str]]) – Check the value in Settings > Manage Distribution +- **redirect_uri** (Optional[str]) – Check the value in Features > OAuth & Permissions > Redirect URLs +- **install_path** (str) – The endpoint to start an OAuth flow (Default: `/slack/install`) +- **install_page_rendering_enabled** (bool) – Renders a web page for install_path access if True +- **redirect_uri_path** (str) – The path of Redirect URL (Default: `/slack/oauth_redirect`) +- **callback_options** (Optional[AsyncCallbackOptions]) – Give success/failure functions f you want to customize callback functions. +- **success_url** (Optional[str]) – Set a complete URL if you want to redirect end-users when an installation completes. +- **failure_url** (Optional[str]) – Set a complete URL if you want to redirect end-users when an installation fails. +- **authorization_url** (Optional[str]) – Set a URL if you want to customize the URL `https://slack.com/oauth/v2/authorize` +- **installation_store** (Optional[AsyncInstallationStore]) – Specify the instance of `InstallationStore` (Default: `FileInstallationStore`) +- **installation_store_bot_only** (bool) – Use `InstallationStore#find_bot()` if True (Default: False) +- **token_rotation_expiration_minutes** (int) – Minutes before refreshing tokens (Default: 2 hours) +- **user_token_resolution** (str) – The option to pick up a user token per request (Default: authed_user) +The available values are "authed_user" and "actor". When you want to resolve the user token per request +using the event's actor IDs, you can set "actor" instead. With this option, bolt-python tries to resolve +a user token for context.actor_enterprise/team/user_id. This can be useful for events in Slack Connect +channels. Note that actor IDs can be absent in some scenarios. +- **state_validation_enabled** (bool) – Set False if your OAuth flow omits the state parameter validation (Default: True) +- **state_store** (Optional[AsyncOAuthStateStore]) – Specify the instance of `InstallationStore` (Default: `FileOAuthStateStore`) +- **state_cookie_name** (str) – The cookie name that is set for installers' browser. (Default: "slack-app-oauth-state") +- **state_expiration_seconds** (int) – The seconds that the state value is alive (Default: 600 seconds) +- **logger** (Logger) – The logger that will be used internally diff --git a/docs/english/reference/oauth/callback_options.md b/docs/english/reference/oauth/callback_options.md index 44ff7fcbb..5072779af 100644 --- a/docs/english/reference/oauth/callback_options.md +++ b/docs/english/reference/oauth/callback_options.md @@ -3,103 +3,47 @@ sidebar_label: callback_options title: slack_bolt.oauth.callback_options --- -## SuccessArgs Objects +## `CallbackOptions` ```python -class SuccessArgs() +CallbackOptions(success, failure) ``` -#### \_\_init\_\_ - -```python -def __init__( - *, - request: BoltRequest, - installation: Installation, - settings: OAuthSettings, - default: CallbackOptions) -``` - -The arguments for a success function. - -**Arguments**: - -- `request` _BoltRequest_ - The request. -- `installation` _Installation_ - The installation data. -- `settings` _OAuthSettings_ - The settings for Slack OAuth flow. -- `default` _CallbackOptions_ - The default `CallbackOptions` +The configurations for OAuth flow. -## FailureArgs Objects +**Parameters:** -```python -class FailureArgs() -``` +- **success** (Callable[[SuccessArgs], BoltResponse]) – A handler for successful installation. +- **failure** (Callable[[FailureArgs], BoltResponse]) – A handler for any types of installation failures. -#### \_\_init\_\_ +## `FailureArgs` ```python -def __init__( - *, - request: BoltRequest, - reason: str, - error: Optional[Exception] = None, - suggested_status_code: int, - settings: OAuthSettings, - default: CallbackOptions) +FailureArgs(*, request, reason, error=None, suggested_status_code, settings, default) ``` The arguments for a failure function. -**Arguments**: - -- `request` _BoltRequest_ - The request. -- `reason` _str_ - The response. -- `error` _Optional[Exception]_ - An exception if exists. -- `suggested_status_code` _int_ - The recommended HTTP status code for the failure. -- `settings` _OAuthSettings_ - The settings for Slack OAuth flow. -- `default` _CallbackOptions_ - The default `CallbackOptions`. - -## CallbackOptions Objects - -```python -class CallbackOptions() -``` - -#### success: `Callable[[SuccessArgs], BoltResponse]` - -#### failure: `Callable[[FailureArgs], BoltResponse]` - -#### \_\_init\_\_ - -```python -def __init__( - success: Callable[[SuccessArgs], BoltResponse], - failure: Callable[[FailureArgs], BoltResponse]) -``` - -The configurations for OAuth flow. - -**Arguments**: +**Parameters:** -- `success` _Callable[[SuccessArgs], BoltResponse]_ - A handler for successful installation. -- `failure` _Callable[[FailureArgs], BoltResponse]_ - A handler for any types of installation failures. +- **request** (BoltRequest) – The request. +- **reason** (str) – The response. +- **error** (Optional[Exception]) – An exception if exists. +- **suggested_status_code** (int) – The recommended HTTP status code for the failure. +- **settings** (OAuthSettings) – The settings for Slack OAuth flow. +- **default** (CallbackOptions) – The default `CallbackOptions`. -## DefaultCallbackOptions Objects +## `SuccessArgs` ```python -class DefaultCallbackOptions(CallbackOptions) +SuccessArgs(*, request, installation, settings, default) ``` -#### success: `Callable[[SuccessArgs], BoltResponse]` - -#### failure: `Callable[[FailureArgs], BoltResponse]` +The arguments for a success function. -#### \_\_init\_\_ +**Parameters:** -```python -def __init__( - *, - logger: Logger, - state_utils: OAuthStateUtils, - redirect_uri_page_renderer: RedirectUriPageRenderer) -``` +- **request** (BoltRequest) – The request. +- **installation** (Installation) – The installation data. +- **settings** (OAuthSettings) – The settings for Slack OAuth flow. +- **default** (CallbackOptions) – The default `CallbackOptions` diff --git a/docs/english/reference/oauth/index.md b/docs/english/reference/oauth/index.md index 29fa841a6..816ac48b7 100644 --- a/docs/english/reference/oauth/index.md +++ b/docs/english/reference/oauth/index.md @@ -7,6 +7,20 @@ Slack OAuth flow support for building an app that is installable in any workspac Refer to https://docs.slack.dev/tools/bolt-python/concepts/authenticating-oauth for details. +## `OAuthFlow` + +```python +OAuthFlow(*, client=None, logger=None, settings) +``` + +The module to run the Slack app installation flow (OAuth flow). + +**Parameters:** + +- **client** (Optional[WebClient]) – The `slack_sdk.web.WebClient` instance. +- **logger** (Optional[Logger]) – The logger. +- **settings** (OAuthSettings) – OAuth settings to configure this module. + ## Submodules - [slack_bolt.oauth.async_callback_options](/tools/bolt-python/reference/oauth/async_callback_options) @@ -17,127 +31,3 @@ Refer to https://docs.slack.dev/tools/bolt-python/concepts/authenticating-oauth - [slack_bolt.oauth.internals](/tools/bolt-python/reference/oauth/internals) - [slack_bolt.oauth.oauth_flow](/tools/bolt-python/reference/oauth/oauth_flow) - [slack_bolt.oauth.oauth_settings](/tools/bolt-python/reference/oauth/oauth_settings) - -## OAuthFlow Objects - -```python -class OAuthFlow() -``` - -#### settings: `OAuthSettings` - -#### client\_id: `str` - -#### redirect\_uri: `Optional[str]` - -#### install\_path: `str` - -#### redirect\_uri\_path: `str` - -#### success\_handler: `Callable[[SuccessArgs], BoltResponse]` - -#### failure\_handler: `Callable[[FailureArgs], BoltResponse]` - -#### \_\_init\_\_ - -```python -def __init__( - *, - client: Optional[WebClient] = None, - logger: Optional[Logger] = None, - settings: OAuthSettings) -``` - -The module to run the Slack app installation flow (OAuth flow). - -**Arguments**: - -- `client` _Optional[WebClient]_ - The `slack_sdk.web.WebClient` instance. -- `logger` _Optional[Logger]_ - The logger. -- `settings` _OAuthSettings_ - OAuth settings to configure this module. - -#### client - -```python -@property -def client() -> WebClient -``` - -#### logger - -```python -@property -def logger() -> Logger -``` - -#### sqlite3 - -```python -def sqlite3( - database: str, - client_id: Optional[str] = None, - client_secret: Optional[str] = None, - scopes: Optional[Sequence[str]] = None, - user_scopes: Optional[Sequence[str]] = None, - redirect_uri: Optional[str] = None, - install_path: Optional[str] = None, - redirect_uri_path: Optional[str] = None, - callback_options: Optional[CallbackOptions] = None, - success_url: Optional[str] = None, - failure_url: Optional[str] = None, - authorization_url: Optional[str] = None, - state_cookie_name: str = OAuthStateUtils.default_cookie_name, - state_expiration_seconds: int = OAuthStateUtils.default_expiration_seconds, - installation_store_bot_only: bool = False, - token_rotation_expiration_minutes: int = 120, - client: Optional[WebClient] = None, - logger: Optional[Logger] = None) -> OAuthFlow -``` - -#### handle\_installation - -```python -def handle_installation(request: BoltRequest) -> BoltResponse -``` - -#### issue\_new\_state - -```python -def issue_new_state(request: BoltRequest) -> str -``` - -#### build\_authorize\_url - -```python -def build_authorize_url(state: str, request: BoltRequest) -> str -``` - -#### build\_install\_page\_html - -```python -def build_install_page_html(url: str, request: BoltRequest) -> str -``` - -#### append\_set\_cookie\_headers - -```python -def append_set_cookie_headers(headers: dict, set_cookie_value: Optional[str]) -``` - -#### handle\_callback - -```python -def handle_callback(request: BoltRequest) -> BoltResponse -``` - -#### run\_installation - -```python -def run_installation(code: str) -> Optional[Installation] -``` - -#### store\_installation - -```python -def store_installation(request: BoltRequest, installation: Installation) -``` diff --git a/docs/english/reference/oauth/internals.md b/docs/english/reference/oauth/internals.md index 34c9fc7ce..88068945f 100644 --- a/docs/english/reference/oauth/internals.md +++ b/docs/english/reference/oauth/internals.md @@ -3,42 +3,4 @@ sidebar_label: internals title: slack_bolt.oauth.internals --- -## CallbackResponseBuilder Objects -```python -class CallbackResponseBuilder() -``` - -#### \_\_init\_\_ - -```python -def __init__( - *, - logger: Logger, - state_utils: OAuthStateUtils, - redirect_uri_page_renderer: RedirectUriPageRenderer) -``` - -#### default\_installation\_stores: `Dict[str, InstallationStore]` - -#### get\_or\_create\_default\_installation\_store - -```python -def get_or_create_default_installation_store(client_id: str) -> InstallationStore -``` - -#### select\_consistent\_installation\_store - -```python -def select_consistent_installation_store( - client_id: str, - app_store: Optional[InstallationStore], - oauth_flow_store: Optional[InstallationStore], - logger: Logger) -> Optional[InstallationStore] -``` - -#### build\_detailed\_error - -```python -def build_detailed_error(reason: str) -> str -``` diff --git a/docs/english/reference/oauth/oauth_flow.md b/docs/english/reference/oauth/oauth_flow.md index 76e74b02d..897dce1ca 100644 --- a/docs/english/reference/oauth/oauth_flow.md +++ b/docs/english/reference/oauth/oauth_flow.md @@ -3,126 +3,16 @@ sidebar_label: oauth_flow title: slack_bolt.oauth.oauth_flow --- -## OAuthFlow Objects +## `OAuthFlow` ```python -class OAuthFlow() -``` - -#### settings: `OAuthSettings` - -#### client\_id: `str` - -#### redirect\_uri: `Optional[str]` - -#### install\_path: `str` - -#### redirect\_uri\_path: `str` - -#### success\_handler: `Callable[[SuccessArgs], BoltResponse]` - -#### failure\_handler: `Callable[[FailureArgs], BoltResponse]` - -#### \_\_init\_\_ - -```python -def __init__( - *, - client: Optional[WebClient] = None, - logger: Optional[Logger] = None, - settings: OAuthSettings) +OAuthFlow(*, client=None, logger=None, settings) ``` The module to run the Slack app installation flow (OAuth flow). -**Arguments**: - -- `client` _Optional[WebClient]_ - The `slack_sdk.web.WebClient` instance. -- `logger` _Optional[Logger]_ - The logger. -- `settings` _OAuthSettings_ - OAuth settings to configure this module. - -#### client - -```python -@property -def client() -> WebClient -``` - -#### logger - -```python -@property -def logger() -> Logger -``` - -#### sqlite3 - -```python -def sqlite3( - database: str, - client_id: Optional[str] = None, - client_secret: Optional[str] = None, - scopes: Optional[Sequence[str]] = None, - user_scopes: Optional[Sequence[str]] = None, - redirect_uri: Optional[str] = None, - install_path: Optional[str] = None, - redirect_uri_path: Optional[str] = None, - callback_options: Optional[CallbackOptions] = None, - success_url: Optional[str] = None, - failure_url: Optional[str] = None, - authorization_url: Optional[str] = None, - state_cookie_name: str = OAuthStateUtils.default_cookie_name, - state_expiration_seconds: int = OAuthStateUtils.default_expiration_seconds, - installation_store_bot_only: bool = False, - token_rotation_expiration_minutes: int = 120, - client: Optional[WebClient] = None, - logger: Optional[Logger] = None) -> OAuthFlow -``` - -#### handle\_installation - -```python -def handle_installation(request: BoltRequest) -> BoltResponse -``` +**Parameters:** -#### issue\_new\_state - -```python -def issue_new_state(request: BoltRequest) -> str -``` - -#### build\_authorize\_url - -```python -def build_authorize_url(state: str, request: BoltRequest) -> str -``` - -#### build\_install\_page\_html - -```python -def build_install_page_html(url: str, request: BoltRequest) -> str -``` - -#### append\_set\_cookie\_headers - -```python -def append_set_cookie_headers(headers: dict, set_cookie_value: Optional[str]) -``` - -#### handle\_callback - -```python -def handle_callback(request: BoltRequest) -> BoltResponse -``` - -#### run\_installation - -```python -def run_installation(code: str) -> Optional[Installation] -``` - -#### store\_installation - -```python -def store_installation(request: BoltRequest, installation: Installation) -``` +- **client** (Optional[WebClient]) – The `slack_sdk.web.WebClient` instance. +- **logger** (Optional[Logger]) – The logger. +- **settings** (OAuthSettings) – OAuth settings to configure this module. diff --git a/docs/english/reference/oauth/oauth_settings.md b/docs/english/reference/oauth/oauth_settings.md index 3f2793041..c6088e5ea 100644 --- a/docs/english/reference/oauth/oauth_settings.md +++ b/docs/english/reference/oauth/oauth_settings.md @@ -3,116 +3,38 @@ sidebar_label: oauth_settings title: slack_bolt.oauth.oauth_settings --- -## OAuthSettings Objects +## `OAuthSettings` ```python -class OAuthSettings() -``` - -#### client\_id: `str` - -#### client\_secret: `str` - -#### scopes: `Optional[Sequence[str]]` - -#### user\_scopes: `Optional[Sequence[str]]` - -#### redirect\_uri: `Optional[str]` - -#### install\_path: `str` - -#### install\_page\_rendering\_enabled: `bool` - -#### redirect\_uri\_path: `str` - -#### callback\_options: `Optional[CallbackOptions]` - -#### success\_url: `Optional[str]` - -#### failure\_url: `Optional[str]` - -#### authorization\_url: `str` - -#### installation\_store: `InstallationStore` - -#### installation\_store\_bot\_only: `bool` - -#### token\_rotation\_expiration\_minutes: `int` - -#### authorize: `Authorize` - -#### user\_token\_resolution: `str` - -#### state\_validation\_enabled: `bool` - -#### state\_store: `OAuthStateStore` - -#### state\_cookie\_name: `str` - -#### state\_expiration\_seconds: `int` - -#### state\_utils: `OAuthStateUtils` - -#### authorize\_url\_generator: `AuthorizeUrlGenerator` - -#### redirect\_uri\_page\_renderer: `RedirectUriPageRenderer` - -#### logger: `Logger` - -#### \_\_init\_\_ - -```python -def __init__( - *, - client_id: Optional[str] = None, - client_secret: Optional[str] = None, - scopes: Optional[Union[Sequence[str], str]] = None, - user_scopes: Optional[Union[Sequence[str], str]] = None, - redirect_uri: Optional[str] = None, - install_path: str = '/slack/install', - install_page_rendering_enabled: bool = True, - redirect_uri_path: str = '/slack/oauth_redirect', - callback_options: Optional[CallbackOptions] = None, - success_url: Optional[str] = None, - failure_url: Optional[str] = None, - authorization_url: Optional[str] = None, - installation_store: Optional[InstallationStore] = None, - installation_store_bot_only: bool = False, - token_rotation_expiration_minutes: int = 120, - user_token_resolution: str = 'authed_user', - state_validation_enabled: bool = True, - state_store: Optional[OAuthStateStore] = None, - state_cookie_name: str = OAuthStateUtils.default_cookie_name, - state_expiration_seconds: int = OAuthStateUtils.default_expiration_seconds, - logger: Logger = logging.getLogger(__name__)) +OAuthSettings(*, client_id=None, client_secret=None, scopes=None, user_scopes=None, redirect_uri=None, install_path='/slack/install', install_page_rendering_enabled=True, redirect_uri_path='/slack/oauth_redirect', callback_options=None, success_url=None, failure_url=None, authorization_url=None, installation_store=None, installation_store_bot_only=False, token_rotation_expiration_minutes=120, user_token_resolution='authed_user', state_validation_enabled=True, state_store=None, state_cookie_name=OAuthStateUtils.default_cookie_name, state_expiration_seconds=OAuthStateUtils.default_expiration_seconds, logger=logging.getLogger(__name__)) ``` The settings for Slack App installation (OAuth flow). -**Arguments**: - -- `client_id` _Optional[str]_ - Check the value in Settings > Basic Information > App Credentials -- `client_secret` _Optional[str]_ - Check the value in Settings > Basic Information > App Credentials -- `scopes` _Optional[Union[Sequence[str], str]]_ - Check the value in Settings > Manage Distribution -- `user_scopes` _Optional[Union[Sequence[str], str]]_ - Check the value in Settings > Manage Distribution -- `redirect_uri` _Optional[str]_ - Check the value in Features > OAuth & Permissions > Redirect URLs -- `install_path` _str_ - The endpoint to start an OAuth flow (Default: `/slack/install`) -- `install_page_rendering_enabled` _bool_ - Renders a web page for install_path access if True -- `redirect_uri_path` _str_ - The path of Redirect URL (Default: `/slack/oauth_redirect`) -- `callback_options` _Optional[CallbackOptions]_ - Give success/failure functions f you want to customize callback functions. -- `success_url` _Optional[str]_ - Set a complete URL if you want to redirect end-users when an installation completes. -- `failure_url` _Optional[str]_ - Set a complete URL if you want to redirect end-users when an installation fails. -- `authorization_url` _Optional[str]_ - Set a URL if you want to customize the URL `https://slack.com/oauth/v2/authorize` -- `installation_store` _Optional[InstallationStore]_ - Specify the instance of `InstallationStore` (Default: `FileInstallationStore`) -- `installation_store_bot_only` _bool_ - Use `InstallationStore#find_bot()` if True (Default: False) -- `token_rotation_expiration_minutes` _int_ - Minutes before refreshing tokens (Default: 2 hours) -- `user_token_resolution` _str_ - The option to pick up a user token per request (Default: authed_user) - The available values are "authed_user" and "actor". When you want to resolve the user token per request - using the event's actor IDs, you can set "actor" instead. With this option, bolt-python tries to resolve - a user token for context.actor_enterprise/team/user_id. This can be useful for events in Slack Connect - channels. Note that actor IDs can be absent in some scenarios. -- `state_validation_enabled` _bool_ - Set False if your OAuth flow omits the state parameter validation (Default: True) -- `state_store` _Optional[OAuthStateStore]_ - Specify the instance of `InstallationStore` (Default: `FileOAuthStateStore`) -- `state_cookie_name` _str_ - The cookie name that is set for installers' browser. (Default: "slack-app-oauth-state") -- `state_expiration_seconds` _int_ - The seconds that the state value is alive (Default: 600 seconds) -- `logger` _Logger_ - The logger that will be used internally +**Parameters:** + +- **client_id** (Optional[str]) – Check the value in Settings > Basic Information > App Credentials +- **client_secret** (Optional[str]) – Check the value in Settings > Basic Information > App Credentials +- **scopes** (Optional[Union[Sequence[str], str]]) – Check the value in Settings > Manage Distribution +- **user_scopes** (Optional[Union[Sequence[str], str]]) – Check the value in Settings > Manage Distribution +- **redirect_uri** (Optional[str]) – Check the value in Features > OAuth & Permissions > Redirect URLs +- **install_path** (str) – The endpoint to start an OAuth flow (Default: `/slack/install`) +- **install_page_rendering_enabled** (bool) – Renders a web page for install_path access if True +- **redirect_uri_path** (str) – The path of Redirect URL (Default: `/slack/oauth_redirect`) +- **callback_options** (Optional[CallbackOptions]) – Give success/failure functions f you want to customize callback functions. +- **success_url** (Optional[str]) – Set a complete URL if you want to redirect end-users when an installation completes. +- **failure_url** (Optional[str]) – Set a complete URL if you want to redirect end-users when an installation fails. +- **authorization_url** (Optional[str]) – Set a URL if you want to customize the URL `https://slack.com/oauth/v2/authorize` +- **installation_store** (Optional[InstallationStore]) – Specify the instance of `InstallationStore` (Default: `FileInstallationStore`) +- **installation_store_bot_only** (bool) – Use `InstallationStore#find_bot()` if True (Default: False) +- **token_rotation_expiration_minutes** (int) – Minutes before refreshing tokens (Default: 2 hours) +- **user_token_resolution** (str) – The option to pick up a user token per request (Default: authed_user) +The available values are "authed_user" and "actor". When you want to resolve the user token per request +using the event's actor IDs, you can set "actor" instead. With this option, bolt-python tries to resolve +a user token for context.actor_enterprise/team/user_id. This can be useful for events in Slack Connect +channels. Note that actor IDs can be absent in some scenarios. +- **state_validation_enabled** (bool) – Set False if your OAuth flow omits the state parameter validation (Default: True) +- **state_store** (Optional[OAuthStateStore]) – Specify the instance of `InstallationStore` (Default: `FileOAuthStateStore`) +- **state_cookie_name** (str) – The cookie name that is set for installers' browser. (Default: "slack-app-oauth-state") +- **state_expiration_seconds** (int) – The seconds that the state value is alive (Default: 600 seconds) +- **logger** (Logger) – The logger that will be used internally diff --git a/docs/english/reference/request/async_internals.md b/docs/english/reference/request/async_internals.md index 9bc9262d6..eb9a039c2 100644 --- a/docs/english/reference/request/async_internals.md +++ b/docs/english/reference/request/async_internals.md @@ -3,10 +3,4 @@ sidebar_label: async_internals title: slack_bolt.request.async_internals --- -#### build\_async\_context -```python -def build_async_context( - context: AsyncBoltContext, - body: Dict[str, Any]) -> AsyncBoltContext -``` diff --git a/docs/english/reference/request/async_request.md b/docs/english/reference/request/async_request.md index 5c5944970..55b2b2604 100644 --- a/docs/english/reference/request/async_request.md +++ b/docs/english/reference/request/async_request.md @@ -3,54 +3,18 @@ sidebar_label: async_request title: slack_bolt.request.async_request --- -## AsyncBoltRequest Objects +## `AsyncBoltRequest` ```python -class AsyncBoltRequest() -``` - -#### raw\_body: `str` - -#### body: `Dict[str, Any]` - -#### query: `Dict[str, Sequence[str]]` - -#### headers: `Dict[str, Sequence[str]]` - -#### content\_type: `Optional[str]` - -#### context: `AsyncBoltContext` - -#### lazy\_only: `bool` - -#### lazy\_function\_name: `Optional[str]` - -#### mode: `str` - -#### \_\_init\_\_ - -```python -def __init__( - *, - body: Union[str, dict], - query: Optional[Union[str, Dict[str, str], Dict[str, Sequence[str]]]] = None, - headers: Optional[Dict[str, Union[str, Sequence[str]]]] = None, - context: Optional[Dict[str, Any]] = None, - mode: str = 'http') +AsyncBoltRequest(*, body, query=None, headers=None, context=None, mode='http') ``` Request to a Bolt app. -**Arguments**: +**Parameters:** -- `body` _Union[str, dict]_ - The raw request body (only plain text is supported for "http" mode) -- `query` _Optional[Union[str, Dict[str, str], Dict[str, Sequence[str]]]]_ - The query string data in any data format. -- `headers` _Optional[Dict[str, Union[str, Sequence[str]]]]_ - The request headers. -- `context` _Optional[Dict[str, Any]]_ - The context in this request. -- `mode` _str_ - The mode used for this request. (either "http" or "socket_mode") - -#### to\_copyable - -```python -def to_copyable() -> AsyncBoltRequest -``` +- **body** (Union[str, dict]) – The raw request body (only plain text is supported for "http" mode) +- **query** (Optional[Union[str, Dict[str, str], Dict[str, Sequence[str]]]]) – The query string data in any data format. +- **headers** (Optional[Dict[str, Union[str, Sequence[str]]]]) – The request headers. +- **context** (Optional[Dict[str, Any]]) – The context in this request. +- **mode** (str) – The mode used for this request. (either "http" or "socket_mode") diff --git a/docs/english/reference/request/index.md b/docs/english/reference/request/index.md index 2a3e6d251..bfeeab5dd 100644 --- a/docs/english/reference/request/index.md +++ b/docs/english/reference/request/index.md @@ -8,62 +8,26 @@ Incoming request from Slack through either HTTP request or Socket Mode connectio Refer to https://docs.slack.dev/apis/events-api/ for the two types of connections. This interface encapsulates the difference between the two. -## Submodules - -- [slack_bolt.request.async_internals](/tools/bolt-python/reference/request/async_internals) -- [slack_bolt.request.async_request](/tools/bolt-python/reference/request/async_request) -- [slack_bolt.request.internals](/tools/bolt-python/reference/request/internals) -- [slack_bolt.request.payload_utils](/tools/bolt-python/reference/request/payload_utils) -- [slack_bolt.request.request](/tools/bolt-python/reference/request/request) - -## BoltRequest Objects +## `BoltRequest` ```python -class BoltRequest() -``` - -#### raw\_body: `str` - -#### query: `Dict[str, Sequence[str]]` - -#### headers: `Dict[str, Sequence[str]]` - -#### content\_type: `Optional[str]` - -#### body: `Dict[str, Any]` - -#### context: `BoltContext` - -#### lazy\_only: `bool` - -#### lazy\_function\_name: `Optional[str]` - -#### mode: `str` - -#### \_\_init\_\_ - -```python -def __init__( - *, - body: Union[str, dict], - query: Optional[Union[str, Dict[str, str], Dict[str, Sequence[str]]]] = None, - headers: Optional[Dict[str, Union[str, Sequence[str]]]] = None, - context: Optional[Dict[str, Any]] = None, - mode: str = 'http') +BoltRequest(*, body, query=None, headers=None, context=None, mode='http') ``` Request to a Bolt app. -**Arguments**: +**Parameters:** -- `body` _Union[str, dict]_ - The raw request body (only plain text is supported for "http" mode) -- `query` _Optional[Union[str, Dict[str, str], Dict[str, Sequence[str]]]]_ - The query string data in any data format. -- `headers` _Optional[Dict[str, Union[str, Sequence[str]]]]_ - The request headers. -- `context` _Optional[Dict[str, Any]]_ - The context in this request. -- `mode` _str_ - The mode used for this request. (either "http" or "socket_mode") +- **body** (Union[str, dict]) – The raw request body (only plain text is supported for "http" mode) +- **query** (Optional[Union[str, Dict[str, str], Dict[str, Sequence[str]]]]) – The query string data in any data format. +- **headers** (Optional[Dict[str, Union[str, Sequence[str]]]]) – The request headers. +- **context** (Optional[Dict[str, Any]]) – The context in this request. +- **mode** (str) – The mode used for this request. (either "http" or "socket_mode") -#### to\_copyable +## Submodules -```python -def to_copyable() -> BoltRequest -``` +- [slack_bolt.request.async_internals](/tools/bolt-python/reference/request/async_internals) +- [slack_bolt.request.async_request](/tools/bolt-python/reference/request/async_request) +- [slack_bolt.request.internals](/tools/bolt-python/reference/request/internals) +- [slack_bolt.request.payload_utils](/tools/bolt-python/reference/request/payload_utils) +- [slack_bolt.request.request](/tools/bolt-python/reference/request/request) diff --git a/docs/english/reference/request/internals.md b/docs/english/reference/request/internals.md index 321deec77..cae00ef03 100644 --- a/docs/english/reference/request/internals.md +++ b/docs/english/reference/request/internals.md @@ -3,118 +3,4 @@ sidebar_label: internals title: slack_bolt.request.internals --- -#### parse\_query -```python -def parse_query( - query: Optional[Union[str, Dict[str, str], Dict[str, Sequence[str]]]]) -> Dict[str, Sequence[str]] -``` - -#### parse\_body - -```python -def parse_body(body: str, content_type: Optional[str]) -> Dict[str, Any] -``` - -#### extract\_is\_enterprise\_install - -```python -def extract_is_enterprise_install(payload: Dict[str, Any]) -> Optional[bool] -``` - -#### extract\_enterprise\_id - -```python -def extract_enterprise_id(payload: Dict[str, Any]) -> Optional[str] -``` - -#### extract\_actor\_enterprise\_id - -```python -def extract_actor_enterprise_id(payload: Dict[str, Any]) -> Optional[str] -``` - -#### extract\_team\_id - -```python -def extract_team_id(payload: Dict[str, Any]) -> Optional[str] -``` - -#### extract\_actor\_team\_id - -```python -def extract_actor_team_id(payload: Dict[str, Any]) -> Optional[str] -``` - -#### extract\_user\_id - -```python -def extract_user_id(payload: Dict[str, Any]) -> Optional[str] -``` - -#### extract\_actor\_user\_id - -```python -def extract_actor_user_id(payload: Dict[str, Any]) -> Optional[str] -``` - -#### extract\_channel\_id - -```python -def extract_channel_id(payload: Dict[str, Any]) -> Optional[str] -``` - -#### extract\_thread\_ts - -```python -def extract_thread_ts(payload: Dict[str, Any]) -> Optional[str] -``` - -#### extract\_function\_execution\_id - -```python -def extract_function_execution_id(payload: Dict[str, Any]) -> Optional[str] -``` - -#### extract\_function\_bot\_access\_token - -```python -def extract_function_bot_access_token(payload: Dict[str, Any]) -> Optional[str] -``` - -#### extract\_function\_inputs - -```python -def extract_function_inputs(payload: Dict[str, Any]) -> Optional[Dict[str, Any]] -``` - -#### build\_context - -```python -def build_context(context: BoltContext, body: Dict[str, Any]) -> BoltContext -``` - -#### extract\_content\_type - -```python -def extract_content_type(headers: Dict[str, Sequence[str]]) -> Optional[str] -``` - -#### build\_normalized\_headers - -```python -def build_normalized_headers( - headers: Optional[Dict[str, Union[str, Sequence[str]]]]) -> Dict[str, Sequence[str]] -``` - -#### error\_message\_raw\_body\_required\_in\_http\_mode - -```python -def error_message_raw_body_required_in_http_mode() -> str -``` - -#### debug\_multiple\_response\_urls\_detected - -```python -def debug_multiple_response_urls_detected() -> str -``` diff --git a/docs/english/reference/request/payload_utils.md b/docs/english/reference/request/payload_utils.md index cb7a62513..f060fa860 100644 --- a/docs/english/reference/request/payload_utils.md +++ b/docs/english/reference/request/payload_utils.md @@ -3,230 +3,4 @@ sidebar_label: payload_utils title: slack_bolt.request.payload_utils --- -#### to\_event -```python -def to_event(body: Dict[str, Any]) -> Optional[Dict[str, Any]] -``` - -#### to\_message - -```python -def to_message(body: Dict[str, Any]) -> Optional[Dict[str, Any]] -``` - -#### is\_function - -```python -def is_function(body: Dict[str, Any]) -> bool -``` - -#### is\_event - -```python -def is_event(body: Dict[str, Any]) -> bool -``` - -#### is\_workflow\_step\_execute - -```python -def is_workflow_step_execute(body: Dict[str, Any]) -> bool -``` - -#### is\_message\_event - -```python -def is_message_event(body: Dict[str, Any]) -> bool -``` - -#### is\_any\_im\_message\_event - -```python -def is_any_im_message_event(body: Dict[str, Any]) -> bool -``` - -#### is\_im\_message\_event - -```python -def is_im_message_event(body: Dict[str, Any]) -> bool -``` - -#### is\_assistant\_event - -```python -def is_assistant_event(body: Dict[str, Any]) -> bool -``` - -#### is\_assistant\_thread\_started\_event - -```python -def is_assistant_thread_started_event(body: Dict[str, Any]) -> bool -``` - -#### is\_assistant\_thread\_context\_changed\_event - -```python -def is_assistant_thread_context_changed_event(body: Dict[str, Any]) -> bool -``` - -#### is\_app\_home\_opened\_event - -```python -def is_app_home_opened_event(body: Dict[str, Any], tab: Optional[str] = None) -> bool -``` - -#### is\_user\_message\_event\_in\_assistant\_thread - -```python -def is_user_message_event_in_assistant_thread(body: Dict[str, Any]) -> bool -``` - -#### is\_bot\_message\_event\_in\_assistant\_thread - -```python -def is_bot_message_event_in_assistant_thread(body: Dict[str, Any]) -> bool -``` - -#### is\_other\_message\_sub\_event\_in\_assistant\_thread - -```python -def is_other_message_sub_event_in_assistant_thread(body: Dict[str, Any]) -> bool -``` - -#### to\_command - -```python -def to_command(body: Dict[str, Any]) -> Optional[Dict[str, Any]] -``` - -#### is\_slash\_command - -```python -def is_slash_command(body: Dict[str, Any]) -> bool -``` - -#### to\_action - -```python -def to_action(body: Dict[str, Any]) -> Optional[Dict[str, Any]] -``` - -#### is\_action - -```python -def is_action(body: Dict[str, Any]) -> bool -``` - -#### is\_attachment\_action - -```python -def is_attachment_action(body: Dict[str, Any]) -> bool -``` - -#### is\_block\_actions - -```python -def is_block_actions(body: Dict[str, Any]) -> bool -``` - -#### is\_dialog\_submission - -```python -def is_dialog_submission(body: Dict[str, Any]) -> bool -``` - -#### is\_dialog\_cancellation - -```python -def is_dialog_cancellation(body: Dict[str, Any]) -> bool -``` - -#### is\_workflow\_step\_edit - -```python -def is_workflow_step_edit(body: Dict[str, Any]) -> bool -``` - -#### to\_options - -```python -def to_options(body: Dict[str, Any]) -> Optional[Dict[str, Any]] -``` - -#### is\_options - -```python -def is_options(body: Dict[str, Any]) -> bool -``` - -#### is\_block\_suggestion - -```python -def is_block_suggestion(body: Dict[str, Any]) -> bool -``` - -#### is\_dialog\_suggestion - -```python -def is_dialog_suggestion(body: Dict[str, Any]) -> bool -``` - -#### to\_shortcut - -```python -def to_shortcut(body: Dict[str, Any]) -> Optional[Dict[str, Any]] -``` - -#### is\_shortcut - -```python -def is_shortcut(body: Dict[str, Any]) -> bool -``` - -#### is\_global\_shortcut - -```python -def is_global_shortcut(body: Dict[str, Any]) -> bool -``` - -#### is\_message\_shortcut - -```python -def is_message_shortcut(body: Dict[str, Any]) -> bool -``` - -#### to\_view - -```python -def to_view(body: Dict[str, Any]) -> Optional[Dict[str, Any]] -``` - -#### is\_view - -```python -def is_view(body: Dict[str, Any]) -> bool -``` - -#### is\_view\_submission - -```python -def is_view_submission(body: Dict[str, Any]) -> bool -``` - -#### is\_view\_closed - -```python -def is_view_closed(body: Dict[str, Any]) -> bool -``` - -#### is\_workflow\_step\_save - -```python -def is_workflow_step_save(body: Dict[str, Any]) -> bool -``` - -#### to\_step - -```python -def to_step(body: Dict[str, Any]) -> Optional[Dict[str, Any]] -``` diff --git a/docs/english/reference/request/request.md b/docs/english/reference/request/request.md index e1434a781..016fa4d3d 100644 --- a/docs/english/reference/request/request.md +++ b/docs/english/reference/request/request.md @@ -4,54 +4,18 @@ title: slack_bolt.request.request slug: request --- -## BoltRequest Objects +## `BoltRequest` ```python -class BoltRequest() -``` - -#### raw\_body: `str` - -#### query: `Dict[str, Sequence[str]]` - -#### headers: `Dict[str, Sequence[str]]` - -#### content\_type: `Optional[str]` - -#### body: `Dict[str, Any]` - -#### context: `BoltContext` - -#### lazy\_only: `bool` - -#### lazy\_function\_name: `Optional[str]` - -#### mode: `str` - -#### \_\_init\_\_ - -```python -def __init__( - *, - body: Union[str, dict], - query: Optional[Union[str, Dict[str, str], Dict[str, Sequence[str]]]] = None, - headers: Optional[Dict[str, Union[str, Sequence[str]]]] = None, - context: Optional[Dict[str, Any]] = None, - mode: str = 'http') +BoltRequest(*, body, query=None, headers=None, context=None, mode='http') ``` Request to a Bolt app. -**Arguments**: +**Parameters:** -- `body` _Union[str, dict]_ - The raw request body (only plain text is supported for "http" mode) -- `query` _Optional[Union[str, Dict[str, str], Dict[str, Sequence[str]]]]_ - The query string data in any data format. -- `headers` _Optional[Dict[str, Union[str, Sequence[str]]]]_ - The request headers. -- `context` _Optional[Dict[str, Any]]_ - The context in this request. -- `mode` _str_ - The mode used for this request. (either "http" or "socket_mode") - -#### to\_copyable - -```python -def to_copyable() -> BoltRequest -``` +- **body** (Union[str, dict]) – The raw request body (only plain text is supported for "http" mode) +- **query** (Optional[Union[str, Dict[str, str], Dict[str, Sequence[str]]]]) – The query string data in any data format. +- **headers** (Optional[Dict[str, Union[str, Sequence[str]]]]) – The request headers. +- **context** (Optional[Dict[str, Any]]) – The context in this request. +- **mode** (str) – The mode used for this request. (either "http" or "socket_mode") diff --git a/docs/english/reference/response/index.md b/docs/english/reference/response/index.md index 1e867986a..98ff63e7f 100644 --- a/docs/english/reference/response/index.md +++ b/docs/english/reference/response/index.md @@ -10,54 +10,20 @@ the response data becomes an HTTP response data. Refer to https://docs.slack.dev/apis/events-api/ for the two types of connections. -## Submodules - -- [slack_bolt.response.response](/tools/bolt-python/reference/response/response) - -## BoltResponse Objects - -```python -class BoltResponse() -``` - -#### status: `int` - -#### body: `str` - -#### headers: `Dict[str, Sequence[str]]` - -#### \_\_init\_\_ +## `BoltResponse` ```python -def __init__( - *, - status: int, - body: Union[str, dict] = '', - headers: Optional[Dict[str, Union[str, Sequence[str]]]] = None) +BoltResponse(*, status, body='', headers=None) ``` The response from a Bolt app. -**Arguments**: - -- `status` _int_ - HTTP status code -- `body` _Union[str, dict]_ - The response body (dict and str are supported) -- `headers` _Optional[Dict[str, Union[str, Sequence[str]]]]_ - The response headers. +**Parameters:** -#### first\_headers +- **status** (int) – HTTP status code +- **body** (Union[str, dict]) – The response body (dict and str are supported) +- **headers** (Optional[Dict[str, Union[str, Sequence[str]]]]) – The response headers. -```python -def first_headers() -> Dict[str, str] -``` - -#### first\_headers\_without\_set\_cookie - -```python -def first_headers_without_set_cookie() -> Dict[str, str] -``` - -#### cookies +## Submodules -```python -def cookies() -> Sequence[SimpleCookie] -``` +- [slack_bolt.response.response](/tools/bolt-python/reference/response/response) diff --git a/docs/english/reference/response/response.md b/docs/english/reference/response/response.md index 260e4dbc0..04c7b2e8e 100644 --- a/docs/english/reference/response/response.md +++ b/docs/english/reference/response/response.md @@ -4,50 +4,16 @@ title: slack_bolt.response.response slug: response --- -## BoltResponse Objects +## `BoltResponse` ```python -class BoltResponse() -``` - -#### status: `int` - -#### body: `str` - -#### headers: `Dict[str, Sequence[str]]` - -#### \_\_init\_\_ - -```python -def __init__( - *, - status: int, - body: Union[str, dict] = '', - headers: Optional[Dict[str, Union[str, Sequence[str]]]] = None) +BoltResponse(*, status, body='', headers=None) ``` The response from a Bolt app. -**Arguments**: - -- `status` _int_ - HTTP status code -- `body` _Union[str, dict]_ - The response body (dict and str are supported) -- `headers` _Optional[Dict[str, Union[str, Sequence[str]]]]_ - The response headers. +**Parameters:** -#### first\_headers - -```python -def first_headers() -> Dict[str, str] -``` - -#### first\_headers\_without\_set\_cookie - -```python -def first_headers_without_set_cookie() -> Dict[str, str] -``` - -#### cookies - -```python -def cookies() -> Sequence[SimpleCookie] -``` +- **status** (int) – HTTP status code +- **body** (Union[str, dict]) – The response body (dict and str are supported) +- **headers** (Optional[Dict[str, Union[str, Sequence[str]]]]) – The response headers. diff --git a/docs/english/reference/util/async_utils.md b/docs/english/reference/util/async_utils.md index 9c2f7ffb7..975065685 100644 --- a/docs/english/reference/util/async_utils.md +++ b/docs/english/reference/util/async_utils.md @@ -3,10 +3,4 @@ sidebar_label: async_utils title: slack_bolt.util.async_utils --- -#### create\_async\_web\_client -```python -def create_async_web_client( - token: Optional[str] = None, - logger: Optional[Logger] = None) -> AsyncWebClient -``` diff --git a/docs/english/reference/util/utils.md b/docs/english/reference/util/utils.md index 58b64ad08..b5847231e 100644 --- a/docs/english/reference/util/utils.md +++ b/docs/english/reference/util/utils.md @@ -3,78 +3,34 @@ sidebar_label: utils title: slack_bolt.util.utils --- -#### create\_web\_client +## `get_name_for_callable` ```python -def create_web_client( - token: Optional[str] = None, - logger: Optional[Logger] = None) -> WebClient -``` - -#### convert\_to\_dict\_list - -```python -def convert_to_dict_list(objects: Sequence[Union[Dict, JsonObject]]) -> Sequence[Dict] -``` - -#### convert\_to\_dict - -```python -def convert_to_dict(obj: Union[Dict, JsonObject]) -> Dict -``` - -#### create\_copy - -```python -def create_copy(original: Any) -> Any -``` - -#### get\_boot\_message - -```python -def get_boot_message(development_server: bool = False) -> str -``` - -#### get\_name\_for\_callable - -```python -def get_name_for_callable(func: Callable) -> str +get_name_for_callable(func) ``` Returns the name for the given Callable function object. -**Arguments**: - -- `func` _Callable_ - Either a `Callable` instance or a function, which as `__name__` +**Parameters:** -**Returns**: +- **func** (Callable) – Either a `Callable` instance or a function, which as `__name__` -- `str` - The name of the given Callable object +**Returns:** -#### get\_arg\_names\_of\_callable - -```python -def get_arg_names_of_callable(func: Callable) -> List[str] -``` - -#### is\_callable\_coroutine - -```python -def is_callable_coroutine(func: Optional[Any]) -> bool -``` +- str – The name of the given Callable object -#### is\_used\_without\_argument +## `is_used_without_argument` ```python -def is_used_without_argument(args) -> bool +is_used_without_argument(args) ``` Tests if a decorator invocation is without () or (args). -**Arguments**: +**Parameters:** -- `args` - arguments +- **args** – arguments -**Returns**: +**Returns:** -- `bool` - True if it's an invocation without args +- bool – True if it's an invocation without args diff --git a/docs/english/reference/workflows/step/async_step.md b/docs/english/reference/workflows/step/async_step.md index 7334db580..fb4d3ddfe 100644 --- a/docs/english/reference/workflows/step/async_step.md +++ b/docs/english/reference/workflows/step/async_step.md @@ -3,31 +3,84 @@ sidebar_label: async_step title: slack_bolt.workflows.step.async_step --- -## AsyncWorkflowStepBuilder Objects +## `AsyncWorkflowStep` ```python -class AsyncWorkflowStepBuilder() +AsyncWorkflowStep(*, callback_id, edit, save, execute, app_name=None, base_logger=None) ``` -Steps from apps. +Deprecated: Steps from apps for legacy workflows are now deprecated. -Refer to https://docs.slack.dev/legacy/legacy-steps-from-apps/ for details. +Use new custom steps: https://docs.slack.dev/workflows/workflow-steps/ -#### callback\_id: `Union[str, Pattern]` +**Parameters:** -#### \_\_init\_\_ +- **callback_id** (Union[str, Pattern]) – The callback_id for this step from app +- **edit** (Union[Callable..., [Awaitable[BoltResponse]], AsyncListener, Sequence[Callable]]) – Either a single function or a list of functions for opening a modal in the builder UI +When it's a list, the first one is responsible for ack() while the rest are lazy listeners. +- **save** (Union[Callable..., [Awaitable[BoltResponse]], AsyncListener, Sequence[Callable]]) – Either a single function or a list of functions for handling modal interactions in the builder UI +When it's a list, the first one is responsible for ack() while the rest are lazy listeners. +- **execute** (Union[Callable..., [Awaitable[BoltResponse]], AsyncListener, Sequence[Callable]]) – Either a single function or a list of functions for handling steps from apps executions +When it's a list, the first one is responsible for ack() while the rest are lazy listeners. +- **app_name** (Optional[str]) – The app name that can be mainly used for logging +- **base_logger** (Optional[Logger]) – The logger instance that can be used as a template when creating this step's logger + +### `builder` ```python -def __init__( - callback_id: Union[str, Pattern], - app_name: Optional[str] = None, - base_logger: Optional[Logger] = None) +builder(callback_id, base_logger=None) ``` Deprecated: Steps from apps for legacy workflows are now deprecated. Use new custom steps: https://docs.slack.dev/workflows/workflow-steps/ +### `callback_id` + +```python +callback_id: Union[str, Pattern] = callback_id +``` + +The Callback ID of the step from app + +### `edit` + +```python +edit: AsyncListener = self.build_listener(callback_id=callback_id, app_name=app_name, listener_or_functions=edit, name='edit', base_logger=base_logger) +``` + +`edit` listener, which displays a modal in Workflow Builder + +### `execute` + +```python +execute: AsyncListener = self.build_listener(callback_id=callback_id, app_name=app_name, listener_or_functions=execute, name='execute', base_logger=base_logger) +``` + +`execute` listener, which processes the step from app execution + +### `save` + +```python +save: AsyncListener = self.build_listener(callback_id=callback_id, app_name=app_name, listener_or_functions=save, name='save', base_logger=base_logger) +``` + +`save` listener, which accepts workflow creator's data submission in Workflow Builder + +## `AsyncWorkflowStepBuilder` + +```python +AsyncWorkflowStepBuilder(callback_id, app_name=None, base_logger=None) +``` + +Steps from apps. + +Refer to https://docs.slack.dev/legacy/legacy-steps-from-apps/ for details. + +Deprecated: Steps from apps for legacy workflows are now deprecated. + +Use new custom steps: https://docs.slack.dev/workflows/workflow-steps/ + This builder is supposed to be used as decorator. ```python @@ -48,84 +101,54 @@ For further information about AsyncWorkflowStep specific function arguments such as `configure`, `update`, `complete`, and `fail`, refer to the `async` prefixed ones in `slack_bolt.workflows.step.utilities` API documents. -**Arguments**: +**Parameters:** -- `callback_id` _Union[str, Pattern]_ - The callback_id for the workflow -- `app_name` _Optional[str]_ - The application name mainly for logging -- `base_logger` _Optional[Logger]_ - The base logger +- **callback_id** (Union[str, Pattern]) – The callback_id for the workflow +- **app_name** (Optional[str]) – The application name mainly for logging +- **base_logger** (Optional[Logger]) – The base logger -#### edit +### `build` ```python -def edit( - *args, - matchers: Optional[Union[Callable[..., Awaitable[bool]], AsyncListenerMatcher]] = None, - middleware: Optional[Union[Callable, AsyncMiddleware]] = None, - lazy: Optional[List[Callable[..., Awaitable[None]]]] = None) +build(base_logger=None) ``` Deprecated: Steps from apps for legacy workflows are now deprecated. Use new custom steps: https://docs.slack.dev/workflows/workflow-steps/ -Registers a new edit listener with details. - -You can use this method as decorator as well. - -```python -@my_step.edit -def edit_my_step(ack, configure): - pass -``` - -It's also possible to add additional listener matchers and/or middleware - -```python -@my_step.edit(matchers=[is_valid], middleware=[update_context]) -def edit_my_step(ack, configure): - pass -``` - -For further information about AsyncWorkflowStep specific function arguments -such as `configure`, `update`, `complete`, and `fail`, -refer to the `async` prefixed ones in `slack_bolt.workflows.step.utilities` API documents. +Constructs a WorkflowStep object. This method may raise an exception +if the builder doesn't have enough configurations to build the object. -**Arguments**: +**Returns:** -- `*args` - This method can behave as either decorator or a method -- `matchers` _Optional[Union[Callable[..., Awaitable[bool]], AsyncListenerMatcher]]_ - Listener matchers -- `middleware` _Optional[Union[Callable, AsyncMiddleware]]_ - Listener middleware -- `lazy` _Optional[List[Callable[..., Awaitable[None]]]]_ - Lazy listeners +- AsyncWorkflowStep – An `AsyncWorkflowStep` object -#### save +### `edit` ```python -def save( - *args, - matchers: Optional[Union[Callable[..., Awaitable[bool]], AsyncListenerMatcher]] = None, - middleware: Optional[Union[Callable, AsyncMiddleware]] = None, - lazy: Optional[List[Callable[..., Awaitable[None]]]] = None) +edit(*args, matchers=None, middleware=None, lazy=None) ``` Deprecated: Steps from apps for legacy workflows are now deprecated. Use new custom steps: https://docs.slack.dev/workflows/workflow-steps/ -Registers a new save listener with details. +Registers a new edit listener with details. You can use this method as decorator as well. ```python -@my_step.save -def save_my_step(ack, step, update): +@my_step.edit +def edit_my_step(ack, configure): pass ``` It's also possible to add additional listener matchers and/or middleware ```python -@my_step.save(matchers=[is_valid], middleware=[update_context]) -def save_my_step(ack, step, update): +@my_step.edit(matchers=[is_valid], middleware=[update_context]) +def edit_my_step(ack, configure): pass ``` @@ -133,21 +156,17 @@ For further information about AsyncWorkflowStep specific function arguments such as `configure`, `update`, `complete`, and `fail`, refer to the `async` prefixed ones in `slack_bolt.workflows.step.utilities` API documents. -**Arguments**: +**Parameters:** -- `*args` - This method can behave as either decorator or a method -- `matchers` _Optional[Union[Callable[..., Awaitable[bool]], AsyncListenerMatcher]]_ - Listener matchers -- `middleware` _Optional[Union[Callable, AsyncMiddleware]]_ - Listener middleware -- `lazy` _Optional[List[Callable[..., Awaitable[None]]]]_ - Lazy listeners +- ***args** – This method can behave as either decorator or a method +- **matchers** (Optional[Union[Callable..., [Awaitable[bool]], AsyncListenerMatcher]]) – Listener matchers +- **middleware** (Optional[Union[Callable, AsyncMiddleware]]) – Listener middleware +- **lazy** (Optional[List[Callable..., [Awaitable[None]]]]) – Lazy listeners -#### execute +### `execute` ```python -def execute( - *args, - matchers: Optional[Union[Callable[..., Awaitable[bool]], AsyncListenerMatcher]] = None, - middleware: Optional[Union[Callable, AsyncMiddleware]] = None, - lazy: Optional[List[Callable[..., Awaitable[None]]]] = None) +execute(*args, matchers=None, middleware=None, lazy=None) ``` Deprecated: Steps from apps for legacy workflows are now deprecated. @@ -176,118 +195,48 @@ For further information about AsyncWorkflowStep specific function arguments such as `configure`, `update`, `complete`, and `fail`, refer to the `async` prefixed ones in `slack_bolt.workflows.step.utilities` API documents. -**Arguments**: +**Parameters:** -- `*args` - This method can behave as either decorator or a method -- `matchers` _Optional[Union[Callable[..., Awaitable[bool]], AsyncListenerMatcher]]_ - Listener matchers -- `middleware` _Optional[Union[Callable, AsyncMiddleware]]_ - Listener middleware -- `lazy` _Optional[List[Callable[..., Awaitable[None]]]]_ - Lazy listeners +- ***args** – This method can behave as either decorator or a method +- **matchers** (Optional[Union[Callable..., [Awaitable[bool]], AsyncListenerMatcher]]) – Listener matchers +- **middleware** (Optional[Union[Callable, AsyncMiddleware]]) – Listener middleware +- **lazy** (Optional[List[Callable..., [Awaitable[None]]]]) – Lazy listeners -#### build +### `save` ```python -def build(base_logger: Optional[Logger] = None) -> AsyncWorkflowStep +save(*args, matchers=None, middleware=None, lazy=None) ``` Deprecated: Steps from apps for legacy workflows are now deprecated. Use new custom steps: https://docs.slack.dev/workflows/workflow-steps/ -Constructs a WorkflowStep object. This method may raise an exception -if the builder doesn't have enough configurations to build the object. - -**Returns**: - -- `AsyncWorkflowStep` - An `AsyncWorkflowStep` object - -#### to\_listener\_matchers - -```python -def to_listener_matchers( - app_name: str, - matchers: Optional[List[Union[Callable[..., Awaitable[bool]], AsyncListenerMatcher]]]) -> List[AsyncListenerMatcher] -``` - -#### to\_listener\_middleware - -```python -def to_listener_middleware( - app_name: str, - middleware: Optional[List[Union[Callable, AsyncMiddleware]]]) -> List[AsyncMiddleware] -``` - -## AsyncWorkflowStep Objects - -```python -class AsyncWorkflowStep() -``` - -#### callback\_id: `Union[str, Pattern]` - -The Callback ID of the step from app - -#### edit: `AsyncListener` - -`edit` listener, which displays a modal in Workflow Builder - -#### save: `AsyncListener` - -`save` listener, which accepts workflow creator's data submission in Workflow Builder - -#### execute: `AsyncListener` - -`execute` listener, which processes the step from app execution +Registers a new save listener with details. -#### \_\_init\_\_ +You can use this method as decorator as well. ```python -def __init__( - *, - callback_id: Union[str, Pattern], - edit: Union[Callable[..., Awaitable[BoltResponse]], AsyncListener, Sequence[Callable]], - save: Union[Callable[..., Awaitable[BoltResponse]], AsyncListener, Sequence[Callable]], - execute: Union[Callable[..., Awaitable[BoltResponse]], AsyncListener, Sequence[Callable]], - app_name: Optional[str] = None, - base_logger: Optional[Logger] = None) +@my_step.save +def save_my_step(ack, step, update): + pass ``` -Deprecated: Steps from apps for legacy workflows are now deprecated. - -Use new custom steps: https://docs.slack.dev/workflows/workflow-steps/ - -**Arguments**: - -- `callback_id` _Union[str, Pattern]_ - The callback_id for this step from app -- `edit` _Union[Callable[..., Awaitable[BoltResponse]], AsyncListener, Sequence[Callable]]_ - Either a single function or a list of functions for opening a modal in the builder UI - When it's a list, the first one is responsible for ack() while the rest are lazy listeners. -- `save` _Union[Callable[..., Awaitable[BoltResponse]], AsyncListener, Sequence[Callable]]_ - Either a single function or a list of functions for handling modal interactions in the builder UI - When it's a list, the first one is responsible for ack() while the rest are lazy listeners. -- `execute` _Union[Callable[..., Awaitable[BoltResponse]], AsyncListener, Sequence[Callable]]_ - Either a single function or a list of functions for handling steps from apps executions - When it's a list, the first one is responsible for ack() while the rest are lazy listeners. -- `app_name` _Optional[str]_ - The app name that can be mainly used for logging -- `base_logger` _Optional[Logger]_ - The logger instance that can be used as a template when creating this step's logger - -#### builder +It's also possible to add additional listener matchers and/or middleware ```python -def builder( - callback_id: Union[str, Pattern], - base_logger: Optional[Logger] = None) -> AsyncWorkflowStepBuilder +@my_step.save(matchers=[is_valid], middleware=[update_context]) +def save_my_step(ack, step, update): + pass ``` -Deprecated: Steps from apps for legacy workflows are now deprecated. - -Use new custom steps: https://docs.slack.dev/workflows/workflow-steps/ +For further information about AsyncWorkflowStep specific function arguments +such as `configure`, `update`, `complete`, and `fail`, +refer to the `async` prefixed ones in `slack_bolt.workflows.step.utilities` API documents. -#### build\_listener +**Parameters:** -```python -def build_listener( - callback_id: Union[str, Pattern], - app_name: str, - listener_or_functions: Union[AsyncListener, Callable, List[Callable]], - name: str, - matchers: Optional[List[AsyncListenerMatcher]] = None, - middleware: Optional[List[AsyncMiddleware]] = None, - base_logger: Optional[Logger] = None) -``` +- ***args** – This method can behave as either decorator or a method +- **matchers** (Optional[Union[Callable..., [Awaitable[bool]], AsyncListenerMatcher]]) – Listener matchers +- **middleware** (Optional[Union[Callable, AsyncMiddleware]]) – Listener middleware +- **lazy** (Optional[List[Callable..., [Awaitable[None]]]]) – Lazy listeners diff --git a/docs/english/reference/workflows/step/async_step_middleware.md b/docs/english/reference/workflows/step/async_step_middleware.md index 532f131ce..8aa1ec901 100644 --- a/docs/english/reference/workflows/step/async_step_middleware.md +++ b/docs/english/reference/workflows/step/async_step_middleware.md @@ -3,26 +3,20 @@ sidebar_label: async_step_middleware title: slack_bolt.workflows.step.async_step_middleware --- -## AsyncWorkflowStepMiddleware Objects +## `AsyncWorkflowStepMiddleware` ```python -class AsyncWorkflowStepMiddleware(AsyncMiddleware) +AsyncWorkflowStepMiddleware(step) ``` +Bases: AsyncMiddleware + Base middleware for step from app specific ones. -#### \_\_init\_\_ +### `name` ```python -def __init__(step: AsyncWorkflowStep) +name: str ``` -#### async\_process - -```python -async def async_process( - *, - req: AsyncBoltRequest, - resp: BoltResponse, - next: Callable[[], Awaitable[BoltResponse]]) -> BoltResponse -``` +The name of this middleware. diff --git a/docs/english/reference/workflows/step/index.md b/docs/english/reference/workflows/step/index.md index cb13b7551..429ec3f29 100644 --- a/docs/english/reference/workflows/step/index.md +++ b/docs/english/reference/workflows/step/index.md @@ -3,119 +3,10 @@ sidebar_label: step title: slack_bolt.workflows.step --- -## Submodules - -- [slack_bolt.workflows.step.async_step](/tools/bolt-python/reference/workflows/step/async_step) -- [slack_bolt.workflows.step.async_step_middleware](/tools/bolt-python/reference/workflows/step/async_step_middleware) -- [slack_bolt.workflows.step.internals](/tools/bolt-python/reference/workflows/step/internals) -- [slack_bolt.workflows.step.step](/tools/bolt-python/reference/workflows/step/step) -- [slack_bolt.workflows.step.step_middleware](/tools/bolt-python/reference/workflows/step/step_middleware) -- [slack_bolt.workflows.step.utilities](/tools/bolt-python/reference/workflows/step/utilities) - -## WorkflowStep Objects +## `Complete` ```python -class WorkflowStep() -``` - -#### callback\_id: `Union[str, Pattern]` - -The Callback ID of the step from app - -#### edit: `Listener` - -`edit` listener, which displays a modal in Workflow Builder - -#### save: `Listener` - -`save` listener, which accepts workflow creator's data submission in Workflow Builder - -#### execute: `Listener` - -`execute` listener, which processes step from app execution - -#### \_\_init\_\_ - -```python -def __init__( - *, - callback_id: Union[str, Pattern], - edit: Union[Callable[..., Optional[BoltResponse]], Listener, Sequence[Callable]], - save: Union[Callable[..., Optional[BoltResponse]], Listener, Sequence[Callable]], - execute: Union[Callable[..., Optional[BoltResponse]], Listener, Sequence[Callable]], - app_name: Optional[str] = None, - base_logger: Optional[Logger] = None) -``` - -Deprecated: Steps from apps for legacy workflows are now deprecated. - -Use new custom steps: https://docs.slack.dev/workflows/workflow-steps/ - -**Arguments**: - -- `callback_id` _Union[str, Pattern]_ - The callback_id for this step from app -- `edit` _Union[Callable[..., Optional[BoltResponse]], Listener, Sequence[Callable]]_ - Either a single function or a list of functions for opening a modal in the builder UI - When it's a list, the first one is responsible for ack() while the rest are lazy listeners. -- `save` _Union[Callable[..., Optional[BoltResponse]], Listener, Sequence[Callable]]_ - Either a single function or a list of functions for handling modal interactions in the builder UI - When it's a list, the first one is responsible for ack() while the rest are lazy listeners. -- `execute` _Union[Callable[..., Optional[BoltResponse]], Listener, Sequence[Callable]]_ - Either a single function or a list of functions for handling step from app executions - When it's a list, the first one is responsible for ack() while the rest are lazy listeners. -- `app_name` _Optional[str]_ - The app name that can be mainly used for logging -- `base_logger` _Optional[Logger]_ - The logger instance that can be used as a template when creating this step's logger - -#### builder - -```python -def builder( - callback_id: Union[str, Pattern], - base_logger: Optional[Logger] = None) -> WorkflowStepBuilder -``` - -Deprecated: Steps from apps for legacy workflows are now deprecated. - -Use new custom steps: https://docs.slack.dev/workflows/workflow-steps/ - -#### build\_listener - -```python -def build_listener( - callback_id: Union[str, Pattern], - app_name: str, - listener_or_functions: Union[Listener, Callable, List[Callable]], - name: str, - matchers: Optional[List[ListenerMatcher]] = None, - middleware: Optional[List[Middleware]] = None, - base_logger: Optional[Logger] = None) -> Listener -``` - -## WorkflowStepMiddleware Objects - -```python -class WorkflowStepMiddleware(Middleware) -``` - -Base middleware for step from app specific ones. - -#### \_\_init\_\_ - -```python -def __init__(step: WorkflowStep) -``` - -#### process - -```python -def process( - *, - req: BoltRequest, - resp: BoltResponse, - next: Callable[[], BoltResponse]) -> Optional[BoltResponse] -``` - -## Complete Objects - -```python -class Complete() +Complete(*, client, body) ``` `complete()` utility to tell Slack the completion of a step from app execution. @@ -142,16 +33,10 @@ app.step(ws) This utility is a thin wrapper of workflows.stepCompleted API method. Refer to https://api.slack.com/methods/workflows.stepCompleted for details. -#### \_\_init\_\_ - -```python -def __init__(*, client: WebClient, body: dict) -``` - -## Configure Objects +## `Configure` ```python -class Configure() +Configure(*, callback_id, client, body) ``` `configure()` utility to send the modal view in Workflow Builder. @@ -185,16 +70,37 @@ app.step(ws) Refer to https://docs.slack.dev/legacy/legacy-steps-from-apps/ for details. -#### \_\_init\_\_ +## `Fail` ```python -def __init__(*, callback_id: str, client: WebClient, body: dict) +Fail(*, client, body) +``` + +`fail()` utility to tell Slack the execution failure of a step from app. + +```python +def execute(step, complete, fail): + inputs = step["inputs"] + # if something went wrong + error = {"message": "Just testing step failure!"} + fail(error=error) + +ws = WorkflowStep( + callback_id="add_task", + edit=edit, + save=save, + execute=execute, +) +app.step(ws) ``` -## Update Objects +This utility is a thin wrapper of workflows.stepFailed API method. +Refer to https://api.slack.com/methods/workflows.stepFailed for details. + +## `Update` ```python -class Update() +Update(*, client, body) ``` `update()` utility to tell Slack the processing results of a `save` listener. @@ -237,41 +143,93 @@ app.step(ws) This utility is a thin wrapper of workflows.stepFailed API method. Refer to https://api.slack.com/methods/workflows.updateStep for details. -#### \_\_init\_\_ +## `WorkflowStep` ```python -def __init__(*, client: WebClient, body: dict) +WorkflowStep(*, callback_id, edit, save, execute, app_name=None, base_logger=None) ``` -## Fail Objects +Deprecated: Steps from apps for legacy workflows are now deprecated. + +Use new custom steps: https://docs.slack.dev/workflows/workflow-steps/ + +**Parameters:** + +- **callback_id** (Union[str, Pattern]) – The callback_id for this step from app +- **edit** (Union[Callable..., [Optional[BoltResponse]], Listener, Sequence[Callable]]) – Either a single function or a list of functions for opening a modal in the builder UI +When it's a list, the first one is responsible for ack() while the rest are lazy listeners. +- **save** (Union[Callable..., [Optional[BoltResponse]], Listener, Sequence[Callable]]) – Either a single function or a list of functions for handling modal interactions in the builder UI +When it's a list, the first one is responsible for ack() while the rest are lazy listeners. +- **execute** (Union[Callable..., [Optional[BoltResponse]], Listener, Sequence[Callable]]) – Either a single function or a list of functions for handling step from app executions +When it's a list, the first one is responsible for ack() while the rest are lazy listeners. +- **app_name** (Optional[str]) – The app name that can be mainly used for logging +- **base_logger** (Optional[Logger]) – The logger instance that can be used as a template when creating this step's logger + +### `builder` ```python -class Fail() +builder(callback_id, base_logger=None) ``` -`fail()` utility to tell Slack the execution failure of a step from app. +Deprecated: Steps from apps for legacy workflows are now deprecated. + +Use new custom steps: https://docs.slack.dev/workflows/workflow-steps/ + +### `callback_id` ```python -def execute(step, complete, fail): - inputs = step["inputs"] - # if something went wrong - error = {"message": "Just testing step failure!"} - fail(error=error) +callback_id: Union[str, Pattern] = callback_id +``` -ws = WorkflowStep( - callback_id="add_task", - edit=edit, - save=save, - execute=execute, -) -app.step(ws) +The Callback ID of the step from app + +### `edit` + +```python +edit: Listener = self.build_listener(callback_id=callback_id, app_name=app_name, listener_or_functions=edit, name='edit', base_logger=base_logger) ``` -This utility is a thin wrapper of workflows.stepFailed API method. -Refer to https://api.slack.com/methods/workflows.stepFailed for details. +`edit` listener, which displays a modal in Workflow Builder + +### `execute` + +```python +execute: Listener = self.build_listener(callback_id=callback_id, app_name=app_name, listener_or_functions=execute, name='execute', base_logger=base_logger) +``` + +`execute` listener, which processes step from app execution + +### `save` + +```python +save: Listener = self.build_listener(callback_id=callback_id, app_name=app_name, listener_or_functions=save, name='save', base_logger=base_logger) +``` + +`save` listener, which accepts workflow creator's data submission in Workflow Builder -#### \_\_init\_\_ +## `WorkflowStepMiddleware` ```python -def __init__(*, client: WebClient, body: dict) +WorkflowStepMiddleware(step) ``` + +Bases: Middleware + +Base middleware for step from app specific ones. + +### `name` + +```python +name: str +``` + +The name of this middleware. + +## Submodules + +- [slack_bolt.workflows.step.async_step](/tools/bolt-python/reference/workflows/step/async_step) +- [slack_bolt.workflows.step.async_step_middleware](/tools/bolt-python/reference/workflows/step/async_step_middleware) +- [slack_bolt.workflows.step.internals](/tools/bolt-python/reference/workflows/step/internals) +- [slack_bolt.workflows.step.step](/tools/bolt-python/reference/workflows/step/step) +- [slack_bolt.workflows.step.step_middleware](/tools/bolt-python/reference/workflows/step/step_middleware) +- [slack_bolt.workflows.step.utilities](/tools/bolt-python/reference/workflows/step/utilities) diff --git a/docs/english/reference/workflows/step/step.md b/docs/english/reference/workflows/step/step.md index 1cea19175..44865b670 100644 --- a/docs/english/reference/workflows/step/step.md +++ b/docs/english/reference/workflows/step/step.md @@ -4,31 +4,84 @@ title: slack_bolt.workflows.step.step slug: step --- -## WorkflowStepBuilder Objects +## `WorkflowStep` ```python -class WorkflowStepBuilder() +WorkflowStep(*, callback_id, edit, save, execute, app_name=None, base_logger=None) ``` -Steps from apps. +Deprecated: Steps from apps for legacy workflows are now deprecated. -Refer to https://docs.slack.dev/legacy/legacy-steps-from-apps/ for details. +Use new custom steps: https://docs.slack.dev/workflows/workflow-steps/ -#### callback\_id: `Union[str, Pattern]` +**Parameters:** -#### \_\_init\_\_ +- **callback_id** (Union[str, Pattern]) – The callback_id for this step from app +- **edit** (Union[Callable..., [Optional[BoltResponse]], Listener, Sequence[Callable]]) – Either a single function or a list of functions for opening a modal in the builder UI +When it's a list, the first one is responsible for ack() while the rest are lazy listeners. +- **save** (Union[Callable..., [Optional[BoltResponse]], Listener, Sequence[Callable]]) – Either a single function or a list of functions for handling modal interactions in the builder UI +When it's a list, the first one is responsible for ack() while the rest are lazy listeners. +- **execute** (Union[Callable..., [Optional[BoltResponse]], Listener, Sequence[Callable]]) – Either a single function or a list of functions for handling step from app executions +When it's a list, the first one is responsible for ack() while the rest are lazy listeners. +- **app_name** (Optional[str]) – The app name that can be mainly used for logging +- **base_logger** (Optional[Logger]) – The logger instance that can be used as a template when creating this step's logger + +### `builder` ```python -def __init__( - callback_id: Union[str, Pattern], - app_name: Optional[str] = None, - base_logger: Optional[Logger] = None) +builder(callback_id, base_logger=None) ``` Deprecated: Steps from apps for legacy workflows are now deprecated. Use new custom steps: https://docs.slack.dev/workflows/workflow-steps/ +### `callback_id` + +```python +callback_id: Union[str, Pattern] = callback_id +``` + +The Callback ID of the step from app + +### `edit` + +```python +edit: Listener = self.build_listener(callback_id=callback_id, app_name=app_name, listener_or_functions=edit, name='edit', base_logger=base_logger) +``` + +`edit` listener, which displays a modal in Workflow Builder + +### `execute` + +```python +execute: Listener = self.build_listener(callback_id=callback_id, app_name=app_name, listener_or_functions=execute, name='execute', base_logger=base_logger) +``` + +`execute` listener, which processes step from app execution + +### `save` + +```python +save: Listener = self.build_listener(callback_id=callback_id, app_name=app_name, listener_or_functions=save, name='save', base_logger=base_logger) +``` + +`save` listener, which accepts workflow creator's data submission in Workflow Builder + +## `WorkflowStepBuilder` + +```python +WorkflowStepBuilder(callback_id, app_name=None, base_logger=None) +``` + +Steps from apps. + +Refer to https://docs.slack.dev/legacy/legacy-steps-from-apps/ for details. + +Deprecated: Steps from apps for legacy workflows are now deprecated. + +Use new custom steps: https://docs.slack.dev/workflows/workflow-steps/ + This builder is supposed to be used as decorator. ```python @@ -49,84 +102,54 @@ For further information about WorkflowStep specific function arguments such as `configure`, `update`, `complete`, and `fail`, refer to `slack_bolt.workflows.step.utilities` API documents. -**Arguments**: +**Parameters:** -- `callback_id` _Union[str, Pattern]_ - The callback_id for the workflow -- `app_name` _Optional[str]_ - The application name mainly for logging -- `base_logger` _Optional[Logger]_ - The base logger +- **callback_id** (Union[str, Pattern]) – The callback_id for the workflow +- **app_name** (Optional[str]) – The application name mainly for logging +- **base_logger** (Optional[Logger]) – The base logger -#### edit +### `build` ```python -def edit( - *args, - matchers: Optional[Union[Callable[..., bool], ListenerMatcher]] = None, - middleware: Optional[Union[Callable, Middleware]] = None, - lazy: Optional[List[Callable[..., None]]] = None) +build(base_logger=None) ``` Deprecated: Steps from apps for legacy workflows are now deprecated. Use new custom steps: https://docs.slack.dev/workflows/workflow-steps/ -Registers a new edit listener with details. - -You can use this method as decorator as well. - -```python -@my_step.edit -def edit_my_step(ack, configure): - pass -``` - -It's also possible to add additional listener matchers and/or middleware - -```python -@my_step.edit(matchers=[is_valid], middleware=[update_context]) -def edit_my_step(ack, configure): - pass -``` - -For further information about WorkflowStep specific function arguments -such as `configure`, `update`, `complete`, and `fail`, -refer to `slack_bolt.workflows.step.utilities` API documents. +Constructs a WorkflowStep object. This method may raise an exception +if the builder doesn't have enough configurations to build the object. -**Arguments**: +**Returns:** -- `*args` - This method can behave as either decorator or a method -- `matchers` _Optional[Union[Callable[..., bool], ListenerMatcher]]_ - Listener matchers -- `middleware` _Optional[Union[Callable, Middleware]]_ - Listener middleware -- `lazy` _Optional[List[Callable[..., None]]]_ - Lazy listeners +- WorkflowStep – WorkflowStep object -#### save +### `edit` ```python -def save( - *args, - matchers: Optional[Union[Callable[..., bool], ListenerMatcher]] = None, - middleware: Optional[Union[Callable, Middleware]] = None, - lazy: Optional[List[Callable[..., None]]] = None) +edit(*args, matchers=None, middleware=None, lazy=None) ``` Deprecated: Steps from apps for legacy workflows are now deprecated. Use new custom steps: https://docs.slack.dev/workflows/workflow-steps/ -Registers a new save listener with details. +Registers a new edit listener with details. You can use this method as decorator as well. ```python -@my_step.save -def save_my_step(ack, step, update): +@my_step.edit +def edit_my_step(ack, configure): pass ``` It's also possible to add additional listener matchers and/or middleware ```python -@my_step.save(matchers=[is_valid], middleware=[update_context]) -def save_my_step(ack, step, update): +@my_step.edit(matchers=[is_valid], middleware=[update_context]) +def edit_my_step(ack, configure): pass ``` @@ -134,21 +157,17 @@ For further information about WorkflowStep specific function arguments such as `configure`, `update`, `complete`, and `fail`, refer to `slack_bolt.workflows.step.utilities` API documents. -**Arguments**: +**Parameters:** -- `*args` - This method can behave as either decorator or a method -- `matchers` _Optional[Union[Callable[..., bool], ListenerMatcher]]_ - Listener matchers -- `middleware` _Optional[Union[Callable, Middleware]]_ - Listener middleware -- `lazy` _Optional[List[Callable[..., None]]]_ - Lazy listeners +- ***args** – This method can behave as either decorator or a method +- **matchers** (Optional[Union[Callable..., [bool], ListenerMatcher]]) – Listener matchers +- **middleware** (Optional[Union[Callable, Middleware]]) – Listener middleware +- **lazy** (Optional[List[Callable[..., None]]]) – Lazy listeners -#### execute +### `execute` ```python -def execute( - *args, - matchers: Optional[Union[Callable[..., bool], ListenerMatcher]] = None, - middleware: Optional[Union[Callable, Middleware]] = None, - lazy: Optional[List[Callable[..., None]]] = None) +execute(*args, matchers=None, middleware=None, lazy=None) ``` Deprecated: Steps from apps for legacy workflows are now deprecated. @@ -177,120 +196,48 @@ For further information about WorkflowStep specific function arguments such as `configure`, `update`, `complete`, and `fail`, refer to `slack_bolt.workflows.step.utilities` API documents. -**Arguments**: +**Parameters:** -- `*args` - This method can behave as either decorator or a method -- `matchers` _Optional[Union[Callable[..., bool], ListenerMatcher]]_ - Listener matchers -- `middleware` _Optional[Union[Callable, Middleware]]_ - Listener middleware -- `lazy` _Optional[List[Callable[..., None]]]_ - Lazy listeners +- ***args** – This method can behave as either decorator or a method +- **matchers** (Optional[Union[Callable..., [bool], ListenerMatcher]]) – Listener matchers +- **middleware** (Optional[Union[Callable, Middleware]]) – Listener middleware +- **lazy** (Optional[List[Callable[..., None]]]) – Lazy listeners -#### build +### `save` ```python -def build(base_logger: Optional[Logger] = None) -> WorkflowStep +save(*args, matchers=None, middleware=None, lazy=None) ``` Deprecated: Steps from apps for legacy workflows are now deprecated. Use new custom steps: https://docs.slack.dev/workflows/workflow-steps/ -Constructs a WorkflowStep object. This method may raise an exception -if the builder doesn't have enough configurations to build the object. - -**Returns**: - -- `WorkflowStep` - WorkflowStep object - -#### to\_listener\_matchers - -```python -def to_listener_matchers( - app_name: str, - matchers: Optional[List[Union[Callable[..., bool], ListenerMatcher]]], - base_logger: Optional[Logger] = None) -> List[ListenerMatcher] -``` - -#### to\_listener\_middleware - -```python -def to_listener_middleware( - app_name: str, - middleware: Optional[List[Union[Callable, Middleware]]], - base_logger: Optional[Logger] = None) -> List[Middleware] -``` - -## WorkflowStep Objects - -```python -class WorkflowStep() -``` - -#### callback\_id: `Union[str, Pattern]` - -The Callback ID of the step from app - -#### edit: `Listener` - -`edit` listener, which displays a modal in Workflow Builder - -#### save: `Listener` - -`save` listener, which accepts workflow creator's data submission in Workflow Builder - -#### execute: `Listener` - -`execute` listener, which processes step from app execution +Registers a new save listener with details. -#### \_\_init\_\_ +You can use this method as decorator as well. ```python -def __init__( - *, - callback_id: Union[str, Pattern], - edit: Union[Callable[..., Optional[BoltResponse]], Listener, Sequence[Callable]], - save: Union[Callable[..., Optional[BoltResponse]], Listener, Sequence[Callable]], - execute: Union[Callable[..., Optional[BoltResponse]], Listener, Sequence[Callable]], - app_name: Optional[str] = None, - base_logger: Optional[Logger] = None) +@my_step.save +def save_my_step(ack, step, update): + pass ``` -Deprecated: Steps from apps for legacy workflows are now deprecated. - -Use new custom steps: https://docs.slack.dev/workflows/workflow-steps/ - -**Arguments**: - -- `callback_id` _Union[str, Pattern]_ - The callback_id for this step from app -- `edit` _Union[Callable[..., Optional[BoltResponse]], Listener, Sequence[Callable]]_ - Either a single function or a list of functions for opening a modal in the builder UI - When it's a list, the first one is responsible for ack() while the rest are lazy listeners. -- `save` _Union[Callable[..., Optional[BoltResponse]], Listener, Sequence[Callable]]_ - Either a single function or a list of functions for handling modal interactions in the builder UI - When it's a list, the first one is responsible for ack() while the rest are lazy listeners. -- `execute` _Union[Callable[..., Optional[BoltResponse]], Listener, Sequence[Callable]]_ - Either a single function or a list of functions for handling step from app executions - When it's a list, the first one is responsible for ack() while the rest are lazy listeners. -- `app_name` _Optional[str]_ - The app name that can be mainly used for logging -- `base_logger` _Optional[Logger]_ - The logger instance that can be used as a template when creating this step's logger - -#### builder +It's also possible to add additional listener matchers and/or middleware ```python -def builder( - callback_id: Union[str, Pattern], - base_logger: Optional[Logger] = None) -> WorkflowStepBuilder +@my_step.save(matchers=[is_valid], middleware=[update_context]) +def save_my_step(ack, step, update): + pass ``` -Deprecated: Steps from apps for legacy workflows are now deprecated. - -Use new custom steps: https://docs.slack.dev/workflows/workflow-steps/ +For further information about WorkflowStep specific function arguments +such as `configure`, `update`, `complete`, and `fail`, +refer to `slack_bolt.workflows.step.utilities` API documents. -#### build\_listener +**Parameters:** -```python -def build_listener( - callback_id: Union[str, Pattern], - app_name: str, - listener_or_functions: Union[Listener, Callable, List[Callable]], - name: str, - matchers: Optional[List[ListenerMatcher]] = None, - middleware: Optional[List[Middleware]] = None, - base_logger: Optional[Logger] = None) -> Listener -``` +- ***args** – This method can behave as either decorator or a method +- **matchers** (Optional[Union[Callable..., [bool], ListenerMatcher]]) – Listener matchers +- **middleware** (Optional[Union[Callable, Middleware]]) – Listener middleware +- **lazy** (Optional[List[Callable[..., None]]]) – Lazy listeners diff --git a/docs/english/reference/workflows/step/step_middleware.md b/docs/english/reference/workflows/step/step_middleware.md index 72f1894c7..f8f198f99 100644 --- a/docs/english/reference/workflows/step/step_middleware.md +++ b/docs/english/reference/workflows/step/step_middleware.md @@ -3,26 +3,20 @@ sidebar_label: step_middleware title: slack_bolt.workflows.step.step_middleware --- -## WorkflowStepMiddleware Objects +## `WorkflowStepMiddleware` ```python -class WorkflowStepMiddleware(Middleware) +WorkflowStepMiddleware(step) ``` +Bases: Middleware + Base middleware for step from app specific ones. -#### \_\_init\_\_ +### `name` ```python -def __init__(step: WorkflowStep) +name: str ``` -#### process - -```python -def process( - *, - req: BoltRequest, - resp: BoltResponse, - next: Callable[[], BoltResponse]) -> Optional[BoltResponse] -``` +The name of this middleware. diff --git a/docs/english/reference/workflows/step/utilities/async_complete.md b/docs/english/reference/workflows/step/utilities/async_complete.md index ff80ef42e..20302ba39 100644 --- a/docs/english/reference/workflows/step/utilities/async_complete.md +++ b/docs/english/reference/workflows/step/utilities/async_complete.md @@ -3,10 +3,10 @@ sidebar_label: async_complete title: slack_bolt.workflows.step.utilities.async_complete --- -## AsyncComplete Objects +## `AsyncComplete` ```python -class AsyncComplete() +AsyncComplete(*, client, body) ``` `complete()` utility to tell Slack the completion of a step from app execution. @@ -32,9 +32,3 @@ app.step(ws) This utility is a thin wrapper of workflows.stepCompleted API method. Refer to https://api.slack.com/methods/workflows.stepCompleted for details. - -#### \_\_init\_\_ - -```python -def __init__(*, client: AsyncWebClient, body: dict) -``` diff --git a/docs/english/reference/workflows/step/utilities/async_configure.md b/docs/english/reference/workflows/step/utilities/async_configure.md index c9a17f0db..0726eec43 100644 --- a/docs/english/reference/workflows/step/utilities/async_configure.md +++ b/docs/english/reference/workflows/step/utilities/async_configure.md @@ -3,10 +3,10 @@ sidebar_label: async_configure title: slack_bolt.workflows.step.utilities.async_configure --- -## AsyncConfigure Objects +## `AsyncConfigure` ```python -class AsyncConfigure() +AsyncConfigure(*, callback_id, client, body) ``` `configure()` utility to send the modal view in Workflow Builder. @@ -39,9 +39,3 @@ app.step(ws) ``` Refer to https://docs.slack.dev/legacy/legacy-steps-from-apps/ for details. - -#### \_\_init\_\_ - -```python -def __init__(*, callback_id: str, client: AsyncWebClient, body: dict) -``` diff --git a/docs/english/reference/workflows/step/utilities/async_fail.md b/docs/english/reference/workflows/step/utilities/async_fail.md index cfadf7b0d..3f4d2f12e 100644 --- a/docs/english/reference/workflows/step/utilities/async_fail.md +++ b/docs/english/reference/workflows/step/utilities/async_fail.md @@ -3,10 +3,10 @@ sidebar_label: async_fail title: slack_bolt.workflows.step.utilities.async_fail --- -## AsyncFail Objects +## `AsyncFail` ```python -class AsyncFail() +AsyncFail(*, client, body) ``` `fail()` utility to tell Slack the execution failure of a step from app. @@ -29,9 +29,3 @@ app.step(ws) This utility is a thin wrapper of workflows.stepFailed API method. Refer to https://api.slack.com/methods/workflows.stepFailed for details. - -#### \_\_init\_\_ - -```python -def __init__(*, client: AsyncWebClient, body: dict) -``` diff --git a/docs/english/reference/workflows/step/utilities/async_update.md b/docs/english/reference/workflows/step/utilities/async_update.md index 7a761e4e9..0c7f916ae 100644 --- a/docs/english/reference/workflows/step/utilities/async_update.md +++ b/docs/english/reference/workflows/step/utilities/async_update.md @@ -3,10 +3,10 @@ sidebar_label: async_update title: slack_bolt.workflows.step.utilities.async_update --- -## AsyncUpdate Objects +## `AsyncUpdate` ```python -class AsyncUpdate() +AsyncUpdate(*, client, body) ``` `update()` utility to tell Slack the processing results of a `save` listener. @@ -48,9 +48,3 @@ app.step(ws) This utility is a thin wrapper of workflows.stepFailed API method. Refer to https://api.slack.com/methods/workflows.updateStep for details. - -#### \_\_init\_\_ - -```python -def __init__(*, client: AsyncWebClient, body: dict) -``` diff --git a/docs/english/reference/workflows/step/utilities/complete.md b/docs/english/reference/workflows/step/utilities/complete.md index 624901495..a6d27577f 100644 --- a/docs/english/reference/workflows/step/utilities/complete.md +++ b/docs/english/reference/workflows/step/utilities/complete.md @@ -3,10 +3,10 @@ sidebar_label: complete title: slack_bolt.workflows.step.utilities.complete --- -## Complete Objects +## `Complete` ```python -class Complete() +Complete(*, client, body) ``` `complete()` utility to tell Slack the completion of a step from app execution. @@ -32,9 +32,3 @@ app.step(ws) This utility is a thin wrapper of workflows.stepCompleted API method. Refer to https://api.slack.com/methods/workflows.stepCompleted for details. - -#### \_\_init\_\_ - -```python -def __init__(*, client: WebClient, body: dict) -``` diff --git a/docs/english/reference/workflows/step/utilities/configure.md b/docs/english/reference/workflows/step/utilities/configure.md index bc33f857a..055d8ad2e 100644 --- a/docs/english/reference/workflows/step/utilities/configure.md +++ b/docs/english/reference/workflows/step/utilities/configure.md @@ -3,10 +3,10 @@ sidebar_label: configure title: slack_bolt.workflows.step.utilities.configure --- -## Configure Objects +## `Configure` ```python -class Configure() +Configure(*, callback_id, client, body) ``` `configure()` utility to send the modal view in Workflow Builder. @@ -39,9 +39,3 @@ app.step(ws) ``` Refer to https://docs.slack.dev/legacy/legacy-steps-from-apps/ for details. - -#### \_\_init\_\_ - -```python -def __init__(*, callback_id: str, client: WebClient, body: dict) -``` diff --git a/docs/english/reference/workflows/step/utilities/fail.md b/docs/english/reference/workflows/step/utilities/fail.md index ccf3c6fec..156f31d7d 100644 --- a/docs/english/reference/workflows/step/utilities/fail.md +++ b/docs/english/reference/workflows/step/utilities/fail.md @@ -3,10 +3,10 @@ sidebar_label: fail title: slack_bolt.workflows.step.utilities.fail --- -## Fail Objects +## `Fail` ```python -class Fail() +Fail(*, client, body) ``` `fail()` utility to tell Slack the execution failure of a step from app. @@ -29,9 +29,3 @@ app.step(ws) This utility is a thin wrapper of workflows.stepFailed API method. Refer to https://api.slack.com/methods/workflows.stepFailed for details. - -#### \_\_init\_\_ - -```python -def __init__(*, client: WebClient, body: dict) -``` diff --git a/docs/english/reference/workflows/step/utilities/update.md b/docs/english/reference/workflows/step/utilities/update.md index 066f89be3..f65b8d65f 100644 --- a/docs/english/reference/workflows/step/utilities/update.md +++ b/docs/english/reference/workflows/step/utilities/update.md @@ -3,10 +3,10 @@ sidebar_label: update title: slack_bolt.workflows.step.utilities.update --- -## Update Objects +## `Update` ```python -class Update() +Update(*, client, body) ``` `update()` utility to tell Slack the processing results of a `save` listener. @@ -48,9 +48,3 @@ app.step(ws) This utility is a thin wrapper of workflows.stepFailed API method. Refer to https://api.slack.com/methods/workflows.updateStep for details. - -#### \_\_init\_\_ - -```python -def __init__(*, client: WebClient, body: dict) -``` diff --git a/docs/english/reference_redirects.json b/docs/english/reference_redirects.json deleted file mode 100644 index f14a9c800..000000000 --- a/docs/english/reference_redirects.json +++ /dev/null @@ -1,236 +0,0 @@ -{ - "/tools/bolt-python/reference/adapter/aiohttp/index.html": "/tools/bolt-python/reference/adapter/aiohttp", - "/tools/bolt-python/reference/adapter/asgi/aiohttp/index.html": "/tools/bolt-python/reference/adapter/asgi/aiohttp", - "/tools/bolt-python/reference/adapter/asgi/async_handler.html": "/tools/bolt-python/reference/adapter/asgi/async_handler", - "/tools/bolt-python/reference/adapter/asgi/base_handler.html": "/tools/bolt-python/reference/adapter/asgi/base_handler", - "/tools/bolt-python/reference/adapter/asgi/builtin/index.html": "/tools/bolt-python/reference/adapter/asgi/builtin", - "/tools/bolt-python/reference/adapter/asgi/http_request.html": "/tools/bolt-python/reference/adapter/asgi/http_request", - "/tools/bolt-python/reference/adapter/asgi/http_response.html": "/tools/bolt-python/reference/adapter/asgi/http_response", - "/tools/bolt-python/reference/adapter/asgi/index.html": "/tools/bolt-python/reference/adapter/asgi", - "/tools/bolt-python/reference/adapter/asgi/utils.html": "/tools/bolt-python/reference/adapter/asgi/utils", - "/tools/bolt-python/reference/adapter/aws_lambda/chalice_handler.html": "/tools/bolt-python/reference/adapter/aws_lambda/chalice_handler", - "/tools/bolt-python/reference/adapter/aws_lambda/chalice_lazy_listener_runner.html": "/tools/bolt-python/reference/adapter/aws_lambda/chalice_lazy_listener_runner", - "/tools/bolt-python/reference/adapter/aws_lambda/handler.html": "/tools/bolt-python/reference/adapter/aws_lambda/handler", - "/tools/bolt-python/reference/adapter/aws_lambda/index.html": "/tools/bolt-python/reference/adapter/aws_lambda", - "/tools/bolt-python/reference/adapter/aws_lambda/internals.html": "/tools/bolt-python/reference/adapter/aws_lambda/internals", - "/tools/bolt-python/reference/adapter/aws_lambda/lambda_s3_oauth_flow.html": "/tools/bolt-python/reference/adapter/aws_lambda/lambda_s3_oauth_flow", - "/tools/bolt-python/reference/adapter/aws_lambda/lazy_listener_runner.html": "/tools/bolt-python/reference/adapter/aws_lambda/lazy_listener_runner", - "/tools/bolt-python/reference/adapter/aws_lambda/local_lambda_client.html": "/tools/bolt-python/reference/adapter/aws_lambda/local_lambda_client", - "/tools/bolt-python/reference/adapter/bottle/handler.html": "/tools/bolt-python/reference/adapter/bottle/handler", - "/tools/bolt-python/reference/adapter/bottle/index.html": "/tools/bolt-python/reference/adapter/bottle", - "/tools/bolt-python/reference/adapter/cherrypy/handler.html": "/tools/bolt-python/reference/adapter/cherrypy/handler", - "/tools/bolt-python/reference/adapter/cherrypy/index.html": "/tools/bolt-python/reference/adapter/cherrypy", - "/tools/bolt-python/reference/adapter/django/handler.html": "/tools/bolt-python/reference/adapter/django/handler", - "/tools/bolt-python/reference/adapter/django/index.html": "/tools/bolt-python/reference/adapter/django", - "/tools/bolt-python/reference/adapter/falcon/async_resource.html": "/tools/bolt-python/reference/adapter/falcon/async_resource", - "/tools/bolt-python/reference/adapter/falcon/index.html": "/tools/bolt-python/reference/adapter/falcon", - "/tools/bolt-python/reference/adapter/falcon/resource.html": "/tools/bolt-python/reference/adapter/falcon/resource", - "/tools/bolt-python/reference/adapter/fastapi/async_handler.html": "/tools/bolt-python/reference/adapter/fastapi/async_handler", - "/tools/bolt-python/reference/adapter/fastapi/index.html": "/tools/bolt-python/reference/adapter/fastapi", - "/tools/bolt-python/reference/adapter/flask/handler.html": "/tools/bolt-python/reference/adapter/flask/handler", - "/tools/bolt-python/reference/adapter/flask/index.html": "/tools/bolt-python/reference/adapter/flask", - "/tools/bolt-python/reference/adapter/google_cloud_functions/handler.html": "/tools/bolt-python/reference/adapter/google_cloud_functions/handler", - "/tools/bolt-python/reference/adapter/google_cloud_functions/index.html": "/tools/bolt-python/reference/adapter/google_cloud_functions", - "/tools/bolt-python/reference/adapter/index.html": "/tools/bolt-python/reference/adapter", - "/tools/bolt-python/reference/adapter/pyramid/handler.html": "/tools/bolt-python/reference/adapter/pyramid/handler", - "/tools/bolt-python/reference/adapter/pyramid/index.html": "/tools/bolt-python/reference/adapter/pyramid", - "/tools/bolt-python/reference/adapter/sanic/async_handler.html": "/tools/bolt-python/reference/adapter/sanic/async_handler", - "/tools/bolt-python/reference/adapter/sanic/index.html": "/tools/bolt-python/reference/adapter/sanic", - "/tools/bolt-python/reference/adapter/socket_mode/aiohttp/index.html": "/tools/bolt-python/reference/adapter/socket_mode/aiohttp", - "/tools/bolt-python/reference/adapter/socket_mode/async_base_handler.html": "/tools/bolt-python/reference/adapter/socket_mode/async_base_handler", - "/tools/bolt-python/reference/adapter/socket_mode/async_handler.html": "/tools/bolt-python/reference/adapter/socket_mode/async_handler", - "/tools/bolt-python/reference/adapter/socket_mode/async_internals.html": "/tools/bolt-python/reference/adapter/socket_mode/async_internals", - "/tools/bolt-python/reference/adapter/socket_mode/base_handler.html": "/tools/bolt-python/reference/adapter/socket_mode/base_handler", - "/tools/bolt-python/reference/adapter/socket_mode/builtin/index.html": "/tools/bolt-python/reference/adapter/socket_mode/builtin", - "/tools/bolt-python/reference/adapter/socket_mode/index.html": "/tools/bolt-python/reference/adapter/socket_mode", - "/tools/bolt-python/reference/adapter/socket_mode/internals.html": "/tools/bolt-python/reference/adapter/socket_mode/internals", - "/tools/bolt-python/reference/adapter/socket_mode/websocket_client/index.html": "/tools/bolt-python/reference/adapter/socket_mode/websocket_client", - "/tools/bolt-python/reference/adapter/socket_mode/websockets/index.html": "/tools/bolt-python/reference/adapter/socket_mode/websockets", - "/tools/bolt-python/reference/adapter/starlette/async_handler.html": "/tools/bolt-python/reference/adapter/starlette/async_handler", - "/tools/bolt-python/reference/adapter/starlette/handler.html": "/tools/bolt-python/reference/adapter/starlette/handler", - "/tools/bolt-python/reference/adapter/starlette/index.html": "/tools/bolt-python/reference/adapter/starlette", - "/tools/bolt-python/reference/adapter/tornado/async_handler.html": "/tools/bolt-python/reference/adapter/tornado/async_handler", - "/tools/bolt-python/reference/adapter/tornado/handler.html": "/tools/bolt-python/reference/adapter/tornado/handler", - "/tools/bolt-python/reference/adapter/tornado/index.html": "/tools/bolt-python/reference/adapter/tornado", - "/tools/bolt-python/reference/adapter/wsgi/handler.html": "/tools/bolt-python/reference/adapter/wsgi/handler", - "/tools/bolt-python/reference/adapter/wsgi/http_request.html": "/tools/bolt-python/reference/adapter/wsgi/http_request", - "/tools/bolt-python/reference/adapter/wsgi/http_response.html": "/tools/bolt-python/reference/adapter/wsgi/http_response", - "/tools/bolt-python/reference/adapter/wsgi/index.html": "/tools/bolt-python/reference/adapter/wsgi", - "/tools/bolt-python/reference/adapter/wsgi/internals.html": "/tools/bolt-python/reference/adapter/wsgi/internals", - "/tools/bolt-python/reference/app/app.html": "/tools/bolt-python/reference/app/app", - "/tools/bolt-python/reference/app/async_app.html": "/tools/bolt-python/reference/app/async_app", - "/tools/bolt-python/reference/app/async_server.html": "/tools/bolt-python/reference/app/async_server", - "/tools/bolt-python/reference/app/index.html": "/tools/bolt-python/reference/app", - "/tools/bolt-python/reference/async_app.html": "/tools/bolt-python/reference/async_app", - "/tools/bolt-python/reference/authorization/async_authorize.html": "/tools/bolt-python/reference/authorization/async_authorize", - "/tools/bolt-python/reference/authorization/async_authorize_args.html": "/tools/bolt-python/reference/authorization/async_authorize_args", - "/tools/bolt-python/reference/authorization/authorize.html": "/tools/bolt-python/reference/authorization/authorize", - "/tools/bolt-python/reference/authorization/authorize_args.html": "/tools/bolt-python/reference/authorization/authorize_args", - "/tools/bolt-python/reference/authorization/authorize_result.html": "/tools/bolt-python/reference/authorization/authorize_result", - "/tools/bolt-python/reference/authorization/index.html": "/tools/bolt-python/reference/authorization", - "/tools/bolt-python/reference/context/ack/ack.html": "/tools/bolt-python/reference/context/ack/ack", - "/tools/bolt-python/reference/context/ack/async_ack.html": "/tools/bolt-python/reference/context/ack/async_ack", - "/tools/bolt-python/reference/context/ack/index.html": "/tools/bolt-python/reference/context/ack", - "/tools/bolt-python/reference/context/ack/internals.html": "/tools/bolt-python/reference/context/ack/internals", - "/tools/bolt-python/reference/context/assistant/assistant_utilities.html": "/tools/bolt-python/reference/context/assistant/assistant_utilities", - "/tools/bolt-python/reference/context/assistant/async_assistant_utilities.html": "/tools/bolt-python/reference/context/assistant/async_assistant_utilities", - "/tools/bolt-python/reference/context/assistant/index.html": "/tools/bolt-python/reference/context/assistant", - "/tools/bolt-python/reference/context/assistant/internals.html": "/tools/bolt-python/reference/context/assistant/internals", - "/tools/bolt-python/reference/context/assistant/thread_context/index.html": "/tools/bolt-python/reference/context/assistant/thread_context", - "/tools/bolt-python/reference/context/assistant/thread_context_store/async_store.html": "/tools/bolt-python/reference/context/assistant/thread_context_store/async_store", - "/tools/bolt-python/reference/context/assistant/thread_context_store/default_async_store.html": "/tools/bolt-python/reference/context/assistant/thread_context_store/default_async_store", - "/tools/bolt-python/reference/context/assistant/thread_context_store/default_store.html": "/tools/bolt-python/reference/context/assistant/thread_context_store/default_store", - "/tools/bolt-python/reference/context/assistant/thread_context_store/file/index.html": "/tools/bolt-python/reference/context/assistant/thread_context_store/file", - "/tools/bolt-python/reference/context/assistant/thread_context_store/index.html": "/tools/bolt-python/reference/context/assistant/thread_context_store", - "/tools/bolt-python/reference/context/assistant/thread_context_store/store.html": "/tools/bolt-python/reference/context/assistant/thread_context_store/store", - "/tools/bolt-python/reference/context/async_context.html": "/tools/bolt-python/reference/context/async_context", - "/tools/bolt-python/reference/context/base_context.html": "/tools/bolt-python/reference/context/base_context", - "/tools/bolt-python/reference/context/complete/async_complete.html": "/tools/bolt-python/reference/context/complete/async_complete", - "/tools/bolt-python/reference/context/complete/complete.html": "/tools/bolt-python/reference/context/complete/complete", - "/tools/bolt-python/reference/context/complete/index.html": "/tools/bolt-python/reference/context/complete", - "/tools/bolt-python/reference/context/context.html": "/tools/bolt-python/reference/context/context", - "/tools/bolt-python/reference/context/fail/async_fail.html": "/tools/bolt-python/reference/context/fail/async_fail", - "/tools/bolt-python/reference/context/fail/fail.html": "/tools/bolt-python/reference/context/fail/fail", - "/tools/bolt-python/reference/context/fail/index.html": "/tools/bolt-python/reference/context/fail", - "/tools/bolt-python/reference/context/get_thread_context/async_get_thread_context.html": "/tools/bolt-python/reference/context/get_thread_context/async_get_thread_context", - "/tools/bolt-python/reference/context/get_thread_context/get_thread_context.html": "/tools/bolt-python/reference/context/get_thread_context/get_thread_context", - "/tools/bolt-python/reference/context/get_thread_context/index.html": "/tools/bolt-python/reference/context/get_thread_context", - "/tools/bolt-python/reference/context/index.html": "/tools/bolt-python/reference/context", - "/tools/bolt-python/reference/context/respond/async_respond.html": "/tools/bolt-python/reference/context/respond/async_respond", - "/tools/bolt-python/reference/context/respond/index.html": "/tools/bolt-python/reference/context/respond", - "/tools/bolt-python/reference/context/respond/internals.html": "/tools/bolt-python/reference/context/respond/internals", - "/tools/bolt-python/reference/context/respond/respond.html": "/tools/bolt-python/reference/context/respond/respond", - "/tools/bolt-python/reference/context/save_thread_context/async_save_thread_context.html": "/tools/bolt-python/reference/context/save_thread_context/async_save_thread_context", - "/tools/bolt-python/reference/context/save_thread_context/index.html": "/tools/bolt-python/reference/context/save_thread_context", - "/tools/bolt-python/reference/context/save_thread_context/save_thread_context.html": "/tools/bolt-python/reference/context/save_thread_context/save_thread_context", - "/tools/bolt-python/reference/context/say/async_say.html": "/tools/bolt-python/reference/context/say/async_say", - "/tools/bolt-python/reference/context/say/index.html": "/tools/bolt-python/reference/context/say", - "/tools/bolt-python/reference/context/say/internals.html": "/tools/bolt-python/reference/context/say/internals", - "/tools/bolt-python/reference/context/say/say.html": "/tools/bolt-python/reference/context/say/say", - "/tools/bolt-python/reference/context/say_stream/async_say_stream.html": "/tools/bolt-python/reference/context/say_stream/async_say_stream", - "/tools/bolt-python/reference/context/say_stream/index.html": "/tools/bolt-python/reference/context/say_stream", - "/tools/bolt-python/reference/context/say_stream/say_stream.html": "/tools/bolt-python/reference/context/say_stream/say_stream", - "/tools/bolt-python/reference/context/set_status/async_set_status.html": "/tools/bolt-python/reference/context/set_status/async_set_status", - "/tools/bolt-python/reference/context/set_status/index.html": "/tools/bolt-python/reference/context/set_status", - "/tools/bolt-python/reference/context/set_status/set_status.html": "/tools/bolt-python/reference/context/set_status/set_status", - "/tools/bolt-python/reference/context/set_suggested_prompts/async_set_suggested_prompts.html": "/tools/bolt-python/reference/context/set_suggested_prompts/async_set_suggested_prompts", - "/tools/bolt-python/reference/context/set_suggested_prompts/index.html": "/tools/bolt-python/reference/context/set_suggested_prompts", - "/tools/bolt-python/reference/context/set_suggested_prompts/set_suggested_prompts.html": "/tools/bolt-python/reference/context/set_suggested_prompts/set_suggested_prompts", - "/tools/bolt-python/reference/context/set_title/async_set_title.html": "/tools/bolt-python/reference/context/set_title/async_set_title", - "/tools/bolt-python/reference/context/set_title/index.html": "/tools/bolt-python/reference/context/set_title", - "/tools/bolt-python/reference/context/set_title/set_title.html": "/tools/bolt-python/reference/context/set_title/set_title", - "/tools/bolt-python/reference/error/index.html": "/tools/bolt-python/reference/error", - "/tools/bolt-python/reference/index.html": "/tools/bolt-python/reference", - "/tools/bolt-python/reference/kwargs_injection/args.html": "/tools/bolt-python/reference/kwargs_injection/args", - "/tools/bolt-python/reference/kwargs_injection/async_args.html": "/tools/bolt-python/reference/kwargs_injection/async_args", - "/tools/bolt-python/reference/kwargs_injection/async_utils.html": "/tools/bolt-python/reference/kwargs_injection/async_utils", - "/tools/bolt-python/reference/kwargs_injection/index.html": "/tools/bolt-python/reference/kwargs_injection", - "/tools/bolt-python/reference/kwargs_injection/utils.html": "/tools/bolt-python/reference/kwargs_injection/utils", - "/tools/bolt-python/reference/lazy_listener/async_internals.html": "/tools/bolt-python/reference/lazy_listener/async_internals", - "/tools/bolt-python/reference/lazy_listener/async_runner.html": "/tools/bolt-python/reference/lazy_listener/async_runner", - "/tools/bolt-python/reference/lazy_listener/asyncio_runner.html": "/tools/bolt-python/reference/lazy_listener/asyncio_runner", - "/tools/bolt-python/reference/lazy_listener/index.html": "/tools/bolt-python/reference/lazy_listener", - "/tools/bolt-python/reference/lazy_listener/internals.html": "/tools/bolt-python/reference/lazy_listener/internals", - "/tools/bolt-python/reference/lazy_listener/runner.html": "/tools/bolt-python/reference/lazy_listener/runner", - "/tools/bolt-python/reference/lazy_listener/thread_runner.html": "/tools/bolt-python/reference/lazy_listener/thread_runner", - "/tools/bolt-python/reference/listener/async_builtins.html": "/tools/bolt-python/reference/listener/async_builtins", - "/tools/bolt-python/reference/listener/async_listener.html": "/tools/bolt-python/reference/listener/async_listener", - "/tools/bolt-python/reference/listener/async_listener_completion_handler.html": "/tools/bolt-python/reference/listener/async_listener_completion_handler", - "/tools/bolt-python/reference/listener/async_listener_error_handler.html": "/tools/bolt-python/reference/listener/async_listener_error_handler", - "/tools/bolt-python/reference/listener/async_listener_start_handler.html": "/tools/bolt-python/reference/listener/async_listener_start_handler", - "/tools/bolt-python/reference/listener/asyncio_runner.html": "/tools/bolt-python/reference/listener/asyncio_runner", - "/tools/bolt-python/reference/listener/builtins.html": "/tools/bolt-python/reference/listener/builtins", - "/tools/bolt-python/reference/listener/custom_listener.html": "/tools/bolt-python/reference/listener/custom_listener", - "/tools/bolt-python/reference/listener/index.html": "/tools/bolt-python/reference/listener", - "/tools/bolt-python/reference/listener/listener.html": "/tools/bolt-python/reference/listener/listener", - "/tools/bolt-python/reference/listener/listener_completion_handler.html": "/tools/bolt-python/reference/listener/listener_completion_handler", - "/tools/bolt-python/reference/listener/listener_error_handler.html": "/tools/bolt-python/reference/listener/listener_error_handler", - "/tools/bolt-python/reference/listener/listener_start_handler.html": "/tools/bolt-python/reference/listener/listener_start_handler", - "/tools/bolt-python/reference/listener/thread_runner.html": "/tools/bolt-python/reference/listener/thread_runner", - "/tools/bolt-python/reference/listener_matcher/async_builtins.html": "/tools/bolt-python/reference/listener_matcher/async_builtins", - "/tools/bolt-python/reference/listener_matcher/async_listener_matcher.html": "/tools/bolt-python/reference/listener_matcher/async_listener_matcher", - "/tools/bolt-python/reference/listener_matcher/builtins.html": "/tools/bolt-python/reference/listener_matcher/builtins", - "/tools/bolt-python/reference/listener_matcher/custom_listener_matcher.html": "/tools/bolt-python/reference/listener_matcher/custom_listener_matcher", - "/tools/bolt-python/reference/listener_matcher/index.html": "/tools/bolt-python/reference/listener_matcher", - "/tools/bolt-python/reference/listener_matcher/listener_matcher.html": "/tools/bolt-python/reference/listener_matcher/listener_matcher", - "/tools/bolt-python/reference/logger/index.html": "/tools/bolt-python/reference/logger", - "/tools/bolt-python/reference/logger/messages.html": "/tools/bolt-python/reference/logger/messages", - "/tools/bolt-python/reference/middleware/assistant/assistant.html": "/tools/bolt-python/reference/middleware/assistant/assistant", - "/tools/bolt-python/reference/middleware/assistant/async_assistant.html": "/tools/bolt-python/reference/middleware/assistant/async_assistant", - "/tools/bolt-python/reference/middleware/assistant/index.html": "/tools/bolt-python/reference/middleware/assistant", - "/tools/bolt-python/reference/middleware/async_builtins.html": "/tools/bolt-python/reference/middleware/async_builtins", - "/tools/bolt-python/reference/middleware/async_custom_middleware.html": "/tools/bolt-python/reference/middleware/async_custom_middleware", - "/tools/bolt-python/reference/middleware/async_middleware.html": "/tools/bolt-python/reference/middleware/async_middleware", - "/tools/bolt-python/reference/middleware/async_middleware_error_handler.html": "/tools/bolt-python/reference/middleware/async_middleware_error_handler", - "/tools/bolt-python/reference/middleware/attaching_conversation_kwargs/async_attaching_conversation_kwargs.html": "/tools/bolt-python/reference/middleware/attaching_conversation_kwargs/async_attaching_conversation_kwargs", - "/tools/bolt-python/reference/middleware/attaching_conversation_kwargs/attaching_conversation_kwargs.html": "/tools/bolt-python/reference/middleware/attaching_conversation_kwargs/attaching_conversation_kwargs", - "/tools/bolt-python/reference/middleware/attaching_conversation_kwargs/index.html": "/tools/bolt-python/reference/middleware/attaching_conversation_kwargs", - "/tools/bolt-python/reference/middleware/attaching_function_token/async_attaching_function_token.html": "/tools/bolt-python/reference/middleware/attaching_function_token/async_attaching_function_token", - "/tools/bolt-python/reference/middleware/attaching_function_token/attaching_function_token.html": "/tools/bolt-python/reference/middleware/attaching_function_token/attaching_function_token", - "/tools/bolt-python/reference/middleware/attaching_function_token/index.html": "/tools/bolt-python/reference/middleware/attaching_function_token", - "/tools/bolt-python/reference/middleware/authorization/async_authorization.html": "/tools/bolt-python/reference/middleware/authorization/async_authorization", - "/tools/bolt-python/reference/middleware/authorization/async_internals.html": "/tools/bolt-python/reference/middleware/authorization/async_internals", - "/tools/bolt-python/reference/middleware/authorization/async_multi_teams_authorization.html": "/tools/bolt-python/reference/middleware/authorization/async_multi_teams_authorization", - "/tools/bolt-python/reference/middleware/authorization/async_single_team_authorization.html": "/tools/bolt-python/reference/middleware/authorization/async_single_team_authorization", - "/tools/bolt-python/reference/middleware/authorization/authorization.html": "/tools/bolt-python/reference/middleware/authorization/authorization", - "/tools/bolt-python/reference/middleware/authorization/index.html": "/tools/bolt-python/reference/middleware/authorization", - "/tools/bolt-python/reference/middleware/authorization/internals.html": "/tools/bolt-python/reference/middleware/authorization/internals", - "/tools/bolt-python/reference/middleware/authorization/multi_teams_authorization.html": "/tools/bolt-python/reference/middleware/authorization/multi_teams_authorization", - "/tools/bolt-python/reference/middleware/authorization/single_team_authorization.html": "/tools/bolt-python/reference/middleware/authorization/single_team_authorization", - "/tools/bolt-python/reference/middleware/custom_middleware.html": "/tools/bolt-python/reference/middleware/custom_middleware", - "/tools/bolt-python/reference/middleware/ignoring_self_events/async_ignoring_self_events.html": "/tools/bolt-python/reference/middleware/ignoring_self_events/async_ignoring_self_events", - "/tools/bolt-python/reference/middleware/ignoring_self_events/ignoring_self_events.html": "/tools/bolt-python/reference/middleware/ignoring_self_events/ignoring_self_events", - "/tools/bolt-python/reference/middleware/ignoring_self_events/index.html": "/tools/bolt-python/reference/middleware/ignoring_self_events", - "/tools/bolt-python/reference/middleware/index.html": "/tools/bolt-python/reference/middleware", - "/tools/bolt-python/reference/middleware/message_listener_matches/async_message_listener_matches.html": "/tools/bolt-python/reference/middleware/message_listener_matches/async_message_listener_matches", - "/tools/bolt-python/reference/middleware/message_listener_matches/index.html": "/tools/bolt-python/reference/middleware/message_listener_matches", - "/tools/bolt-python/reference/middleware/message_listener_matches/message_listener_matches.html": "/tools/bolt-python/reference/middleware/message_listener_matches/message_listener_matches", - "/tools/bolt-python/reference/middleware/middleware.html": "/tools/bolt-python/reference/middleware/middleware", - "/tools/bolt-python/reference/middleware/middleware_error_handler.html": "/tools/bolt-python/reference/middleware/middleware_error_handler", - "/tools/bolt-python/reference/middleware/request_verification/async_request_verification.html": "/tools/bolt-python/reference/middleware/request_verification/async_request_verification", - "/tools/bolt-python/reference/middleware/request_verification/index.html": "/tools/bolt-python/reference/middleware/request_verification", - "/tools/bolt-python/reference/middleware/request_verification/request_verification.html": "/tools/bolt-python/reference/middleware/request_verification/request_verification", - "/tools/bolt-python/reference/middleware/ssl_check/async_ssl_check.html": "/tools/bolt-python/reference/middleware/ssl_check/async_ssl_check", - "/tools/bolt-python/reference/middleware/ssl_check/index.html": "/tools/bolt-python/reference/middleware/ssl_check", - "/tools/bolt-python/reference/middleware/ssl_check/ssl_check.html": "/tools/bolt-python/reference/middleware/ssl_check/ssl_check", - "/tools/bolt-python/reference/middleware/url_verification/async_url_verification.html": "/tools/bolt-python/reference/middleware/url_verification/async_url_verification", - "/tools/bolt-python/reference/middleware/url_verification/index.html": "/tools/bolt-python/reference/middleware/url_verification", - "/tools/bolt-python/reference/middleware/url_verification/url_verification.html": "/tools/bolt-python/reference/middleware/url_verification/url_verification", - "/tools/bolt-python/reference/oauth/async_callback_options.html": "/tools/bolt-python/reference/oauth/async_callback_options", - "/tools/bolt-python/reference/oauth/async_internals.html": "/tools/bolt-python/reference/oauth/async_internals", - "/tools/bolt-python/reference/oauth/async_oauth_flow.html": "/tools/bolt-python/reference/oauth/async_oauth_flow", - "/tools/bolt-python/reference/oauth/async_oauth_settings.html": "/tools/bolt-python/reference/oauth/async_oauth_settings", - "/tools/bolt-python/reference/oauth/callback_options.html": "/tools/bolt-python/reference/oauth/callback_options", - "/tools/bolt-python/reference/oauth/index.html": "/tools/bolt-python/reference/oauth", - "/tools/bolt-python/reference/oauth/internals.html": "/tools/bolt-python/reference/oauth/internals", - "/tools/bolt-python/reference/oauth/oauth_flow.html": "/tools/bolt-python/reference/oauth/oauth_flow", - "/tools/bolt-python/reference/oauth/oauth_settings.html": "/tools/bolt-python/reference/oauth/oauth_settings", - "/tools/bolt-python/reference/request/async_internals.html": "/tools/bolt-python/reference/request/async_internals", - "/tools/bolt-python/reference/request/async_request.html": "/tools/bolt-python/reference/request/async_request", - "/tools/bolt-python/reference/request/index.html": "/tools/bolt-python/reference/request", - "/tools/bolt-python/reference/request/internals.html": "/tools/bolt-python/reference/request/internals", - "/tools/bolt-python/reference/request/payload_utils.html": "/tools/bolt-python/reference/request/payload_utils", - "/tools/bolt-python/reference/request/request.html": "/tools/bolt-python/reference/request/request", - "/tools/bolt-python/reference/response/index.html": "/tools/bolt-python/reference/response", - "/tools/bolt-python/reference/response/response.html": "/tools/bolt-python/reference/response/response", - "/tools/bolt-python/reference/util/async_utils.html": "/tools/bolt-python/reference/util/async_utils", - "/tools/bolt-python/reference/util/index.html": "/tools/bolt-python/reference/util", - "/tools/bolt-python/reference/util/utils.html": "/tools/bolt-python/reference/util/utils", - "/tools/bolt-python/reference/version.html": "/tools/bolt-python/reference/version", - "/tools/bolt-python/reference/workflows/index.html": "/tools/bolt-python/reference/workflows", - "/tools/bolt-python/reference/workflows/step/async_step.html": "/tools/bolt-python/reference/workflows/step/async_step", - "/tools/bolt-python/reference/workflows/step/async_step_middleware.html": "/tools/bolt-python/reference/workflows/step/async_step_middleware", - "/tools/bolt-python/reference/workflows/step/index.html": "/tools/bolt-python/reference/workflows/step", - "/tools/bolt-python/reference/workflows/step/internals.html": "/tools/bolt-python/reference/workflows/step/internals", - "/tools/bolt-python/reference/workflows/step/step.html": "/tools/bolt-python/reference/workflows/step/step", - "/tools/bolt-python/reference/workflows/step/step_middleware.html": "/tools/bolt-python/reference/workflows/step/step_middleware", - "/tools/bolt-python/reference/workflows/step/utilities/async_complete.html": "/tools/bolt-python/reference/workflows/step/utilities/async_complete", - "/tools/bolt-python/reference/workflows/step/utilities/async_configure.html": "/tools/bolt-python/reference/workflows/step/utilities/async_configure", - "/tools/bolt-python/reference/workflows/step/utilities/async_fail.html": "/tools/bolt-python/reference/workflows/step/utilities/async_fail", - "/tools/bolt-python/reference/workflows/step/utilities/async_update.html": "/tools/bolt-python/reference/workflows/step/utilities/async_update", - "/tools/bolt-python/reference/workflows/step/utilities/complete.html": "/tools/bolt-python/reference/workflows/step/utilities/complete", - "/tools/bolt-python/reference/workflows/step/utilities/configure.html": "/tools/bolt-python/reference/workflows/step/utilities/configure", - "/tools/bolt-python/reference/workflows/step/utilities/fail.html": "/tools/bolt-python/reference/workflows/step/utilities/fail", - "/tools/bolt-python/reference/workflows/step/utilities/index.html": "/tools/bolt-python/reference/workflows/step/utilities", - "/tools/bolt-python/reference/workflows/step/utilities/update.html": "/tools/bolt-python/reference/workflows/step/utilities/update" -} \ No newline at end of file diff --git a/requirements/docs.txt b/requirements/docs.txt new file mode 100644 index 000000000..b57cc690d --- /dev/null +++ b/requirements/docs.txt @@ -0,0 +1,10 @@ +# pip install -r requirements/docs.txt +# Note: doc-gen only; runs on the latest supported Python (see scripts/generate_api_docs.sh). +# Note: pinned so the committed reference tree under docs/english/reference stays reproducible; +# an unpinned griffe/griffe2md can silently shift the generated Markdown (and fail the drift CI job). + +# griffe2md -- renders griffe objects to Markdown (pulls in griffelib + jinja2 + mdformat) +griffe2md==1.5.0 + +# griffelib -- griffe's PyPI distribution (import name `griffe`); pinned to match griffe2md's rendering +griffelib==2.2.0 diff --git a/requirements/documentation.txt b/requirements/documentation.txt deleted file mode 100644 index 75e2bcb0a..000000000 --- a/requirements/documentation.txt +++ /dev/null @@ -1,8 +0,0 @@ -# pip install -r requirements/documentation.txt - -# griffe -# Note: doc-gen only; the generator runs on the latest supported Python (see -# scripts/generate_api_docs.sh), so no python_version markers are needed. -# Note: pinned so the committed reference tree under docs/english/reference stays -# reproducible -- an unpinned griffe can silently shift the generated Markdown. -griffe==2.2.0 diff --git a/scripts/generate_api_docs.py b/scripts/generate_api_docs.py index dde672fc0..ac2393a17 100644 --- a/scripts/generate_api_docs.py +++ b/scripts/generate_api_docs.py @@ -1,16 +1,18 @@ #!/usr/bin/env python -"""Generate the Markdown API reference for slack_bolt using griffe. +"""Generate the Markdown API reference for slack_bolt using griffe + griffe2md. -Invoked by scripts/generate_api_docs.sh. griffe (the parser behind -mkdocstrings) is used purely as the extraction engine: it loads the package, -resolves re-export aliases to their concrete definition, and parses Google-style -docstrings into structured sections. This module renders that structured data -into the Docusaurus-flavored Markdown tree the docs site imports. +Invoked by scripts/generate_api_docs.sh. griffe loads the package, resolves +re-export aliases to their concrete definition, and parses Google-style +docstrings into structured data; griffe2md renders that data to Markdown. This +module is the thin Docusaurus adapter around griffe2md: it walks the package, +writes one Markdown page per module under ``reference/`` (packages become +``index.md``), and post-processes griffe2md's output so the docs site can +compile it as MDX. The output layout (flattened under ``reference/``, package overviews as -``index.md``) is produced directly rather than rendered and then rewritten. The -reference nav is contributed by a single ``autogenerated`` entry in -``docs/english/_sidebar.json``; this script writes only Markdown. +``index.md``) is produced directly. The reference nav is contributed by a +single ``autogenerated`` entry in ``docs/english/_sidebar.json``; this script +writes only Markdown. """ import os @@ -18,6 +20,7 @@ import shutil import griffe +from griffe2md import default_config, render_object_docs REPO_ROOT = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) @@ -32,142 +35,67 @@ # hence the prefix. SIDEBAR_DOC_ID_PREFIX = "tools/bolt-python/" -# Signatures longer than this render one parameter per line. -MAX_SIGNATURE_WIDTH = 88 - PACKAGE = "slack_bolt" # --------------------------------------------------------------------------- # -# MDX escaping +# griffe2md rendering # --------------------------------------------------------------------------- # -# Docusaurus v3 parses every .md file as MDX: a bare ``<`` reads as JSX and a -# bare ``{`` as a JS expression, either of which aborts the docs build. Escape -# those two characters in prose while leaving fenced blocks and inline code -# spans untouched. -_CODE_SPLIT_RE = re.compile(r"(```[\s\S]*?```|`[^`]*`)") - - -def _escape_mdx(text): - """Escape MDX-hazardous characters outside code spans and fenced blocks.""" - out = [] - for i, chunk in enumerate(_CODE_SPLIT_RE.split(text)): - # Odd indices are the captured code spans/blocks -- leave them verbatim. - if i % 2 == 1: - out.append(chunk) - else: - out.append(chunk.replace("<", "<").replace("{", "{")) - return "".join(out) - - -def _escape_header(name): - """Escape a name for use in a Markdown header (underscores/asterisks).""" - return name.replace("_", "\\_").replace("*", "\\*") +# griffe2md renders a griffe object to Markdown. We accept its default output +# style (``## `Name```, ``**Parameters:**``, ``- **app** (App) - ...``) and only +# adjust structural knobs so each module renders as a flat, root-less section +# that slots beneath our own front-matter and submodule links. +CONFIG = dict(default_config) +CONFIG.update( + docstring_style="google", + summary=False, + show_if_no_docstring=False, + show_submodules=False, + show_root_heading=False, + show_root_full_path=False, + show_root_members_full_path=False, + show_object_full_path=False, + heading_level=2, + # big to keep signatures single-line, so output never depends on Black. + line_length=10**9, +) + + +def _render_module(module): + """Render a module to MDX-safe Markdown via griffe2md + post-processing.""" + return _post_process(render_object_docs(module, CONFIG)) # --------------------------------------------------------------------------- # -# Signatures +# MDX-safety post-processing # --------------------------------------------------------------------------- # -_VAR_POSITIONAL = "variadic positional" -_VAR_KEYWORD = "variadic keyword" -_POSITIONAL_ONLY = "positional-only" -_KEYWORD_ONLY = "keyword-only" - - -def _parameter_source(param): - """Render a single parameter as Python source (``name: type = default``).""" - if param.kind.value == _VAR_POSITIONAL: - text = "*" + param.name - elif param.kind.value == _VAR_KEYWORD: - text = "**" + param.name - else: - text = param.name - - annotation = str(param.annotation) if param.annotation is not None else None - default = str(param.default) if param.default is not None else None - if annotation: - text += ": " + annotation - if default is not None and param.kind.value not in (_VAR_POSITIONAL, _VAR_KEYWORD): - text += " = " + default if annotation else "=" + default - return text - - -def _parameter_list(func, drop_first_self): - """Build the ordered parameter fragments for a function, inserting the - ``/`` (positional-only) and bare ``*`` (keyword-only) separators the way - ``inspect.Signature`` does.""" - params = list(func.parameters) - if drop_first_self and params and params[0].name in ("self", "cls"): - params = params[1:] - - fragments = [] - render_pos_only_sep = False - render_kw_only_sep = True - for param in params: - kind = param.kind.value - if kind == _POSITIONAL_ONLY: - render_pos_only_sep = True - elif render_pos_only_sep: - fragments.append("/") - render_pos_only_sep = False - - if kind == _VAR_POSITIONAL: - render_kw_only_sep = False - elif kind == _KEYWORD_ONLY and render_kw_only_sep: - fragments.append("*") - render_kw_only_sep = False - - fragments.append(_parameter_source(param)) - - if render_pos_only_sep: - fragments.append("/") - return fragments - - -def _format_function_signature(func, name, is_method): - """Render a ``def``/``async def`` signature, wrapping long ones one - parameter per line.""" - prefix = "async def " if "async" in (func.labels or set()) else "def " - fragments = _parameter_list(func, drop_first_self=is_method) - returns = " -> {}".format(func.returns) if func.returns is not None else "" - - one_line = "{}{}({}){}".format(prefix, name, ", ".join(fragments), returns) - if len(one_line) <= MAX_SIGNATURE_WIDTH: - return one_line - - inner = ",\n".join(" " + fragment for fragment in fragments) - return "{}{}(\n{}){}".format(prefix, name, inner, returns) - - -def _format_classdef_signature(cls): - """Render a ``class Name(bases)`` signature.""" - bases = ", ".join(str(base) for base in cls.bases) - return "class {}({})".format(cls.name, bases) - - -def _property_signature(attr): - """Render a property as a ``@property``-decorated getter.""" - returns = " -> {}".format(attr.annotation) if attr.annotation is not None else "" - return "@property\ndef {}(){}".format(attr.name, returns) +# Docusaurus v3 parses every .md file as MDX: a bare ``<`` reads as JSX and a +# bare ``{`` as a JS expression, either of which aborts the docs build. Escape +# those two characters in prose while leaving fenced blocks and inline code +# spans untouched. +_CODE_SPLIT_RE = re.compile(r"(```[\s\S]*?```|`[^`]*`)") - -# --------------------------------------------------------------------------- # -# Docstrings -# --------------------------------------------------------------------------- # +# griffe2md wraps type annotations and base classes in ```` and links +# symbols to intra-page anchors (``#slack_bolt.App``). We render one page per +# module and emit no cross-references, so those anchors don't resolve -- strip +# the wrapper and the anchor links back to plain text +# (``[App](#slack_bolt.App)`` -> ``App``). Links to real URLs +# (``(https://...)``) are left intact. +_CODE_TAG_RE = re.compile(r"") +_ANCHOR_LINK_RE = re.compile(r"\[([^\]]+)\]\(#[^)]*\)") def _reflow_indented_code(text): - """Convert Markdown indented code blocks (4-space, RST literal-block style - used in many docstrings) into fenced ``python`` blocks. + """Convert 4-space indented docstring code blocks into fenced python blocks. A bare indented block renders without syntax highlighting and, worse, its - ``#`` comment lines can be misread as headers by some Markdown/MDX - processors. Re-emitting the block fenced removes both problems and lets - _escape_mdx leave the code verbatim. Only blocks preceded by a blank line - are treated as code, matching CommonMark (an indented run cannot interrupt - a paragraph).""" + ``<``/``{`` characters would be escaped as prose by _escape_prose. Re-emitting + the block fenced fixes highlighting and lets the code survive verbatim. Only + blocks preceded by a blank line are treated as code, matching CommonMark (an + indented run cannot interrupt a paragraph). + """ lines = text.split("\n") out = [] i = 0 @@ -208,165 +136,29 @@ def _reflow_indented_code(text): return "\n".join(out) -def _indent_continuation(text): - """Indent wrapped continuation lines of a list item by two spaces.""" - return _escape_mdx(text).replace("\n", "\n ") - - -def _render_docstring(obj, out): - """Append an object's docstring, section by section, to ``out``.""" - if not obj.docstring: - return - for section in obj.docstring.parsed: - kind = section.kind.value - if kind == "text": - out.append(_escape_mdx(_reflow_indented_code(section.value))) - out.append("") - elif kind == "parameters": - out.append("**Arguments**:") - out.append("") - for param in section.value: - typ = " _{}_".format(param.annotation) if param.annotation else "" - if param.description: - out.append("- `{}`{} - {}".format(param.name, typ, _indent_continuation(param.description))) - else: - out.append("- `{}`{}".format(param.name, typ)) - out.append("") - elif kind == "returns": - out.append("**Returns**:") - out.append("") - for ret in section.value: - bits = [] - if ret.annotation: - bits.append("`{}`".format(ret.annotation)) - if ret.description: - bits.append(_indent_continuation(ret.description)) - out.append("- " + " - ".join(bits)) - out.append("") - elif kind == "raises": - out.append("**Raises**:") - out.append("") - for exc in section.value: - typ = "`{}`".format(exc.annotation) if exc.annotation else "" - if exc.description: - out.append("- {} - {}".format(typ, _indent_continuation(exc.description))) - else: - out.append("- {}".format(typ)) - out.append("") - elif kind == "admonition": - label = (section.value.kind or "note").replace("-", " ").title() - out.append("**{}**:".format(label)) - out.append("") - out.append(_escape_mdx(_reflow_indented_code(section.value.contents))) - out.append("") - else: - # Unknown/rare section (examples, yields, ...): render its text form. - contents = str(getattr(section.value, "contents", section.value)) - out.append(_escape_mdx(_reflow_indented_code(contents))) - out.append("") - - -# --------------------------------------------------------------------------- # -# Member selection (with re-export inlining) -# --------------------------------------------------------------------------- # - - -def _is_public(name): - """Keep public names plus ``__init__`` (constructors carry the class's - ``Args:``); drop every other dunder/private name.""" - return name == "__init__" or not name.startswith("_") - - -def _inlined_export_target(alias): - """If *alias* re-exports a concrete slack_bolt class/function, return it.""" - try: - target = alias.target - except Exception: - return None - if target.canonical_path.startswith(PACKAGE + ".") and target.kind.value in ("class", "function"): - return target - return None - - -def _documented_members(parent): - """Yield ``(display_name, object)`` pairs to document under *parent*. - - Submodules are skipped (they become their own files). Aliases are inlined - only when they are declared in the module's ``__all__`` and resolve to a - concrete slack_bolt class/function, so genuine public re-exports render - inline while incidental imports do not.""" - exports = set(parent.exports or []) if parent.is_module else set() - members = [] - for name, member in parent.members.items(): - if member.is_alias: - if name in exports: - target = _inlined_export_target(member) - if target is not None: - members.append((name, target)) - continue - if member.is_module: - continue - if not _is_public(name): - continue - # Drop undocumented instance attributes (bare ``self.x = x`` assignments - # with neither a type annotation nor a docstring) -- they are - # implementation detail. Class- and module-level constants are kept. - labels = member.labels or set() - if member.kind.value == "attribute" and labels == {"instance-attribute"}: - if member.annotation is None and not member.docstring: - continue - members.append((name, member)) - return members +def _escape_prose(chunk): + """Strip griffe2md markup, then escape MDX-hazardous characters in prose. + Removes ```` wrappers and intra-page anchor links, then escapes ``<`` + and ``{``. Applied only to prose chunks, never to code. + """ + chunk = _CODE_TAG_RE.sub("", chunk) + chunk = _ANCHOR_LINK_RE.sub(r"\1", chunk) + return chunk.replace("<", "<").replace("{", "{") -# --------------------------------------------------------------------------- # -# Object rendering -# --------------------------------------------------------------------------- # +def _post_process(text): + """Make griffe2md's Markdown safe to compile as MDX. -def _render_object(display_name, obj, out): - """Append the Markdown for a single class/function/attribute to ``out``.""" - kind = obj.kind.value - - if kind == "class": - out.append("## {} Objects".format(_escape_header(obj.name))) - out.append("") - out.append("```python") - out.append(_format_classdef_signature(obj)) - out.append("```") - out.append("") - _render_docstring(obj, out) - for child_name, child in _documented_members(obj): - _render_object(child_name, child, out) - return - - if kind == "function": - is_method = obj.parent is not None and obj.parent.kind.value == "class" - out.append("#### {}".format(_escape_header(display_name))) - out.append("") - out.append("```python") - out.append(_format_function_signature(obj, display_name, is_method)) - out.append("```") - out.append("") - _render_docstring(obj, out) - return - - # Attribute -- a property renders as a getter, a plain variable as a header - # carrying its type hint (no value block). - if "property" in (obj.labels or set()): - out.append("#### {}".format(_escape_header(display_name))) - out.append("") - out.append("```python") - out.append(_property_signature(obj)) - out.append("```") - out.append("") - elif obj.annotation is not None: - out.append("#### {}: `{}`".format(_escape_header(display_name), obj.annotation)) - out.append("") - else: - out.append("#### {}".format(_escape_header(display_name))) - out.append("") - _render_docstring(obj, out) + Fence indented code so it survives verbatim, then rewrite only the prose + (fenced/inline code spans are left untouched). + """ + text = _reflow_indented_code(text) + out = [] + for i, chunk in enumerate(_CODE_SPLIT_RE.split(text)): + # Odd indices are the captured code spans/blocks -- leave them verbatim. + out.append(chunk if i % 2 else _escape_prose(chunk)) + return "".join(out).rstrip("\n") # --------------------------------------------------------------------------- # @@ -389,30 +181,17 @@ def _iter_modules(module): yield from _iter_modules(member) -def _module_docstring(module): - """Render a module's own docstring (the package/module overview), if any.""" - out = [] - _render_docstring(module, out) - return "\n".join(out).rstrip("\n") - - -def _render_body(module): - """Render a module's members (the module docstring is rendered separately - at the top of the page).""" - out = [] - for name, obj in _documented_members(module): - _render_object(name, obj, out) - return "\n".join(out).rstrip("\n") + "\n" if out else "" - - # --------------------------------------------------------------------------- # # Routes # --------------------------------------------------------------------------- # def _doc_id(rel_path, is_package): - """Docs-root doc ID for a module, e.g. ``reference/app/app`` or the package - overview ``reference/app/index``.""" + """Docs-root doc ID for a module. + + For example ``reference/app/app`` or the package overview + ``reference/app/index``. + """ if not rel_path: base = REFERENCE_SUBDIR + "/index" elif is_package: @@ -440,6 +219,7 @@ def _load_package(): PACKAGE, search_paths=[REPO_ROOT], docstring_parser=griffe.Parser.google, + resolve_aliases=True, ) @@ -459,8 +239,7 @@ def _build_pages(root): "title": dotted, "sidebar_label": sidebar_label, "doc_id": _doc_id(rel_path, is_package), - "docstring": _module_docstring(module), - "body": _render_body(module), + "content": _render_module(module), } return pages @@ -490,6 +269,10 @@ def _write_pages(pages): os.makedirs(os.path.dirname(path), exist_ok=True) frontmatter = ["---", "sidebar_label: {}".format(page["sidebar_label"]), "title: {}".format(page["title"])] + # Pin the top-level reference index to the top of its sidebar category; + # siblings have no explicit position, so any number floats it first. + if not rel_path: + frontmatter.append("sidebar_position: 1") # A module whose file is /.md collides with the folder's # index.md route; pin it with a relative slug. basename = os.path.basename(path)[: -len(".md")] @@ -499,8 +282,8 @@ def _write_pages(pages): frontmatter.append("---") body_parts = [] - if page["docstring"]: - body_parts.append(page["docstring"]) + if page["content"]: + body_parts.append(page["content"]) body_parts.append("") if page["is_package"] or not rel_path: links = _submodule_links(rel_path, pages) @@ -509,8 +292,6 @@ def _write_pages(pages): body_parts.append("") body_parts += ["- [{}]({})".format(title, route) for title, route in links] body_parts.append("") - if page["body"]: - body_parts.append(page["body"]) with open(path, "w", encoding="utf-8") as handle: handle.write("\n".join(frontmatter) + "\n\n" + "\n".join(body_parts).rstrip("\n") + "\n") @@ -524,10 +305,12 @@ def _write_pages(pages): def _check_mdx_hazards(): - """Fail generation if any rendered Markdown has an MDX/acorn hazard: a line - outside a code fence beginning with ``export``/``import`` (ESM) or ``<`` - (JSX). These come from unfenced code examples in docstrings; the fix is to - fence the example in its source docstring.""" + """Fail generation if any rendered Markdown has an MDX/acorn hazard. + + A hazard is a line outside a code fence beginning with ``export``/``import`` + (ESM) or ``<`` (JSX). These come from unfenced code examples in docstrings; + the fix is to fence the example in its source docstring. + """ reference_dir = os.path.join(DOCS_BASE_PATH, REFERENCE_SUBDIR) hazards = [] for dirpath, _dirnames, filenames in os.walk(reference_dir): diff --git a/scripts/generate_api_docs.sh b/scripts/generate_api_docs.sh index 6f5305c12..884cdac40 100755 --- a/scripts/generate_api_docs.sh +++ b/scripts/generate_api_docs.sh @@ -1,17 +1,20 @@ #!/bin/bash # Generate the Markdown API reference from the latest source code. -# The heavy lifting (including inlining re-exported classes) lives in -# scripts/generate_api_docs.py. +# The heavy lifting (griffe extraction + griffe2md rendering + MDX-safety +# post-processing) lives in scripts/generate_api_docs.py. set -e script_dir=$(dirname "$0") cd "${script_dir}/.." -pip install -U pip -pip install -U -r requirements/adapter_dev.txt -pip install -U -r requirements/async_dev.txt -pip install -U -r requirements/documentation.txt -pip install . +if [[ "$1" != "--no-install" ]]; then + pip install -U pip + pip install -U -r requirements/adapter_dev.txt + pip install -U -r requirements/async_dev.txt + pip install -U -r requirements/docs.txt + pip install . +fi + rm -rf docs/english/reference python scripts/generate_api_docs.py diff --git a/slack_bolt/adapter/asgi/aiohttp/__init__.py b/slack_bolt/adapter/asgi/aiohttp/__init__.py index 796098537..26332d45b 100644 --- a/slack_bolt/adapter/asgi/aiohttp/__init__.py +++ b/slack_bolt/adapter/asgi/aiohttp/__init__.py @@ -18,14 +18,16 @@ def __init__(self, app: AsyncApp, path: str = "/slack/events"): With the default settings, `http://localhost:3000/slack/events` Run Bolt with [uvicron](https://www.uvicorn.org/) - # Python - app = AsyncApp() - api = SlackRequestHandler(app) - - # bash - export SLACK_SIGNING_SECRET=*** - export SLACK_BOT_TOKEN=xoxb-*** - uvicorn app:api --port 3000 --log-level debug + ```python + app = AsyncApp() + api = SlackRequestHandler(app) + ``` + + ```bash + export SLACK_SIGNING_SECRET=*** + export SLACK_BOT_TOKEN=xoxb-*** + uvicorn app:api --port 3000 --log-level debug + ``` Args: app: Your bolt application diff --git a/slack_bolt/adapter/asgi/builtin/__init__.py b/slack_bolt/adapter/asgi/builtin/__init__.py index b05451f34..a52395ef2 100644 --- a/slack_bolt/adapter/asgi/builtin/__init__.py +++ b/slack_bolt/adapter/asgi/builtin/__init__.py @@ -17,14 +17,16 @@ def __init__(self, app: App, path: str = "/slack/events"): With the default settings, `http://localhost:3000/slack/events` Run Bolt with [uvicron](https://www.uvicorn.org/) - # Python - app = App() - api = SlackRequestHandler(app) - - # bash - export SLACK_SIGNING_SECRET=*** - export SLACK_BOT_TOKEN=xoxb-*** - uvicorn app:api --port 3000 --log-level debug + ```python + app = App() + api = SlackRequestHandler(app) + ``` + + ```bash + export SLACK_SIGNING_SECRET=*** + export SLACK_BOT_TOKEN=xoxb-*** + uvicorn app:api --port 3000 --log-level debug + ``` Args: app: Your bolt application diff --git a/slack_bolt/adapter/wsgi/handler.py b/slack_bolt/adapter/wsgi/handler.py index b13e64530..ab7971096 100644 --- a/slack_bolt/adapter/wsgi/handler.py +++ b/slack_bolt/adapter/wsgi/handler.py @@ -20,17 +20,19 @@ def __init__(self, app: App, path: str = "/slack/events"): With the default settings, `http://localhost:3000/slack/events` Run Bolt with [gunicorn](https://gunicorn.org/) - # Python - app = App() + ```python + app = App() - api = SlackRequestHandler(app) + api = SlackRequestHandler(app) + ``` - # bash - export SLACK_SIGNING_SECRET=*** + ```bash + export SLACK_SIGNING_SECRET=*** - export SLACK_BOT_TOKEN=xoxb-*** + export SLACK_BOT_TOKEN=xoxb-*** - gunicorn app:api -b 0.0.0.0:3000 --log-level debug + gunicorn app:api -b 0.0.0.0:3000 --log-level debug + ``` Args: app: Your bolt application