stream-chat 4.26.0__py3-none-any.whl → 4.27.0__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
stream_chat/__pkg__.py CHANGED
@@ -1,6 +1,6 @@
1
1
  __author__ = "Tommaso Barbugli"
2
2
  __copyright__ = "Copyright 2019-2022, Stream.io, Inc"
3
- __version__ = "4.26.0"
3
+ __version__ = "4.27.0"
4
4
  __maintainer__ = "Tommaso Barbugli"
5
5
  __email__ = "support@getstream.io"
6
6
  __status__ = "Production"
@@ -1,3 +1,4 @@
1
+ import datetime
1
2
  import json
2
3
  from typing import Any, Dict, Iterable, List, Optional, Union
3
4
 
@@ -94,6 +95,10 @@ class Channel(ChannelInterface):
94
95
  self, members: Iterable[Dict], message: Dict = None, **options: Any
95
96
  ) -> StreamResponse:
96
97
  payload = {"add_members": members, "message": message, **options}
98
+ if "hide_history_before" in payload and isinstance(
99
+ payload["hide_history_before"], datetime.datetime
100
+ ):
101
+ payload["hide_history_before"] = payload["hide_history_before"].isoformat()
97
102
  return await self.client.post(self.url, data=payload)
98
103
 
99
104
  async def assign_roles(
@@ -267,3 +272,19 @@ class Channel(ChannelInterface):
267
272
  if parent_id:
268
273
  params["parent_id"] = parent_id
269
274
  return await self.client.get(f"{self.url}/draft", params=params)
275
+
276
+ async def add_filter_tags(
277
+ self,
278
+ tags: Iterable[str],
279
+ message: Dict = None,
280
+ ) -> StreamResponse:
281
+ payload = {"add_filter_tags": tags, "message": message}
282
+ return await self.client.post(self.url, data=payload)
283
+
284
+ async def remove_filter_tags(
285
+ self,
286
+ tags: Iterable[str],
287
+ message: Dict = None,
288
+ ) -> StreamResponse:
289
+ payload = {"remove_filter_tags": tags, "message": message}
290
+ return await self.client.post(self.url, data=payload)
@@ -109,7 +109,7 @@ class StreamChatAsync(StreamChatInterface, AsyncContextManager):
109
109
  headers["Authorization"] = self.auth_token
110
110
  headers["stream-auth-type"] = "jwt"
111
111
 
112
- if method.__name__ in ["post", "put", "patch"]:
112
+ if method.__name__ in ["post", "put", "patch", "delete"]:
113
113
  serialized = json.dumps(data)
114
114
 
115
115
  async with method(
@@ -134,8 +134,10 @@ class StreamChatAsync(StreamChatInterface, AsyncContextManager):
134
134
  async def get(self, relative_url: str, params: Dict = None) -> StreamResponse:
135
135
  return await self._make_request(self.session.get, relative_url, params, None)
136
136
 
137
- async def delete(self, relative_url: str, params: Dict = None) -> StreamResponse:
138
- return await self._make_request(self.session.delete, relative_url, params, None)
137
+ async def delete(
138
+ self, relative_url: str, params: Dict = None, data: Any = None
139
+ ) -> StreamResponse:
140
+ return await self._make_request(self.session.delete, relative_url, params, data)
139
141
 
140
142
  async def patch(
141
143
  self, relative_url: str, params: Dict = None, data: Any = None
@@ -355,8 +357,23 @@ class StreamChatAsync(StreamChatInterface, AsyncContextManager):
355
357
  data.update(options)
356
358
  return await self.put(f"messages/{message_id}", data=data)
357
359
 
358
- async def delete_message(self, message_id: str, **options: Any) -> StreamResponse:
359
- return await self.delete(f"messages/{message_id}", options)
360
+ async def delete_message(
361
+ self,
362
+ message_id: str,
363
+ delete_for_me: bool = False,
364
+ deleted_by: str = None,
365
+ **options: Any,
366
+ ) -> StreamResponse:
367
+ if delete_for_me and not deleted_by:
368
+ raise ValueError("deleted_by is required when delete_for_me is True")
369
+
370
+ params = options.copy()
371
+ if delete_for_me:
372
+ body = {"delete_for_me": True, "user": {"id": deleted_by}}
373
+ return await self.delete(f"messages/{message_id}", None, body)
374
+ if deleted_by:
375
+ params["deleted_by"] = deleted_by
376
+ return await self.delete(f"messages/{message_id}", params)
360
377
 
361
378
  async def undelete_message(self, message_id: str, user_id: str) -> StreamResponse:
362
379
  return await self.post(
@@ -969,6 +986,48 @@ class StreamChatAsync(StreamChatInterface, AsyncContextManager):
969
986
  params = {"user_id": user_id, **options}
970
987
  return await self.put("users/live_locations", data=data, params=params)
971
988
 
989
+ async def mark_delivered(self, data: Dict[str, Any]) -> Optional[StreamResponse]:
990
+ """
991
+ Send the mark delivered event for this user, only works if the `delivery_receipts` setting is enabled
992
+
993
+ :param data: MarkDeliveredOptions containing latest_delivered_messages and other optional fields
994
+ :return: The server response or None if delivery receipts are disabled
995
+ """
996
+ # Validate required fields
997
+ if not data.get("latest_delivered_messages"):
998
+ raise ValueError("latest_delivered_messages must not be empty")
999
+
1000
+ # Ensure either user or user_id is provided
1001
+ if not data.get("user") and not data.get("user_id"):
1002
+ raise ValueError("either user or user_id must be provided")
1003
+
1004
+ return await self.post("channels/delivered", data=data)
1005
+
1006
+ async def mark_delivered_simple(
1007
+ self, user_id: str, message_id: str, channel_cid: str
1008
+ ) -> Optional[StreamResponse]:
1009
+ """
1010
+ Convenience method to mark a message as delivered for a specific user.
1011
+
1012
+ :param user_id: The user ID
1013
+ :param message_id: The message ID
1014
+ :param channel_cid: The channel CID (channel_type:channel_id)
1015
+ :return: The server response or None if delivery receipts are disabled
1016
+ """
1017
+ if not user_id:
1018
+ raise ValueError("user ID must not be empty")
1019
+ if not message_id:
1020
+ raise ValueError("message ID must not be empty")
1021
+ if not channel_cid:
1022
+ raise ValueError("channel CID must not be empty")
1023
+
1024
+ data = {
1025
+ "latest_delivered_messages": [{"cid": channel_cid, "id": message_id}],
1026
+ "user_id": user_id,
1027
+ }
1028
+
1029
+ return await self.mark_delivered(data)
1030
+
972
1031
  async def close(self) -> None:
973
1032
  await self.session.close()
974
1033
 
@@ -196,7 +196,7 @@ class ChannelInterface(abc.ABC):
196
196
 
197
197
  :param members: member objects to add
198
198
  :param message: An optional to show
199
- :param options: additional options such as hide_history
199
+ :param options: additional options such as hide_history or hide_history_before
200
200
  :return:
201
201
  """
202
202
  pass
@@ -527,6 +527,32 @@ class ChannelInterface(abc.ABC):
527
527
  """
528
528
  pass
529
529
 
530
+ @abc.abstractmethod
531
+ def add_filter_tags(
532
+ self, tags: Iterable[str], message: Dict = None
533
+ ) -> Union[StreamResponse, Awaitable[StreamResponse]]:
534
+ """
535
+ Adds filter tags to the channel
536
+
537
+ :param tags: list of tags to add
538
+ :param message: optional system message
539
+ :return: The server response
540
+ """
541
+ pass
542
+
543
+ @abc.abstractmethod
544
+ def remove_filter_tags(
545
+ self, tags: Iterable[str], message: Dict = None
546
+ ) -> Union[StreamResponse, Awaitable[StreamResponse]]:
547
+ """
548
+ Removes filter tags from the channel
549
+
550
+ :param tags: list of tags to remove
551
+ :param message: optional system message
552
+ :return: The server response
553
+ """
554
+ pass
555
+
530
556
 
531
557
  def add_user_id(payload: Dict, user_id: str) -> Dict:
532
558
  return {**payload, "user": {"id": user_id}}
@@ -560,10 +560,20 @@ class StreamChatInterface(abc.ABC):
560
560
 
561
561
  @abc.abstractmethod
562
562
  def delete_message(
563
- self, message_id: str, **options: Any
563
+ self,
564
+ message_id: str,
565
+ delete_for_me: bool = False,
566
+ deleted_by: str = None,
567
+ **options: Any,
564
568
  ) -> Union[StreamResponse, Awaitable[StreamResponse]]:
565
569
  """
566
570
  Deletes a message.
571
+
572
+ Args:
573
+ message_id: The ID of the message to delete
574
+ delete_for_me: If True, deletes the message only for the specified user
575
+ deleted_by: The user ID who is deleting the message (required when delete_for_me is True)
576
+ **options: Additional options to pass to the delete request
567
577
  """
568
578
  pass
569
579
 
@@ -1527,6 +1537,32 @@ class StreamChatInterface(abc.ABC):
1527
1537
  """
1528
1538
  pass
1529
1539
 
1540
+ @abc.abstractmethod
1541
+ def mark_delivered(
1542
+ self, data: Dict[str, Any]
1543
+ ) -> Union[StreamResponse, Awaitable[StreamResponse], None]:
1544
+ """
1545
+ Send the mark delivered event for this user, only works if the `delivery_receipts` setting is enabled
1546
+
1547
+ :param data: MarkDeliveredOptions containing latest_delivered_messages and other optional fields
1548
+ :return: The server response or None if delivery receipts are disabled
1549
+ """
1550
+ pass
1551
+
1552
+ @abc.abstractmethod
1553
+ def mark_delivered_simple(
1554
+ self, user_id: str, message_id: str, channel_cid: str
1555
+ ) -> Union[StreamResponse, Awaitable[StreamResponse], None]:
1556
+ """
1557
+ Convenience method to mark a message as delivered for a specific user.
1558
+
1559
+ :param user_id: The user ID
1560
+ :param message_id: The message ID
1561
+ :param channel_cid: The channel CID (channel_type:channel_id)
1562
+ :return: The server response or None if delivery receipts are disabled
1563
+ """
1564
+ pass
1565
+
1530
1566
  #####################
1531
1567
  # Private methods #
1532
1568
  #####################
stream_chat/channel.py CHANGED
@@ -1,3 +1,4 @@
1
+ import datetime
1
2
  import json
2
3
  from typing import Any, Dict, Iterable, List, Optional, Union
3
4
 
@@ -95,6 +96,10 @@ class Channel(ChannelInterface):
95
96
  **options: Any,
96
97
  ) -> StreamResponse:
97
98
  payload = {"add_members": members, "message": message, **options}
99
+ if "hide_history_before" in payload and isinstance(
100
+ payload["hide_history_before"], datetime.datetime
101
+ ):
102
+ payload["hide_history_before"] = payload["hide_history_before"].isoformat()
98
103
  return self.client.post(self.url, data=payload)
99
104
 
100
105
  def assign_roles(
@@ -271,3 +276,19 @@ class Channel(ChannelInterface):
271
276
  params["parent_id"] = parent_id
272
277
 
273
278
  return self.client.get(f"{self.url}/draft", params=params)
279
+
280
+ def add_filter_tags(
281
+ self,
282
+ tags: Iterable[str],
283
+ message: Dict = None,
284
+ ) -> StreamResponse:
285
+ payload = {"add_filter_tags": tags, "message": message}
286
+ return self.client.post(self.url, data=payload)
287
+
288
+ def remove_filter_tags(
289
+ self,
290
+ tags: Iterable[str],
291
+ message: Dict = None,
292
+ ) -> StreamResponse:
293
+ payload = {"remove_filter_tags": tags, "message": message}
294
+ return self.client.post(self.url, data=payload)
stream_chat/client.py CHANGED
@@ -84,6 +84,10 @@ class StreamChat(StreamChatInterface):
84
84
  data: Any = None,
85
85
  ) -> StreamResponse:
86
86
  params = params or {}
87
+ # Convert boolean values to lowercase strings for consistency with async implementation
88
+ params = {
89
+ k: str(v).lower() if isinstance(v, bool) else v for k, v in params.items()
90
+ }
87
91
  data = data or {}
88
92
  serialized = None
89
93
  default_params = self.get_default_params()
@@ -94,7 +98,9 @@ class StreamChat(StreamChatInterface):
94
98
 
95
99
  url = f"{self.base_url}/{relative_url}"
96
100
 
97
- if method.__name__ in ["post", "put", "patch"]:
101
+ if method.__name__ in ["post", "put", "patch"] or (
102
+ method.__name__ == "delete" and data
103
+ ):
98
104
  serialized = json.dumps(data)
99
105
 
100
106
  response = method(
@@ -119,8 +125,10 @@ class StreamChat(StreamChatInterface):
119
125
  def get(self, relative_url: str, params: Dict = None) -> StreamResponse:
120
126
  return self._make_request(self.session.get, relative_url, params, None)
121
127
 
122
- def delete(self, relative_url: str, params: Dict = None) -> StreamResponse:
123
- return self._make_request(self.session.delete, relative_url, params, None)
128
+ def delete(
129
+ self, relative_url: str, params: Dict = None, data: Any = None
130
+ ) -> StreamResponse:
131
+ return self._make_request(self.session.delete, relative_url, params, data)
124
132
 
125
133
  def patch(
126
134
  self, relative_url: str, params: Dict = None, data: Any = None
@@ -342,8 +350,24 @@ class StreamChat(StreamChatInterface):
342
350
  data.update(options)
343
351
  return self.put(f"messages/{message_id}", data=data)
344
352
 
345
- def delete_message(self, message_id: str, **options: Any) -> StreamResponse:
346
- return self.delete(f"messages/{message_id}", options)
353
+ def delete_message(
354
+ self,
355
+ message_id: str,
356
+ delete_for_me: bool = False,
357
+ deleted_by: str = None,
358
+ **options: Any,
359
+ ) -> StreamResponse:
360
+ if delete_for_me and not deleted_by:
361
+ raise ValueError("deleted_by is required when delete_for_me is True")
362
+
363
+ params = options.copy()
364
+ if delete_for_me:
365
+ # Send in body with acting user for server-side auth compatibility
366
+ body = {"delete_for_me": True, "user": {"id": deleted_by}}
367
+ return self.delete(f"messages/{message_id}", None, body)
368
+ if deleted_by:
369
+ params["deleted_by"] = deleted_by
370
+ return self.delete(f"messages/{message_id}", params)
347
371
 
348
372
  def undelete_message(self, message_id: str, user_id: str) -> StreamResponse:
349
373
  return self.post(
@@ -915,3 +939,49 @@ class StreamChat(StreamChatInterface):
915
939
  data.update(cast(dict, options))
916
940
  params = {"user_id": user_id, **options}
917
941
  return self.put("users/live_locations", data=data, params=params)
942
+
943
+ def mark_delivered(self, data: Dict[str, Any]) -> Optional[StreamResponse]:
944
+ """
945
+ Send the mark delivered event for this user, only works if the `delivery_receipts` setting is enabled
946
+
947
+ :param data: MarkDeliveredOptions containing latest_delivered_messages and other optional fields
948
+ :return: The server response or None if delivery receipts are disabled
949
+ """
950
+ # Validate required fields
951
+ if not data.get("latest_delivered_messages"):
952
+ raise ValueError("latest_delivered_messages must not be empty")
953
+
954
+ # Ensure either user or user_id is provided
955
+ if not data.get("user") and not data.get("user_id"):
956
+ raise ValueError("either user or user_id must be provided")
957
+
958
+ # Extract user_id from data
959
+ user_id = data.get("user_id") or data.get("user", {}).get("id")
960
+ if not user_id:
961
+ raise ValueError("user_id must be provided")
962
+
963
+ params = {"user_id": user_id}
964
+ return self.post("channels/delivered", data=data, params=params)
965
+
966
+ def mark_delivered_simple(
967
+ self, user_id: str, message_id: str, channel_cid: str
968
+ ) -> Optional[StreamResponse]:
969
+ """
970
+ Convenience method to mark a message as delivered for a specific user.
971
+
972
+ :param user_id: The user ID
973
+ :param message_id: The message ID
974
+ :param channel_cid: The channel CID (channel_type:channel_id)
975
+ :return: The server response or None if delivery receipts are disabled
976
+ """
977
+ if not user_id:
978
+ raise ValueError("user ID must not be empty")
979
+ if not message_id:
980
+ raise ValueError("message ID must not be empty")
981
+ if not channel_cid:
982
+ raise ValueError("channel CID must not be empty")
983
+ data = {
984
+ "latest_delivered_messages": [{"cid": channel_cid, "id": message_id}],
985
+ "user_id": user_id,
986
+ }
987
+ return self.mark_delivered(data=data)
@@ -24,6 +24,21 @@ class MessageTemplate(TypedDict, total=False):
24
24
  custom: Optional[Dict]
25
25
 
26
26
 
27
+ class MemberTemplate(TypedDict, total=False):
28
+ """
29
+ Represents the data structure for a member in the members_template.
30
+
31
+ Parameters:
32
+ user_id: The ID of the user.
33
+ channel_role: The role of the user in the channel.
34
+ custom: Custom data for the member.
35
+ """
36
+
37
+ user_id: str
38
+ channel_role: Optional[str]
39
+ custom: Optional[Dict]
40
+
41
+
27
42
  class ChannelTemplate(TypedDict, total=False):
28
43
  """
29
44
  Represents the data structure for a channel template.
@@ -32,12 +47,14 @@ class ChannelTemplate(TypedDict, total=False):
32
47
  type: The type of channel.
33
48
  id: The ID of the channel.
34
49
  members: List of member IDs.
50
+ members_template: List of member templates with roles and custom data.
35
51
  custom: Custom data.
36
52
  """
37
53
 
38
54
  type: str
39
55
  id: Optional[str]
40
56
  members: Optional[List[str]]
57
+ members_template: Optional[List[MemberTemplate]]
41
58
  custom: Optional[Dict]
42
59
 
43
60
 
@@ -0,0 +1,58 @@
1
+ import sys
2
+ from typing import Dict, List, Optional
3
+
4
+ if sys.version_info >= (3, 8):
5
+ from typing import TypedDict
6
+ else:
7
+ from typing_extensions import TypedDict
8
+
9
+
10
+ class DeliveredMessageConfirmation(TypedDict):
11
+ """
12
+ Confirmation of a delivered message.
13
+
14
+ Parameters:
15
+ cid: Channel CID (channel_type:channel_id)
16
+ id: Message ID
17
+ """
18
+
19
+ cid: str
20
+ id: str
21
+
22
+
23
+ class MarkDeliveredOptions(TypedDict, total=False):
24
+ """
25
+ Options for marking messages as delivered.
26
+
27
+ Parameters:
28
+ latest_delivered_messages: List of delivered message confirmations
29
+ user: Optional user object
30
+ user_id: Optional user ID
31
+ """
32
+
33
+ latest_delivered_messages: List[DeliveredMessageConfirmation]
34
+ user: Optional[Dict] # UserResponse equivalent
35
+ user_id: Optional[str]
36
+
37
+
38
+ class ChannelReadStatus(TypedDict, total=False):
39
+ """
40
+ Channel read status information.
41
+
42
+ Parameters:
43
+ last_read: Last read timestamp
44
+ unread_messages: Number of unread messages
45
+ user: User information
46
+ first_unread_message_id: ID of first unread message
47
+ last_read_message_id: ID of last read message
48
+ last_delivered_at: Last delivered timestamp
49
+ last_delivered_message_id: ID of last delivered message
50
+ """
51
+
52
+ last_read: str # ISO format string for timestamp
53
+ unread_messages: int
54
+ user: Dict # UserResponse equivalent
55
+ first_unread_message_id: Optional[str]
56
+ last_read_message_id: Optional[str]
57
+ last_delivered_at: Optional[str] # ISO format string for timestamp
58
+ last_delivered_message_id: Optional[str]
@@ -1,13 +1,13 @@
1
- Metadata-Version: 2.1
1
+ Metadata-Version: 2.4
2
2
  Name: stream-chat
3
- Version: 4.26.0
3
+ Version: 4.27.0
4
4
  Summary: Client for Stream Chat.
5
5
  Home-page: https://github.com/GetStream/stream-chat-python
6
6
  Author: Tommaso Barbugli
7
7
  Author-email: support@getstream.io
8
8
  Project-URL: Bug Tracker, https://github.com/GetStream/stream-chat-python/issues
9
9
  Project-URL: Documentation, https://getstream.io/activity-feeds/docs/python/?language=python
10
- Project-URL: Release Notes, https://github.com/GetStream/stream-chat-python/releases/tag/v4.26.0
10
+ Project-URL: Release Notes, https://github.com/GetStream/stream-chat-python/releases/tag/v4.27.0
11
11
  Classifier: Intended Audience :: Developers
12
12
  Classifier: Intended Audience :: System Administrators
13
13
  Classifier: Operating System :: OS Independent
@@ -24,23 +24,35 @@ Classifier: Topic :: Software Development :: Libraries :: Python Modules
24
24
  Requires-Python: >=3.8
25
25
  Description-Content-Type: text/markdown
26
26
  License-File: LICENSE
27
- Requires-Dist: requests (<3,>=2.22.0)
28
- Requires-Dist: aiodns (>=2.0.0)
29
- Requires-Dist: aiohttp (<4,>=3.6.0)
30
- Requires-Dist: aiofile (<4,>=3.1)
31
- Requires-Dist: pyjwt (<3,>=2.0.0)
32
- Requires-Dist: typing-extensions ; python_version < "3.8"
33
- Provides-Extra: ci
34
- Requires-Dist: black ; extra == 'ci'
35
- Requires-Dist: flake8 ; extra == 'ci'
36
- Requires-Dist: flake8-isort ; extra == 'ci'
37
- Requires-Dist: flake8-bugbear ; extra == 'ci'
38
- Requires-Dist: pytest-cov ; extra == 'ci'
39
- Requires-Dist: mypy ; extra == 'ci'
40
- Requires-Dist: types-requests ; extra == 'ci'
27
+ Requires-Dist: requests<3,>=2.22.0
28
+ Requires-Dist: aiodns>=2.0.0
29
+ Requires-Dist: aiohttp<4,>=3.6.0
30
+ Requires-Dist: aiofile<4,>=3.1
31
+ Requires-Dist: pyjwt<3,>=2.0.0
32
+ Requires-Dist: typing_extensions; python_version < "3.8"
41
33
  Provides-Extra: test
42
- Requires-Dist: pytest (==8.1.1) ; extra == 'test'
43
- Requires-Dist: pytest-asyncio (<=0.21.1) ; extra == 'test'
34
+ Requires-Dist: pytest==8.1.1; extra == "test"
35
+ Requires-Dist: pytest-asyncio<=0.21.1; extra == "test"
36
+ Provides-Extra: ci
37
+ Requires-Dist: black; extra == "ci"
38
+ Requires-Dist: flake8; extra == "ci"
39
+ Requires-Dist: flake8-isort; extra == "ci"
40
+ Requires-Dist: flake8-bugbear; extra == "ci"
41
+ Requires-Dist: pytest-cov; extra == "ci"
42
+ Requires-Dist: mypy; extra == "ci"
43
+ Requires-Dist: types-requests; extra == "ci"
44
+ Dynamic: author
45
+ Dynamic: author-email
46
+ Dynamic: classifier
47
+ Dynamic: description
48
+ Dynamic: description-content-type
49
+ Dynamic: home-page
50
+ Dynamic: license-file
51
+ Dynamic: project-url
52
+ Dynamic: provides-extra
53
+ Dynamic: requires-dist
54
+ Dynamic: requires-python
55
+ Dynamic: summary
44
56
 
45
57
  # Official Python SDK for [Stream Chat](https://getstream.io/chat/)
46
58
 
@@ -1,33 +1,34 @@
1
1
  stream_chat/__init__.py,sha256=xYQuC8xcPLJxJnFWzaNaO-sVUc7IJZYe13OIPRaDBEA,116
2
- stream_chat/__pkg__.py,sha256=WBnBeASAZkPIdtP-mtFIDmizXhGSF3Y9221LiaWXQBM,206
2
+ stream_chat/__pkg__.py,sha256=3vFq6KVLE2mFiPgVLpZrtO2SYgLCXYD2UEIWqWZ_dDc,206
3
3
  stream_chat/campaign.py,sha256=Z7bBo2rGMs02JkA1k9_206J0spcSLecjdhQuRnrc2Eo,2156
4
- stream_chat/channel.py,sha256=KP8aSKFMG8iE_YUR1VwVp0-rNLmufETQRriWJ18Omc4,10328
5
- stream_chat/client.py,sha256=YzZanTE_fQm9xLMkR1KpnrWwDtu9MrmJ-ogsNtD9S_k,34450
4
+ stream_chat/channel.py,sha256=40q61hI0A0iy_Q2Xdv6D94oSG47Bu1PYaBXMRX2k03g,11059
5
+ stream_chat/client.py,sha256=KOl4FRjlN2Af9p_yhBn5B8WFVYD9CoPDz1tZySfBIqg,37292
6
6
  stream_chat/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
7
7
  stream_chat/query_threads.py,sha256=zz0w7DnTq0FR8OAvNkPH7Q1CSYaWOtoP_NAa8JgsKtE,542
8
8
  stream_chat/segment.py,sha256=MD1de83rVsaqxcyPy8wTXDudFjxz5Mvr70z4pTkW3P0,2691
9
9
  stream_chat/async_chat/__init__.py,sha256=V6x7yDCdXbP3vMuSan6Xm7RE_njZUvflImqOxfKRt4Y,67
10
10
  stream_chat/async_chat/campaign.py,sha256=Bc3iHZigxserUycZK4wDuXU0wXVH2G6fIDiYNVYPkeE,1885
11
- stream_chat/async_chat/channel.py,sha256=R7r8kIJ3SjQN-jlF27Sp49ZGYRJl7ebh1pJ1cSIbSsg,10770
12
- stream_chat/async_chat/client.py,sha256=1vMEWsnwPeOY0ereMH5aAW_nvT7sx4szIhey1nHtcyo,37156
11
+ stream_chat/async_chat/channel.py,sha256=20dj1jQVm6dU_VUDpFJ1rUqxZVJtLhQeFxjJvcFm56s,11525
12
+ stream_chat/async_chat/client.py,sha256=FGJaySh2YeJuWmFGz1s5JncavW4Ig_tjYhKkBdXvSMg,39437
13
13
  stream_chat/async_chat/segment.py,sha256=G_YEwW2SXIE7huTW3Zu_rim2XkYcuFNYekLZZGDjFkA,2777
14
14
  stream_chat/base/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
15
15
  stream_chat/base/campaign.py,sha256=dAVkTYyirEpgyOPn8JyDebNMKeJu02vTuqgmPvdQoWU,1449
16
- stream_chat/base/channel.py,sha256=FSYnKbfPPPpjYO8ODGw3E3udRwaV-phngsEoMgV1T9o,16986
17
- stream_chat/base/client.py,sha256=3wty1PSXacU_lLqUC27jt8fiar1vtdywiqZ9UU4w008,46968
16
+ stream_chat/base/channel.py,sha256=FC3NVtA7Oz2g4cJMu3a8jXfTjkjteqV7PPJjMI-K6Fc,17758
17
+ stream_chat/base/client.py,sha256=1n8JQngKNRWT7cnVKzxmVjWTCXrb0Dj2v1e2tc0eEVE,48391
18
18
  stream_chat/base/exceptions.py,sha256=eh1qW5d6zjUrlgsHNEBebAr0jVH2UupZ06w8sp2cseI,819
19
19
  stream_chat/base/query_threads.py,sha256=LfC09Atsw6cwL98MJjL-cGzQU4V1r7CRbRLitgBV-x8,934
20
20
  stream_chat/base/segment.py,sha256=X82DX8Y-cERJ1OvF2tz9iIM4CBNW6tx8HGaTEXBva9I,2364
21
21
  stream_chat/types/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
22
22
  stream_chat/types/base.py,sha256=JKlOxQVPvMClTo0ev63Ya-K-dX-98j95qSE-KKzziEE,858
23
- stream_chat/types/campaign.py,sha256=JyAn08oMaEsxPSqmVTdsfJK4xpfErPQV7Xr7zLQm99M,2293
23
+ stream_chat/types/campaign.py,sha256=3Hsgf3SGKA5jh-szQkGLJlmIuswKVTFQBW7vxpJVu-g,2795
24
+ stream_chat/types/delivery_receipts.py,sha256=ir1EYIvRCKo2pw5nMPJ_JNJck1c_9xRXOANEW_803gk,1607
24
25
  stream_chat/types/draft.py,sha256=EJP1JkCtDFnz-DTC8p7WFWXfTazA8x5XKE7ghag7gJM,288
25
26
  stream_chat/types/rate_limit.py,sha256=v3Z4Ur0yoEdFLiHa1CNABEej2nxPlHQ6Bpy2XxW-TYQ,165
26
27
  stream_chat/types/segment.py,sha256=KzOi5N-VzLfj0m4zeZ9U_29ey9dxDtewtcNv9g4Aums,1273
27
28
  stream_chat/types/shared_locations.py,sha256=2rO4e0G1RX9DXGHcg3HJt5gp33G-LRKox62hfc0skGA,200
28
29
  stream_chat/types/stream_response.py,sha256=jWKPrOU7u6dZ2SyOK53uQCXTstrL1HshO9fA7R6Bt_A,2391
29
- stream_chat-4.26.0.dist-info/LICENSE,sha256=H66SBDuPWSRHzKPEdyjAk3C0THQRcGPfqqve4naQuu0,14424
30
- stream_chat-4.26.0.dist-info/METADATA,sha256=nu30qax59vfLVQN-1bJm3sf-hMEVOaRrQOWlbTXR8Ag,7405
31
- stream_chat-4.26.0.dist-info/WHEEL,sha256=G16H4A3IeoQmnOrYV4ueZGKSjhipXx8zc8nu9FGlvMA,92
32
- stream_chat-4.26.0.dist-info/top_level.txt,sha256=26uTfg4bWcEaFrVKlzGGgfONH1p5DDe21G07EKfYSvo,12
33
- stream_chat-4.26.0.dist-info/RECORD,,
30
+ stream_chat-4.27.0.dist-info/licenses/LICENSE,sha256=H66SBDuPWSRHzKPEdyjAk3C0THQRcGPfqqve4naQuu0,14424
31
+ stream_chat-4.27.0.dist-info/METADATA,sha256=9g8l7CtgHK6EXUPy4QAK2VHfo9ajjiK-0fFWQAHIRRU,7638
32
+ stream_chat-4.27.0.dist-info/WHEEL,sha256=SmOxYU7pzNKBqASvQJ7DjX3XGUF92lrGhMb3R6_iiqI,91
33
+ stream_chat-4.27.0.dist-info/top_level.txt,sha256=26uTfg4bWcEaFrVKlzGGgfONH1p5DDe21G07EKfYSvo,12
34
+ stream_chat-4.27.0.dist-info/RECORD,,
@@ -1,5 +1,5 @@
1
1
  Wheel-Version: 1.0
2
- Generator: bdist_wheel (0.37.1)
2
+ Generator: setuptools (79.0.1)
3
3
  Root-Is-Purelib: true
4
4
  Tag: py3-none-any
5
5