diff --git a/getstream/chat/rest_client.py b/getstream/chat/rest_client.py index 45bc07c9..db83b21a 100644 --- a/getstream/chat/rest_client.py +++ b/getstream/chat/rest_client.py @@ -641,6 +641,7 @@ def create_channel_type( read_events: Optional[bool] = None, replies: Optional[bool] = None, search: Optional[bool] = None, + shared_locations: Optional[bool] = None, skip_last_msg_update_for_system_msgs: Optional[bool] = None, typing_events: Optional[bool] = None, uploads: Optional[bool] = None, @@ -671,6 +672,7 @@ def create_channel_type( read_events=read_events, replies=replies, search=search, + shared_locations=shared_locations, skip_last_msg_update_for_system_msgs=skip_last_msg_update_for_system_msgs, typing_events=typing_events, uploads=uploads, @@ -728,6 +730,7 @@ def update_channel_type( reminders: Optional[bool] = None, replies: Optional[bool] = None, search: Optional[bool] = None, + shared_locations: Optional[bool] = None, skip_last_msg_update_for_system_msgs: Optional[bool] = None, typing_events: Optional[bool] = None, uploads: Optional[bool] = None, @@ -763,6 +766,7 @@ def update_channel_type( reminders=reminders, replies=replies, search=search, + shared_locations=shared_locations, skip_last_msg_update_for_system_msgs=skip_last_msg_update_for_system_msgs, typing_events=typing_events, uploads=uploads, diff --git a/getstream/common/rest_client.py b/getstream/common/rest_client.py index 45928998..6ad2134b 100644 --- a/getstream/common/rest_client.py +++ b/getstream/common/rest_client.py @@ -583,6 +583,42 @@ def delete_users( return self.post("/api/v2/users/delete", DeleteUsersResponse, json=json) + def get_user_live_locations( + self, user_id: Optional[str] = None + ) -> StreamResponse[SharedLocationsResponse]: + query_params = build_query_param(user_id=user_id) + + return self.get( + "/api/v2/users/live_locations", + SharedLocationsResponse, + query_params=query_params, + ) + + def update_live_location( + self, + created_by_device_id: str, + message_id: str, + end_at: Optional[datetime] = None, + latitude: Optional[float] = None, + longitude: Optional[float] = None, + user_id: Optional[str] = None, + ) -> StreamResponse[SharedLocationResponse]: + query_params = build_query_param(user_id=user_id) + json = build_body_dict( + created_by_device_id=created_by_device_id, + message_id=message_id, + end_at=end_at, + latitude=latitude, + longitude=longitude, + ) + + return self.put( + "/api/v2/users/live_locations", + SharedLocationResponse, + query_params=query_params, + json=json, + ) + def reactivate_users( self, user_ids: List[str], diff --git a/getstream/models/__init__.py b/getstream/models/__init__.py index 5032c546..9273a7cd 100644 --- a/getstream/models/__init__.py +++ b/getstream/models/__init__.py @@ -201,7 +201,7 @@ class ActionLogResponse(DataClassJsonMixin): type: str = dc_field(metadata=dc_config(field_name="type")) user_id: str = dc_field(metadata=dc_config(field_name="user_id")) custom: Dict[str, object] = dc_field(metadata=dc_config(field_name="custom")) - review_queue_item: "Optional[ReviewQueueItem]" = dc_field( + review_queue_item: "Optional[ReviewQueueItemResponse]" = dc_field( default=None, metadata=dc_config(field_name="review_queue_item") ) target_user: "Optional[UserResponse]" = dc_field( @@ -223,6 +223,45 @@ class ActionSequence(DataClassJsonMixin): warning_text: str = dc_field(metadata=dc_config(field_name="warning_text")) +@dataclass +class ActiveCallsFPSStats(DataClassJsonMixin): + p05: float = dc_field(metadata=dc_config(field_name="p05")) + p10: float = dc_field(metadata=dc_config(field_name="p10")) + p50: float = dc_field(metadata=dc_config(field_name="p50")) + p90: float = dc_field(metadata=dc_config(field_name="p90")) + + +@dataclass +class ActiveCallsLatencyStats(DataClassJsonMixin): + p50: float = dc_field(metadata=dc_config(field_name="p50")) + p90: float = dc_field(metadata=dc_config(field_name="p90")) + + +@dataclass +class ActiveCallsMetrics(DataClassJsonMixin): + join_call_api: "Optional[JoinCallAPIMetrics]" = dc_field( + default=None, metadata=dc_config(field_name="join_call_api") + ) + publishers: "Optional[PublishersMetrics]" = dc_field( + default=None, metadata=dc_config(field_name="publishers") + ) + subscribers: "Optional[SubscribersMetrics]" = dc_field( + default=None, metadata=dc_config(field_name="subscribers") + ) + + +@dataclass +class ActiveCallsSummary(DataClassJsonMixin): + active_calls: int = dc_field(metadata=dc_config(field_name="active_calls")) + active_publishers: int = dc_field( + metadata=dc_config(field_name="active_publishers") + ) + active_subscribers: int = dc_field( + metadata=dc_config(field_name="active_subscribers") + ) + participants: int = dc_field(metadata=dc_config(field_name="participants")) + + @dataclass class AnyEvent(DataClassJsonMixin): created_at: datetime = dc_field( @@ -475,7 +514,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.moderation_logs.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, @@ -622,12 +661,6 @@ class Attachment(DataClassJsonMixin): image_url: Optional[str] = dc_field( default=None, metadata=dc_config(field_name="image_url") ) - 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") - ) og_scrape_url: Optional[str] = dc_field( default=None, metadata=dc_config(field_name="og_scrape_url") ) @@ -640,9 +673,6 @@ class Attachment(DataClassJsonMixin): pretext: Optional[str] = dc_field( default=None, metadata=dc_config(field_name="pretext") ) - stopped_sharing: Optional[bool] = dc_field( - default=None, metadata=dc_config(field_name="stopped_sharing") - ) text: Optional[str] = dc_field(default=None, metadata=dc_config(field_name="text")) thumb_url: Optional[str] = dc_field( default=None, metadata=dc_config(field_name="thumb_url") @@ -3182,6 +3212,9 @@ class Channel(DataClassJsonMixin): default=None, metadata=dc_config(field_name="member_count") ) team: Optional[str] = dc_field(default=None, metadata=dc_config(field_name="team")) + active_live_locations: "Optional[List[SharedLocation]]" = dc_field( + default=None, metadata=dc_config(field_name="active_live_locations") + ) invites: "Optional[List[ChannelMember]]" = dc_field( default=None, metadata=dc_config(field_name="invites") ) @@ -3234,6 +3267,7 @@ class ChannelConfig(DataClassJsonMixin): reminders: bool = dc_field(metadata=dc_config(field_name="reminders")) replies: bool = dc_field(metadata=dc_config(field_name="replies")) search: bool = dc_field(metadata=dc_config(field_name="search")) + shared_locations: bool = dc_field(metadata=dc_config(field_name="shared_locations")) skip_last_msg_update_for_system_msgs: bool = dc_field( metadata=dc_config(field_name="skip_last_msg_update_for_system_msgs") ) @@ -3307,6 +3341,7 @@ class ChannelConfigWithInfo(DataClassJsonMixin): reminders: bool = dc_field(metadata=dc_config(field_name="reminders")) replies: bool = dc_field(metadata=dc_config(field_name="replies")) search: bool = dc_field(metadata=dc_config(field_name="search")) + shared_locations: bool = dc_field(metadata=dc_config(field_name="shared_locations")) skip_last_msg_update_for_system_msgs: bool = dc_field( metadata=dc_config(field_name="skip_last_msg_update_for_system_msgs") ) @@ -3807,6 +3842,7 @@ class ChannelOwnCapability: ) SEND_TYPING_EVENTS: Final[ChannelOwnCapabilityType] = "send-typing-events" SET_CHANNEL_COOLDOWN: Final[ChannelOwnCapabilityType] = "set-channel-cooldown" + SHARE_LOCATION: Final[ChannelOwnCapabilityType] = "share-location" SKIP_SLOW_MODE: Final[ChannelOwnCapabilityType] = "skip-slow-mode" SLOW_MODE: Final[ChannelOwnCapabilityType] = "slow-mode" TYPING_EVENTS: Final[ChannelOwnCapabilityType] = "typing-events" @@ -3970,6 +4006,9 @@ class ChannelStateResponse(DataClassJsonMixin): watcher_count: Optional[int] = dc_field( default=None, metadata=dc_config(field_name="watcher_count") ) + active_live_locations: "Optional[List[SharedLocationResponseData]]" = dc_field( + default=None, metadata=dc_config(field_name="active_live_locations") + ) pending_messages: "Optional[List[PendingMessageResponse]]" = dc_field( default=None, metadata=dc_config(field_name="pending_messages") ) @@ -4020,6 +4059,9 @@ class ChannelStateResponseFields(DataClassJsonMixin): watcher_count: Optional[int] = dc_field( default=None, metadata=dc_config(field_name="watcher_count") ) + active_live_locations: "Optional[List[SharedLocationResponseData]]" = dc_field( + default=None, metadata=dc_config(field_name="active_live_locations") + ) pending_messages: "Optional[List[PendingMessageResponse]]" = dc_field( default=None, metadata=dc_config(field_name="pending_messages") ) @@ -4099,6 +4141,7 @@ class ChannelTypeConfig(DataClassJsonMixin): reminders: bool = dc_field(metadata=dc_config(field_name="reminders")) replies: bool = dc_field(metadata=dc_config(field_name="replies")) search: bool = dc_field(metadata=dc_config(field_name="search")) + shared_locations: bool = dc_field(metadata=dc_config(field_name="shared_locations")) skip_last_msg_update_for_system_msgs: bool = dc_field( metadata=dc_config(field_name="skip_last_msg_update_for_system_msgs") ) @@ -4340,7 +4383,7 @@ class CheckResponse(DataClassJsonMixin): task_id: Optional[str] = dc_field( default=None, metadata=dc_config(field_name="task_id") ) - item: "Optional[ReviewQueueItem]" = dc_field( + item: "Optional[ReviewQueueItemResponse]" = dc_field( default=None, metadata=dc_config(field_name="item") ) @@ -4507,6 +4550,9 @@ class ConfigOverrides(DataClassJsonMixin): replies: Optional[bool] = dc_field( default=None, metadata=dc_config(field_name="replies") ) + shared_locations: Optional[bool] = dc_field( + default=None, metadata=dc_config(field_name="shared_locations") + ) typing_events: Optional[bool] = dc_field( default=None, metadata=dc_config(field_name="typing_events") ) @@ -4706,6 +4752,9 @@ class CreateChannelTypeRequest(DataClassJsonMixin): search: Optional[bool] = dc_field( default=None, metadata=dc_config(field_name="search") ) + shared_locations: Optional[bool] = dc_field( + default=None, metadata=dc_config(field_name="shared_locations") + ) skip_last_msg_update_for_system_msgs: Optional[bool] = dc_field( default=None, metadata=dc_config(field_name="skip_last_msg_update_for_system_msgs"), @@ -4769,6 +4818,7 @@ class CreateChannelTypeResponse(DataClassJsonMixin): reminders: bool = dc_field(metadata=dc_config(field_name="reminders")) replies: bool = dc_field(metadata=dc_config(field_name="replies")) search: bool = dc_field(metadata=dc_config(field_name="search")) + shared_locations: bool = dc_field(metadata=dc_config(field_name="shared_locations")) skip_last_msg_update_for_system_msgs: bool = dc_field( metadata=dc_config(field_name="skip_last_msg_update_for_system_msgs") ) @@ -6460,6 +6510,33 @@ class GeofenceSettingsResponse(DataClassJsonMixin): names: List[str] = dc_field(metadata=dc_config(field_name="names")) +@dataclass +class GetActiveCallsStatusResponse(DataClassJsonMixin): + duration: str = dc_field(metadata=dc_config(field_name="duration")) + end_time: datetime = dc_field( + metadata=dc_config( + field_name="end_time", + encoder=encode_datetime, + decoder=datetime_from_unix_ns, + mm_field=fields.DateTime(format="iso"), + ) + ) + start_time: datetime = dc_field( + metadata=dc_config( + field_name="start_time", + encoder=encode_datetime, + decoder=datetime_from_unix_ns, + mm_field=fields.DateTime(format="iso"), + ) + ) + metrics: "Optional[ActiveCallsMetrics]" = dc_field( + default=None, metadata=dc_config(field_name="metrics") + ) + summary: "Optional[ActiveCallsSummary]" = dc_field( + default=None, metadata=dc_config(field_name="summary") + ) + + @dataclass class GetApplicationResponse(DataClassJsonMixin): duration: str = dc_field(metadata=dc_config(field_name="duration")) @@ -6581,6 +6658,7 @@ class GetChannelTypeResponse(DataClassJsonMixin): reminders: bool = dc_field(metadata=dc_config(field_name="reminders")) replies: bool = dc_field(metadata=dc_config(field_name="replies")) search: bool = dc_field(metadata=dc_config(field_name="search")) + shared_locations: bool = dc_field(metadata=dc_config(field_name="shared_locations")) skip_last_msg_update_for_system_msgs: bool = dc_field( metadata=dc_config(field_name="skip_last_msg_update_for_system_msgs") ) @@ -6737,12 +6815,6 @@ class GetOGResponse(DataClassJsonMixin): image_url: Optional[str] = dc_field( default=None, metadata=dc_config(field_name="image_url") ) - 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") - ) og_scrape_url: Optional[str] = dc_field( default=None, metadata=dc_config(field_name="og_scrape_url") ) @@ -6755,9 +6827,6 @@ class GetOGResponse(DataClassJsonMixin): pretext: Optional[str] = dc_field( default=None, metadata=dc_config(field_name="pretext") ) - stopped_sharing: Optional[bool] = dc_field( - default=None, metadata=dc_config(field_name="stopped_sharing") - ) text: Optional[str] = dc_field(default=None, metadata=dc_config(field_name="text")) thumb_url: Optional[str] = dc_field( default=None, metadata=dc_config(field_name="thumb_url") @@ -7146,6 +7215,15 @@ class ImportTaskHistory(DataClassJsonMixin): prev_state: str = dc_field(metadata=dc_config(field_name="prev_state")) +@dataclass +class JoinCallAPIMetrics(DataClassJsonMixin): + failures: float = dc_field(metadata=dc_config(field_name="failures")) + total: float = dc_field(metadata=dc_config(field_name="total")) + latency: "Optional[ActiveCallsLatencyStats]" = dc_field( + default=None, metadata=dc_config(field_name="latency") + ) + + @dataclass class Label(DataClassJsonMixin): name: str = dc_field(metadata=dc_config(field_name="name")) @@ -7219,12 +7297,18 @@ class LimitInfo(DataClassJsonMixin): @dataclass class LimitsSettings(DataClassJsonMixin): + max_participants_exclude_roles: List[str] = dc_field( + metadata=dc_config(field_name="max_participants_exclude_roles") + ) max_duration_seconds: Optional[int] = dc_field( default=None, metadata=dc_config(field_name="max_duration_seconds") ) max_participants: Optional[int] = dc_field( default=None, metadata=dc_config(field_name="max_participants") ) + max_participants_exclude_owner: Optional[bool] = dc_field( + default=None, metadata=dc_config(field_name="max_participants_exclude_owner") + ) @dataclass @@ -7235,16 +7319,28 @@ class LimitsSettingsRequest(DataClassJsonMixin): max_participants: Optional[int] = dc_field( default=None, metadata=dc_config(field_name="max_participants") ) + max_participants_exclude_owner: Optional[bool] = dc_field( + default=None, metadata=dc_config(field_name="max_participants_exclude_owner") + ) + max_participants_exclude_roles: Optional[List[str]] = dc_field( + default=None, metadata=dc_config(field_name="max_participants_exclude_roles") + ) @dataclass class LimitsSettingsResponse(DataClassJsonMixin): + max_participants_exclude_roles: List[str] = dc_field( + metadata=dc_config(field_name="max_participants_exclude_roles") + ) max_duration_seconds: Optional[int] = dc_field( default=None, metadata=dc_config(field_name="max_duration_seconds") ) max_participants: Optional[int] = dc_field( default=None, metadata=dc_config(field_name="max_participants") ) + max_participants_exclude_owner: Optional[bool] = dc_field( + default=None, metadata=dc_config(field_name="max_participants_exclude_owner") + ) @dataclass @@ -7660,6 +7756,9 @@ class Message(DataClassJsonMixin): reminder: "Optional[MessageReminder]" = dc_field( default=None, metadata=dc_config(field_name="reminder") ) + shared_location: "Optional[SharedLocation]" = dc_field( + default=None, metadata=dc_config(field_name="shared_location") + ) user: "Optional[User]" = dc_field( default=None, metadata=dc_config(field_name="user") ) @@ -7899,9 +7998,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") @@ -8061,6 +8158,9 @@ class MessageRequest(DataClassJsonMixin): custom: Optional[Dict[str, object]] = dc_field( default=None, metadata=dc_config(field_name="custom") ) + shared_location: "Optional[SharedLocation]" = dc_field( + default=None, metadata=dc_config(field_name="shared_location") + ) user: "Optional[UserRequest]" = dc_field( default=None, metadata=dc_config(field_name="user") ) @@ -8201,6 +8301,9 @@ class MessageResponse(DataClassJsonMixin): reminder: "Optional[ReminderResponseData]" = dc_field( default=None, metadata=dc_config(field_name="reminder") ) + shared_location: "Optional[SharedLocationResponseData]" = dc_field( + default=None, metadata=dc_config(field_name="shared_location") + ) @dataclass @@ -8437,6 +8540,9 @@ class MessageWithChannelResponse(DataClassJsonMixin): reminder: "Optional[ReminderResponseData]" = dc_field( default=None, metadata=dc_config(field_name="reminder") ) + shared_location: "Optional[SharedLocationResponseData]" = dc_field( + default=None, metadata=dc_config(field_name="shared_location") + ) @dataclass @@ -8542,7 +8648,7 @@ class ModerationFlagResponse(DataClassJsonMixin): moderation_payload: "Optional[ModerationPayload]" = dc_field( default=None, metadata=dc_config(field_name="moderation_payload") ) - review_queue_item: "Optional[ReviewQueueItem]" = dc_field( + review_queue_item: "Optional[ReviewQueueItemResponse]" = dc_field( default=None, metadata=dc_config(field_name="review_queue_item") ) user: "Optional[UserResponse]" = dc_field( @@ -8912,6 +9018,9 @@ class OwnUser(DataClassJsonMixin): devices: "List[Device]" = dc_field(metadata=dc_config(field_name="devices")) mutes: "List[UserMute]" = dc_field(metadata=dc_config(field_name="mutes")) custom: Dict[str, object] = dc_field(metadata=dc_config(field_name="custom")) + total_unread_count_by_team: "Dict[str, int]" = dc_field( + metadata=dc_config(field_name="total_unread_count_by_team") + ) deactivated_at: Optional[datetime] = dc_field( default=None, metadata=dc_config( @@ -9063,6 +9172,9 @@ class OwnUserResponse(DataClassJsonMixin): teams_role: "Optional[Dict[str, str]]" = dc_field( default=None, metadata=dc_config(field_name="teams_role") ) + total_unread_count_by_team: "Optional[Dict[str, int]]" = dc_field( + default=None, metadata=dc_config(field_name="total_unread_count_by_team") + ) @dataclass @@ -9515,6 +9627,26 @@ class PrivacySettingsResponse(DataClassJsonMixin): ) +@dataclass +class PublisherAllMetrics(DataClassJsonMixin): + audio: "Optional[PublisherAudioMetrics]" = dc_field( + default=None, metadata=dc_config(field_name="audio") + ) + rtt_ms: "Optional[ActiveCallsLatencyStats]" = dc_field( + default=None, metadata=dc_config(field_name="rtt_ms") + ) + video: "Optional[PublisherVideoMetrics]" = dc_field( + default=None, metadata=dc_config(field_name="video") + ) + + +@dataclass +class PublisherAudioMetrics(DataClassJsonMixin): + jitter_ms: "Optional[ActiveCallsLatencyStats]" = dc_field( + default=None, metadata=dc_config(field_name="jitter_ms") + ) + + @dataclass class PublisherStatsResponse(DataClassJsonMixin): total: int = dc_field(metadata=dc_config(field_name="total")) @@ -9524,6 +9656,26 @@ class PublisherStatsResponse(DataClassJsonMixin): ) +@dataclass +class PublisherVideoMetrics(DataClassJsonMixin): + fps_30: "Optional[ActiveCallsFPSStats]" = dc_field( + default=None, metadata=dc_config(field_name="fps_30") + ) + frame_encoding_time_ms: "Optional[ActiveCallsLatencyStats]" = dc_field( + default=None, metadata=dc_config(field_name="frame_encoding_time_ms") + ) + jitter_ms: "Optional[ActiveCallsLatencyStats]" = dc_field( + default=None, metadata=dc_config(field_name="jitter_ms") + ) + + +@dataclass +class PublishersMetrics(DataClassJsonMixin): + all: "Optional[PublisherAllMetrics]" = dc_field( + default=None, metadata=dc_config(field_name="all") + ) + + @dataclass class PushConfig(DataClassJsonMixin): version: str = dc_field(metadata=dc_config(field_name="version")) @@ -11137,6 +11289,7 @@ class ReviewQueueItem(DataClassJsonMixin): flags: "List[Flag]" = dc_field(metadata=dc_config(field_name="flags")) languages: List[str] = dc_field(metadata=dc_config(field_name="languages")) teams: List[str] = dc_field(metadata=dc_config(field_name="teams")) + completed_at: "NullTime" = dc_field(metadata=dc_config(field_name="completed_at")) reviewed_at: "NullTime" = dc_field(metadata=dc_config(field_name="reviewed_at")) activity: "Optional[EnrichedActivity]" = dc_field( default=None, metadata=dc_config(field_name="activity") @@ -11740,6 +11893,9 @@ class SearchResultMessage(DataClassJsonMixin): reminder: "Optional[ReminderResponseData]" = dc_field( default=None, metadata=dc_config(field_name="reminder") ) + shared_location: "Optional[SharedLocationResponseData]" = dc_field( + default=None, metadata=dc_config(field_name="shared_location") + ) @dataclass @@ -11959,6 +12115,148 @@ class ShadowBlockActionRequest(DataClassJsonMixin): pass +@dataclass +class SharedLocation(DataClassJsonMixin): + channel_cid: str = dc_field(metadata=dc_config(field_name="channel_cid")) + 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"), + ) + ) + created_by_device_id: str = dc_field( + metadata=dc_config(field_name="created_by_device_id") + ) + message_id: str = dc_field(metadata=dc_config(field_name="message_id")) + 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"), + ) + ) + user_id: str = dc_field(metadata=dc_config(field_name="user_id")) + end_at: Optional[datetime] = dc_field( + default=None, + metadata=dc_config( + field_name="end_at", + encoder=encode_datetime, + decoder=datetime_from_unix_ns, + mm_field=fields.DateTime(format="iso"), + ), + ) + 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") + ) + channel: "Optional[Channel]" = dc_field( + default=None, metadata=dc_config(field_name="channel") + ) + message: "Optional[Message]" = dc_field( + default=None, metadata=dc_config(field_name="message") + ) + + +@dataclass +class SharedLocationResponse(DataClassJsonMixin): + channel_cid: str = dc_field(metadata=dc_config(field_name="channel_cid")) + 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"), + ) + ) + created_by_device_id: str = dc_field( + metadata=dc_config(field_name="created_by_device_id") + ) + duration: str = dc_field(metadata=dc_config(field_name="duration")) + latitude: float = dc_field(metadata=dc_config(field_name="latitude")) + longitude: float = dc_field(metadata=dc_config(field_name="longitude")) + message_id: str = dc_field(metadata=dc_config(field_name="message_id")) + 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"), + ) + ) + user_id: str = dc_field(metadata=dc_config(field_name="user_id")) + end_at: Optional[datetime] = dc_field( + default=None, + metadata=dc_config( + field_name="end_at", + encoder=encode_datetime, + decoder=datetime_from_unix_ns, + mm_field=fields.DateTime(format="iso"), + ), + ) + channel: "Optional[ChannelResponse]" = dc_field( + default=None, metadata=dc_config(field_name="channel") + ) + message: "Optional[MessageResponse]" = dc_field( + default=None, metadata=dc_config(field_name="message") + ) + + +@dataclass +class SharedLocationResponseData(DataClassJsonMixin): + channel_cid: str = dc_field(metadata=dc_config(field_name="channel_cid")) + 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"), + ) + ) + created_by_device_id: str = dc_field( + metadata=dc_config(field_name="created_by_device_id") + ) + latitude: float = dc_field(metadata=dc_config(field_name="latitude")) + longitude: float = dc_field(metadata=dc_config(field_name="longitude")) + message_id: str = dc_field(metadata=dc_config(field_name="message_id")) + 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"), + ) + ) + user_id: str = dc_field(metadata=dc_config(field_name="user_id")) + end_at: Optional[datetime] = dc_field( + default=None, + metadata=dc_config( + field_name="end_at", + encoder=encode_datetime, + decoder=datetime_from_unix_ns, + mm_field=fields.DateTime(format="iso"), + ), + ) + channel: "Optional[ChannelResponse]" = dc_field( + default=None, metadata=dc_config(field_name="channel") + ) + message: "Optional[MessageResponse]" = dc_field( + default=None, metadata=dc_config(field_name="message") + ) + + +@dataclass +class SharedLocationsResponse(DataClassJsonMixin): + duration: str = dc_field(metadata=dc_config(field_name="duration")) + active_live_locations: "List[SharedLocationResponseData]" = dc_field( + metadata=dc_config(field_name="active_live_locations") + ) + + @dataclass class ShowChannelRequest(DataClassJsonMixin): user_id: Optional[str] = dc_field( @@ -12253,11 +12551,37 @@ class SubmitActionRequest(DataClassJsonMixin): @dataclass class SubmitActionResponse(DataClassJsonMixin): duration: str = dc_field(metadata=dc_config(field_name="duration")) - item: "Optional[ReviewQueueItem]" = dc_field( + item: "Optional[ReviewQueueItemResponse]" = dc_field( default=None, metadata=dc_config(field_name="item") ) +@dataclass +class SubscriberAllMetrics(DataClassJsonMixin): + audio: "Optional[SubscriberAudioMetrics]" = dc_field( + default=None, metadata=dc_config(field_name="audio") + ) + rtt_ms: "Optional[ActiveCallsLatencyStats]" = dc_field( + default=None, metadata=dc_config(field_name="rtt_ms") + ) + video: "Optional[SubscriberVideoMetrics]" = dc_field( + default=None, metadata=dc_config(field_name="video") + ) + + +@dataclass +class SubscriberAudioMetrics(DataClassJsonMixin): + concealment_pct: "Optional[ActiveCallsLatencyStats]" = dc_field( + default=None, metadata=dc_config(field_name="concealment_pct") + ) + jitter_ms: "Optional[ActiveCallsLatencyStats]" = dc_field( + default=None, metadata=dc_config(field_name="jitter_ms") + ) + packets_lost_pct: "Optional[ActiveCallsLatencyStats]" = dc_field( + default=None, metadata=dc_config(field_name="packets_lost_pct") + ) + + @dataclass class SubscriberStatsResponse(DataClassJsonMixin): total: int = dc_field(metadata=dc_config(field_name="total")) @@ -12267,6 +12591,26 @@ class SubscriberStatsResponse(DataClassJsonMixin): unique: int = dc_field(metadata=dc_config(field_name="unique")) +@dataclass +class SubscriberVideoMetrics(DataClassJsonMixin): + fps_30: "Optional[ActiveCallsFPSStats]" = dc_field( + default=None, metadata=dc_config(field_name="fps_30") + ) + jitter_ms: "Optional[ActiveCallsLatencyStats]" = dc_field( + default=None, metadata=dc_config(field_name="jitter_ms") + ) + packets_lost_pct: "Optional[ActiveCallsLatencyStats]" = dc_field( + default=None, metadata=dc_config(field_name="packets_lost_pct") + ) + + +@dataclass +class SubscribersMetrics(DataClassJsonMixin): + all: "Optional[SubscriberAllMetrics]" = dc_field( + default=None, metadata=dc_config(field_name="all") + ) + + @dataclass class TargetResolution(DataClassJsonMixin): bitrate: int = dc_field(metadata=dc_config(field_name="bitrate")) @@ -12792,6 +13136,9 @@ class UnreadCountsResponse(DataClassJsonMixin): threads: "List[UnreadCountsThread]" = dc_field( metadata=dc_config(field_name="threads") ) + total_unread_count_by_team: "Dict[str, int]" = dc_field( + metadata=dc_config(field_name="total_unread_count_by_team") + ) @dataclass @@ -13213,6 +13560,9 @@ class UpdateChannelTypeRequest(DataClassJsonMixin): search: Optional[bool] = dc_field( default=None, metadata=dc_config(field_name="search") ) + shared_locations: Optional[bool] = dc_field( + default=None, metadata=dc_config(field_name="shared_locations") + ) skip_last_msg_update_for_system_msgs: Optional[bool] = dc_field( default=None, metadata=dc_config(field_name="skip_last_msg_update_for_system_msgs"), @@ -13282,6 +13632,7 @@ class UpdateChannelTypeResponse(DataClassJsonMixin): reminders: bool = dc_field(metadata=dc_config(field_name="reminders")) replies: bool = dc_field(metadata=dc_config(field_name="replies")) search: bool = dc_field(metadata=dc_config(field_name="search")) + shared_locations: bool = dc_field(metadata=dc_config(field_name="shared_locations")) skip_last_msg_update_for_system_msgs: bool = dc_field( metadata=dc_config(field_name="skip_last_msg_update_for_system_msgs") ) @@ -13367,6 +13718,29 @@ class UpdateExternalStorageResponse(DataClassJsonMixin): type: str = dc_field(metadata=dc_config(field_name="type")) +@dataclass +class UpdateLiveLocationRequest(DataClassJsonMixin): + created_by_device_id: str = dc_field( + metadata=dc_config(field_name="created_by_device_id") + ) + message_id: str = dc_field(metadata=dc_config(field_name="message_id")) + end_at: Optional[datetime] = dc_field( + default=None, + metadata=dc_config( + field_name="end_at", + encoder=encode_datetime, + decoder=datetime_from_unix_ns, + mm_field=fields.DateTime(format="iso"), + ), + ) + 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") + ) + + @dataclass class UpdateMemberPartialRequest(DataClassJsonMixin): unset: Optional[List[str]] = dc_field( @@ -14747,6 +15121,9 @@ class WrappedUnreadCountsResponse(DataClassJsonMixin): threads: "List[UnreadCountsThread]" = dc_field( metadata=dc_config(field_name="threads") ) + total_unread_count_by_team: "Dict[str, int]" = dc_field( + metadata=dc_config(field_name="total_unread_count_by_team") + ) @dataclass diff --git a/getstream/video/rest_client.py b/getstream/video/rest_client.py index 47684459..775743e4 100644 --- a/getstream/video/rest_client.py +++ b/getstream/video/rest_client.py @@ -21,6 +21,11 @@ def __init__(self, api_key: str, base_url: str, timeout: float, token: str): token=token, ) + def get_active_calls_status(self) -> StreamResponse[GetActiveCallsStatusResponse]: + return self.get( + "/api/v2/video/active_calls_status", GetActiveCallsStatusResponse + ) + def query_user_feedback( self, full: Optional[bool] = None,