diff --git a/stream_chat/async_chat/channel.py b/stream_chat/async_chat/channel.py index c8023ea..0f0fcf7 100644 --- a/stream_chat/async_chat/channel.py +++ b/stream_chat/async_chat/channel.py @@ -272,3 +272,19 @@ async def get_draft( if parent_id: params["parent_id"] = parent_id return await self.client.get(f"{self.url}/draft", params=params) + + async def add_filter_tags( + self, + tags: Iterable[str], + message: Dict = None, + ) -> StreamResponse: + payload = {"add_filter_tags": tags, "message": message} + return await self.client.post(self.url, data=payload) + + async def remove_filter_tags( + self, + tags: Iterable[str], + message: Dict = None, + ) -> StreamResponse: + payload = {"remove_filter_tags": tags, "message": message} + return await self.client.post(self.url, data=payload) diff --git a/stream_chat/base/channel.py b/stream_chat/base/channel.py index d49a3f7..0e14f10 100644 --- a/stream_chat/base/channel.py +++ b/stream_chat/base/channel.py @@ -527,6 +527,32 @@ def get_draft( """ pass + @abc.abstractmethod + def add_filter_tags( + self, tags: Iterable[str], message: Dict = None + ) -> Union[StreamResponse, Awaitable[StreamResponse]]: + """ + Adds filter tags to the channel + + :param tags: list of tags to add + :param message: optional system message + :return: The server response + """ + pass + + @abc.abstractmethod + def remove_filter_tags( + self, tags: Iterable[str], message: Dict = None + ) -> Union[StreamResponse, Awaitable[StreamResponse]]: + """ + Removes filter tags from the channel + + :param tags: list of tags to remove + :param message: optional system message + :return: The server response + """ + pass + def add_user_id(payload: Dict, user_id: str) -> Dict: return {**payload, "user": {"id": user_id}} diff --git a/stream_chat/channel.py b/stream_chat/channel.py index f5ce5c7..b3400b4 100644 --- a/stream_chat/channel.py +++ b/stream_chat/channel.py @@ -276,3 +276,19 @@ def get_draft( params["parent_id"] = parent_id return self.client.get(f"{self.url}/draft", params=params) + + def add_filter_tags( + self, + tags: Iterable[str], + message: Dict = None, + ) -> StreamResponse: + payload = {"add_filter_tags": tags, "message": message} + return self.client.post(self.url, data=payload) + + def remove_filter_tags( + self, + tags: Iterable[str], + message: Dict = None, + ) -> StreamResponse: + payload = {"remove_filter_tags": tags, "message": message} + return self.client.post(self.url, data=payload) diff --git a/stream_chat/tests/test_filter_tags.py b/stream_chat/tests/test_filter_tags.py new file mode 100644 index 0000000..d7da4f7 --- /dev/null +++ b/stream_chat/tests/test_filter_tags.py @@ -0,0 +1,19 @@ +import pytest + +from stream_chat.channel import Channel + + +@pytest.mark.incremental +class TestFilterTags: + def test_add_and_remove_filter_tags(self, channel: Channel): + # Add tags + add_resp = channel.add_filter_tags(["vip", "premium"]) + assert "channel" in add_resp + assert set(add_resp["channel"].get("filter_tags", [])) >= {"vip", "premium"} + + # Remove one tag + remove_resp = channel.remove_filter_tags(["premium"]) + assert "channel" in remove_resp + remaining = remove_resp["channel"].get("filter_tags", []) + assert "premium" not in remaining + assert "vip" in remaining