Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Empty file.
46 changes: 46 additions & 0 deletions integration_tests/samples/socket_mode/aiohttp_example.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,46 @@
# ------------------
# Only for running this script here
import sys
from os.path import dirname

sys.path.insert(1, f"{dirname(__file__)}/../../..")
# ------------------

import logging

logging.basicConfig(level=logging.DEBUG)

import asyncio
import os
from slack_sdk.web.async_client import AsyncWebClient
from slack_sdk.socket_mode.response import SocketModeResponse
from slack_sdk.socket_mode.request import SocketModeRequest
from slack_sdk.socket_mode.aiohttp import SocketModeClient


async def main():

client = SocketModeClient(
app_token=os.environ.get("SLACK_SDK_TEST_SOCKET_MODE_APP_TOKEN"),
web_client=AsyncWebClient(
token=os.environ.get("SLACK_SDK_TEST_SOCKET_MODE_BOT_TOKEN")
),
)

async def process(client: SocketModeClient, req: SocketModeRequest):
if req.type == "events_api":
response = SocketModeResponse(envelope_id=req.envelope_id)
await client.send_socket_mode_response(response)

await client.web_client.reactions_add(
name="eyes",
channel=req.payload["event"]["channel"],
timestamp=req.payload["event"]["ts"],
)

client.socket_mode_request_listeners.append(process)
await client.connect()
await asyncio.sleep(float("inf"))


asyncio.run(main())
Empty file.
66 changes: 66 additions & 0 deletions integration_tests/samples/socket_mode/bolt_adapter/aiohttp.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,66 @@
# ------------------
# Only for running this script here
import sys
from os.path import dirname

sys.path.insert(1, f"{dirname(__file__)}/../../../..")
# ------------------

import os
from time import time
from typing import Optional

from slack_sdk.socket_mode.aiohttp import SocketModeClient
from slack_sdk.socket_mode.request import SocketModeRequest

from slack_bolt import App
from .async_base_handler import AsyncBaseSocketModeHandler
from .async_internals import (
send_async_response,
run_async_bolt_app,
)
from .internals import run_bolt_app
from slack_bolt.app.async_app import AsyncApp
from slack_bolt.response import BoltResponse


class SocketModeHandler(AsyncBaseSocketModeHandler):
app: App # type: ignore
app_token: str
client: SocketModeClient

def __init__( # type: ignore
self,
app: App, # type: ignore
app_token: Optional[str] = None,
):
self.app = app
self.app_token = app_token or os.environ["SLACK_APP_TOKEN"]
self.client = SocketModeClient(app_token=self.app_token)
self.client.socket_mode_request_listeners.append(self.handle)

async def handle(self, client: SocketModeClient, req: SocketModeRequest) -> None:
start = time()
bolt_resp: BoltResponse = run_bolt_app(self.app, req)
await send_async_response(client, req, bolt_resp, start)


class AsyncSocketModeHandler(AsyncBaseSocketModeHandler):
app: AsyncApp # type: ignore
app_token: str
client: SocketModeClient

def __init__( # type: ignore
self,
app: AsyncApp, # type: ignore
app_token: Optional[str] = None,
):
self.app = app
self.app_token = app_token or os.environ["SLACK_APP_TOKEN"]
self.client = SocketModeClient(app_token=self.app_token)
self.client.socket_mode_request_listeners.append(self.handle)

async def handle(self, client: SocketModeClient, req: SocketModeRequest) -> None:
start = time()
bolt_resp: BoltResponse = await run_async_bolt_app(self.app, req)
await send_async_response(client, req, bolt_resp, start)
Original file line number Diff line number Diff line change
@@ -0,0 +1,44 @@
# ------------------
# Only for running this script here
import sys
from os.path import dirname

sys.path.insert(1, f"{dirname(__file__)}/../../../..")
# ------------------

import asyncio
import logging
from typing import Union

from slack_sdk.socket_mode.async_client import AsyncBaseSocketModeClient
from slack_sdk.socket_mode.request import SocketModeRequest

from slack_bolt import App
from slack_bolt.app.async_app import AsyncApp


class AsyncBaseSocketModeHandler:
app: Union[App, AsyncApp] # type: ignore
client: AsyncBaseSocketModeClient

async def handle(
self, client: AsyncBaseSocketModeClient, req: SocketModeRequest
) -> None:
raise NotImplementedError()

async def connect_async(self):
await self.client.connect()

async def disconnect_async(self):
await self.client.disconnect()

async def close_async(self):
await self.client.close()

async def start_async(self):
await self.connect_async()
if self.app.logger.level > logging.INFO:
print("⚡️ Bolt app is running!")
else:
self.app.logger.info("⚡️ Bolt app is running!")
await asyncio.sleep(float("inf"))
Original file line number Diff line number Diff line change
@@ -0,0 +1,57 @@
# ------------------
# Only for running this script here
import sys
from os.path import dirname

sys.path.insert(1, f"{dirname(__file__)}/../../../..")
# ------------------

import json
import logging
from time import time

from slack_sdk.socket_mode.async_client import AsyncBaseSocketModeClient
from slack_sdk.socket_mode.request import SocketModeRequest
from slack_sdk.socket_mode.response import SocketModeResponse

from slack_bolt.app.async_app import AsyncApp
from slack_bolt.request.async_request import AsyncBoltRequest
from slack_bolt.response import BoltResponse


