Exemple #1
0
    def __init__(  # type: ignore
        self,
        app: App,  # type: ignore
        app_token: Optional[str] = None,
        logger: Optional[Logger] = None,
        web_client: Optional[AsyncWebClient] = None,
        ping_interval: float = 10,
    ):
        """Socket Mode adapter for Bolt apps.

        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.

        Args:
            app: The Bolt app
            app_token: App-level token starting with `xapp-`
            logger: Custom logger
            web_client: custom `slack_sdk.web.WebClient` instance
            ping_interval: The ping-pong internal (seconds)
        """
        self.app = app
        self.app_token = app_token or os.environ["SLACK_APP_TOKEN"]
        self.client = SocketModeClient(
            app_token=self.app_token,
            logger=logger if logger is not None else app.logger,
            web_client=web_client if web_client is not None else app.client,
            ping_interval=ping_interval,
        )
        self.client.socket_mode_request_listeners.append(self.handle)
 async def test_issue_new_wss_url(self):
     client = SocketModeClient(
         app_token="xapp-A111-222-xyz",
         web_client=self.web_client,
     )
     url = await client.issue_new_wss_url()
     self.assertTrue(url.startswith("wss://"))
Exemple #3
0
 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 test_connect_to_new_endpoint(self):
     client = SocketModeClient(
         app_token="xapp-A111-222-xyz",
         web_client=self.web_client,
     )
     try:
         await client.connect_to_new_endpoint()
     except Exception as e:
         # TODO: valida test to connect
         pass
     finally:
         await client.close()
    async def test_send_message_while_disconnection(self):
        if is_ci_unstable_test_skip_enabled():
            return
        t = Thread(target=start_socket_mode_server(self, 3001))
        t.daemon = True
        t.start()

        client = SocketModeClient(
            app_token="xapp-A111-222-xyz",
            web_client=self.web_client,
            auto_reconnect_enabled=False,
            trace_enabled=True,
        )

        try:
            time.sleep(1)  # wait for the server
            client.wss_uri = "ws://0.0.0.0:3001/link"
            await client.connect()
            await asyncio.sleep(1)  # wait for the message receiver
            await client.send_message("foo")

            await client.disconnect()
            await asyncio.sleep(1)  # wait for the message receiver
            try:
                await client.send_message("foo")
                self.fail("WebSocketException is expected here")
            except WebSocketException as _:
                pass

            await client.connect()
            await asyncio.sleep(1)  # wait for the message receiver
            await client.send_message("foo")
        finally:
            await client.close()
            self.server.stop()
            self.server.close()
    async def test_enqueue_message(self):
        client = SocketModeClient(
            app_token="xapp-A111-222-xyz",
            web_client=self.web_client,
        )
        client.message_listeners.append(listener)
        try:
            await client.enqueue_message("hello")
            await client.process_message()

            await client.enqueue_message(
                """{"type":"hello","num_connections":1,"debug_info":{"host":"applink-111-222","build_number":10,"approximate_connection_time":18060},"connection_info":{"app_id":"A111"}}"""
            )
            await client.process_message()
        finally:
            await client.close()
 def __init__(  # type: ignore
     self,
     app: AsyncApp,  # type: ignore
     app_token: Optional[str] = None,
     logger: Optional[Logger] = None,
     web_client: Optional[AsyncWebClient] = None,
     ping_interval: float = 10,
 ):
     self.app = app
     self.app_token = app_token or os.environ["SLACK_APP_TOKEN"]
     self.client = SocketModeClient(
         app_token=self.app_token,
         logger=logger if logger is not None else app.logger,
         web_client=web_client if web_client is not None else app.client,
         ping_interval=ping_interval,
     )
     self.client.socket_mode_request_listeners.append(self.handle)
Exemple #8
0
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"))
    async def test_interactions(self):
        t = Thread(target=start_socket_mode_server(self, 3002))
        t.daemon = True
        t.start()

        received_messages = []
        received_socket_mode_requests = []

        async def message_handler(
            receiver: AsyncBaseSocketModeClient,
            message: dict,
            raw_message: Optional[str],
        ):
            self.logger.info(f"Raw Message: {raw_message}")
            await asyncio.sleep(randint(50, 200) / 1000)
            received_messages.append(raw_message)

        async def socket_mode_listener(
            receiver: AsyncBaseSocketModeClient,
            request: SocketModeRequest,
        ):
            self.logger.info(f"Socket Mode Request: {request}")
            await asyncio.sleep(randint(50, 200) / 1000)
            received_socket_mode_requests.append(request)

        client = SocketModeClient(
            app_token="xapp-A111-222-xyz",
            web_client=self.web_client,
            auto_reconnect_enabled=False,
        )
        client.message_listeners.append(message_handler)
        client.socket_mode_request_listeners.append(socket_mode_listener)

        try:
            time.sleep(1)  # wait for the server
            client.wss_uri = "ws://0.0.0.0:3002/link"
            await client.connect()
            await asyncio.sleep(1)  # wait for the message receiver

            for _ in range(10):
                await client.send_message("foo")
                await client.send_message("bar")
                await client.send_message("baz")

            expected = (socket_mode_envelopes + [socket_mode_hello_message] +
                        ["foo", "bar", "baz"] * 10)
            expected.sort()

            count = 0
            while count < 10 and len(received_messages) < len(expected):
                await asyncio.sleep(0.2)
                count += 0.2

            received_messages.sort()
            self.assertEqual(received_messages, expected)

            self.assertEqual(len(socket_mode_envelopes),
                             len(received_socket_mode_requests))
        finally:
            await client.close()
            self.server.stop()
            self.server.close()
 async def test_init_close(self):
     client = SocketModeClient(app_token="xapp-A111-222-xyz")
     try:
         self.assertIsNotNone(client)
     finally:
         await client.close()