From 1a1e7dce9f29c2893291e54ecbac86910ed069a7 Mon Sep 17 00:00:00 2001 From: Rafael Marinho Date: Fri, 7 Nov 2025 14:06:18 +0100 Subject: [PATCH 1/3] [CHA-0] fix unread counts api spec --- getstream/chat/async_channel.py | 18 +- getstream/chat/async_rest_client.py | 36 +- getstream/chat/channel.py | 18 +- getstream/chat/rest_client.py | 36 +- getstream/models/__init__.py | 1076 +++++++++++++++++++-- getstream/moderation/async_rest_client.py | 6 + getstream/moderation/rest_client.py | 6 + getstream/video/async_rest_client.py | 141 +++ getstream/video/rest_client.py | 139 +++ 9 files changed, 1351 insertions(+), 125 deletions(-) diff --git a/getstream/chat/async_channel.py b/getstream/chat/async_channel.py index 9c3c9964..8cb74639 100644 --- a/getstream/chat/async_channel.py +++ b/getstream/chat/async_channel.py @@ -56,14 +56,17 @@ async def update( accept_invite: Optional[bool] = None, cooldown: Optional[int] = None, hide_history: Optional[bool] = None, + hide_history_before: Optional[datetime] = None, reject_invite: Optional[bool] = None, skip_push: Optional[bool] = None, user_id: Optional[str] = None, - add_members: Optional[List[ChannelMember]] = None, + add_filter_tags: Optional[List[str]] = None, + add_members: Optional[List[ChannelMemberRequest]] = None, add_moderators: Optional[List[str]] = None, - assign_roles: Optional[List[ChannelMember]] = None, + assign_roles: Optional[List[ChannelMemberRequest]] = None, demote_moderators: Optional[List[str]] = None, - invites: Optional[List[ChannelMember]] = None, + invites: Optional[List[ChannelMemberRequest]] = None, + remove_filter_tags: Optional[List[str]] = None, remove_members: Optional[List[str]] = None, data: Optional[ChannelInput] = None, message: Optional[MessageRequest] = None, @@ -75,14 +78,17 @@ async def update( accept_invite=accept_invite, cooldown=cooldown, hide_history=hide_history, + hide_history_before=hide_history_before, reject_invite=reject_invite, skip_push=skip_push, user_id=user_id, + add_filter_tags=add_filter_tags, add_members=add_members, add_moderators=add_moderators, assign_roles=assign_roles, demote_moderators=demote_moderators, invites=invites, + remove_filter_tags=remove_filter_tags, remove_members=remove_members, data=data, message=message, @@ -323,18 +329,16 @@ async def truncate( @attach_channel_cid_async async def mark_unread( self, + user_id: Optional[str] = None, message_id: Optional[str] = None, thread_id: Optional[str] = None, - user_id: Optional[str] = None, - user: Optional[UserRequest] = None, ) -> StreamResponse[Response]: response = await self.client.mark_unread( type=self.channel_type, id=self.channel_id, + user_id=user_id, message_id=message_id, thread_id=thread_id, - user_id=user_id, - user=user, ) self._sync_from_response(response.data) return response diff --git a/getstream/chat/async_rest_client.py b/getstream/chat/async_rest_client.py index 39edeab2..78e6b229 100644 --- a/getstream/chat/async_rest_client.py +++ b/getstream/chat/async_rest_client.py @@ -234,14 +234,17 @@ async def update_channel( accept_invite: Optional[bool] = None, cooldown: Optional[int] = None, hide_history: Optional[bool] = None, + hide_history_before: Optional[datetime] = None, reject_invite: Optional[bool] = None, skip_push: Optional[bool] = None, user_id: Optional[str] = None, - add_members: Optional[List[ChannelMember]] = None, + add_filter_tags: Optional[List[str]] = None, + add_members: Optional[List[ChannelMemberRequest]] = None, add_moderators: Optional[List[str]] = None, - assign_roles: Optional[List[ChannelMember]] = None, + assign_roles: Optional[List[ChannelMemberRequest]] = None, demote_moderators: Optional[List[str]] = None, - invites: Optional[List[ChannelMember]] = None, + invites: Optional[List[ChannelMemberRequest]] = None, + remove_filter_tags: Optional[List[str]] = None, remove_members: Optional[List[str]] = None, data: Optional[ChannelInput] = None, message: Optional[MessageRequest] = None, @@ -255,14 +258,17 @@ async def update_channel( accept_invite=accept_invite, cooldown=cooldown, hide_history=hide_history, + hide_history_before=hide_history_before, reject_invite=reject_invite, skip_push=skip_push, user_id=user_id, + add_filter_tags=add_filter_tags, add_members=add_members, add_moderators=add_moderators, assign_roles=assign_roles, demote_moderators=demote_moderators, invites=invites, + remove_filter_tags=remove_filter_tags, remove_members=remove_members, data=data, message=message, @@ -612,21 +618,20 @@ async def mark_unread( self, type: str, id: str, + user_id: Optional[str] = None, message_id: Optional[str] = None, thread_id: Optional[str] = None, - user_id: Optional[str] = None, - user: Optional[UserRequest] = None, ) -> StreamResponse[Response]: + query_params = build_query_param(user_id=user_id) path_params = { "type": type, "id": id, } - json = build_body_dict( - message_id=message_id, thread_id=thread_id, user_id=user_id, user=user - ) + json = build_body_dict(message_id=message_id, thread_id=thread_id) return await self.post( "/api/v2/chat/channels/{type}/{id}/unread", Response, + query_params=query_params, path_params=path_params, json=json, ) @@ -647,6 +652,7 @@ async def create_channel_type( connect_events: Optional[bool] = None, count_messages: Optional[bool] = None, custom_events: Optional[bool] = None, + delivery_events: Optional[bool] = None, mark_messages_pending: Optional[bool] = None, message_retention: Optional[str] = None, mutes: Optional[bool] = None, @@ -679,6 +685,7 @@ async def create_channel_type( connect_events=connect_events, count_messages=count_messages, custom_events=custom_events, + delivery_events=delivery_events, mark_messages_pending=mark_messages_pending, message_retention=message_retention, mutes=mutes, @@ -739,6 +746,7 @@ async def update_channel_type( connect_events: Optional[bool] = None, count_messages: Optional[bool] = None, custom_events: Optional[bool] = None, + delivery_events: Optional[bool] = None, mark_messages_pending: Optional[bool] = None, mutes: Optional[bool] = None, partition_size: Optional[int] = None, @@ -776,6 +784,7 @@ async def update_channel_type( connect_events=connect_events, count_messages=count_messages, custom_events=custom_events, + delivery_events=delivery_events, mark_messages_pending=mark_messages_pending, mutes=mutes, partition_size=partition_size, @@ -1565,8 +1574,15 @@ async def update_thread_partial( ) @telemetry.operation_name("getstream.api.chat.unread_counts") - async def unread_counts(self) -> StreamResponse[WrappedUnreadCountsResponse]: - return await self.get("/api/v2/chat/unread", WrappedUnreadCountsResponse) + async def unread_counts( + self, user_id: Optional[str] = None + ) -> StreamResponse[WrappedUnreadCountsResponse]: + query_params = build_query_param(user_id=user_id) + return await self.get( + "/api/v2/chat/unread", + WrappedUnreadCountsResponse, + query_params=query_params, + ) @telemetry.operation_name("getstream.api.chat.unread_counts_batch") async def unread_counts_batch( diff --git a/getstream/chat/channel.py b/getstream/chat/channel.py index f64841cb..b17b6a04 100644 --- a/getstream/chat/channel.py +++ b/getstream/chat/channel.py @@ -56,14 +56,17 @@ def update( accept_invite: Optional[bool] = None, cooldown: Optional[int] = None, hide_history: Optional[bool] = None, + hide_history_before: Optional[datetime] = None, reject_invite: Optional[bool] = None, skip_push: Optional[bool] = None, user_id: Optional[str] = None, - add_members: Optional[List[ChannelMember]] = None, + add_filter_tags: Optional[List[str]] = None, + add_members: Optional[List[ChannelMemberRequest]] = None, add_moderators: Optional[List[str]] = None, - assign_roles: Optional[List[ChannelMember]] = None, + assign_roles: Optional[List[ChannelMemberRequest]] = None, demote_moderators: Optional[List[str]] = None, - invites: Optional[List[ChannelMember]] = None, + invites: Optional[List[ChannelMemberRequest]] = None, + remove_filter_tags: Optional[List[str]] = None, remove_members: Optional[List[str]] = None, data: Optional[ChannelInput] = None, message: Optional[MessageRequest] = None, @@ -75,14 +78,17 @@ def update( accept_invite=accept_invite, cooldown=cooldown, hide_history=hide_history, + hide_history_before=hide_history_before, reject_invite=reject_invite, skip_push=skip_push, user_id=user_id, + add_filter_tags=add_filter_tags, add_members=add_members, add_moderators=add_moderators, assign_roles=assign_roles, demote_moderators=demote_moderators, invites=invites, + remove_filter_tags=remove_filter_tags, remove_members=remove_members, data=data, message=message, @@ -323,18 +329,16 @@ def truncate( @attach_channel_cid def mark_unread( self, + user_id: Optional[str] = None, message_id: Optional[str] = None, thread_id: Optional[str] = None, - user_id: Optional[str] = None, - user: Optional[UserRequest] = None, ) -> StreamResponse[Response]: response = self.client.mark_unread( type=self.channel_type, id=self.channel_id, + user_id=user_id, message_id=message_id, thread_id=thread_id, - user_id=user_id, - user=user, ) self._sync_from_response(response.data) return response diff --git a/getstream/chat/rest_client.py b/getstream/chat/rest_client.py index 12caa6ea..a478a629 100644 --- a/getstream/chat/rest_client.py +++ b/getstream/chat/rest_client.py @@ -230,14 +230,17 @@ def update_channel( accept_invite: Optional[bool] = None, cooldown: Optional[int] = None, hide_history: Optional[bool] = None, + hide_history_before: Optional[datetime] = None, reject_invite: Optional[bool] = None, skip_push: Optional[bool] = None, user_id: Optional[str] = None, - add_members: Optional[List[ChannelMember]] = None, + add_filter_tags: Optional[List[str]] = None, + add_members: Optional[List[ChannelMemberRequest]] = None, add_moderators: Optional[List[str]] = None, - assign_roles: Optional[List[ChannelMember]] = None, + assign_roles: Optional[List[ChannelMemberRequest]] = None, demote_moderators: Optional[List[str]] = None, - invites: Optional[List[ChannelMember]] = None, + invites: Optional[List[ChannelMemberRequest]] = None, + remove_filter_tags: Optional[List[str]] = None, remove_members: Optional[List[str]] = None, data: Optional[ChannelInput] = None, message: Optional[MessageRequest] = None, @@ -251,14 +254,17 @@ def update_channel( accept_invite=accept_invite, cooldown=cooldown, hide_history=hide_history, + hide_history_before=hide_history_before, reject_invite=reject_invite, skip_push=skip_push, user_id=user_id, + add_filter_tags=add_filter_tags, add_members=add_members, add_moderators=add_moderators, assign_roles=assign_roles, demote_moderators=demote_moderators, invites=invites, + remove_filter_tags=remove_filter_tags, remove_members=remove_members, data=data, message=message, @@ -608,21 +614,20 @@ def mark_unread( self, type: str, id: str, + user_id: Optional[str] = None, message_id: Optional[str] = None, thread_id: Optional[str] = None, - user_id: Optional[str] = None, - user: Optional[UserRequest] = None, ) -> StreamResponse[Response]: + query_params = build_query_param(user_id=user_id) path_params = { "type": type, "id": id, } - json = build_body_dict( - message_id=message_id, thread_id=thread_id, user_id=user_id, user=user - ) + json = build_body_dict(message_id=message_id, thread_id=thread_id) return self.post( "/api/v2/chat/channels/{type}/{id}/unread", Response, + query_params=query_params, path_params=path_params, json=json, ) @@ -643,6 +648,7 @@ def create_channel_type( connect_events: Optional[bool] = None, count_messages: Optional[bool] = None, custom_events: Optional[bool] = None, + delivery_events: Optional[bool] = None, mark_messages_pending: Optional[bool] = None, message_retention: Optional[str] = None, mutes: Optional[bool] = None, @@ -675,6 +681,7 @@ def create_channel_type( connect_events=connect_events, count_messages=count_messages, custom_events=custom_events, + delivery_events=delivery_events, mark_messages_pending=mark_messages_pending, message_retention=message_retention, mutes=mutes, @@ -733,6 +740,7 @@ def update_channel_type( connect_events: Optional[bool] = None, count_messages: Optional[bool] = None, custom_events: Optional[bool] = None, + delivery_events: Optional[bool] = None, mark_messages_pending: Optional[bool] = None, mutes: Optional[bool] = None, partition_size: Optional[int] = None, @@ -770,6 +778,7 @@ def update_channel_type( connect_events=connect_events, count_messages=count_messages, custom_events=custom_events, + delivery_events=delivery_events, mark_messages_pending=mark_messages_pending, mutes=mutes, partition_size=partition_size, @@ -1555,8 +1564,15 @@ def update_thread_partial( ) @telemetry.operation_name("getstream.api.chat.unread_counts") - def unread_counts(self) -> StreamResponse[WrappedUnreadCountsResponse]: - return self.get("/api/v2/chat/unread", WrappedUnreadCountsResponse) + def unread_counts( + self, user_id: Optional[str] = None + ) -> StreamResponse[WrappedUnreadCountsResponse]: + query_params = build_query_param(user_id=user_id) + return self.get( + "/api/v2/chat/unread", + WrappedUnreadCountsResponse, + query_params=query_params, + ) @telemetry.operation_name("getstream.api.chat.unread_counts_batch") def unread_counts_batch( diff --git a/getstream/models/__init__.py b/getstream/models/__init__.py index 0b912715..6b4a579d 100644 --- a/getstream/models/__init__.py +++ b/getstream/models/__init__.py @@ -371,17 +371,63 @@ class ActivityDeletedEvent(DataClassJsonMixin): @dataclass -class ActivityFeedbackRequest(DataClassJsonMixin): - hide: Optional[bool] = dc_field(default=None, metadata=dc_config(field_name="hide")) - mute_user: Optional[bool] = dc_field( - default=None, metadata=dc_config(field_name="mute_user") +class ActivityFeedbackEvent(DataClassJsonMixin): + created_at: datetime = dc_field( + metadata=dc_config( + field_name="created_at", + encoder=encode_datetime, + decoder=datetime_from_unix_ns, + mm_field=fields.DateTime(format="iso"), + ) ) - reason: Optional[str] = dc_field( - default=None, metadata=dc_config(field_name="reason") + activity_feedback: "ActivityFeedbackEventPayload" = dc_field( + metadata=dc_config(field_name="activity_feedback") + ) + custom: Dict[str, object] = dc_field(metadata=dc_config(field_name="custom")) + type: str = dc_field( + default="feeds.activity.feedback", metadata=dc_config(field_name="type") + ) + received_at: Optional[datetime] = dc_field( + default=None, + metadata=dc_config( + field_name="received_at", + encoder=encode_datetime, + decoder=datetime_from_unix_ns, + mm_field=fields.DateTime(format="iso"), + ), + ) + user: "Optional[UserResponseCommonFields]" = dc_field( + default=None, metadata=dc_config(field_name="user") + ) + + +@dataclass +class ActivityFeedbackEventPayload(DataClassJsonMixin): + action: str = dc_field(metadata=dc_config(field_name="action")) + activity_id: str = dc_field(metadata=dc_config(field_name="activity_id")) + created_at: datetime = dc_field( + metadata=dc_config( + field_name="created_at", + encoder=encode_datetime, + decoder=datetime_from_unix_ns, + mm_field=fields.DateTime(format="iso"), + ) ) - report: Optional[bool] = dc_field( - default=None, metadata=dc_config(field_name="report") + updated_at: datetime = dc_field( + metadata=dc_config( + field_name="updated_at", + encoder=encode_datetime, + decoder=datetime_from_unix_ns, + mm_field=fields.DateTime(format="iso"), + ) ) + value: str = dc_field(metadata=dc_config(field_name="value")) + user: "UserResponse" = dc_field(metadata=dc_config(field_name="user")) + + +@dataclass +class ActivityFeedbackRequest(DataClassJsonMixin): + hide: Optional[bool] = dc_field(default=None, metadata=dc_config(field_name="hide")) show_less: Optional[bool] = dc_field( default=None, metadata=dc_config(field_name="show_less") ) @@ -744,8 +790,10 @@ class ActivityResponse(DataClassJsonMixin): mm_field=fields.DateTime(format="iso"), ) ) + hidden: bool = dc_field(metadata=dc_config(field_name="hidden")) id: str = dc_field(metadata=dc_config(field_name="id")) popularity: int = dc_field(metadata=dc_config(field_name="popularity")) + preview: bool = dc_field(metadata=dc_config(field_name="preview")) reaction_count: int = dc_field(metadata=dc_config(field_name="reaction_count")) score: float = dc_field(metadata=dc_config(field_name="score")) share_count: int = dc_field(metadata=dc_config(field_name="share_count")) @@ -815,12 +863,12 @@ class ActivityResponse(DataClassJsonMixin): mm_field=fields.DateTime(format="iso"), ), ) - hidden: Optional[bool] = dc_field( - default=None, metadata=dc_config(field_name="hidden") - ) is_watched: Optional[bool] = dc_field( default=None, metadata=dc_config(field_name="is_watched") ) + moderation_action: Optional[str] = dc_field( + default=None, metadata=dc_config(field_name="moderation_action") + ) text: Optional[str] = dc_field(default=None, metadata=dc_config(field_name="text")) visibility_tag: Optional[str] = dc_field( default=None, metadata=dc_config(field_name="visibility_tag") @@ -847,23 +895,17 @@ class ActivityResponse(DataClassJsonMixin): @dataclass class ActivitySelectorConfig(DataClassJsonMixin): - cutoff_time: Optional[datetime] = dc_field( - default=None, - metadata=dc_config( - field_name="CutoffTime", - encoder=encode_datetime, - decoder=datetime_from_unix_ns, - mm_field=fields.DateTime(format="iso"), - ), - ) + type: str = dc_field(metadata=dc_config(field_name="type")) cutoff_time: Optional[str] = dc_field( default=None, metadata=dc_config(field_name="cutoff_time") ) + cutoff_window: Optional[str] = dc_field( + default=None, metadata=dc_config(field_name="cutoff_window") + ) min_popularity: Optional[int] = dc_field( default=None, metadata=dc_config(field_name="min_popularity") ) - type: Optional[str] = dc_field(default=None, metadata=dc_config(field_name="type")) - sort: "Optional[List[SortParam]]" = dc_field( + sort: "Optional[List[SortParamRequest]]" = dc_field( default=None, metadata=dc_config(field_name="sort") ) filter: Optional[Dict[str, object]] = dc_field( @@ -873,6 +915,7 @@ class ActivitySelectorConfig(DataClassJsonMixin): @dataclass class ActivitySelectorConfigResponse(DataClassJsonMixin): + type: str = dc_field(metadata=dc_config(field_name="type")) cutoff_time: Optional[datetime] = dc_field( default=None, metadata=dc_config( @@ -882,11 +925,13 @@ class ActivitySelectorConfigResponse(DataClassJsonMixin): mm_field=fields.DateTime(format="iso"), ), ) + cutoff_window: Optional[str] = dc_field( + default=None, metadata=dc_config(field_name="cutoff_window") + ) min_popularity: Optional[int] = dc_field( default=None, metadata=dc_config(field_name="min_popularity") ) - type: Optional[str] = dc_field(default=None, metadata=dc_config(field_name="type")) - sort: "Optional[List[SortParam]]" = dc_field( + sort: "Optional[List[SortParamRequest]]" = dc_field( default=None, metadata=dc_config(field_name="sort") ) filter: Optional[Dict[str, object]] = dc_field( @@ -1082,6 +1127,7 @@ class AddCommentRequest(DataClassJsonMixin): create_notification_activity: Optional[bool] = dc_field( default=None, metadata=dc_config(field_name="create_notification_activity") ) + id: Optional[str] = dc_field(default=None, metadata=dc_config(field_name="id")) parent_id: Optional[str] = dc_field( default=None, metadata=dc_config(field_name="parent_id") ) @@ -1201,9 +1247,7 @@ class AggregatedActivityResponse(DataClassJsonMixin): @dataclass class AggregationConfig(DataClassJsonMixin): - format: Optional[str] = dc_field( - default=None, metadata=dc_config(field_name="format") - ) + format: str = dc_field(metadata=dc_config(field_name="format")) @dataclass @@ -1249,6 +1293,7 @@ class AppResponseFields(DataClassJsonMixin): guest_user_creation_disabled: bool = dc_field( metadata=dc_config(field_name="guest_user_creation_disabled") ) + id: int = dc_field(metadata=dc_config(field_name="id")) image_moderation_enabled: bool = dc_field( metadata=dc_config(field_name="image_moderation_enabled") ) @@ -1278,11 +1323,10 @@ class AppResponseFields(DataClassJsonMixin): permission_version: str = dc_field( metadata=dc_config(field_name="permission_version") ) - region: str = dc_field(metadata=dc_config(field_name="region")) + placement: str = dc_field(metadata=dc_config(field_name="placement")) reminders_interval: int = dc_field( metadata=dc_config(field_name="reminders_interval") ) - shard: str = dc_field(metadata=dc_config(field_name="shard")) sns_key: str = dc_field(metadata=dc_config(field_name="sns_key")) sns_secret: str = dc_field(metadata=dc_config(field_name="sns_secret")) sns_topic_arn: str = dc_field(metadata=dc_config(field_name="sns_topic_arn")) @@ -1975,6 +2019,13 @@ class BanResponse(DataClassJsonMixin): ) +@dataclass +class BlockActionRequest(DataClassJsonMixin): + reason: Optional[str] = dc_field( + default=None, metadata=dc_config(field_name="reason") + ) + + @dataclass class BlockListConfig(DataClassJsonMixin): _async: Optional[bool] = dc_field( @@ -3559,6 +3610,29 @@ class CallStateResponseFields(DataClassJsonMixin): call: "CallResponse" = dc_field(metadata=dc_config(field_name="call")) +@dataclass +class CallStatsLocation(DataClassJsonMixin): + accuracy_radius_meters: Optional[int] = dc_field( + default=None, metadata=dc_config(field_name="accuracy_radius_meters") + ) + city: Optional[str] = dc_field(default=None, metadata=dc_config(field_name="city")) + continent: Optional[str] = dc_field( + default=None, metadata=dc_config(field_name="continent") + ) + country: Optional[str] = dc_field( + default=None, metadata=dc_config(field_name="country") + ) + latitude: Optional[float] = dc_field( + default=None, metadata=dc_config(field_name="latitude") + ) + longitude: Optional[float] = dc_field( + default=None, metadata=dc_config(field_name="longitude") + ) + subdivision: Optional[str] = dc_field( + default=None, metadata=dc_config(field_name="subdivision") + ) + + @dataclass class CallStatsParticipant(DataClassJsonMixin): user_id: str = dc_field(metadata=dc_config(field_name="user_id")) @@ -3584,6 +3658,12 @@ class CallStatsParticipant(DataClassJsonMixin): class CallStatsParticipantCounts(DataClassJsonMixin): live_sessions: int = dc_field(metadata=dc_config(field_name="live_sessions")) participants: int = dc_field(metadata=dc_config(field_name="participants")) + peak_concurrent_sessions: int = dc_field( + metadata=dc_config(field_name="peak_concurrent_sessions") + ) + peak_concurrent_users: int = dc_field( + metadata=dc_config(field_name="peak_concurrent_users") + ) publishers: int = dc_field(metadata=dc_config(field_name="publishers")) sessions: int = dc_field(metadata=dc_config(field_name="sessions")) @@ -3595,9 +3675,24 @@ class CallStatsParticipantSession(DataClassJsonMixin): published_tracks: "PublishedTrackFlags" = dc_field( metadata=dc_config(field_name="published_tracks") ) + browser: Optional[str] = dc_field( + default=None, metadata=dc_config(field_name="browser") + ) + browser_version: Optional[str] = dc_field( + default=None, metadata=dc_config(field_name="browser_version") + ) cq_score: Optional[int] = dc_field( default=None, metadata=dc_config(field_name="cq_score") ) + current_ip: Optional[str] = dc_field( + default=None, metadata=dc_config(field_name="current_ip") + ) + current_sfu: Optional[str] = dc_field( + default=None, metadata=dc_config(field_name="current_sfu") + ) + distance_to_sfu_kilometers: Optional[float] = dc_field( + default=None, metadata=dc_config(field_name="distance_to_sfu_kilometers") + ) ended_at: Optional[datetime] = dc_field( default=None, metadata=dc_config( @@ -3607,9 +3702,14 @@ class CallStatsParticipantSession(DataClassJsonMixin): mm_field=fields.DateTime(format="iso"), ), ) + os: Optional[str] = dc_field(default=None, metadata=dc_config(field_name="os")) publisher_type: Optional[str] = dc_field( default=None, metadata=dc_config(field_name="publisher_type") ) + sdk: Optional[str] = dc_field(default=None, metadata=dc_config(field_name="sdk")) + sdk_version: Optional[str] = dc_field( + default=None, metadata=dc_config(field_name="sdk_version") + ) started_at: Optional[datetime] = dc_field( default=None, metadata=dc_config( @@ -3622,6 +3722,12 @@ class CallStatsParticipantSession(DataClassJsonMixin): unified_session_id: Optional[str] = dc_field( default=None, metadata=dc_config(field_name="unified_session_id") ) + webrtc_version: Optional[str] = dc_field( + default=None, metadata=dc_config(field_name="webrtc_version") + ) + location: "Optional[CallStatsLocation]" = dc_field( + default=None, metadata=dc_config(field_name="location") + ) @dataclass @@ -3773,31 +3879,33 @@ class CallTranscriptionStoppedEvent(DataClassJsonMixin): @dataclass class CallType(DataClassJsonMixin): - app_pk: int = dc_field(metadata=dc_config(field_name="AppPK")) + app: int = dc_field(metadata=dc_config(field_name="app")) created_at: datetime = dc_field( metadata=dc_config( - field_name="CreatedAt", + field_name="created_at", encoder=encode_datetime, decoder=datetime_from_unix_ns, mm_field=fields.DateTime(format="iso"), ) ) - external_storage: str = dc_field(metadata=dc_config(field_name="ExternalStorage")) - name: str = dc_field(metadata=dc_config(field_name="Name")) - pk: int = dc_field(metadata=dc_config(field_name="PK")) + id: int = dc_field(metadata=dc_config(field_name="id")) + name: str = dc_field(metadata=dc_config(field_name="name")) + recording_external_storage: str = dc_field( + metadata=dc_config(field_name="recording_external_storage") + ) updated_at: datetime = dc_field( metadata=dc_config( - field_name="UpdatedAt", + field_name="updated_at", encoder=encode_datetime, decoder=datetime_from_unix_ns, mm_field=fields.DateTime(format="iso"), ) ) notification_settings: "Optional[NotificationSettings]" = dc_field( - default=None, metadata=dc_config(field_name="NotificationSettings") + default=None, metadata=dc_config(field_name="notification_settings") ) settings: "Optional[CallSettings]" = dc_field( - default=None, metadata=dc_config(field_name="Settings") + default=None, metadata=dc_config(field_name="settings") ) @@ -3912,6 +4020,17 @@ class CallsPerDayReportResponse(DataClassJsonMixin): ) +@dataclass +class CampaignChannelMember(DataClassJsonMixin): + user_id: str = dc_field(metadata=dc_config(field_name="user_id")) + channel_role: Optional[str] = dc_field( + default=None, metadata=dc_config(field_name="channel_role") + ) + custom: Optional[Dict[str, object]] = dc_field( + default=None, metadata=dc_config(field_name="custom") + ) + + @dataclass class CampaignChannelTemplate(DataClassJsonMixin): type: str = dc_field(metadata=dc_config(field_name="type")) @@ -3921,6 +4040,9 @@ class CampaignChannelTemplate(DataClassJsonMixin): members: Optional[List[str]] = dc_field( default=None, metadata=dc_config(field_name="members") ) + members_template: "Optional[List[CampaignChannelMember]]" = dc_field( + default=None, metadata=dc_config(field_name="members_template") + ) @dataclass @@ -4169,6 +4291,9 @@ class Channel(DataClassJsonMixin): active_live_locations: "Optional[List[SharedLocation]]" = dc_field( default=None, metadata=dc_config(field_name="active_live_locations") ) + filter_tags: Optional[List[str]] = dc_field( + default=None, metadata=dc_config(field_name="filter_tags") + ) invites: "Optional[List[ChannelMember]]" = dc_field( default=None, metadata=dc_config(field_name="invites") ) @@ -4207,6 +4332,7 @@ class ChannelConfig(DataClassJsonMixin): ) ) custom_events: bool = dc_field(metadata=dc_config(field_name="custom_events")) + delivery_events: bool = dc_field(metadata=dc_config(field_name="delivery_events")) mark_messages_pending: bool = dc_field( metadata=dc_config(field_name="mark_messages_pending") ) @@ -4282,6 +4408,7 @@ class ChannelConfigWithInfo(DataClassJsonMixin): ) ) custom_events: bool = dc_field(metadata=dc_config(field_name="custom_events")) + delivery_events: bool = dc_field(metadata=dc_config(field_name="delivery_events")) mark_messages_pending: bool = dc_field( metadata=dc_config(field_name="mark_messages_pending") ) @@ -4502,10 +4629,13 @@ class ChannelInput(DataClassJsonMixin): truncated_by_id: Optional[str] = dc_field( default=None, metadata=dc_config(field_name="truncated_by_id") ) - invites: "Optional[List[ChannelMember]]" = dc_field( + filter_tags: Optional[List[str]] = dc_field( + default=None, metadata=dc_config(field_name="filter_tags") + ) + invites: "Optional[List[ChannelMemberRequest]]" = dc_field( default=None, metadata=dc_config(field_name="invites") ) - members: "Optional[List[ChannelMember]]" = dc_field( + members: "Optional[List[ChannelMemberRequest]]" = dc_field( default=None, metadata=dc_config(field_name="members") ) config_overrides: "Optional[ChannelConfig]" = dc_field( @@ -4531,6 +4661,7 @@ class ChannelMember(DataClassJsonMixin): mm_field=fields.DateTime(format="iso"), ) ) + is_global_banned: bool = dc_field(metadata=dc_config(field_name="is_global_banned")) notifications_muted: bool = dc_field( metadata=dc_config(field_name="notifications_muted") ) @@ -4562,6 +4693,9 @@ class ChannelMember(DataClassJsonMixin): mm_field=fields.DateTime(format="iso"), ), ) + blocked: Optional[bool] = dc_field( + default=None, metadata=dc_config(field_name="blocked") + ) deleted_at: Optional[datetime] = dc_field( default=None, metadata=dc_config( @@ -4571,6 +4705,9 @@ class ChannelMember(DataClassJsonMixin): mm_field=fields.DateTime(format="iso"), ), ) + hidden: Optional[bool] = dc_field( + default=None, metadata=dc_config(field_name="hidden") + ) invite_accepted_at: Optional[datetime] = dc_field( default=None, metadata=dc_config( @@ -4604,7 +4741,6 @@ class ChannelMember(DataClassJsonMixin): mm_field=fields.DateTime(format="iso"), ), ) - role: Optional[str] = dc_field(default=None, metadata=dc_config(field_name="role")) status: Optional[str] = dc_field( default=None, metadata=dc_config(field_name="status") ) @@ -4614,7 +4750,10 @@ class ChannelMember(DataClassJsonMixin): deleted_messages: Optional[List[str]] = dc_field( default=None, metadata=dc_config(field_name="deleted_messages") ) - user: "Optional[UserResponse]" = dc_field( + channel: "Optional[DenormalizedChannelFields]" = dc_field( + default=None, metadata=dc_config(field_name="channel") + ) + user: "Optional[User]" = dc_field( default=None, metadata=dc_config(field_name="user") ) @@ -4655,9 +4794,118 @@ class ChannelMemberLookup(DataClassJsonMixin): ) +@dataclass +class ChannelMemberRequest(DataClassJsonMixin): + user_id: str = dc_field(metadata=dc_config(field_name="user_id")) + channel_role: Optional[str] = dc_field( + default=None, metadata=dc_config(field_name="channel_role") + ) + custom: Optional[Dict[str, object]] = dc_field( + default=None, metadata=dc_config(field_name="custom") + ) + user: "Optional[UserResponse]" = dc_field( + default=None, metadata=dc_config(field_name="user") + ) + + @dataclass class ChannelMemberResponse(DataClassJsonMixin): + banned: bool = dc_field(metadata=dc_config(field_name="banned")) channel_role: str = dc_field(metadata=dc_config(field_name="channel_role")) + created_at: datetime = dc_field( + metadata=dc_config( + field_name="created_at", + encoder=encode_datetime, + decoder=datetime_from_unix_ns, + mm_field=fields.DateTime(format="iso"), + ) + ) + notifications_muted: bool = dc_field( + metadata=dc_config(field_name="notifications_muted") + ) + shadow_banned: bool = dc_field(metadata=dc_config(field_name="shadow_banned")) + updated_at: datetime = dc_field( + metadata=dc_config( + field_name="updated_at", + encoder=encode_datetime, + decoder=datetime_from_unix_ns, + mm_field=fields.DateTime(format="iso"), + ) + ) + custom: Dict[str, object] = dc_field(metadata=dc_config(field_name="custom")) + archived_at: Optional[datetime] = dc_field( + default=None, + metadata=dc_config( + field_name="archived_at", + encoder=encode_datetime, + decoder=datetime_from_unix_ns, + mm_field=fields.DateTime(format="iso"), + ), + ) + ban_expires: Optional[datetime] = dc_field( + default=None, + metadata=dc_config( + field_name="ban_expires", + encoder=encode_datetime, + decoder=datetime_from_unix_ns, + mm_field=fields.DateTime(format="iso"), + ), + ) + deleted_at: Optional[datetime] = dc_field( + default=None, + metadata=dc_config( + field_name="deleted_at", + encoder=encode_datetime, + decoder=datetime_from_unix_ns, + mm_field=fields.DateTime(format="iso"), + ), + ) + invite_accepted_at: Optional[datetime] = dc_field( + default=None, + metadata=dc_config( + field_name="invite_accepted_at", + encoder=encode_datetime, + decoder=datetime_from_unix_ns, + mm_field=fields.DateTime(format="iso"), + ), + ) + invite_rejected_at: Optional[datetime] = dc_field( + default=None, + metadata=dc_config( + field_name="invite_rejected_at", + encoder=encode_datetime, + decoder=datetime_from_unix_ns, + mm_field=fields.DateTime(format="iso"), + ), + ) + invited: Optional[bool] = dc_field( + default=None, metadata=dc_config(field_name="invited") + ) + is_moderator: Optional[bool] = dc_field( + default=None, metadata=dc_config(field_name="is_moderator") + ) + pinned_at: Optional[datetime] = dc_field( + default=None, + metadata=dc_config( + field_name="pinned_at", + encoder=encode_datetime, + decoder=datetime_from_unix_ns, + mm_field=fields.DateTime(format="iso"), + ), + ) + role: Optional[str] = dc_field(default=None, metadata=dc_config(field_name="role")) + status: Optional[str] = dc_field( + default=None, metadata=dc_config(field_name="status") + ) + user_id: Optional[str] = dc_field( + default=None, metadata=dc_config(field_name="user_id") + ) + deleted_messages: Optional[List[str]] = dc_field( + default=None, metadata=dc_config(field_name="deleted_messages") + ) + user: "Optional[UserResponse]" = dc_field( + default=None, metadata=dc_config(field_name="user") + ) @dataclass @@ -4727,6 +4975,7 @@ class ChannelOwnCapability: DELETE_ANY_MESSAGE: Final[ChannelOwnCapabilityType] = "delete-any-message" DELETE_CHANNEL: Final[ChannelOwnCapabilityType] = "delete-channel" DELETE_OWN_MESSAGE: Final[ChannelOwnCapabilityType] = "delete-own-message" + DELIVERY_EVENTS: Final[ChannelOwnCapabilityType] = "delivery-events" FLAG_MESSAGE: Final[ChannelOwnCapabilityType] = "flag-message" FREEZE_CHANNEL: Final[ChannelOwnCapabilityType] = "freeze-channel" JOIN_CHANNEL: Final[ChannelOwnCapabilityType] = "join-channel" @@ -4870,7 +5119,10 @@ class ChannelResponse(DataClassJsonMixin): mm_field=fields.DateTime(format="iso"), ), ) - members: "Optional[List[ChannelMember]]" = dc_field( + filter_tags: Optional[List[str]] = dc_field( + default=None, metadata=dc_config(field_name="filter_tags") + ) + members: "Optional[List[ChannelMemberResponse]]" = dc_field( default=None, metadata=dc_config(field_name="members") ) own_capabilities: "Optional[List[ChannelOwnCapability]]" = dc_field( @@ -4890,7 +5142,9 @@ class ChannelResponse(DataClassJsonMixin): @dataclass class ChannelStateResponse(DataClassJsonMixin): duration: str = dc_field(metadata=dc_config(field_name="duration")) - members: "List[ChannelMember]" = dc_field(metadata=dc_config(field_name="members")) + members: "List[ChannelMemberResponse]" = dc_field( + metadata=dc_config(field_name="members") + ) messages: "List[MessageResponse]" = dc_field( metadata=dc_config(field_name="messages") ) @@ -4933,7 +5187,7 @@ class ChannelStateResponse(DataClassJsonMixin): draft: "Optional[DraftResponse]" = dc_field( default=None, metadata=dc_config(field_name="draft") ) - membership: "Optional[ChannelMember]" = dc_field( + membership: "Optional[ChannelMemberResponse]" = dc_field( default=None, metadata=dc_config(field_name="membership") ) push_preferences: "Optional[ChannelPushPreferences]" = dc_field( @@ -4943,7 +5197,9 @@ class ChannelStateResponse(DataClassJsonMixin): @dataclass class ChannelStateResponseFields(DataClassJsonMixin): - members: "List[ChannelMember]" = dc_field(metadata=dc_config(field_name="members")) + members: "List[ChannelMemberResponse]" = dc_field( + metadata=dc_config(field_name="members") + ) messages: "List[MessageResponse]" = dc_field( metadata=dc_config(field_name="messages") ) @@ -4986,7 +5242,7 @@ class ChannelStateResponseFields(DataClassJsonMixin): draft: "Optional[DraftResponse]" = dc_field( default=None, metadata=dc_config(field_name="draft") ) - membership: "Optional[ChannelMember]" = dc_field( + membership: "Optional[ChannelMemberResponse]" = dc_field( default=None, metadata=dc_config(field_name="membership") ) push_preferences: "Optional[ChannelPushPreferences]" = dc_field( @@ -5033,6 +5289,7 @@ class ChannelTypeConfig(DataClassJsonMixin): ) ) custom_events: bool = dc_field(metadata=dc_config(field_name="custom_events")) + delivery_events: bool = dc_field(metadata=dc_config(field_name="delivery_events")) mark_messages_pending: bool = dc_field( metadata=dc_config(field_name="mark_messages_pending") ) @@ -5931,6 +6188,9 @@ class CreateChannelTypeRequest(DataClassJsonMixin): custom_events: Optional[bool] = dc_field( default=None, metadata=dc_config(field_name="custom_events") ) + delivery_events: Optional[bool] = dc_field( + default=None, metadata=dc_config(field_name="delivery_events") + ) mark_messages_pending: Optional[bool] = dc_field( default=None, metadata=dc_config(field_name="mark_messages_pending") ) @@ -6012,6 +6272,7 @@ class CreateChannelTypeResponse(DataClassJsonMixin): ) ) custom_events: bool = dc_field(metadata=dc_config(field_name="custom_events")) + delivery_events: bool = dc_field(metadata=dc_config(field_name="delivery_events")) duration: str = dc_field(metadata=dc_config(field_name="duration")) mark_messages_pending: bool = dc_field( metadata=dc_config(field_name="mark_messages_pending") @@ -6176,9 +6437,6 @@ class CreateFeedGroupResponse(DataClassJsonMixin): @dataclass class CreateFeedViewRequest(DataClassJsonMixin): id: str = dc_field(metadata=dc_config(field_name="id")) - activity_processors: "Optional[List[ActivityProcessorConfig]]" = dc_field( - default=None, metadata=dc_config(field_name="activity_processors") - ) activity_selectors: "Optional[List[ActivitySelectorConfig]]" = dc_field( default=None, metadata=dc_config(field_name="activity_selectors") ) @@ -6356,6 +6614,20 @@ class CreateRoleResponse(DataClassJsonMixin): role: "Role" = dc_field(metadata=dc_config(field_name="role")) +@dataclass +class CreateSIPTrunkRequest(DataClassJsonMixin): + name: str = dc_field(metadata=dc_config(field_name="name")) + numbers: List[str] = dc_field(metadata=dc_config(field_name="numbers")) + + +@dataclass +class CreateSIPTrunkResponse(DataClassJsonMixin): + duration: str = dc_field(metadata=dc_config(field_name="duration")) + sip_trunk: "Optional[SIPTrunkResponse]" = dc_field( + default=None, metadata=dc_config(field_name="sip_trunk") + ) + + @dataclass class CustomActionRequest(DataClassJsonMixin): id: Optional[str] = dc_field(default=None, metadata=dc_config(field_name="id")) @@ -6461,6 +6733,20 @@ class DailyAggregateUserFeedbackReportResponse(DataClassJsonMixin): report: "UserFeedbackReport" = dc_field(metadata=dc_config(field_name="report")) +@dataclass +class DailyMetricResponse(DataClassJsonMixin): + date: str = dc_field(metadata=dc_config(field_name="date")) + value: int = dc_field(metadata=dc_config(field_name="value")) + + +@dataclass +class DailyMetricStatsResponse(DataClassJsonMixin): + total: int = dc_field(metadata=dc_config(field_name="total")) + daily: "List[DailyMetricResponse]" = dc_field( + metadata=dc_config(field_name="daily") + ) + + @dataclass class Data(DataClassJsonMixin): id: str = dc_field(metadata=dc_config(field_name="id")) @@ -6569,6 +6855,9 @@ class DeleteActivityRequest(DataClassJsonMixin): hard_delete: Optional[bool] = dc_field( default=None, metadata=dc_config(field_name="hard_delete") ) + reason: Optional[str] = dc_field( + default=None, metadata=dc_config(field_name="reason") + ) @dataclass @@ -6651,6 +6940,16 @@ class DeleteCommentReactionResponse(DataClassJsonMixin): ) +@dataclass +class DeleteCommentRequest(DataClassJsonMixin): + hard_delete: Optional[bool] = dc_field( + default=None, metadata=dc_config(field_name="hard_delete") + ) + reason: Optional[str] = dc_field( + default=None, metadata=dc_config(field_name="reason") + ) + + @dataclass class DeleteCommentResponse(DataClassJsonMixin): duration: str = dc_field(metadata=dc_config(field_name="duration")) @@ -6699,6 +6998,9 @@ class DeleteMessageRequest(DataClassJsonMixin): hard_delete: Optional[bool] = dc_field( default=None, metadata=dc_config(field_name="hard_delete") ) + reason: Optional[str] = dc_field( + default=None, metadata=dc_config(field_name="reason") + ) @dataclass @@ -6727,6 +7029,9 @@ class DeleteReactionRequest(DataClassJsonMixin): hard_delete: Optional[bool] = dc_field( default=None, metadata=dc_config(field_name="hard_delete") ) + reason: Optional[str] = dc_field( + default=None, metadata=dc_config(field_name="reason") + ) @dataclass @@ -6746,6 +7051,16 @@ class DeleteReminderResponse(DataClassJsonMixin): duration: str = dc_field(metadata=dc_config(field_name="duration")) +@dataclass +class DeleteSIPInboundRoutingRuleResponse(DataClassJsonMixin): + duration: str = dc_field(metadata=dc_config(field_name="duration")) + + +@dataclass +class DeleteSIPTrunkResponse(DataClassJsonMixin): + duration: str = dc_field(metadata=dc_config(field_name="duration")) + + @dataclass class DeleteSegmentTargetsRequest(DataClassJsonMixin): target_ids: List[str] = dc_field(metadata=dc_config(field_name="target_ids")) @@ -6770,6 +7085,9 @@ class DeleteUserRequest(DataClassJsonMixin): mark_messages_deleted: Optional[bool] = dc_field( default=None, metadata=dc_config(field_name="mark_messages_deleted") ) + reason: Optional[str] = dc_field( + default=None, metadata=dc_config(field_name="reason") + ) @dataclass @@ -6814,6 +7132,37 @@ class DeliveryReceiptsResponse(DataClassJsonMixin): ) +@dataclass +class DenormalizedChannelFields(DataClassJsonMixin): + created_at: Optional[str] = dc_field( + default=None, metadata=dc_config(field_name="created_at") + ) + created_by_id: Optional[str] = dc_field( + default=None, metadata=dc_config(field_name="created_by_id") + ) + disabled: Optional[bool] = dc_field( + default=None, metadata=dc_config(field_name="disabled") + ) + frozen: Optional[bool] = dc_field( + default=None, metadata=dc_config(field_name="frozen") + ) + id: Optional[str] = dc_field(default=None, metadata=dc_config(field_name="id")) + last_message_at: Optional[str] = dc_field( + default=None, metadata=dc_config(field_name="last_message_at") + ) + member_count: Optional[int] = dc_field( + default=None, metadata=dc_config(field_name="member_count") + ) + team: Optional[str] = dc_field(default=None, metadata=dc_config(field_name="team")) + type: Optional[str] = dc_field(default=None, metadata=dc_config(field_name="type")) + updated_at: Optional[str] = dc_field( + default=None, metadata=dc_config(field_name="updated_at") + ) + custom: Optional[Dict[str, object]] = dc_field( + default=None, metadata=dc_config(field_name="custom") + ) + + @dataclass class Device(DataClassJsonMixin): created_at: datetime = dc_field( @@ -7440,9 +7789,9 @@ class FeedDeletedEvent(DataClassJsonMixin): @dataclass class FeedGroup(DataClassJsonMixin): aggregation_version: int = dc_field( - metadata=dc_config(field_name="AggregationVersion") + metadata=dc_config(field_name="aggregation_version") ) - app_pk: int = dc_field(metadata=dc_config(field_name="AppPK")) + app_pk: int = dc_field(metadata=dc_config(field_name="app_pk")) created_at: datetime = dc_field( metadata=dc_config( field_name="created_at", @@ -7452,9 +7801,9 @@ class FeedGroup(DataClassJsonMixin): ) ) default_visibility: str = dc_field( - metadata=dc_config(field_name="DefaultVisibility") + metadata=dc_config(field_name="default_visibility") ) - id: str = dc_field(metadata=dc_config(field_name="ID")) + group_id: str = dc_field(metadata=dc_config(field_name="group_id")) updated_at: datetime = dc_field( metadata=dc_config( field_name="updated_at", @@ -7464,16 +7813,16 @@ class FeedGroup(DataClassJsonMixin): ) ) activity_processors: "List[ActivityProcessorConfig]" = dc_field( - metadata=dc_config(field_name="ActivityProcessors") + metadata=dc_config(field_name="activity_processors") ) activity_selectors: "List[ActivitySelectorConfig]" = dc_field( - metadata=dc_config(field_name="ActivitySelectors") + metadata=dc_config(field_name="activity_selectors") ) - custom: Dict[str, object] = dc_field(metadata=dc_config(field_name="Custom")) + custom: Dict[str, object] = dc_field(metadata=dc_config(field_name="custom")) deleted_at: Optional[datetime] = dc_field( default=None, metadata=dc_config( - field_name="DeletedAt", + field_name="deleted_at", encoder=encode_datetime, decoder=datetime_from_unix_ns, mm_field=fields.DateTime(format="iso"), @@ -7482,26 +7831,26 @@ class FeedGroup(DataClassJsonMixin): last_feed_get_at: Optional[datetime] = dc_field( default=None, metadata=dc_config( - field_name="LastFeedGetAt", + field_name="last_feed_get_at", encoder=encode_datetime, decoder=datetime_from_unix_ns, mm_field=fields.DateTime(format="iso"), ), ) aggregation: "Optional[AggregationConfig]" = dc_field( - default=None, metadata=dc_config(field_name="Aggregation") + default=None, metadata=dc_config(field_name="aggregation") ) notification: "Optional[NotificationConfig]" = dc_field( - default=None, metadata=dc_config(field_name="Notification") + default=None, metadata=dc_config(field_name="notification") ) push_notification: "Optional[PushNotificationConfig]" = dc_field( - default=None, metadata=dc_config(field_name="PushNotification") + default=None, metadata=dc_config(field_name="push_notification") ) ranking: "Optional[RankingConfig]" = dc_field( - default=None, metadata=dc_config(field_name="Ranking") + default=None, metadata=dc_config(field_name="ranking") ) stories: "Optional[StoriesConfig]" = dc_field( - default=None, metadata=dc_config(field_name="Stories") + default=None, metadata=dc_config(field_name="stories") ) @@ -7592,6 +7941,15 @@ class FeedGroupResponse(DataClassJsonMixin): default_visibility: Optional[str] = dc_field( default=None, metadata=dc_config(field_name="default_visibility") ) + deleted_at: Optional[datetime] = dc_field( + default=None, + metadata=dc_config( + field_name="deleted_at", + encoder=encode_datetime, + decoder=datetime_from_unix_ns, + mm_field=fields.DateTime(format="iso"), + ), + ) activity_processors: "Optional[List[ActivityProcessorConfig]]" = dc_field( default=None, metadata=dc_config(field_name="activity_processors") ) @@ -7924,6 +8282,72 @@ class FeedResponse(DataClassJsonMixin): ) +@dataclass +class FeedSuggestionResponse(DataClassJsonMixin): + created_at: datetime = dc_field( + metadata=dc_config( + field_name="created_at", + encoder=encode_datetime, + decoder=datetime_from_unix_ns, + mm_field=fields.DateTime(format="iso"), + ) + ) + description: str = dc_field(metadata=dc_config(field_name="description")) + feed: str = dc_field(metadata=dc_config(field_name="feed")) + follower_count: int = dc_field(metadata=dc_config(field_name="follower_count")) + following_count: int = dc_field(metadata=dc_config(field_name="following_count")) + group_id: str = dc_field(metadata=dc_config(field_name="group_id")) + id: str = dc_field(metadata=dc_config(field_name="id")) + member_count: int = dc_field(metadata=dc_config(field_name="member_count")) + name: str = dc_field(metadata=dc_config(field_name="name")) + pin_count: int = dc_field(metadata=dc_config(field_name="pin_count")) + updated_at: datetime = dc_field( + metadata=dc_config( + field_name="updated_at", + encoder=encode_datetime, + decoder=datetime_from_unix_ns, + mm_field=fields.DateTime(format="iso"), + ) + ) + created_by: "UserResponse" = dc_field(metadata=dc_config(field_name="created_by")) + deleted_at: Optional[datetime] = dc_field( + default=None, + metadata=dc_config( + field_name="deleted_at", + encoder=encode_datetime, + decoder=datetime_from_unix_ns, + mm_field=fields.DateTime(format="iso"), + ), + ) + reason: Optional[str] = dc_field( + default=None, metadata=dc_config(field_name="reason") + ) + recommendation_score: Optional[float] = dc_field( + default=None, metadata=dc_config(field_name="recommendation_score") + ) + visibility: Optional[str] = dc_field( + default=None, metadata=dc_config(field_name="visibility") + ) + filter_tags: Optional[List[str]] = dc_field( + default=None, metadata=dc_config(field_name="filter_tags") + ) + own_capabilities: "Optional[List[FeedOwnCapability]]" = dc_field( + default=None, metadata=dc_config(field_name="own_capabilities") + ) + own_follows: "Optional[List[FollowResponse]]" = dc_field( + default=None, metadata=dc_config(field_name="own_follows") + ) + algorithm_scores: "Optional[Dict[str, float]]" = dc_field( + default=None, metadata=dc_config(field_name="algorithm_scores") + ) + custom: Optional[Dict[str, object]] = dc_field( + default=None, metadata=dc_config(field_name="custom") + ) + own_membership: "Optional[FeedMemberResponse]" = dc_field( + default=None, metadata=dc_config(field_name="own_membership") + ) + + @dataclass class FeedUpdatedEvent(DataClassJsonMixin): created_at: datetime = dc_field( @@ -7969,9 +8393,6 @@ class FeedViewResponse(DataClassJsonMixin): mm_field=fields.DateTime(format="iso"), ), ) - activity_processors: "Optional[List[ActivityProcessorConfig]]" = dc_field( - default=None, metadata=dc_config(field_name="activity_processors") - ) activity_selectors: "Optional[List[ActivitySelectorConfigResponse]]" = dc_field( default=None, metadata=dc_config(field_name="activity_selectors") ) @@ -8817,6 +9238,7 @@ class GetChannelTypeResponse(DataClassJsonMixin): ) ) custom_events: bool = dc_field(metadata=dc_config(field_name="custom_events")) + delivery_events: bool = dc_field(metadata=dc_config(field_name="delivery_events")) duration: str = dc_field(metadata=dc_config(field_name="duration")) mark_messages_pending: bool = dc_field( metadata=dc_config(field_name="mark_messages_pending") @@ -8983,12 +9405,32 @@ class GetFeedVisibilityResponse(DataClassJsonMixin): ) +@dataclass +class GetFeedsRateLimitsResponse(DataClassJsonMixin): + duration: str = dc_field(metadata=dc_config(field_name="duration")) + android: "Optional[Dict[str, LimitInfo]]" = dc_field( + default=None, metadata=dc_config(field_name="android") + ) + ios: "Optional[Dict[str, LimitInfo]]" = dc_field( + default=None, metadata=dc_config(field_name="ios") + ) + server_side: "Optional[Dict[str, LimitInfo]]" = dc_field( + default=None, metadata=dc_config(field_name="server_side") + ) + web: "Optional[Dict[str, LimitInfo]]" = dc_field( + default=None, metadata=dc_config(field_name="web") + ) + + @dataclass class GetFollowSuggestionsResponse(DataClassJsonMixin): duration: str = dc_field(metadata=dc_config(field_name="duration")) - suggestions: "List[FeedResponse]" = dc_field( + suggestions: "List[FeedSuggestionResponse]" = dc_field( metadata=dc_config(field_name="suggestions") ) + algorithm_used: Optional[str] = dc_field( + default=None, metadata=dc_config(field_name="algorithm_used") + ) @dataclass @@ -9173,9 +9615,6 @@ class GetOrCreateFeedRequest(DataClassJsonMixin): watch: Optional[bool] = dc_field( default=None, metadata=dc_config(field_name="watch") ) - activity_selector_options: Optional[Dict[str, object]] = dc_field( - default=None, metadata=dc_config(field_name="activity_selector_options") - ) data: "Optional[FeedInput]" = dc_field( default=None, metadata=dc_config(field_name="data") ) @@ -9243,9 +9682,6 @@ class GetOrCreateFeedResponse(DataClassJsonMixin): @dataclass class GetOrCreateFeedViewRequest(DataClassJsonMixin): - activity_processors: "Optional[List[ActivityProcessorConfig]]" = dc_field( - default=None, metadata=dc_config(field_name="activity_processors") - ) activity_selectors: "Optional[List[ActivitySelectorConfig]]" = dc_field( default=None, metadata=dc_config(field_name="activity_selectors") ) @@ -10053,6 +10489,22 @@ class ListRolesResponse(DataClassJsonMixin): roles: "List[Role]" = dc_field(metadata=dc_config(field_name="roles")) +@dataclass +class ListSIPInboundRoutingRuleResponse(DataClassJsonMixin): + duration: str = dc_field(metadata=dc_config(field_name="duration")) + sip_inbound_routing_rules: "List[SIPInboundRoutingRuleResponse]" = dc_field( + metadata=dc_config(field_name="sip_inbound_routing_rules") + ) + + +@dataclass +class ListSIPTrunksResponse(DataClassJsonMixin): + duration: str = dc_field(metadata=dc_config(field_name="duration")) + sip_trunks: "List[SIPTrunkResponse]" = dc_field( + metadata=dc_config(field_name="sip_trunks") + ) + + @dataclass class ListTranscriptionsResponse(DataClassJsonMixin): duration: str = dc_field(metadata=dc_config(field_name="duration")) @@ -10142,12 +10594,6 @@ class MarkUnreadRequest(DataClassJsonMixin): thread_id: Optional[str] = dc_field( default=None, metadata=dc_config(field_name="thread_id") ) - user_id: Optional[str] = dc_field( - default=None, metadata=dc_config(field_name="user_id") - ) - user: "Optional[UserRequest]" = dc_field( - default=None, metadata=dc_config(field_name="user") - ) @dataclass @@ -10267,7 +10713,9 @@ class MemberUpdatedEvent(DataClassJsonMixin): @dataclass class MembersResponse(DataClassJsonMixin): duration: str = dc_field(metadata=dc_config(field_name="duration")) - members: "List[ChannelMember]" = dc_field(metadata=dc_config(field_name="members")) + members: "List[ChannelMemberResponse]" = dc_field( + metadata=dc_config(field_name="members") + ) @dataclass @@ -10685,7 +11133,9 @@ class MessageNewEvent(DataClassJsonMixin): ) ) watcher_count: int = dc_field(metadata=dc_config(field_name="watcher_count")) - type: str = dc_field(default="message.new", metadata=dc_config(field_name="type")) + type: str = dc_field( + default="notification.thread_message_new", metadata=dc_config(field_name="type") + ) team: Optional[str] = dc_field(default=None, metadata=dc_config(field_name="team")) thread_participants: "Optional[List[User]]" = dc_field( default=None, metadata=dc_config(field_name="thread_participants") @@ -11309,6 +11759,15 @@ class MessageWithChannelResponse(DataClassJsonMixin): ) +@dataclass +class MetricDescriptor(DataClassJsonMixin): + label: str = dc_field(metadata=dc_config(field_name="label")) + description: Optional[str] = dc_field( + default=None, metadata=dc_config(field_name="description") + ) + unit: Optional[str] = dc_field(default=None, metadata=dc_config(field_name="unit")) + + @dataclass class MetricThreshold(DataClassJsonMixin): level: str = dc_field(metadata=dc_config(field_name="level")) @@ -11481,6 +11940,12 @@ class ModerationDashboardPreferences(DataClassJsonMixin): media_queue_blur_enabled: Optional[bool] = dc_field( default=None, metadata=dc_config(field_name="media_queue_blur_enabled") ) + allowed_moderation_action_reasons: Optional[List[str]] = dc_field( + default=None, metadata=dc_config(field_name="allowed_moderation_action_reasons") + ) + overview_dashboard: "Optional[OverviewDashboardConfig]" = dc_field( + default=None, metadata=dc_config(field_name="overview_dashboard") + ) @dataclass @@ -11973,6 +12438,16 @@ class OnlyUserID(DataClassJsonMixin): id: str = dc_field(metadata=dc_config(field_name="id")) +@dataclass +class OverviewDashboardConfig(DataClassJsonMixin): + default_date_range_days: Optional[int] = dc_field( + default=None, metadata=dc_config(field_name="default_date_range_days") + ) + visible_charts: Optional[List[str]] = dc_field( + default=None, metadata=dc_config(field_name="visible_charts") + ) + + @dataclass class OwnCapabilitiesBatchRequest(DataClassJsonMixin): feeds: List[str] = dc_field(metadata=dc_config(field_name="feeds")) @@ -12310,9 +12785,15 @@ class ParticipantReportResponse(DataClassJsonMixin): @dataclass class ParticipantSeriesPublisherStats(DataClassJsonMixin): + global_metrics_order: Optional[List[str]] = dc_field( + default=None, metadata=dc_config(field_name="global_metrics_order") + ) _global: "Optional[Dict[str, List[List[float]]]]" = dc_field( default=None, metadata=dc_config(field_name="global") ) + global_meta: "Optional[Dict[str, MetricDescriptor]]" = dc_field( + default=None, metadata=dc_config(field_name="global_meta") + ) global_thresholds: "Optional[Dict[str, List[MetricThreshold]]]" = dc_field( default=None, metadata=dc_config(field_name="global_thresholds") ) @@ -12323,12 +12804,18 @@ class ParticipantSeriesPublisherStats(DataClassJsonMixin): @dataclass class ParticipantSeriesSubscriberStats(DataClassJsonMixin): + global_metrics_order: Optional[List[str]] = dc_field( + default=None, metadata=dc_config(field_name="global_metrics_order") + ) subscriptions: "Optional[List[ParticipantSeriesSubscriptionTrackMetrics]]" = ( dc_field(default=None, metadata=dc_config(field_name="subscriptions")) ) _global: "Optional[Dict[str, List[List[float]]]]" = dc_field( default=None, metadata=dc_config(field_name="global") ) + global_meta: "Optional[Dict[str, MetricDescriptor]]" = dc_field( + default=None, metadata=dc_config(field_name="global_meta") + ) global_thresholds: "Optional[Dict[str, List[MetricThreshold]]]" = dc_field( default=None, metadata=dc_config(field_name="global_thresholds") ) @@ -12385,9 +12872,15 @@ class ParticipantSeriesTrackMetrics(DataClassJsonMixin): track_type: Optional[str] = dc_field( default=None, metadata=dc_config(field_name="track_type") ) + metrics_order: Optional[List[str]] = dc_field( + default=None, metadata=dc_config(field_name="metrics_order") + ) metrics: "Optional[Dict[str, List[List[float]]]]" = dc_field( default=None, metadata=dc_config(field_name="metrics") ) + metrics_meta: "Optional[Dict[str, MetricDescriptor]]" = dc_field( + default=None, metadata=dc_config(field_name="metrics_meta") + ) thresholds: "Optional[Dict[str, List[MetricThreshold]]]" = dc_field( default=None, metadata=dc_config(field_name="thresholds") ) @@ -12395,9 +12888,15 @@ class ParticipantSeriesTrackMetrics(DataClassJsonMixin): @dataclass class ParticipantSeriesUserStats(DataClassJsonMixin): + metrics_order: Optional[List[str]] = dc_field( + default=None, metadata=dc_config(field_name="metrics_order") + ) metrics: "Optional[Dict[str, List[List[float]]]]" = dc_field( default=None, metadata=dc_config(field_name="metrics") ) + metrics_meta: "Optional[Dict[str, MetricDescriptor]]" = dc_field( + default=None, metadata=dc_config(field_name="metrics_meta") + ) thresholds: "Optional[Dict[str, List[MetricThreshold]]]" = dc_field( default=None, metadata=dc_config(field_name="thresholds") ) @@ -13113,6 +13612,9 @@ class PushProvider(DataClassJsonMixin): huawei_app_secret: Optional[str] = dc_field( default=None, metadata=dc_config(field_name="huawei_app_secret") ) + huawei_host: Optional[str] = dc_field( + default=None, metadata=dc_config(field_name="huawei_host") + ) xiaomi_app_secret: Optional[str] = dc_field( default=None, metadata=dc_config(field_name="xiaomi_app_secret") ) @@ -13804,6 +14306,29 @@ class QueryFeedsResponse(DataClassJsonMixin): prev: Optional[str] = dc_field(default=None, metadata=dc_config(field_name="prev")) +@dataclass +class QueryFeedsUsageStatsRequest(DataClassJsonMixin): + _from: Optional[str] = dc_field(default=None, metadata=dc_config(field_name="from")) + to: Optional[str] = dc_field(default=None, metadata=dc_config(field_name="to")) + + +@dataclass +class QueryFeedsUsageStatsResponse(DataClassJsonMixin): + duration: str = dc_field(metadata=dc_config(field_name="duration")) + activities: "DailyMetricStatsResponse" = dc_field( + metadata=dc_config(field_name="activities") + ) + api_requests: "DailyMetricStatsResponse" = dc_field( + metadata=dc_config(field_name="api_requests") + ) + follows: "DailyMetricStatsResponse" = dc_field( + metadata=dc_config(field_name="follows") + ) + openai_requests: "DailyMetricStatsResponse" = dc_field( + metadata=dc_config(field_name="openai_requests") + ) + + @dataclass class QueryFollowsRequest(DataClassJsonMixin): limit: Optional[int] = dc_field( @@ -13843,7 +14368,7 @@ class QueryMembersPayload(DataClassJsonMixin): user_id: Optional[str] = dc_field( default=None, metadata=dc_config(field_name="user_id") ) - members: "Optional[List[ChannelMember]]" = dc_field( + members: "Optional[List[ChannelMemberRequest]]" = dc_field( default=None, metadata=dc_config(field_name="members") ) sort: "Optional[List[SortParamRequest]]" = dc_field( @@ -14973,6 +15498,32 @@ class ReportResponse(DataClassJsonMixin): ) +@dataclass +class ResolveSipInboundRequest(DataClassJsonMixin): + sip_caller_number: str = dc_field( + metadata=dc_config(field_name="sip_caller_number") + ) + sip_trunk_number: str = dc_field(metadata=dc_config(field_name="sip_trunk_number")) + challenge: "SIPChallenge" = dc_field(metadata=dc_config(field_name="challenge")) + sip_headers: "Optional[Dict[str, str]]" = dc_field( + default=None, metadata=dc_config(field_name="sip_headers") + ) + + +@dataclass +class ResolveSipInboundResponse(DataClassJsonMixin): + duration: str = dc_field(metadata=dc_config(field_name="duration")) + credentials: "SipInboundCredentials" = dc_field( + metadata=dc_config(field_name="credentials") + ) + sip_routing_rule: "Optional[SIPInboundRoutingRuleResponse]" = dc_field( + default=None, metadata=dc_config(field_name="sip_routing_rule") + ) + sip_trunk: "Optional[SIPTrunkResponse]" = dc_field( + default=None, metadata=dc_config(field_name="sip_trunk") + ) + + @dataclass class Response(DataClassJsonMixin): duration: str = dc_field(metadata=dc_config(field_name="duration")) @@ -15037,6 +15588,9 @@ class ReviewQueueItemResponse(DataClassJsonMixin): entity_type: str = dc_field(metadata=dc_config(field_name="entity_type")) flags_count: int = dc_field(metadata=dc_config(field_name="flags_count")) id: str = dc_field(metadata=dc_config(field_name="id")) + latest_moderator_action: str = dc_field( + metadata=dc_config(field_name="latest_moderator_action") + ) recommended_action: str = dc_field( metadata=dc_config(field_name="recommended_action") ) @@ -15104,6 +15658,12 @@ class ReviewQueueItemResponse(DataClassJsonMixin): feeds_v2_reaction: "Optional[Reaction]" = dc_field( default=None, metadata=dc_config(field_name="feeds_v2_reaction") ) + feeds_v3_activity: "Optional[ActivityResponse]" = dc_field( + default=None, metadata=dc_config(field_name="feeds_v3_activity") + ) + feeds_v3_comment: "Optional[CommentResponse]" = dc_field( + default=None, metadata=dc_config(field_name="feeds_v3_comment") + ) message: "Optional[MessageResponse]" = dc_field( default=None, metadata=dc_config(field_name="message") ) @@ -15327,6 +15887,231 @@ class SDKUsageReportResponse(DataClassJsonMixin): ) +@dataclass +class SIPCallConfigsRequest(DataClassJsonMixin): + custom_data: Optional[Dict[str, object]] = dc_field( + default=None, metadata=dc_config(field_name="custom_data") + ) + + +@dataclass +class SIPCallConfigsResponse(DataClassJsonMixin): + custom_data: Dict[str, object] = dc_field( + metadata=dc_config(field_name="custom_data") + ) + + +@dataclass +class SIPCallerConfigsRequest(DataClassJsonMixin): + id: str = dc_field(metadata=dc_config(field_name="id")) + custom_data: Optional[Dict[str, object]] = dc_field( + default=None, metadata=dc_config(field_name="custom_data") + ) + + +@dataclass +class SIPCallerConfigsResponse(DataClassJsonMixin): + id: str = dc_field(metadata=dc_config(field_name="id")) + custom_data: Dict[str, object] = dc_field( + metadata=dc_config(field_name="custom_data") + ) + + +@dataclass +class SIPChallenge(DataClassJsonMixin): + a1: Optional[str] = dc_field(default=None, metadata=dc_config(field_name="a1")) + algorithm: Optional[str] = dc_field( + default=None, metadata=dc_config(field_name="algorithm") + ) + charset: Optional[str] = dc_field( + default=None, metadata=dc_config(field_name="charset") + ) + cnonce: Optional[str] = dc_field( + default=None, metadata=dc_config(field_name="cnonce") + ) + method: Optional[str] = dc_field( + default=None, metadata=dc_config(field_name="method") + ) + nc: Optional[str] = dc_field(default=None, metadata=dc_config(field_name="nc")) + nonce: Optional[str] = dc_field( + default=None, metadata=dc_config(field_name="nonce") + ) + opaque: Optional[str] = dc_field( + default=None, metadata=dc_config(field_name="opaque") + ) + realm: Optional[str] = dc_field( + default=None, metadata=dc_config(field_name="realm") + ) + response: Optional[str] = dc_field( + default=None, metadata=dc_config(field_name="response") + ) + stale: Optional[bool] = dc_field( + default=None, metadata=dc_config(field_name="stale") + ) + uri: Optional[str] = dc_field(default=None, metadata=dc_config(field_name="uri")) + userhash: Optional[bool] = dc_field( + default=None, metadata=dc_config(field_name="userhash") + ) + username: Optional[str] = dc_field( + default=None, metadata=dc_config(field_name="username") + ) + domain: Optional[List[str]] = dc_field( + default=None, metadata=dc_config(field_name="domain") + ) + qop: Optional[List[str]] = dc_field( + default=None, metadata=dc_config(field_name="qop") + ) + + +@dataclass +class SIPDirectRoutingRuleCallConfigsRequest(DataClassJsonMixin): + call_id: str = dc_field(metadata=dc_config(field_name="call_id")) + call_type: str = dc_field(metadata=dc_config(field_name="call_type")) + + +@dataclass +class SIPDirectRoutingRuleCallConfigsResponse(DataClassJsonMixin): + call_id: str = dc_field(metadata=dc_config(field_name="call_id")) + call_type: str = dc_field(metadata=dc_config(field_name="call_type")) + + +@dataclass +class SIPInboundRoutingRulePinConfigsRequest(DataClassJsonMixin): + custom_webhook_url: Optional[str] = dc_field( + default=None, metadata=dc_config(field_name="custom_webhook_url") + ) + pin_failed_attempt_prompt: Optional[str] = dc_field( + default=None, metadata=dc_config(field_name="pin_failed_attempt_prompt") + ) + pin_hangup_prompt: Optional[str] = dc_field( + default=None, metadata=dc_config(field_name="pin_hangup_prompt") + ) + pin_prompt: Optional[str] = dc_field( + default=None, metadata=dc_config(field_name="pin_prompt") + ) + pin_success_prompt: Optional[str] = dc_field( + default=None, metadata=dc_config(field_name="pin_success_prompt") + ) + + +@dataclass +class SIPInboundRoutingRulePinConfigsResponse(DataClassJsonMixin): + custom_webhook_url: Optional[str] = dc_field( + default=None, metadata=dc_config(field_name="custom_webhook_url") + ) + pin_failed_attempt_prompt: Optional[str] = dc_field( + default=None, metadata=dc_config(field_name="pin_failed_attempt_prompt") + ) + pin_hangup_prompt: Optional[str] = dc_field( + default=None, metadata=dc_config(field_name="pin_hangup_prompt") + ) + pin_prompt: Optional[str] = dc_field( + default=None, metadata=dc_config(field_name="pin_prompt") + ) + pin_success_prompt: Optional[str] = dc_field( + default=None, metadata=dc_config(field_name="pin_success_prompt") + ) + + +@dataclass +class SIPInboundRoutingRuleRequest(DataClassJsonMixin): + name: str = dc_field(metadata=dc_config(field_name="name")) + trunk_ids: List[str] = dc_field(metadata=dc_config(field_name="trunk_ids")) + caller_configs: "SIPCallerConfigsRequest" = dc_field( + metadata=dc_config(field_name="caller_configs") + ) + called_numbers: Optional[List[str]] = dc_field( + default=None, metadata=dc_config(field_name="called_numbers") + ) + caller_numbers: Optional[List[str]] = dc_field( + default=None, metadata=dc_config(field_name="caller_numbers") + ) + call_configs: "Optional[SIPCallConfigsRequest]" = dc_field( + default=None, metadata=dc_config(field_name="call_configs") + ) + direct_routing_configs: "Optional[SIPDirectRoutingRuleCallConfigsRequest]" = ( + dc_field(default=None, metadata=dc_config(field_name="direct_routing_configs")) + ) + pin_protection_configs: "Optional[SIPPinProtectionConfigsRequest]" = dc_field( + default=None, metadata=dc_config(field_name="pin_protection_configs") + ) + pin_routing_configs: "Optional[SIPInboundRoutingRulePinConfigsRequest]" = dc_field( + default=None, metadata=dc_config(field_name="pin_routing_configs") + ) + + +@dataclass +class SIPInboundRoutingRuleResponse(DataClassJsonMixin): + duration: str = dc_field(metadata=dc_config(field_name="duration")) + id: str = dc_field(metadata=dc_config(field_name="id")) + name: str = dc_field(metadata=dc_config(field_name="name")) + called_numbers: List[str] = dc_field( + metadata=dc_config(field_name="called_numbers") + ) + trunk_ids: List[str] = dc_field(metadata=dc_config(field_name="trunk_ids")) + created_at: "UnixTs" = dc_field(metadata=dc_config(field_name="created_at")) + updated_at: "UnixTs" = dc_field(metadata=dc_config(field_name="updated_at")) + caller_numbers: Optional[List[str]] = dc_field( + default=None, metadata=dc_config(field_name="caller_numbers") + ) + call_configs: "Optional[SIPCallConfigsResponse]" = dc_field( + default=None, metadata=dc_config(field_name="call_configs") + ) + caller_configs: "Optional[SIPCallerConfigsResponse]" = dc_field( + default=None, metadata=dc_config(field_name="caller_configs") + ) + direct_routing_configs: "Optional[SIPDirectRoutingRuleCallConfigsResponse]" = ( + dc_field(default=None, metadata=dc_config(field_name="direct_routing_configs")) + ) + pin_protection_configs: "Optional[SIPPinProtectionConfigsResponse]" = dc_field( + default=None, metadata=dc_config(field_name="pin_protection_configs") + ) + pin_routing_configs: "Optional[SIPInboundRoutingRulePinConfigsResponse]" = dc_field( + default=None, metadata=dc_config(field_name="pin_routing_configs") + ) + + +@dataclass +class SIPPinProtectionConfigsRequest(DataClassJsonMixin): + default_pin: Optional[str] = dc_field( + default=None, metadata=dc_config(field_name="default_pin") + ) + enabled: Optional[bool] = dc_field( + default=None, metadata=dc_config(field_name="enabled") + ) + max_attempts: Optional[int] = dc_field( + default=None, metadata=dc_config(field_name="max_attempts") + ) + required_pin_digits: Optional[int] = dc_field( + default=None, metadata=dc_config(field_name="required_pin_digits") + ) + + +@dataclass +class SIPPinProtectionConfigsResponse(DataClassJsonMixin): + enabled: bool = dc_field(metadata=dc_config(field_name="enabled")) + default_pin: Optional[str] = dc_field( + default=None, metadata=dc_config(field_name="default_pin") + ) + max_attempts: Optional[int] = dc_field( + default=None, metadata=dc_config(field_name="max_attempts") + ) + required_pin_digits: Optional[int] = dc_field( + default=None, metadata=dc_config(field_name="required_pin_digits") + ) + + +@dataclass +class SIPTrunkResponse(DataClassJsonMixin): + id: str = dc_field(metadata=dc_config(field_name="id")) + name: str = dc_field(metadata=dc_config(field_name="name")) + password: str = dc_field(metadata=dc_config(field_name="password")) + uri: str = dc_field(metadata=dc_config(field_name="uri")) + username: str = dc_field(metadata=dc_config(field_name="username")) + numbers: List[str] = dc_field(metadata=dc_config(field_name="numbers")) + updated_at: "UnixTs" = dc_field(metadata=dc_config(field_name="updated_at")) + + @dataclass class SRTIngress(DataClassJsonMixin): address: str = dc_field(metadata=dc_config(field_name="address")) @@ -15820,7 +16605,9 @@ class SessionSettingsResponse(DataClassJsonMixin): @dataclass class ShadowBlockActionRequest(DataClassJsonMixin): - pass + reason: Optional[str] = dc_field( + default=None, metadata=dc_config(field_name="reason") + ) @dataclass @@ -15986,6 +16773,20 @@ class SingleFollowResponse(DataClassJsonMixin): follow: "FollowResponse" = dc_field(metadata=dc_config(field_name="follow")) +@dataclass +class SipInboundCredentials(DataClassJsonMixin): + call_id: str = dc_field(metadata=dc_config(field_name="call_id")) + call_type: str = dc_field(metadata=dc_config(field_name="call_type")) + token: str = dc_field(metadata=dc_config(field_name="token")) + user_id: str = dc_field(metadata=dc_config(field_name="user_id")) + call_custom_data: Dict[str, object] = dc_field( + metadata=dc_config(field_name="call_custom_data") + ) + user_custom_data: Dict[str, object] = dc_field( + metadata=dc_config(field_name="user_custom_data") + ) + + @dataclass class SortParam(DataClassJsonMixin): direction: Optional[int] = dc_field( @@ -16276,6 +17077,9 @@ class StoriesFeedUpdatedEvent(DataClassJsonMixin): mm_field=fields.DateTime(format="iso"), ), ) + activities: "Optional[List[ActivityResponse]]" = dc_field( + default=None, metadata=dc_config(field_name="activities") + ) aggregated_activities: "Optional[List[AggregatedActivityResponse]]" = dc_field( default=None, metadata=dc_config(field_name="aggregated_activities") ) @@ -16294,12 +17098,18 @@ class SubmitActionRequest(DataClassJsonMixin): ban: "Optional[BanActionRequest]" = dc_field( default=None, metadata=dc_config(field_name="ban") ) + block: "Optional[BlockActionRequest]" = dc_field( + default=None, metadata=dc_config(field_name="block") + ) custom: "Optional[CustomActionRequest]" = dc_field( default=None, metadata=dc_config(field_name="custom") ) delete_activity: "Optional[DeleteActivityRequest]" = dc_field( default=None, metadata=dc_config(field_name="delete_activity") ) + delete_comment: "Optional[DeleteCommentRequest]" = dc_field( + default=None, metadata=dc_config(field_name="delete_comment") + ) delete_message: "Optional[DeleteMessageRequest]" = dc_field( default=None, metadata=dc_config(field_name="delete_message") ) @@ -16312,6 +17122,9 @@ class SubmitActionRequest(DataClassJsonMixin): mark_reviewed: "Optional[MarkReviewedRequest]" = dc_field( default=None, metadata=dc_config(field_name="mark_reviewed") ) + shadow_block: "Optional[ShadowBlockActionRequest]" = dc_field( + default=None, metadata=dc_config(field_name="shadow_block") + ) unban: "Optional[UnbanActionRequest]" = dc_field( default=None, metadata=dc_config(field_name="unban") ) @@ -16972,6 +17785,11 @@ class UnfollowResponse(DataClassJsonMixin): follow: "FollowResponse" = dc_field(metadata=dc_config(field_name="follow")) +@dataclass +class UnixTs(DataClassJsonMixin): + pass + + @dataclass class UnmuteChannelRequest(DataClassJsonMixin): expiration: Optional[int] = dc_field( @@ -17530,6 +18348,15 @@ class UpdateChannelRequest(DataClassJsonMixin): hide_history: Optional[bool] = dc_field( default=None, metadata=dc_config(field_name="hide_history") ) + hide_history_before: Optional[datetime] = dc_field( + default=None, + metadata=dc_config( + field_name="hide_history_before", + encoder=encode_datetime, + decoder=datetime_from_unix_ns, + mm_field=fields.DateTime(format="iso"), + ), + ) reject_invite: Optional[bool] = dc_field( default=None, metadata=dc_config(field_name="reject_invite") ) @@ -17539,21 +18366,27 @@ class UpdateChannelRequest(DataClassJsonMixin): user_id: Optional[str] = dc_field( default=None, metadata=dc_config(field_name="user_id") ) - add_members: "Optional[List[ChannelMember]]" = dc_field( + add_filter_tags: Optional[List[str]] = dc_field( + default=None, metadata=dc_config(field_name="add_filter_tags") + ) + add_members: "Optional[List[ChannelMemberRequest]]" = dc_field( default=None, metadata=dc_config(field_name="add_members") ) add_moderators: Optional[List[str]] = dc_field( default=None, metadata=dc_config(field_name="add_moderators") ) - assign_roles: "Optional[List[ChannelMember]]" = dc_field( + assign_roles: "Optional[List[ChannelMemberRequest]]" = dc_field( default=None, metadata=dc_config(field_name="assign_roles") ) demote_moderators: Optional[List[str]] = dc_field( default=None, metadata=dc_config(field_name="demote_moderators") ) - invites: "Optional[List[ChannelMember]]" = dc_field( + invites: "Optional[List[ChannelMemberRequest]]" = dc_field( default=None, metadata=dc_config(field_name="invites") ) + remove_filter_tags: Optional[List[str]] = dc_field( + default=None, metadata=dc_config(field_name="remove_filter_tags") + ) remove_members: Optional[List[str]] = dc_field( default=None, metadata=dc_config(field_name="remove_members") ) @@ -17571,7 +18404,9 @@ class UpdateChannelRequest(DataClassJsonMixin): @dataclass class UpdateChannelResponse(DataClassJsonMixin): duration: str = dc_field(metadata=dc_config(field_name="duration")) - members: "List[ChannelMember]" = dc_field(metadata=dc_config(field_name="members")) + members: "List[ChannelMemberResponse]" = dc_field( + metadata=dc_config(field_name="members") + ) channel: "Optional[ChannelResponse]" = dc_field( default=None, metadata=dc_config(field_name="channel") ) @@ -17602,6 +18437,9 @@ class UpdateChannelTypeRequest(DataClassJsonMixin): custom_events: Optional[bool] = dc_field( default=None, metadata=dc_config(field_name="custom_events") ) + delivery_events: Optional[bool] = dc_field( + default=None, metadata=dc_config(field_name="delivery_events") + ) mark_messages_pending: Optional[bool] = dc_field( default=None, metadata=dc_config(field_name="mark_messages_pending") ) @@ -17692,6 +18530,7 @@ class UpdateChannelTypeResponse(DataClassJsonMixin): ) ) custom_events: bool = dc_field(metadata=dc_config(field_name="custom_events")) + delivery_events: bool = dc_field(metadata=dc_config(field_name="delivery_events")) duration: str = dc_field(metadata=dc_config(field_name="duration")) mark_messages_pending: bool = dc_field( metadata=dc_config(field_name="mark_messages_pending") @@ -17780,9 +18619,15 @@ class UpdateCommentRequest(DataClassJsonMixin): skip_push: Optional[bool] = dc_field( default=None, metadata=dc_config(field_name="skip_push") ) + user_id: Optional[str] = dc_field( + default=None, metadata=dc_config(field_name="user_id") + ) custom: Optional[Dict[str, object]] = dc_field( default=None, metadata=dc_config(field_name="custom") ) + user: "Optional[UserRequest]" = dc_field( + default=None, metadata=dc_config(field_name="user") + ) @dataclass @@ -17818,6 +18663,9 @@ class UpdateExternalStorageResponse(DataClassJsonMixin): @dataclass class UpdateFeedGroupRequest(DataClassJsonMixin): + default_visibility: Optional[str] = dc_field( + default=None, metadata=dc_config(field_name="default_visibility") + ) activity_processors: "Optional[List[ActivityProcessorConfig]]" = dc_field( default=None, metadata=dc_config(field_name="activity_processors") ) @@ -17893,9 +18741,6 @@ class UpdateFeedResponse(DataClassJsonMixin): @dataclass class UpdateFeedViewRequest(DataClassJsonMixin): - activity_processors: "Optional[List[ActivityProcessorConfig]]" = dc_field( - default=None, metadata=dc_config(field_name="activity_processors") - ) activity_selectors: "Optional[List[ActivitySelectorConfig]]" = dc_field( default=None, metadata=dc_config(field_name="activity_selectors") ) @@ -18165,6 +19010,55 @@ class UpdateReminderResponse(DataClassJsonMixin): ) +@dataclass +class UpdateSIPInboundRoutingRuleRequest(DataClassJsonMixin): + name: str = dc_field(metadata=dc_config(field_name="name")) + called_numbers: List[str] = dc_field( + metadata=dc_config(field_name="called_numbers") + ) + trunk_ids: List[str] = dc_field(metadata=dc_config(field_name="trunk_ids")) + caller_configs: "SIPCallerConfigsRequest" = dc_field( + metadata=dc_config(field_name="caller_configs") + ) + caller_numbers: Optional[List[str]] = dc_field( + default=None, metadata=dc_config(field_name="caller_numbers") + ) + call_configs: "Optional[SIPCallConfigsRequest]" = dc_field( + default=None, metadata=dc_config(field_name="call_configs") + ) + direct_routing_configs: "Optional[SIPDirectRoutingRuleCallConfigsRequest]" = ( + dc_field(default=None, metadata=dc_config(field_name="direct_routing_configs")) + ) + pin_protection_configs: "Optional[SIPPinProtectionConfigsRequest]" = dc_field( + default=None, metadata=dc_config(field_name="pin_protection_configs") + ) + pin_routing_configs: "Optional[SIPInboundRoutingRulePinConfigsRequest]" = dc_field( + default=None, metadata=dc_config(field_name="pin_routing_configs") + ) + + +@dataclass +class UpdateSIPInboundRoutingRuleResponse(DataClassJsonMixin): + duration: str = dc_field(metadata=dc_config(field_name="duration")) + sip_inbound_routing_rule: "Optional[SIPInboundRoutingRuleResponse]" = dc_field( + default=None, metadata=dc_config(field_name="sip_inbound_routing_rule") + ) + + +@dataclass +class UpdateSIPTrunkRequest(DataClassJsonMixin): + name: str = dc_field(metadata=dc_config(field_name="name")) + numbers: List[str] = dc_field(metadata=dc_config(field_name="numbers")) + + +@dataclass +class UpdateSIPTrunkResponse(DataClassJsonMixin): + duration: str = dc_field(metadata=dc_config(field_name="duration")) + sip_trunk: "Optional[SIPTrunkResponse]" = dc_field( + default=None, metadata=dc_config(field_name="sip_trunk") + ) + + @dataclass class UpdateThreadPartialRequest(DataClassJsonMixin): user_id: Optional[str] = dc_field( @@ -19559,7 +20453,7 @@ class WSEvent(DataClassJsonMixin): me: "Optional[OwnUserResponse]" = dc_field( default=None, metadata=dc_config(field_name="me") ) - member: "Optional[ChannelMember]" = dc_field( + member: "Optional[ChannelMemberResponse]" = dc_field( default=None, metadata=dc_config(field_name="member") ) message: "Optional[MessageResponse]" = dc_field( diff --git a/getstream/moderation/async_rest_client.py b/getstream/moderation/async_rest_client.py index e56bfc75..92a30d64 100644 --- a/getstream/moderation/async_rest_client.py +++ b/getstream/moderation/async_rest_client.py @@ -458,12 +458,15 @@ async def submit_action( item_id: str, user_id: Optional[str] = None, ban: Optional[BanActionRequest] = None, + block: Optional[BlockActionRequest] = None, custom: Optional[CustomActionRequest] = None, delete_activity: Optional[DeleteActivityRequest] = None, + delete_comment: Optional[DeleteCommentRequest] = None, delete_message: Optional[DeleteMessageRequest] = None, delete_reaction: Optional[DeleteReactionRequest] = None, delete_user: Optional[DeleteUserRequest] = None, mark_reviewed: Optional[MarkReviewedRequest] = None, + shadow_block: Optional[ShadowBlockActionRequest] = None, unban: Optional[UnbanActionRequest] = None, user: Optional[UserRequest] = None, ) -> StreamResponse[SubmitActionResponse]: @@ -472,12 +475,15 @@ async def submit_action( item_id=item_id, user_id=user_id, ban=ban, + block=block, custom=custom, delete_activity=delete_activity, + delete_comment=delete_comment, delete_message=delete_message, delete_reaction=delete_reaction, delete_user=delete_user, mark_reviewed=mark_reviewed, + shadow_block=shadow_block, unban=unban, user=user, ) diff --git a/getstream/moderation/rest_client.py b/getstream/moderation/rest_client.py index 09f51fe5..e8cebd38 100644 --- a/getstream/moderation/rest_client.py +++ b/getstream/moderation/rest_client.py @@ -452,12 +452,15 @@ def submit_action( item_id: str, user_id: Optional[str] = None, ban: Optional[BanActionRequest] = None, + block: Optional[BlockActionRequest] = None, custom: Optional[CustomActionRequest] = None, delete_activity: Optional[DeleteActivityRequest] = None, + delete_comment: Optional[DeleteCommentRequest] = None, delete_message: Optional[DeleteMessageRequest] = None, delete_reaction: Optional[DeleteReactionRequest] = None, delete_user: Optional[DeleteUserRequest] = None, mark_reviewed: Optional[MarkReviewedRequest] = None, + shadow_block: Optional[ShadowBlockActionRequest] = None, unban: Optional[UnbanActionRequest] = None, user: Optional[UserRequest] = None, ) -> StreamResponse[SubmitActionResponse]: @@ -466,12 +469,15 @@ def submit_action( item_id=item_id, user_id=user_id, ban=ban, + block=block, custom=custom, delete_activity=delete_activity, + delete_comment=delete_comment, delete_message=delete_message, delete_reaction=delete_reaction, delete_user=delete_user, mark_reviewed=mark_reviewed, + shadow_block=shadow_block, unban=unban, user=user, ) diff --git a/getstream/video/async_rest_client.py b/getstream/video/async_rest_client.py index 2daa5668..e46e1b69 100644 --- a/getstream/video/async_rest_client.py +++ b/getstream/video/async_rest_client.py @@ -1028,6 +1028,147 @@ async def update_call_type( async def get_edges(self) -> StreamResponse[GetEdgesResponse]: return await self.get("/api/v2/video/edges", GetEdgesResponse) + @telemetry.operation_name("getstream.api.video.resolve_sip_inbound") + async def resolve_sip_inbound( + self, + sip_caller_number: str, + sip_trunk_number: str, + challenge: SIPChallenge, + sip_headers: Optional[Dict[str, str]] = None, + ) -> StreamResponse[ResolveSipInboundResponse]: + json = build_body_dict( + sip_caller_number=sip_caller_number, + sip_trunk_number=sip_trunk_number, + challenge=challenge, + sip_headers=sip_headers, + ) + return await self.post( + "/api/v2/video/sip/resolve", ResolveSipInboundResponse, json=json + ) + + @telemetry.operation_name("getstream.api.video.list_sip_inbound_routing_rule") + async def list_sip_inbound_routing_rule( + self, + ) -> StreamResponse[ListSIPInboundRoutingRuleResponse]: + return await self.get( + "/api/v2/video/sip/routing_rules", ListSIPInboundRoutingRuleResponse + ) + + @telemetry.operation_name("getstream.api.video.create_sip_inbound_routing_rule") + async def create_sip_inbound_routing_rule( + self, + name: str, + trunk_ids: List[str], + caller_configs: SIPCallerConfigsRequest, + called_numbers: Optional[List[str]] = None, + caller_numbers: Optional[List[str]] = None, + call_configs: Optional[SIPCallConfigsRequest] = None, + direct_routing_configs: Optional[SIPDirectRoutingRuleCallConfigsRequest] = None, + pin_protection_configs: Optional[SIPPinProtectionConfigsRequest] = None, + pin_routing_configs: Optional[SIPInboundRoutingRulePinConfigsRequest] = None, + ) -> StreamResponse[SIPInboundRoutingRuleResponse]: + json = build_body_dict( + name=name, + trunk_ids=trunk_ids, + caller_configs=caller_configs, + called_numbers=called_numbers, + caller_numbers=caller_numbers, + call_configs=call_configs, + direct_routing_configs=direct_routing_configs, + pin_protection_configs=pin_protection_configs, + pin_routing_configs=pin_routing_configs, + ) + return await self.post( + "/api/v2/video/sip/routing_rules", SIPInboundRoutingRuleResponse, json=json + ) + + @telemetry.operation_name("getstream.api.video.delete_sip_inbound_routing_rule") + async def delete_sip_inbound_routing_rule( + self, id: str + ) -> StreamResponse[DeleteSIPInboundRoutingRuleResponse]: + path_params = { + "id": id, + } + return await self.delete( + "/api/v2/video/sip/routing_rules/{id}", + DeleteSIPInboundRoutingRuleResponse, + path_params=path_params, + ) + + @telemetry.operation_name("getstream.api.video.update_sip_inbound_routing_rule") + async def update_sip_inbound_routing_rule( + self, + id: str, + name: str, + called_numbers: List[str], + trunk_ids: List[str], + caller_configs: SIPCallerConfigsRequest, + caller_numbers: Optional[List[str]] = None, + call_configs: Optional[SIPCallConfigsRequest] = None, + direct_routing_configs: Optional[SIPDirectRoutingRuleCallConfigsRequest] = None, + pin_protection_configs: Optional[SIPPinProtectionConfigsRequest] = None, + pin_routing_configs: Optional[SIPInboundRoutingRulePinConfigsRequest] = None, + ) -> StreamResponse[UpdateSIPInboundRoutingRuleResponse]: + path_params = { + "id": id, + } + json = build_body_dict( + name=name, + called_numbers=called_numbers, + trunk_ids=trunk_ids, + caller_configs=caller_configs, + caller_numbers=caller_numbers, + call_configs=call_configs, + direct_routing_configs=direct_routing_configs, + pin_protection_configs=pin_protection_configs, + pin_routing_configs=pin_routing_configs, + ) + return await self.put( + "/api/v2/video/sip/routing_rules/{id}", + UpdateSIPInboundRoutingRuleResponse, + path_params=path_params, + json=json, + ) + + @telemetry.operation_name("getstream.api.video.list_sip_trunks") + async def list_sip_trunks(self) -> StreamResponse[ListSIPTrunksResponse]: + return await self.get("/api/v2/video/sip/trunks", ListSIPTrunksResponse) + + @telemetry.operation_name("getstream.api.video.create_sip_trunk") + async def create_sip_trunk( + self, name: str, numbers: List[str] + ) -> StreamResponse[CreateSIPTrunkResponse]: + json = build_body_dict(name=name, numbers=numbers) + return await self.post( + "/api/v2/video/sip/trunks", CreateSIPTrunkResponse, json=json + ) + + @telemetry.operation_name("getstream.api.video.delete_sip_trunk") + async def delete_sip_trunk(self, id: str) -> StreamResponse[DeleteSIPTrunkResponse]: + path_params = { + "id": id, + } + return await self.delete( + "/api/v2/video/sip/trunks/{id}", + DeleteSIPTrunkResponse, + path_params=path_params, + ) + + @telemetry.operation_name("getstream.api.video.update_sip_trunk") + async def update_sip_trunk( + self, id: str, name: str, numbers: List[str] + ) -> StreamResponse[UpdateSIPTrunkResponse]: + path_params = { + "id": id, + } + json = build_body_dict(name=name, numbers=numbers) + return await self.put( + "/api/v2/video/sip/trunks/{id}", + UpdateSIPTrunkResponse, + path_params=path_params, + json=json, + ) + @telemetry.operation_name("getstream.api.video.query_aggregate_call_stats") async def query_aggregate_call_stats( self, diff --git a/getstream/video/rest_client.py b/getstream/video/rest_client.py index 81883acd..d5c6df18 100644 --- a/getstream/video/rest_client.py +++ b/getstream/video/rest_client.py @@ -1022,6 +1022,145 @@ def update_call_type( def get_edges(self) -> StreamResponse[GetEdgesResponse]: return self.get("/api/v2/video/edges", GetEdgesResponse) + @telemetry.operation_name("getstream.api.video.resolve_sip_inbound") + def resolve_sip_inbound( + self, + sip_caller_number: str, + sip_trunk_number: str, + challenge: SIPChallenge, + sip_headers: Optional[Dict[str, str]] = None, + ) -> StreamResponse[ResolveSipInboundResponse]: + json = build_body_dict( + sip_caller_number=sip_caller_number, + sip_trunk_number=sip_trunk_number, + challenge=challenge, + sip_headers=sip_headers, + ) + return self.post( + "/api/v2/video/sip/resolve", ResolveSipInboundResponse, json=json + ) + + @telemetry.operation_name("getstream.api.video.list_sip_inbound_routing_rule") + def list_sip_inbound_routing_rule( + self, + ) -> StreamResponse[ListSIPInboundRoutingRuleResponse]: + return self.get( + "/api/v2/video/sip/routing_rules", ListSIPInboundRoutingRuleResponse + ) + + @telemetry.operation_name("getstream.api.video.create_sip_inbound_routing_rule") + def create_sip_inbound_routing_rule( + self, + name: str, + trunk_ids: List[str], + caller_configs: SIPCallerConfigsRequest, + called_numbers: Optional[List[str]] = None, + caller_numbers: Optional[List[str]] = None, + call_configs: Optional[SIPCallConfigsRequest] = None, + direct_routing_configs: Optional[SIPDirectRoutingRuleCallConfigsRequest] = None, + pin_protection_configs: Optional[SIPPinProtectionConfigsRequest] = None, + pin_routing_configs: Optional[SIPInboundRoutingRulePinConfigsRequest] = None, + ) -> StreamResponse[SIPInboundRoutingRuleResponse]: + json = build_body_dict( + name=name, + trunk_ids=trunk_ids, + caller_configs=caller_configs, + called_numbers=called_numbers, + caller_numbers=caller_numbers, + call_configs=call_configs, + direct_routing_configs=direct_routing_configs, + pin_protection_configs=pin_protection_configs, + pin_routing_configs=pin_routing_configs, + ) + return self.post( + "/api/v2/video/sip/routing_rules", SIPInboundRoutingRuleResponse, json=json + ) + + @telemetry.operation_name("getstream.api.video.delete_sip_inbound_routing_rule") + def delete_sip_inbound_routing_rule( + self, id: str + ) -> StreamResponse[DeleteSIPInboundRoutingRuleResponse]: + path_params = { + "id": id, + } + return self.delete( + "/api/v2/video/sip/routing_rules/{id}", + DeleteSIPInboundRoutingRuleResponse, + path_params=path_params, + ) + + @telemetry.operation_name("getstream.api.video.update_sip_inbound_routing_rule") + def update_sip_inbound_routing_rule( + self, + id: str, + name: str, + called_numbers: List[str], + trunk_ids: List[str], + caller_configs: SIPCallerConfigsRequest, + caller_numbers: Optional[List[str]] = None, + call_configs: Optional[SIPCallConfigsRequest] = None, + direct_routing_configs: Optional[SIPDirectRoutingRuleCallConfigsRequest] = None, + pin_protection_configs: Optional[SIPPinProtectionConfigsRequest] = None, + pin_routing_configs: Optional[SIPInboundRoutingRulePinConfigsRequest] = None, + ) -> StreamResponse[UpdateSIPInboundRoutingRuleResponse]: + path_params = { + "id": id, + } + json = build_body_dict( + name=name, + called_numbers=called_numbers, + trunk_ids=trunk_ids, + caller_configs=caller_configs, + caller_numbers=caller_numbers, + call_configs=call_configs, + direct_routing_configs=direct_routing_configs, + pin_protection_configs=pin_protection_configs, + pin_routing_configs=pin_routing_configs, + ) + return self.put( + "/api/v2/video/sip/routing_rules/{id}", + UpdateSIPInboundRoutingRuleResponse, + path_params=path_params, + json=json, + ) + + @telemetry.operation_name("getstream.api.video.list_sip_trunks") + def list_sip_trunks(self) -> StreamResponse[ListSIPTrunksResponse]: + return self.get("/api/v2/video/sip/trunks", ListSIPTrunksResponse) + + @telemetry.operation_name("getstream.api.video.create_sip_trunk") + def create_sip_trunk( + self, name: str, numbers: List[str] + ) -> StreamResponse[CreateSIPTrunkResponse]: + json = build_body_dict(name=name, numbers=numbers) + return self.post("/api/v2/video/sip/trunks", CreateSIPTrunkResponse, json=json) + + @telemetry.operation_name("getstream.api.video.delete_sip_trunk") + def delete_sip_trunk(self, id: str) -> StreamResponse[DeleteSIPTrunkResponse]: + path_params = { + "id": id, + } + return self.delete( + "/api/v2/video/sip/trunks/{id}", + DeleteSIPTrunkResponse, + path_params=path_params, + ) + + @telemetry.operation_name("getstream.api.video.update_sip_trunk") + def update_sip_trunk( + self, id: str, name: str, numbers: List[str] + ) -> StreamResponse[UpdateSIPTrunkResponse]: + path_params = { + "id": id, + } + json = build_body_dict(name=name, numbers=numbers) + return self.put( + "/api/v2/video/sip/trunks/{id}", + UpdateSIPTrunkResponse, + path_params=path_params, + json=json, + ) + @telemetry.operation_name("getstream.api.video.query_aggregate_call_stats") def query_aggregate_call_stats( self, From f94b922ae78e6e5390a47b235c49ecf4bee1024c Mon Sep 17 00:00:00 2001 From: Rafael Marinho Date: Fri, 7 Nov 2025 14:18:37 +0100 Subject: [PATCH 2/3] fix unread counts api spec --- getstream/chat/async_channel.py | 6 ++++-- getstream/chat/async_rest_client.py | 9 +++++---- getstream/chat/channel.py | 6 ++++-- getstream/chat/rest_client.py | 9 +++++---- getstream/models/__init__.py | 13 ++++++++----- 5 files changed, 26 insertions(+), 17 deletions(-) diff --git a/getstream/chat/async_channel.py b/getstream/chat/async_channel.py index 8cb74639..64a8916c 100644 --- a/getstream/chat/async_channel.py +++ b/getstream/chat/async_channel.py @@ -329,16 +329,18 @@ async def truncate( @attach_channel_cid_async async def mark_unread( self, - user_id: Optional[str] = None, message_id: Optional[str] = None, thread_id: Optional[str] = None, + user_id: Optional[str] = None, + user: Optional[UserRequest] = None, ) -> StreamResponse[Response]: response = await self.client.mark_unread( type=self.channel_type, id=self.channel_id, - user_id=user_id, message_id=message_id, thread_id=thread_id, + user_id=user_id, + user=user, ) self._sync_from_response(response.data) return response diff --git a/getstream/chat/async_rest_client.py b/getstream/chat/async_rest_client.py index 78e6b229..17576b6a 100644 --- a/getstream/chat/async_rest_client.py +++ b/getstream/chat/async_rest_client.py @@ -618,20 +618,21 @@ async def mark_unread( self, type: str, id: str, - user_id: Optional[str] = None, message_id: Optional[str] = None, thread_id: Optional[str] = None, + user_id: Optional[str] = None, + user: Optional[UserRequest] = None, ) -> StreamResponse[Response]: - query_params = build_query_param(user_id=user_id) path_params = { "type": type, "id": id, } - json = build_body_dict(message_id=message_id, thread_id=thread_id) + json = build_body_dict( + message_id=message_id, thread_id=thread_id, user_id=user_id, user=user + ) return await self.post( "/api/v2/chat/channels/{type}/{id}/unread", Response, - query_params=query_params, path_params=path_params, json=json, ) diff --git a/getstream/chat/channel.py b/getstream/chat/channel.py index b17b6a04..b59cc6b9 100644 --- a/getstream/chat/channel.py +++ b/getstream/chat/channel.py @@ -329,16 +329,18 @@ def truncate( @attach_channel_cid def mark_unread( self, - user_id: Optional[str] = None, message_id: Optional[str] = None, thread_id: Optional[str] = None, + user_id: Optional[str] = None, + user: Optional[UserRequest] = None, ) -> StreamResponse[Response]: response = self.client.mark_unread( type=self.channel_type, id=self.channel_id, - user_id=user_id, message_id=message_id, thread_id=thread_id, + user_id=user_id, + user=user, ) self._sync_from_response(response.data) return response diff --git a/getstream/chat/rest_client.py b/getstream/chat/rest_client.py index a478a629..9b29551e 100644 --- a/getstream/chat/rest_client.py +++ b/getstream/chat/rest_client.py @@ -614,20 +614,21 @@ def mark_unread( self, type: str, id: str, - user_id: Optional[str] = None, message_id: Optional[str] = None, thread_id: Optional[str] = None, + user_id: Optional[str] = None, + user: Optional[UserRequest] = None, ) -> StreamResponse[Response]: - query_params = build_query_param(user_id=user_id) path_params = { "type": type, "id": id, } - json = build_body_dict(message_id=message_id, thread_id=thread_id) + json = build_body_dict( + message_id=message_id, thread_id=thread_id, user_id=user_id, user=user + ) return self.post( "/api/v2/chat/channels/{type}/{id}/unread", Response, - query_params=query_params, path_params=path_params, json=json, ) diff --git a/getstream/models/__init__.py b/getstream/models/__init__.py index 6b4a579d..b6f755f1 100644 --- a/getstream/models/__init__.py +++ b/getstream/models/__init__.py @@ -1519,8 +1519,7 @@ class AsyncExportErrorEvent(DataClassJsonMixin): task_id: str = dc_field(metadata=dc_config(field_name="task_id")) custom: Dict[str, object] = dc_field(metadata=dc_config(field_name="custom")) type: str = dc_field( - default="export.bulk_image_moderation.error", - metadata=dc_config(field_name="type"), + default="export.users.error", metadata=dc_config(field_name="type") ) received_at: Optional[datetime] = dc_field( default=None, @@ -10594,6 +10593,12 @@ class MarkUnreadRequest(DataClassJsonMixin): thread_id: Optional[str] = dc_field( default=None, metadata=dc_config(field_name="thread_id") ) + user_id: Optional[str] = dc_field( + default=None, metadata=dc_config(field_name="user_id") + ) + user: "Optional[UserRequest]" = dc_field( + default=None, metadata=dc_config(field_name="user") + ) @dataclass @@ -11133,9 +11138,7 @@ class MessageNewEvent(DataClassJsonMixin): ) ) watcher_count: int = dc_field(metadata=dc_config(field_name="watcher_count")) - type: str = dc_field( - default="notification.thread_message_new", metadata=dc_config(field_name="type") - ) + type: str = dc_field(default="message.new", metadata=dc_config(field_name="type")) team: Optional[str] = dc_field(default=None, metadata=dc_config(field_name="team")) thread_participants: "Optional[List[User]]" = dc_field( default=None, metadata=dc_config(field_name="thread_participants") From 44978c6574db4fb0da451679471498a013ca86d9 Mon Sep 17 00:00:00 2001 From: Rafael Marinho Date: Mon, 10 Nov 2025 16:26:32 +0100 Subject: [PATCH 3/3] update --- getstream/models/__init__.py | 71 ++++++++++++++++++++++++---- getstream/video/async_call.py | 10 ++++ getstream/video/async_rest_client.py | 20 ++++++++ getstream/video/call.py | 10 ++++ getstream/video/rest_client.py | 20 ++++++++ getstream/video/rtc/audio_track.py | 4 +- 6 files changed, 125 insertions(+), 10 deletions(-) diff --git a/getstream/models/__init__.py b/getstream/models/__init__.py index b6f755f1..4520554f 100644 --- a/getstream/models/__init__.py +++ b/getstream/models/__init__.py @@ -745,6 +745,9 @@ class ActivityRequest(DataClassJsonMixin): poll_id: Optional[str] = dc_field( default=None, metadata=dc_config(field_name="poll_id") ) + restrict_replies: Optional[str] = dc_field( + default=None, metadata=dc_config(field_name="restrict_replies") + ) text: Optional[str] = dc_field(default=None, metadata=dc_config(field_name="text")) user_id: Optional[str] = dc_field( default=None, metadata=dc_config(field_name="user_id") @@ -795,6 +798,7 @@ class ActivityResponse(DataClassJsonMixin): popularity: int = dc_field(metadata=dc_config(field_name="popularity")) preview: bool = dc_field(metadata=dc_config(field_name="preview")) reaction_count: int = dc_field(metadata=dc_config(field_name="reaction_count")) + restrict_replies: str = dc_field(metadata=dc_config(field_name="restrict_replies")) score: float = dc_field(metadata=dc_config(field_name="score")) share_count: int = dc_field(metadata=dc_config(field_name="share_count")) type: str = dc_field(metadata=dc_config(field_name="type")) @@ -1021,6 +1025,9 @@ class AddActivityRequest(DataClassJsonMixin): poll_id: Optional[str] = dc_field( default=None, metadata=dc_config(field_name="poll_id") ) + restrict_replies: Optional[str] = dc_field( + default=None, metadata=dc_config(field_name="restrict_replies") + ) text: Optional[str] = dc_field(default=None, metadata=dc_config(field_name="text")) user_id: Optional[str] = dc_field( default=None, metadata=dc_config(field_name="user_id") @@ -1519,7 +1526,7 @@ class AsyncExportErrorEvent(DataClassJsonMixin): task_id: str = dc_field(metadata=dc_config(field_name="task_id")) custom: Dict[str, object] = dc_field(metadata=dc_config(field_name="custom")) type: str = dc_field( - default="export.users.error", metadata=dc_config(field_name="type") + default="export.channels.error", metadata=dc_config(field_name="type") ) received_at: Optional[datetime] = dc_field( default=None, @@ -3621,6 +3628,9 @@ class CallStatsLocation(DataClassJsonMixin): country: Optional[str] = dc_field( default=None, metadata=dc_config(field_name="country") ) + country_iso_code: Optional[str] = dc_field( + default=None, metadata=dc_config(field_name="country_iso_code") + ) latitude: Optional[float] = dc_field( default=None, metadata=dc_config(field_name="latitude") ) @@ -15712,6 +15722,22 @@ class ReviewQueueItemUpdatedEvent(DataClassJsonMixin): ) +@dataclass +class RingCallRequest(DataClassJsonMixin): + video: Optional[bool] = dc_field( + default=None, metadata=dc_config(field_name="video") + ) + members_ids: Optional[List[str]] = dc_field( + default=None, metadata=dc_config(field_name="members_ids") + ) + + +@dataclass +class RingCallResponse(DataClassJsonMixin): + duration: str = dc_field(metadata=dc_config(field_name="duration")) + members_ids: List[str] = dc_field(metadata=dc_config(field_name="members_ids")) + + @dataclass class RingSettings(DataClassJsonMixin): auto_cancel_timeout_ms: int = dc_field( @@ -16045,15 +16071,29 @@ class SIPInboundRoutingRuleRequest(DataClassJsonMixin): @dataclass class SIPInboundRoutingRuleResponse(DataClassJsonMixin): + created_at: datetime = dc_field( + metadata=dc_config( + field_name="created_at", + encoder=encode_datetime, + decoder=datetime_from_unix_ns, + mm_field=fields.DateTime(format="iso"), + ) + ) duration: str = dc_field(metadata=dc_config(field_name="duration")) id: str = dc_field(metadata=dc_config(field_name="id")) name: str = dc_field(metadata=dc_config(field_name="name")) + updated_at: datetime = dc_field( + metadata=dc_config( + field_name="updated_at", + encoder=encode_datetime, + decoder=datetime_from_unix_ns, + mm_field=fields.DateTime(format="iso"), + ) + ) called_numbers: List[str] = dc_field( metadata=dc_config(field_name="called_numbers") ) trunk_ids: List[str] = dc_field(metadata=dc_config(field_name="trunk_ids")) - created_at: "UnixTs" = dc_field(metadata=dc_config(field_name="created_at")) - updated_at: "UnixTs" = dc_field(metadata=dc_config(field_name="updated_at")) caller_numbers: Optional[List[str]] = dc_field( default=None, metadata=dc_config(field_name="caller_numbers") ) @@ -16106,13 +16146,28 @@ class SIPPinProtectionConfigsResponse(DataClassJsonMixin): @dataclass class SIPTrunkResponse(DataClassJsonMixin): + created_at: datetime = dc_field( + metadata=dc_config( + field_name="created_at", + encoder=encode_datetime, + decoder=datetime_from_unix_ns, + mm_field=fields.DateTime(format="iso"), + ) + ) id: str = dc_field(metadata=dc_config(field_name="id")) name: str = dc_field(metadata=dc_config(field_name="name")) password: str = dc_field(metadata=dc_config(field_name="password")) + updated_at: datetime = dc_field( + metadata=dc_config( + field_name="updated_at", + encoder=encode_datetime, + decoder=datetime_from_unix_ns, + mm_field=fields.DateTime(format="iso"), + ) + ) uri: str = dc_field(metadata=dc_config(field_name="uri")) username: str = dc_field(metadata=dc_config(field_name="username")) numbers: List[str] = dc_field(metadata=dc_config(field_name="numbers")) - updated_at: "UnixTs" = dc_field(metadata=dc_config(field_name="updated_at")) @dataclass @@ -17788,11 +17843,6 @@ class UnfollowResponse(DataClassJsonMixin): follow: "FollowResponse" = dc_field(metadata=dc_config(field_name="follow")) -@dataclass -class UnixTs(DataClassJsonMixin): - pass - - @dataclass class UnmuteChannelRequest(DataClassJsonMixin): expiration: Optional[int] = dc_field( @@ -17958,6 +18008,9 @@ class UpdateActivityRequest(DataClassJsonMixin): poll_id: Optional[str] = dc_field( default=None, metadata=dc_config(field_name="poll_id") ) + restrict_replies: Optional[str] = dc_field( + default=None, metadata=dc_config(field_name="restrict_replies") + ) text: Optional[str] = dc_field(default=None, metadata=dc_config(field_name="text")) user_id: Optional[str] = dc_field( default=None, metadata=dc_config(field_name="user_id") diff --git a/getstream/video/async_call.py b/getstream/video/async_call.py index febe1705..1c7e9c7a 100644 --- a/getstream/video/async_call.py +++ b/getstream/video/async_call.py @@ -277,6 +277,16 @@ async def get_call_report( self._sync_from_response(response.data) return response + @attach_call_cid_async + async def ring( + self, video: Optional[bool] = None, members_ids: Optional[List[str]] = None + ) -> StreamResponse[RingCallResponse]: + response = await self.client.ring_call( + type=self.call_type, id=self.id, video=video, members_ids=members_ids + ) + self._sync_from_response(response.data) + return response + @attach_call_cid_async async def start_rtmp_broadcasts( self, broadcasts: List[RTMPBroadcastRequest] diff --git a/getstream/video/async_rest_client.py b/getstream/video/async_rest_client.py index e46e1b69..5485bec6 100644 --- a/getstream/video/async_rest_client.py +++ b/getstream/video/async_rest_client.py @@ -497,6 +497,26 @@ async def get_call_report( path_params=path_params, ) + @telemetry.operation_name("getstream.api.video.ring_call") + async def ring_call( + self, + type: str, + id: str, + video: Optional[bool] = None, + members_ids: Optional[List[str]] = None, + ) -> StreamResponse[RingCallResponse]: + path_params = { + "type": type, + "id": id, + } + json = build_body_dict(video=video, members_ids=members_ids) + return await self.post( + "/api/v2/video/call/{type}/{id}/ring", + RingCallResponse, + path_params=path_params, + json=json, + ) + @telemetry.operation_name("getstream.api.video.start_rtmp_broadcasts") async def start_rtmp_broadcasts( self, type: str, id: str, broadcasts: List[RTMPBroadcastRequest] diff --git a/getstream/video/call.py b/getstream/video/call.py index 2c201ca3..ed64664a 100644 --- a/getstream/video/call.py +++ b/getstream/video/call.py @@ -271,6 +271,16 @@ def get_call_report( self._sync_from_response(response.data) return response + @attach_call_cid + def ring( + self, video: Optional[bool] = None, members_ids: Optional[List[str]] = None + ) -> StreamResponse[RingCallResponse]: + response = self.client.ring_call( + type=self.call_type, id=self.id, video=video, members_ids=members_ids + ) + self._sync_from_response(response.data) + return response + @attach_call_cid def start_rtmp_broadcasts( self, broadcasts: List[RTMPBroadcastRequest] diff --git a/getstream/video/rest_client.py b/getstream/video/rest_client.py index d5c6df18..ced4d3fa 100644 --- a/getstream/video/rest_client.py +++ b/getstream/video/rest_client.py @@ -493,6 +493,26 @@ def get_call_report( path_params=path_params, ) + @telemetry.operation_name("getstream.api.video.ring_call") + def ring_call( + self, + type: str, + id: str, + video: Optional[bool] = None, + members_ids: Optional[List[str]] = None, + ) -> StreamResponse[RingCallResponse]: + path_params = { + "type": type, + "id": id, + } + json = build_body_dict(video=video, members_ids=members_ids) + return self.post( + "/api/v2/video/call/{type}/{id}/ring", + RingCallResponse, + path_params=path_params, + json=json, + ) + @telemetry.operation_name("getstream.api.video.start_rtmp_broadcasts") def start_rtmp_broadcasts( self, type: str, id: str, broadcasts: List[RTMPBroadcastRequest] diff --git a/getstream/video/rtc/audio_track.py b/getstream/video/rtc/audio_track.py index 735355a7..92bd453b 100644 --- a/getstream/video/rtc/audio_track.py +++ b/getstream/video/rtc/audio_track.py @@ -91,7 +91,9 @@ async def write(self, pcm: PcmData): break logger.warning( - "Audio queue overflow, dropped items max is %d. pcm duration %s ms", self.max_queue_size, pcm.duration_ms, + "Audio queue overflow, dropped items max is %d. pcm duration %s ms", + self.max_queue_size, + pcm.duration_ms, extra={ "dropped_items": dropped_items, "queue_size": self._queue.qsize(),