async def run_async_bolt_app(app: AsyncApp, req: SocketModeRequest): # type: ignore
bolt_req: AsyncBoltRequest = AsyncBoltRequest(mode="socket_mode", body=req.payload)
bolt_resp: BoltResponse = await app.async_dispatch(bolt_req)
return bolt_resp


async def send_async_response(
client: AsyncBaseSocketModeClient,
req: SocketModeRequest,
bolt_resp: BoltResponse,
start_time: float,
):
if bolt_resp.status == 200:
content_type = bolt_resp.headers.get("content-type", [""])[0]
if bolt_resp.body is None or len(bolt_resp.body) == 0:
await client.send_socket_mode_response(
SocketModeResponse(envelope_id=req.envelope_id)
)
elif content_type.startswith("application/json"):
dict_body = json.loads(bolt_resp.body)
await client.send_socket_mode_response(
SocketModeResponse(envelope_id=req.envelope_id, payload=dict_body)
)
else:
await client.send_socket_mode_response(
SocketModeResponse(
envelope_id=req.envelope_id, payload={"text": bolt_resp.body},
)
)
if client.logger.level <= logging.DEBUG:
spent_time = int((time() - start_time) * 1000)
client.logger.debug(f"Response time: {spent_time} milliseconds")
else:
client.logger.info(
f"Unsuccessful Bolt execution result (status: {bolt_resp.status}, body: {bolt_resp.body})"
)
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
# ------------------
# Only for running this script here
import sys
from os.path import dirname

sys.path.insert(1, f"{dirname(__file__)}/../../../..")
# ------------------

import logging
from threading import Event

from slack_sdk.socket_mode.client import BaseSocketModeClient
from slack_sdk.socket_mode.request import SocketModeRequest

from slack_bolt import App


class BaseSocketModeHandler:
app: App # type: ignore
client: BaseSocketModeClient

def handle(self, client: BaseSocketModeClient, req: SocketModeRequest) -> None:
raise NotImplementedError()

def connect(self):
self.client.connect()

def disconnect(self):
self.client.disconnect()

def close(self):
self.client.close()

def start(self):
self.connect()
if self.app.logger.level > logging.INFO:
print("⚡️ Bolt app is running!")
else:
self.app.logger.info("⚡️ Bolt app is running!")
Event().wait()
40 changes: 40 additions & 0 deletions integration_tests/samples/socket_mode/bolt_adapter/builtin.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
# ------------------
# Only for running this script here
import sys
from os.path import dirname

sys.path.insert(1, f"{dirname(__file__)}/../../../..")
# ------------------

import os
from time import time
from typing import Optional

from slack_sdk.socket_mode.request import SocketModeRequest
from slack_sdk.socket_mode.builtin import SocketModeClient

from slack_bolt import App
from .base_handler import BaseSocketModeHandler
from .internals import run_bolt_app, send_response
from slack_bolt.response import BoltResponse


class SocketModeHandler(BaseSocketModeHandler):
app: App # type: ignore
app_token: str
client: SocketModeClient

def __init__( # type: ignore
self,
app: App, # type: ignore
app_token: Optional[str] = None,
):
self.app = app
self.app_token = app_token or os.environ["SLACK_APP_TOKEN"]
self.client = SocketModeClient(app_token=self.app_token)
self.client.socket_mode_request_listeners.append(self.handle)

def handle(self, client: SocketModeClient, req: SocketModeRequest) -> None:
start = time()
bolt_resp: BoltResponse = run_bolt_app(self.app, req)
send_response(client, req, bolt_resp, start)
58 changes: 58 additions & 0 deletions integration_tests/samples/socket_mode/bolt_adapter/internals.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,58 @@
# ------------------
# Only for running this script here
import sys
from os.path import dirname

sys.path.insert(1, f"{dirname(__file__)}/../../../..")
# ------------------

import json
import logging
from time import time

from slack_sdk.socket_mode.client import BaseSocketModeClient
from slack_sdk.socket_mode.request import SocketModeRequest
from slack_sdk.socket_mode.response import SocketModeResponse

from slack_bolt.app import App
from slack_bolt.request import BoltRequest
from slack_bolt.response import BoltResponse


def run_bolt_app(app: App, req: SocketModeRequest): # type: ignore
bolt_req: BoltRequest = BoltRequest(mode="socket_mode", body=req.payload)
bolt_resp: BoltResponse = app.dispatch(bolt_req)
return bolt_resp


def send_response(
client: BaseSocketModeClient,
req: SocketModeRequest,
bolt_resp: BoltResponse,
start_time: float,
):
if bolt_resp.status == 200:
content_type = bolt_resp.headers.get("content-type", [""])[0]
if bolt_resp.body is None or len(bolt_resp.body) == 0:
client.send_socket_mode_response(
SocketModeResponse(envelope_id=req.envelope_id)
)
elif content_type.startswith("application/json"):
dict_body = json.loads(bolt_resp.body)
client.send_socket_mode_response(
SocketModeResponse(envelope_id=req.envelope_id, payload=dict_body)
)
else:
client.send_socket_mode_response(
SocketModeResponse(
envelope_id=req.envelope_id, payload={"text": bolt_resp.body}
)
)

if client.logger.level <= logging.DEBUG:
spent_time = int((time() - start_time) * 1000)
client.logger.debug(f"Response time: {spent_time} milliseconds")
else:
client.logger.info(
f"Unsuccessful Bolt execution result (status: {bolt_resp.status}, body: {bolt_resp.body})"
)
Loading