diff --git a/stream_chat/async_chat/client.py b/stream_chat/async_chat/client.py index 1065c1f..31cb612 100644 --- a/stream_chat/async_chat/client.py +++ b/stream_chat/async_chat/client.py @@ -223,6 +223,22 @@ async def query_banned_users(self, query_conditions: Dict) -> StreamResponse: "query_banned_users", params={"payload": json.dumps(query_conditions)} ) + async def block_user( + self, blocked_user_id: str, user_id: str, **options: Any + ) -> StreamResponse: + data = {"blocked_user_id": blocked_user_id, "user_id": user_id, **options} + return await self.post("users/block", data=data) + + async def unblock_user( + self, blocked_user_id: str, user_id: str, **options: Any + ) -> StreamResponse: + data = {"blocked_user_id": blocked_user_id, "user_id": user_id, **options} + return await self.post("users/unblock", data=data) + + async def get_blocked_users(self, user_id: str, **options: Any) -> StreamResponse: + params = {"user_id": user_id, **options} + return await self.get("users/block", params=params) + async def run_message_action(self, message_id: str, data: Dict) -> StreamResponse: return await self.post(f"messages/{message_id}/action", data=data) diff --git a/stream_chat/base/client.py b/stream_chat/base/client.py index d05c775..5aa5668 100644 --- a/stream_chat/base/client.py +++ b/stream_chat/base/client.py @@ -355,6 +355,37 @@ def query_banned_users( """ pass + @abc.abstractmethod + def block_user( + self, blocked_user_id: str, user_id: str, **options: Any + ) -> Union[StreamResponse, Awaitable[StreamResponse]]: + """ + Blocks a user. When a user is blocked, they will not be able to communicate with the + blocking user in 1-on-1 channels, and will not be able to add the blocking user to channels. + To unblock a user, use `unblock_user` method. + """ + pass + + @abc.abstractmethod + def unblock_user( + self, blocked_user_id: str, user_id: str, **options: Any + ) -> Union[StreamResponse, Awaitable[StreamResponse]]: + """ + Unblocks a user. This allows the previously blocked user to communicate with the + unblocking user in 1-on-1 channels again, and all previous messages become visible. + To block a user, use `block_user` method. + """ + pass + + @abc.abstractmethod + def get_blocked_users( + self, user_id: str, **options: Any + ) -> Union[StreamResponse, Awaitable[StreamResponse]]: + """ + Retrieves the list of users that have been blocked by the specified user. + """ + pass + @abc.abstractmethod def run_message_action( self, message_id: str, data: Dict diff --git a/stream_chat/client.py b/stream_chat/client.py index 47bb12d..67faed7 100644 --- a/stream_chat/client.py +++ b/stream_chat/client.py @@ -209,6 +209,22 @@ def query_banned_users(self, query_conditions: Dict) -> StreamResponse: "query_banned_users", params={"payload": json.dumps(query_conditions)} ) + def block_user( + self, blocked_user_id: str, user_id: str, **options: Any + ) -> StreamResponse: + data = {"blocked_user_id": blocked_user_id, "user_id": user_id, **options} + return self.post("users/block", data=data) + + def unblock_user( + self, blocked_user_id: str, user_id: str, **options: Any + ) -> StreamResponse: + data = {"blocked_user_id": blocked_user_id, "user_id": user_id, **options} + return self.post("users/unblock", data=data) + + def get_blocked_users(self, user_id: str, **options: Any) -> StreamResponse: + params = {"user_id": user_id, **options} + return self.get("users/block", params=params) + def run_message_action(self, message_id: str, data: Dict) -> StreamResponse: return self.post(f"messages/{message_id}/action", data=data) diff --git a/stream_chat/tests/async_chat/test_client.py b/stream_chat/tests/async_chat/test_client.py index 140eea4..5bae8b3 100644 --- a/stream_chat/tests/async_chat/test_client.py +++ b/stream_chat/tests/async_chat/test_client.py @@ -304,6 +304,29 @@ async def test_query_banned_user( ) assert len(resp["bans"]) == 1 + async def test_block_user( + self, client: StreamChatAsync, random_user, server_user: Dict + ): + await client.block_user(random_user["id"], server_user["id"]) + response = await client.get_blocked_users(server_user["id"]) + assert len(response["blocks"]) > 0 + + async def test_unblock_user( + self, client: StreamChatAsync, random_user, server_user: Dict + ): + await client.block_user(random_user["id"], server_user["id"]) + await client.unblock_user(random_user["id"], server_user["id"]) + + response = await client.get_blocked_users(server_user["id"]) + assert len(response["blocks"]) == 0 + + async def test_get_blocked_users( + self, client: StreamChatAsync, random_user, server_user: Dict + ): + await client.block_user(random_user["id"], server_user["id"]) + response = await client.get_blocked_users(server_user["id"]) + assert len(response["blocks"]) > 0 + async def test_flag_user( self, client: StreamChatAsync, random_user, server_user: Dict ): diff --git a/stream_chat/tests/test_client.py b/stream_chat/tests/test_client.py index f28d593..176b69c 100644 --- a/stream_chat/tests/test_client.py +++ b/stream_chat/tests/test_client.py @@ -319,6 +319,25 @@ def test_query_banned_user( ) assert len(resp["bans"]) == 1 + def test_block_user(self, client: StreamChat, random_user, server_user: Dict): + client.block_user(random_user["id"], server_user["id"]) + response = client.get_blocked_users(server_user["id"]) + assert len(response["blocks"]) > 0 + + def test_unblock_user(self, client: StreamChat, random_user, server_user: Dict): + client.block_user(random_user["id"], server_user["id"]) + client.unblock_user(random_user["id"], server_user["id"]) + + response = client.get_blocked_users(server_user["id"]) + assert len(response["blocks"]) == 0 + + def test_get_blocked_users( + self, client: StreamChat, random_user, server_user: Dict + ): + client.block_user(random_user["id"], server_user["id"]) + response = client.get_blocked_users(server_user["id"]) + assert len(response["blocks"]) > 0 + def test_flag_user(self, client: StreamChat, random_user, server_user: Dict): client.flag_user(random_user["id"], user_id=server_user["id"])