diff --git a/README.md b/README.md index 469765ac..4c80bfb1 100644 --- a/README.md +++ b/README.md @@ -86,6 +86,41 @@ call.get_or_create( ) ``` +#### Ringing Individual Members + +In some cases, you may want to ring individual members instead of the whole call, or you want to ring a member into an existing call. You can do this by using the `ring` method: + +```python +import uuid +from getstream import Stream + +# Initialize client +client = Stream(api_key="your_api_key", api_secret="your_api_secret") + +# Create a call +call = client.video.call("default", str(uuid.uuid4())) + +# Create or get a call with members +call.get_or_create( + data=CallRequest( + created_by_id="myself", + members=[ + MemberRequest(user_id= "myself"), + MemberRequest(user_id="my-friend") + ], + ) +) + +# Ring an existing member +call.ring(member_ids=["my-friend"]) + +# Add a new member to the call and ring them +call.update_call_members( + update_members=[{"user_id": "my-other-friend"}] +) +call.ring(member_ids=["my-other-friend"]) +``` + ### App configuration ```python diff --git a/getstream/chat/rest_client.py b/getstream/chat/rest_client.py index 59ac94e3..c65827f7 100644 --- a/getstream/chat/rest_client.py +++ b/getstream/chat/rest_client.py @@ -26,24 +26,40 @@ def query_campaigns( limit: Optional[int] = None, next: Optional[str] = None, prev: Optional[str] = None, + user_limit: Optional[int] = None, sort: Optional[List[SortParamRequest]] = None, filter: Optional[Dict[str, object]] = None, ) -> StreamResponse[QueryCampaignsResponse]: json = build_body_dict( - limit=limit, next=next, prev=prev, sort=sort, filter=filter + limit=limit, + next=next, + prev=prev, + user_limit=user_limit, + sort=sort, + filter=filter, ) return self.post( "/api/v2/chat/campaigns/query", QueryCampaignsResponse, json=json ) - def get_campaign(self, id: str) -> StreamResponse[GetCampaignResponse]: + def get_campaign( + self, + id: str, + prev: Optional[str] = None, + next: Optional[str] = None, + limit: Optional[int] = None, + ) -> StreamResponse[GetCampaignResponse]: + query_params = build_query_param(prev=prev, next=next, limit=limit) path_params = { "id": id, } return self.get( - "/api/v2/chat/campaigns/{id}", GetCampaignResponse, path_params=path_params + "/api/v2/chat/campaigns/{id}", + GetCampaignResponse, + query_params=query_params, + path_params=path_params, ) def start_campaign( @@ -245,6 +261,46 @@ def update_channel( json=json, ) + def delete_draft( + self, + type: str, + id: str, + parent_id: Optional[str] = None, + user_id: Optional[str] = None, + ) -> StreamResponse[Response]: + query_params = build_query_param(parent_id=parent_id, user_id=user_id) + path_params = { + "type": type, + "id": id, + } + + return self.delete( + "/api/v2/chat/channels/{type}/{id}/draft", + Response, + query_params=query_params, + path_params=path_params, + ) + + def get_draft( + self, + type: str, + id: str, + parent_id: Optional[str] = None, + user_id: Optional[str] = None, + ) -> StreamResponse[GetDraftResponse]: + query_params = build_query_param(parent_id=parent_id, user_id=user_id) + path_params = { + "type": type, + "id": id, + } + + return self.get( + "/api/v2/chat/channels/{type}/{id}/draft", + GetDraftResponse, + query_params=query_params, + path_params=path_params, + ) + def send_event( self, type: str, id: str, event: EventRequest ) -> StreamResponse[EventResponse]: @@ -773,6 +829,28 @@ def update_command( json=json, ) + def query_drafts( + self, + limit: Optional[int] = None, + next: Optional[str] = None, + prev: Optional[str] = None, + user_id: Optional[str] = None, + sort: Optional[List[SortParamRequest]] = None, + filter: Optional[Dict[str, object]] = None, + user: Optional[UserRequest] = None, + ) -> StreamResponse[QueryDraftsResponse]: + json = build_body_dict( + limit=limit, + next=next, + prev=prev, + user_id=user_id, + sort=sort, + filter=filter, + user=user, + ) + + return self.post("/api/v2/chat/drafts/query", QueryDraftsResponse, json=json) + def export_channels( self, channels: List[ChannelExport], @@ -795,19 +873,6 @@ def export_channels( "/api/v2/chat/export_channels", ExportChannelsResponse, json=json ) - def get_export_channels_status( - self, id: str - ) -> StreamResponse[GetExportChannelsStatusResponse]: - path_params = { - "id": id, - } - - return self.get( - "/api/v2/chat/export_channels/{id}", - GetExportChannelsStatusResponse, - path_params=path_params, - ) - def query_members( self, payload: Optional[QueryMembersPayload] = None ) -> StreamResponse[MembersResponse]: @@ -1542,6 +1607,8 @@ def query_threads( prev: Optional[str] = None, reply_limit: Optional[int] = None, user_id: Optional[str] = None, + sort: Optional[List[SortParamRequest]] = None, + filter: Optional[Dict[str, object]] = None, user: Optional[UserRequest] = None, ) -> StreamResponse[QueryThreadsResponse]: json = build_body_dict( @@ -1552,6 +1619,8 @@ def query_threads( prev=prev, reply_limit=reply_limit, user_id=user_id, + sort=sort, + filter=filter, user=user, ) diff --git a/getstream/common/rest_client.py b/getstream/common/rest_client.py index ff327ca5..5dca77c3 100644 --- a/getstream/common/rest_client.py +++ b/getstream/common/rest_client.py @@ -37,6 +37,7 @@ def update_app( enforce_unique_usernames: Optional[str] = None, feeds_moderation_enabled: Optional[bool] = None, feeds_v2_region: Optional[str] = None, + guest_user_creation_disabled: Optional[bool] = None, image_moderation_enabled: Optional[bool] = None, migrate_permissions_to_v2: Optional[bool] = None, moderation_enabled: Optional[bool] = None, @@ -81,6 +82,7 @@ def update_app( enforce_unique_usernames=enforce_unique_usernames, feeds_moderation_enabled=feeds_moderation_enabled, feeds_v2_region=feeds_v2_region, + guest_user_creation_disabled=guest_user_creation_disabled, image_moderation_enabled=image_moderation_enabled, migrate_permissions_to_v2=migrate_permissions_to_v2, moderation_enabled=moderation_enabled, diff --git a/getstream/models/__init__.py b/getstream/models/__init__.py index f20ccde3..843523d6 100644 --- a/getstream/models/__init__.py +++ b/getstream/models/__init__.py @@ -12,6 +12,7 @@ @dataclass class AIImageConfig(DataClassJsonMixin): enabled: bool = dc_field(metadata=dc_config(field_name="enabled")) + ocr_rules: "List[OCRRule]" = dc_field(metadata=dc_config(field_name="ocr_rules")) rules: "List[AWSRekognitionRule]" = dc_field(metadata=dc_config(field_name="rules")) _async: Optional[bool] = dc_field( default=None, metadata=dc_config(field_name="async") @@ -246,6 +247,9 @@ class AppResponseFields(DataClassJsonMixin): enforce_unique_usernames: str = dc_field( metadata=dc_config(field_name="enforce_unique_usernames") ) + guest_user_creation_disabled: bool = dc_field( + metadata=dc_config(field_name="guest_user_creation_disabled") + ) image_moderation_enabled: bool = dc_field( metadata=dc_config(field_name="image_moderation_enabled") ) @@ -331,6 +335,178 @@ class AppResponseFields(DataClassJsonMixin): ) +@dataclass +class AsyncExportChannelsEvent(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"), + ) + ) + finished_at: datetime = dc_field( + metadata=dc_config( + field_name="finished_at", + encoder=encode_datetime, + decoder=datetime_from_unix_ns, + mm_field=fields.DateTime(format="iso"), + ) + ) + started_at: datetime = dc_field( + metadata=dc_config( + field_name="started_at", + encoder=encode_datetime, + decoder=datetime_from_unix_ns, + mm_field=fields.DateTime(format="iso"), + ) + ) + task_id: str = dc_field(metadata=dc_config(field_name="task_id")) + url: str = dc_field(metadata=dc_config(field_name="url")) + custom: Dict[str, object] = dc_field(metadata=dc_config(field_name="custom")) + type: str = dc_field( + default="export.channels.success", 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"), + ), + ) + + +@dataclass +class AsyncExportErrorEvent(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"), + ) + ) + error: str = dc_field(metadata=dc_config(field_name="error")) + finished_at: datetime = dc_field( + metadata=dc_config( + field_name="finished_at", + encoder=encode_datetime, + decoder=datetime_from_unix_ns, + mm_field=fields.DateTime(format="iso"), + ) + ) + started_at: datetime = dc_field( + metadata=dc_config( + field_name="started_at", + encoder=encode_datetime, + decoder=datetime_from_unix_ns, + mm_field=fields.DateTime(format="iso"), + ) + ) + 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") + ) + 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"), + ), + ) + + +@dataclass +class AsyncExportModerationLogsEvent(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"), + ) + ) + finished_at: datetime = dc_field( + metadata=dc_config( + field_name="finished_at", + encoder=encode_datetime, + decoder=datetime_from_unix_ns, + mm_field=fields.DateTime(format="iso"), + ) + ) + started_at: datetime = dc_field( + metadata=dc_config( + field_name="started_at", + encoder=encode_datetime, + decoder=datetime_from_unix_ns, + mm_field=fields.DateTime(format="iso"), + ) + ) + task_id: str = dc_field(metadata=dc_config(field_name="task_id")) + url: str = dc_field(metadata=dc_config(field_name="url")) + custom: Dict[str, object] = dc_field(metadata=dc_config(field_name="custom")) + type: str = dc_field( + default="export.moderation_logs.success", 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"), + ), + ) + + +@dataclass +class AsyncExportUsersEvent(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"), + ) + ) + finished_at: datetime = dc_field( + metadata=dc_config( + field_name="finished_at", + encoder=encode_datetime, + decoder=datetime_from_unix_ns, + mm_field=fields.DateTime(format="iso"), + ) + ) + started_at: datetime = dc_field( + metadata=dc_config( + field_name="started_at", + encoder=encode_datetime, + decoder=datetime_from_unix_ns, + mm_field=fields.DateTime(format="iso"), + ) + ) + task_id: str = dc_field(metadata=dc_config(field_name="task_id")) + url: str = dc_field(metadata=dc_config(field_name="url")) + custom: Dict[str, object] = dc_field(metadata=dc_config(field_name="custom")) + type: str = dc_field( + default="export.users.success", 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"), + ), + ) + + @dataclass class AsyncModerationCallbackConfig(DataClassJsonMixin): mode: Optional[str] = dc_field(default=None, metadata=dc_config(field_name="mode")) @@ -1377,6 +1553,7 @@ class CallRecording(DataClassJsonMixin): ) ) filename: str = dc_field(metadata=dc_config(field_name="filename")) + session_id: str = dc_field(metadata=dc_config(field_name="session_id")) start_time: datetime = dc_field( metadata=dc_config( field_name="start_time", @@ -1735,6 +1912,14 @@ class CallSessionResponse(DataClassJsonMixin): anonymous_participant_count: int = dc_field( metadata=dc_config(field_name="anonymous_participant_count") ) + 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")) participants: "List[CallParticipantResponse]" = dc_field( metadata=dc_config(field_name="participants") @@ -2171,6 +2356,35 @@ class CallUpdatedEvent(DataClassJsonMixin): type: str = dc_field(default="call.updated", metadata=dc_config(field_name="type")) +@dataclass +class CallUserFeedbackSubmittedEvent(DataClassJsonMixin): + call_cid: str = dc_field(metadata=dc_config(field_name="call_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"), + ) + ) + rating: int = dc_field(metadata=dc_config(field_name="rating")) + session_id: str = dc_field(metadata=dc_config(field_name="session_id")) + user: "UserResponse" = dc_field(metadata=dc_config(field_name="user")) + type: str = dc_field( + default="call.user_feedback_submitted", metadata=dc_config(field_name="type") + ) + reason: Optional[str] = dc_field( + default=None, metadata=dc_config(field_name="reason") + ) + 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") + ) + custom: Optional[Dict[str, object]] = dc_field( + default=None, metadata=dc_config(field_name="custom") + ) + + @dataclass class CallUserMutedEvent(DataClassJsonMixin): call_cid: str = dc_field(metadata=dc_config(field_name="call_cid")) @@ -2268,6 +2482,7 @@ class CampaignResponse(DataClassJsonMixin): name: str = dc_field(metadata=dc_config(field_name="name")) sender_id: str = dc_field(metadata=dc_config(field_name="sender_id")) sender_mode: str = dc_field(metadata=dc_config(field_name="sender_mode")) + show_channels: bool = dc_field(metadata=dc_config(field_name="show_channels")) skip_push: bool = dc_field(metadata=dc_config(field_name="skip_push")) skip_webhook: bool = dc_field(metadata=dc_config(field_name="skip_webhook")) status: str = dc_field(metadata=dc_config(field_name="status")) @@ -2366,6 +2581,8 @@ class CampaignStatsResponse(DataClassJsonMixin): mm_field=fields.DateTime(format="iso"), ) ) + stats_users_read: int = dc_field(metadata=dc_config(field_name="stats_users_read")) + stats_users_sent: int = dc_field(metadata=dc_config(field_name="stats_users_sent")) @dataclass @@ -2423,6 +2640,9 @@ class Channel(DataClassJsonMixin): mm_field=fields.DateTime(format="iso"), ), ) + last_campaigns: Optional[str] = dc_field( + default=None, metadata=dc_config(field_name="last_campaigns") + ) last_message_at: Optional[datetime] = dc_field( default=None, metadata=dc_config( @@ -3050,6 +3270,9 @@ class ChannelOwnCapability: SEND_POLL: Final[ChannelOwnCapabilityType] = "send-poll" SEND_REACTION: Final[ChannelOwnCapabilityType] = "send-reaction" SEND_REPLY: Final[ChannelOwnCapabilityType] = "send-reply" + SEND_RESTRICTED_VISIBILITY_MESSAGE: Final[ChannelOwnCapabilityType] = ( + "send-restricted-visibility-message" + ) SEND_TYPING_EVENTS: Final[ChannelOwnCapabilityType] = "send-typing-events" SET_CHANNEL_COOLDOWN: Final[ChannelOwnCapabilityType] = "set-channel-cooldown" SKIP_SLOW_MODE: Final[ChannelOwnCapabilityType] = "skip-slow-mode" @@ -3227,6 +3450,9 @@ class ChannelStateResponse(DataClassJsonMixin): channel: "Optional[ChannelResponse]" = dc_field( default=None, metadata=dc_config(field_name="channel") ) + draft: "Optional[DraftResponse]" = dc_field( + default=None, metadata=dc_config(field_name="draft") + ) membership: "Optional[ChannelMember]" = dc_field( default=None, metadata=dc_config(field_name="membership") ) @@ -3274,6 +3500,9 @@ class ChannelStateResponseFields(DataClassJsonMixin): channel: "Optional[ChannelResponse]" = dc_field( default=None, metadata=dc_config(field_name="channel") ) + draft: "Optional[DraftResponse]" = dc_field( + default=None, metadata=dc_config(field_name="draft") + ) membership: "Optional[ChannelMember]" = dc_field( default=None, metadata=dc_config(field_name="membership") ) @@ -4565,6 +4794,63 @@ class DeviceResponse(DataClassJsonMixin): voip: Optional[bool] = dc_field(default=None, metadata=dc_config(field_name="voip")) +@dataclass +class DraftPayloadResponse(DataClassJsonMixin): + id: str = dc_field(metadata=dc_config(field_name="id")) + text: str = dc_field(metadata=dc_config(field_name="text")) + custom: Dict[str, object] = dc_field(metadata=dc_config(field_name="custom")) + html: Optional[str] = dc_field(default=None, metadata=dc_config(field_name="html")) + mml: Optional[str] = dc_field(default=None, metadata=dc_config(field_name="mml")) + parent_id: Optional[str] = dc_field( + default=None, metadata=dc_config(field_name="parent_id") + ) + poll_id: Optional[str] = dc_field( + default=None, metadata=dc_config(field_name="poll_id") + ) + quoted_message_id: Optional[str] = dc_field( + default=None, metadata=dc_config(field_name="quoted_message_id") + ) + show_in_channel: Optional[bool] = dc_field( + default=None, metadata=dc_config(field_name="show_in_channel") + ) + silent: Optional[bool] = dc_field( + default=None, metadata=dc_config(field_name="silent") + ) + type: Optional[str] = dc_field(default=None, metadata=dc_config(field_name="type")) + attachments: "Optional[List[Attachment]]" = dc_field( + default=None, metadata=dc_config(field_name="attachments") + ) + mentioned_users: "Optional[List[UserResponse]]" = dc_field( + default=None, metadata=dc_config(field_name="mentioned_users") + ) + + +@dataclass +class DraftResponse(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"), + ) + ) + message: "DraftPayloadResponse" = dc_field(metadata=dc_config(field_name="message")) + parent_id: Optional[str] = dc_field( + default=None, metadata=dc_config(field_name="parent_id") + ) + channel: "Optional[ChannelResponse]" = dc_field( + default=None, metadata=dc_config(field_name="channel") + ) + parent_message: "Optional[MessageResponse]" = dc_field( + default=None, metadata=dc_config(field_name="parent_message") + ) + quoted_message: "Optional[MessageResponse]" = dc_field( + default=None, metadata=dc_config(field_name="quoted_message") + ) + + @dataclass class EdgeResponse(DataClassJsonMixin): continent_code: str = dc_field(metadata=dc_config(field_name="continent_code")) @@ -4710,6 +4996,7 @@ class EntityCreator(DataClassJsonMixin): online: bool = dc_field(metadata=dc_config(field_name="online")) role: str = dc_field(metadata=dc_config(field_name="role")) custom: Dict[str, object] = dc_field(metadata=dc_config(field_name="custom")) + teams_role: "Dict[str, str]" = dc_field(metadata=dc_config(field_name="teams_role")) ban_expires: Optional[datetime] = dc_field( default=None, metadata=dc_config( @@ -4811,6 +5098,7 @@ class EntityCreatorResponse(DataClassJsonMixin): deleted_content_count: int = dc_field( metadata=dc_config(field_name="deleted_content_count") ) + flagged_count: int = dc_field(metadata=dc_config(field_name="flagged_count")) id: str = dc_field(metadata=dc_config(field_name="id")) invisible: bool = dc_field(metadata=dc_config(field_name="invisible")) language: str = dc_field(metadata=dc_config(field_name="language")) @@ -4888,6 +5176,9 @@ class EntityCreatorResponse(DataClassJsonMixin): push_notifications: "Optional[PushNotificationSettingsResponse]" = dc_field( default=None, metadata=dc_config(field_name="push_notifications") ) + teams_role: "Optional[Dict[str, str]]" = dc_field( + default=None, metadata=dc_config(field_name="teams_role") + ) @dataclass @@ -4958,15 +5249,6 @@ class ExportChannelsResponse(DataClassJsonMixin): task_id: str = dc_field(metadata=dc_config(field_name="task_id")) -@dataclass -class ExportChannelsResult(DataClassJsonMixin): - url: str = dc_field(metadata=dc_config(field_name="url")) - path: Optional[str] = dc_field(default=None, metadata=dc_config(field_name="path")) - s3_bucket_name: Optional[str] = dc_field( - default=None, metadata=dc_config(field_name="s3_bucket_name") - ) - - @dataclass class ExportUserResponse(DataClassJsonMixin): duration: str = dc_field(metadata=dc_config(field_name="duration")) @@ -5000,6 +5282,12 @@ class ExternalStorageResponse(DataClassJsonMixin): type: str = dc_field(metadata=dc_config(field_name="type")) +@dataclass +class FPSStats(DataClassJsonMixin): + average_fps: float = dc_field(metadata=dc_config(field_name="average_fps")) + tracked: int = dc_field(metadata=dc_config(field_name="tracked")) + + @dataclass class FeedsModerationTemplateConfig(DataClassJsonMixin): config_key: str = dc_field(metadata=dc_config(field_name="config_key")) @@ -5087,80 +5375,6 @@ class FirebaseConfigFields(DataClassJsonMixin): @dataclass class Flag(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"), - ) - ) - created_by_automod: bool = dc_field( - metadata=dc_config(field_name="created_by_automod") - ) - 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"), - ) - ) - approved_at: Optional[datetime] = dc_field( - default=None, - metadata=dc_config( - field_name="approved_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") - ) - rejected_at: Optional[datetime] = dc_field( - default=None, - metadata=dc_config( - field_name="rejected_at", - encoder=encode_datetime, - decoder=datetime_from_unix_ns, - mm_field=fields.DateTime(format="iso"), - ), - ) - reviewed_at: Optional[datetime] = dc_field( - default=None, - metadata=dc_config( - field_name="reviewed_at", - encoder=encode_datetime, - decoder=datetime_from_unix_ns, - mm_field=fields.DateTime(format="iso"), - ), - ) - reviewed_by: Optional[str] = dc_field( - default=None, metadata=dc_config(field_name="reviewed_by") - ) - target_message_id: Optional[str] = dc_field( - default=None, metadata=dc_config(field_name="target_message_id") - ) - custom: Optional[Dict[str, object]] = dc_field( - default=None, metadata=dc_config(field_name="custom") - ) - details: "Optional[FlagDetails]" = dc_field( - default=None, metadata=dc_config(field_name="details") - ) - target_message: "Optional[Message]" = dc_field( - default=None, metadata=dc_config(field_name="target_message") - ) - target_user: "Optional[User]" = dc_field( - default=None, metadata=dc_config(field_name="target_user") - ) - user: "Optional[User]" = dc_field( - default=None, metadata=dc_config(field_name="user") - ) - - -@dataclass -class Flag2(DataClassJsonMixin): created_at: datetime = dc_field( metadata=dc_config( field_name="created_at", @@ -5209,54 +5423,6 @@ class Flag2(DataClassJsonMixin): ) -@dataclass -class Flag2Response(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"), - ) - ) - entity_id: str = dc_field(metadata=dc_config(field_name="entity_id")) - entity_type: str = dc_field(metadata=dc_config(field_name="entity_type")) - 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")) - result: "List[Dict[str, object]]" = dc_field( - metadata=dc_config(field_name="result") - ) - entity_creator_id: Optional[str] = dc_field( - default=None, metadata=dc_config(field_name="entity_creator_id") - ) - reason: Optional[str] = dc_field( - default=None, metadata=dc_config(field_name="reason") - ) - review_queue_item_id: Optional[str] = dc_field( - default=None, metadata=dc_config(field_name="review_queue_item_id") - ) - type: Optional[str] = dc_field(default=None, metadata=dc_config(field_name="type")) - labels: Optional[List[str]] = dc_field( - default=None, metadata=dc_config(field_name="labels") - ) - custom: Optional[Dict[str, object]] = dc_field( - default=None, metadata=dc_config(field_name="custom") - ) - moderation_payload: "Optional[ModerationPayload]" = dc_field( - default=None, metadata=dc_config(field_name="moderation_payload") - ) - user: "Optional[UserResponse]" = dc_field( - default=None, metadata=dc_config(field_name="user") - ) - - @dataclass class FlagDetails(DataClassJsonMixin): original_text: str = dc_field(metadata=dc_config(field_name="original_text")) @@ -5437,6 +5603,15 @@ class FullUserResponse(DataClassJsonMixin): mutes: "List[UserMuteResponse]" = dc_field(metadata=dc_config(field_name="mutes")) teams: List[str] = dc_field(metadata=dc_config(field_name="teams")) custom: Dict[str, object] = dc_field(metadata=dc_config(field_name="custom")) + 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"), + ), + ) deactivated_at: Optional[datetime] = dc_field( default=None, metadata=dc_config( @@ -5483,6 +5658,9 @@ class FullUserResponse(DataClassJsonMixin): privacy_settings: "Optional[PrivacySettingsResponse]" = dc_field( default=None, metadata=dc_config(field_name="privacy_settings") ) + teams_role: "Optional[Dict[str, str]]" = dc_field( + default=None, metadata=dc_config(field_name="teams_role") + ) @dataclass @@ -5576,6 +5754,9 @@ class GetCallStatsResponse(DataClassJsonMixin): ) call_status: str = dc_field(metadata=dc_config(field_name="call_status")) duration: str = dc_field(metadata=dc_config(field_name="duration")) + is_truncated_report: bool = dc_field( + metadata=dc_config(field_name="is_truncated_report") + ) max_freezes_duration_seconds: int = dc_field( metadata=dc_config(field_name="max_freezes_duration_seconds") ) @@ -5647,6 +5828,9 @@ class GetCampaignResponse(DataClassJsonMixin): campaign: "Optional[CampaignResponse]" = dc_field( default=None, metadata=dc_config(field_name="campaign") ) + users: "Optional[PagerResponse]" = dc_field( + default=None, metadata=dc_config(field_name="users") + ) @dataclass @@ -5766,38 +5950,15 @@ class GetCustomPermissionResponse(DataClassJsonMixin): @dataclass -class GetEdgesResponse(DataClassJsonMixin): +class GetDraftResponse(DataClassJsonMixin): duration: str = dc_field(metadata=dc_config(field_name="duration")) - edges: "List[EdgeResponse]" = dc_field(metadata=dc_config(field_name="edges")) + draft: "DraftResponse" = dc_field(metadata=dc_config(field_name="draft")) @dataclass -class GetExportChannelsStatusResponse(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"), - ) - ) +class GetEdgesResponse(DataClassJsonMixin): duration: str = dc_field(metadata=dc_config(field_name="duration")) - status: str = dc_field(metadata=dc_config(field_name="status")) - task_id: str = dc_field(metadata=dc_config(field_name="task_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"), - ) - ) - error: "Optional[ErrorResult]" = dc_field( - default=None, metadata=dc_config(field_name="error") - ) - result: "Optional[ExportChannelsResult]" = dc_field( - default=None, metadata=dc_config(field_name="result") - ) + edges: "List[EdgeResponse]" = dc_field(metadata=dc_config(field_name="edges")) @dataclass @@ -5827,24 +5988,6 @@ class GetMessageResponse(DataClassJsonMixin): ) -@dataclass -class GetModerationAnalyticsRequest(DataClassJsonMixin): - end_date: Optional[str] = dc_field( - default=None, metadata=dc_config(field_name="end_date") - ) - start_date: Optional[str] = dc_field( - default=None, metadata=dc_config(field_name="start_date") - ) - - -@dataclass -class GetModerationAnalyticsResponse(DataClassJsonMixin): - duration: str = dc_field(metadata=dc_config(field_name="duration")) - analytics: "Optional[ModerationAnalytics]" = dc_field( - default=None, metadata=dc_config(field_name="analytics") - ) - - @dataclass class GetOGResponse(DataClassJsonMixin): duration: str = dc_field(metadata=dc_config(field_name="duration")) @@ -6032,16 +6175,6 @@ class GetThreadResponse(DataClassJsonMixin): thread: "ThreadStateResponse" = dc_field(metadata=dc_config(field_name="thread")) -@dataclass -class GetUserModerationReportResponse(DataClassJsonMixin): - duration: str = dc_field(metadata=dc_config(field_name="duration")) - user_blocks: "List[UserBlock]" = dc_field( - metadata=dc_config(field_name="user_blocks") - ) - user_mutes: "List[UserMute]" = dc_field(metadata=dc_config(field_name="user_mutes")) - user: "UserResponse" = dc_field(metadata=dc_config(field_name="user")) - - @dataclass class GoLiveRequest(DataClassJsonMixin): recording_storage_name: Optional[str] = dc_field( @@ -6056,9 +6189,6 @@ class GoLiveRequest(DataClassJsonMixin): start_recording: Optional[bool] = dc_field( default=None, metadata=dc_config(field_name="start_recording") ) - start_rtmp_broadcasts: Optional[bool] = dc_field( - default=None, metadata=dc_config(field_name="start_rtmp_broadcasts") - ) start_transcription: Optional[bool] = dc_field( default=None, metadata=dc_config(field_name="start_transcription") ) @@ -6697,6 +6827,9 @@ class Message(DataClassJsonMixin): own_reactions: "List[Reaction]" = dc_field( metadata=dc_config(field_name="own_reactions") ) + restricted_visibility: List[str] = dc_field( + metadata=dc_config(field_name="restricted_visibility") + ) custom: Dict[str, object] = dc_field(metadata=dc_config(field_name="custom")) reaction_counts: "Dict[str, int]" = dc_field( metadata=dc_config(field_name="reaction_counts") @@ -7022,9 +7155,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") @@ -7037,6 +7168,13 @@ class MessageNewEvent(DataClassJsonMixin): ) +@dataclass +class MessageOptions(DataClassJsonMixin): + include_thread_participants: Optional[bool] = dc_field( + default=None, metadata=dc_config(field_name="include_thread_participants") + ) + + @dataclass class MessagePaginationParams(DataClassJsonMixin): pass @@ -7129,6 +7267,9 @@ class MessageRequest(DataClassJsonMixin): mentioned_users: Optional[List[str]] = dc_field( default=None, metadata=dc_config(field_name="mentioned_users") ) + restricted_visibility: Optional[List[str]] = dc_field( + default=None, metadata=dc_config(field_name="restricted_visibility") + ) custom: Optional[Dict[str, object]] = dc_field( default=None, metadata=dc_config(field_name="custom") ) @@ -7179,6 +7320,9 @@ class MessageResponse(DataClassJsonMixin): own_reactions: "List[ReactionResponse]" = dc_field( metadata=dc_config(field_name="own_reactions") ) + restricted_visibility: List[str] = dc_field( + metadata=dc_config(field_name="restricted_visibility") + ) custom: Dict[str, object] = dc_field(metadata=dc_config(field_name="custom")) reaction_counts: "Dict[str, int]" = dc_field( metadata=dc_config(field_name="reaction_counts") @@ -7242,6 +7386,9 @@ class MessageResponse(DataClassJsonMixin): thread_participants: "Optional[List[UserResponse]]" = dc_field( default=None, metadata=dc_config(field_name="thread_participants") ) + draft: "Optional[DraftResponse]" = dc_field( + default=None, metadata=dc_config(field_name="draft") + ) i18n: "Optional[Dict[str, str]]" = dc_field( default=None, metadata=dc_config(field_name="i18n") ) @@ -7398,6 +7545,9 @@ class MessageWithChannelResponse(DataClassJsonMixin): own_reactions: "List[ReactionResponse]" = dc_field( metadata=dc_config(field_name="own_reactions") ) + restricted_visibility: List[str] = dc_field( + metadata=dc_config(field_name="restricted_visibility") + ) channel: "ChannelResponse" = dc_field(metadata=dc_config(field_name="channel")) custom: Dict[str, object] = dc_field(metadata=dc_config(field_name="custom")) reaction_counts: "Dict[str, int]" = dc_field( @@ -7462,6 +7612,9 @@ class MessageWithChannelResponse(DataClassJsonMixin): thread_participants: "Optional[List[UserResponse]]" = dc_field( default=None, metadata=dc_config(field_name="thread_participants") ) + draft: "Optional[DraftResponse]" = dc_field( + default=None, metadata=dc_config(field_name="draft") + ) i18n: "Optional[Dict[str, str]]" = dc_field( default=None, metadata=dc_config(field_name="i18n") ) @@ -7495,52 +7648,6 @@ class ModerationActionConfig(DataClassJsonMixin): custom: Dict[str, object] = dc_field(metadata=dc_config(field_name="custom")) -@dataclass -class ModerationAnalytics(DataClassJsonMixin): - total_items_moderated: int = dc_field( - metadata=dc_config(field_name="total_items_moderated") - ) - ai_image_harms: "List[Dict[str, object]]" = dc_field( - metadata=dc_config(field_name="ai_image_harms") - ) - ai_text_harms: "List[Dict[str, object]]" = dc_field( - metadata=dc_config(field_name="ai_text_harms") - ) - ai_video_harms: "List[Dict[str, object]]" = dc_field( - metadata=dc_config(field_name="ai_video_harms") - ) - blocklist_by_list: "List[Dict[str, object]]" = dc_field( - metadata=dc_config(field_name="blocklist_by_list") - ) - blocklist_matches: "List[Dict[str, object]]" = dc_field( - metadata=dc_config(field_name="blocklist_matches") - ) - model_accuracy: "List[Dict[str, object]]" = dc_field( - metadata=dc_config(field_name="model_accuracy") - ) - moderator_actions: "List[Dict[str, object]]" = dc_field( - metadata=dc_config(field_name="moderator_actions") - ) - moderator_productivity: "List[Dict[str, object]]" = dc_field( - metadata=dc_config(field_name="moderator_productivity") - ) - semantic_filter_top_matches: "List[Dict[str, object]]" = dc_field( - metadata=dc_config(field_name="semantic_filter_top_matches") - ) - sla_metrics: "List[Dict[str, object]]" = dc_field( - metadata=dc_config(field_name="sla_metrics") - ) - usage_metrics: "List[Dict[str, object]]" = dc_field( - metadata=dc_config(field_name="usage_metrics") - ) - action_distribution_over_time: "Dict[str, Dict[str, object]]" = dc_field( - metadata=dc_config(field_name="action_distribution_over_time") - ) - detection_by_engine_over_time: "Dict[str, Dict[str, object]]" = dc_field( - metadata=dc_config(field_name="detection_by_engine_over_time") - ) - - @dataclass class ModerationCustomActionEvent(DataClassJsonMixin): created_at: datetime = dc_field( @@ -7565,40 +7672,6 @@ class ModerationCustomActionEvent(DataClassJsonMixin): ) -@dataclass -class ModerationEvent(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"), - ) - ) - custom: Dict[str, object] = dc_field(metadata=dc_config(field_name="custom")) - type: str = dc_field( - default="review_queue_item.updated", 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"), - ), - ) - flags: "Optional[List[Flag2Response]]" = dc_field( - default=None, metadata=dc_config(field_name="flags") - ) - action: "Optional[ActionLogResponse]" = dc_field( - default=None, metadata=dc_config(field_name="action") - ) - review_queue_item: "Optional[ReviewQueueItemResponse]" = dc_field( - default=None, metadata=dc_config(field_name="review_queue_item") - ) - - @dataclass class ModerationFlaggedEvent(DataClassJsonMixin): created_at: datetime = dc_field( @@ -7669,31 +7742,6 @@ class ModerationResponse(DataClassJsonMixin): toxic: float = dc_field(metadata=dc_config(field_name="toxic")) -@dataclass -class ModerationUsageStats(DataClassJsonMixin): - app_pk: int = dc_field(metadata=dc_config(field_name="app_pk")) - id: int = dc_field(metadata=dc_config(field_name="id")) - organization_id: int = dc_field(metadata=dc_config(field_name="organization_id")) - reference_date: datetime = dc_field( - metadata=dc_config( - field_name="reference_date", - encoder=encode_datetime, - decoder=datetime_from_unix_ns, - mm_field=fields.DateTime(format="iso"), - ) - ) - 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"), - ) - ) - usage_amount: int = dc_field(metadata=dc_config(field_name="usage_amount")) - usage_type: str = dc_field(metadata=dc_config(field_name="usage_type")) - - @dataclass class ModerationV2Response(DataClassJsonMixin): action: str = dc_field(metadata=dc_config(field_name="action")) @@ -7715,23 +7763,6 @@ class ModerationV2Response(DataClassJsonMixin): ) -@dataclass -class ModeratorStats(DataClassJsonMixin): - id: str = dc_field(metadata=dc_config(field_name="id")) - items_reviewed: int = dc_field(metadata=dc_config(field_name="items_reviewed")) - action_counts: "Dict[str, int]" = dc_field( - metadata=dc_config(field_name="action_counts") - ) - - -@dataclass -class ModeratorStatsResponse(DataClassJsonMixin): - duration: str = dc_field(metadata=dc_config(field_name="duration")) - moderator_stats: "List[ModeratorStats]" = dc_field( - metadata=dc_config(field_name="moderator_stats") - ) - - @dataclass class MuteChannelRequest(DataClassJsonMixin): expiration: Optional[int] = dc_field( @@ -7921,6 +7952,12 @@ class NullTime(DataClassJsonMixin): pass +@dataclass +class OCRRule(DataClassJsonMixin): + action: str = dc_field(metadata=dc_config(field_name="action")) + label: str = dc_field(metadata=dc_config(field_name="label")) + + @dataclass class OnlyUserID(DataClassJsonMixin): id: str = dc_field(metadata=dc_config(field_name="id")) @@ -8051,6 +8088,9 @@ class OwnUser(DataClassJsonMixin): push_preferences: "Optional[PushPreferences]" = dc_field( default=None, metadata=dc_config(field_name="push_preferences") ) + teams_role: "Optional[Dict[str, str]]" = dc_field( + default=None, metadata=dc_config(field_name="teams_role") + ) @dataclass @@ -8142,6 +8182,15 @@ class OwnUserResponse(DataClassJsonMixin): push_preferences: "Optional[PushPreferences]" = dc_field( default=None, metadata=dc_config(field_name="push_preferences") ) + teams_role: "Optional[Dict[str, str]]" = dc_field( + default=None, metadata=dc_config(field_name="teams_role") + ) + + +@dataclass +class PagerResponse(DataClassJsonMixin): + next: Optional[str] = dc_field(default=None, metadata=dc_config(field_name="next")) + prev: Optional[str] = dc_field(default=None, metadata=dc_config(field_name="prev")) @dataclass @@ -9005,6 +9054,9 @@ class QueryCampaignsRequest(DataClassJsonMixin): ) next: Optional[str] = dc_field(default=None, metadata=dc_config(field_name="next")) prev: Optional[str] = dc_field(default=None, metadata=dc_config(field_name="prev")) + user_limit: Optional[int] = dc_field( + default=None, metadata=dc_config(field_name="user_limit") + ) sort: "Optional[List[SortParamRequest]]" = dc_field( default=None, metadata=dc_config(field_name="sort") ) @@ -9062,6 +9114,35 @@ class QueryChannelsResponse(DataClassJsonMixin): ) +@dataclass +class QueryDraftsRequest(DataClassJsonMixin): + limit: Optional[int] = dc_field( + default=None, metadata=dc_config(field_name="limit") + ) + next: Optional[str] = dc_field(default=None, metadata=dc_config(field_name="next")) + prev: Optional[str] = dc_field(default=None, metadata=dc_config(field_name="prev")) + user_id: Optional[str] = dc_field( + default=None, metadata=dc_config(field_name="user_id") + ) + sort: "Optional[List[SortParamRequest]]" = dc_field( + default=None, metadata=dc_config(field_name="sort") + ) + filter: Optional[Dict[str, object]] = dc_field( + default=None, metadata=dc_config(field_name="filter") + ) + user: "Optional[UserRequest]" = dc_field( + default=None, metadata=dc_config(field_name="user") + ) + + +@dataclass +class QueryDraftsResponse(DataClassJsonMixin): + duration: str = dc_field(metadata=dc_config(field_name="duration")) + drafts: "List[DraftResponse]" = dc_field(metadata=dc_config(field_name="drafts")) + next: Optional[str] = dc_field(default=None, metadata=dc_config(field_name="next")) + prev: Optional[str] = dc_field(default=None, metadata=dc_config(field_name="prev")) + + @dataclass class QueryFeedModerationTemplate(DataClassJsonMixin): created_at: datetime = dc_field( @@ -9418,31 +9499,6 @@ class QueryThreadsRequest(DataClassJsonMixin): 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 -class QueryThreadsResponse(DataClassJsonMixin): - duration: str = dc_field(metadata=dc_config(field_name="duration")) - threads: "List[ThreadStateResponse]" = dc_field( - metadata=dc_config(field_name="threads") - ) - next: Optional[str] = dc_field(default=None, metadata=dc_config(field_name="next")) - prev: Optional[str] = dc_field(default=None, metadata=dc_config(field_name="prev")) - - -@dataclass -class QueryUsageStatsRequest(DataClassJsonMixin): - limit: Optional[int] = dc_field( - default=None, metadata=dc_config(field_name="limit") - ) - next: Optional[str] = dc_field(default=None, metadata=dc_config(field_name="next")) - prev: Optional[str] = dc_field(default=None, metadata=dc_config(field_name="prev")) - user_id: Optional[str] = dc_field( - default=None, metadata=dc_config(field_name="user_id") - ) sort: "Optional[List[SortParamRequest]]" = dc_field( default=None, metadata=dc_config(field_name="sort") ) @@ -9455,10 +9511,10 @@ class QueryUsageStatsRequest(DataClassJsonMixin): @dataclass -class QueryUsageStatsResponse(DataClassJsonMixin): +class QueryThreadsResponse(DataClassJsonMixin): duration: str = dc_field(metadata=dc_config(field_name="duration")) - items: "List[ModerationUsageStats]" = dc_field( - metadata=dc_config(field_name="items") + threads: "List[ThreadStateResponse]" = dc_field( + metadata=dc_config(field_name="threads") ) next: Optional[str] = dc_field(default=None, metadata=dc_config(field_name="next")) prev: Optional[str] = dc_field(default=None, metadata=dc_config(field_name="prev")) @@ -9523,17 +9579,6 @@ class QueryUsersResponse(DataClassJsonMixin): users: "List[FullUserResponse]" = dc_field(metadata=dc_config(field_name="users")) -@dataclass -class QueueStatsResponse(DataClassJsonMixin): - avg_time_to_action: int = dc_field( - metadata=dc_config(field_name="avg_time_to_action") - ) - duration: str = dc_field(metadata=dc_config(field_name="duration")) - time_to_action_buckets: "Dict[str, int]" = dc_field( - metadata=dc_config(field_name="time_to_action_buckets") - ) - - @dataclass class RTMPBroadcastRequest(DataClassJsonMixin): name: str = dc_field(metadata=dc_config(field_name="name")) @@ -9939,6 +9984,7 @@ class RestoreUsersRequest(DataClassJsonMixin): class ReviewQueueItem(DataClassJsonMixin): ai_text_severity: str = dc_field(metadata=dc_config(field_name="ai_text_severity")) bounce_count: int = dc_field(metadata=dc_config(field_name="bounce_count")) + config_key: str = dc_field(metadata=dc_config(field_name="config_key")) content_changed: bool = dc_field(metadata=dc_config(field_name="content_changed")) created_at: datetime = dc_field( metadata=dc_config( @@ -9950,6 +9996,7 @@ class ReviewQueueItem(DataClassJsonMixin): ) entity_id: str = dc_field(metadata=dc_config(field_name="entity_id")) entity_type: str = dc_field(metadata=dc_config(field_name="entity_type")) + flags_count: int = dc_field(metadata=dc_config(field_name="flags_count")) has_image: bool = dc_field(metadata=dc_config(field_name="has_image")) has_text: bool = dc_field(metadata=dc_config(field_name="has_text")) has_video: bool = dc_field(metadata=dc_config(field_name="has_video")) @@ -9973,10 +10020,13 @@ class ReviewQueueItem(DataClassJsonMixin): ) actions: "List[ActionLog]" = dc_field(metadata=dc_config(field_name="actions")) bans: "List[Ban]" = dc_field(metadata=dc_config(field_name="bans")) - flags: "List[Flag2]" = dc_field(metadata=dc_config(field_name="flags")) + 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")) 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") + ) assigned_to: "Optional[User]" = dc_field( default=None, metadata=dc_config(field_name="assigned_to") ) @@ -9995,6 +10045,43 @@ class ReviewQueueItem(DataClassJsonMixin): moderation_payload: "Optional[ModerationPayload]" = dc_field( default=None, metadata=dc_config(field_name="moderation_payload") ) + reaction: "Optional[Reaction]" = dc_field( + default=None, metadata=dc_config(field_name="reaction") + ) + + +@dataclass +class ReviewQueueItemNewEvent(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"), + ) + ) + custom: Dict[str, object] = dc_field(metadata=dc_config(field_name="custom")) + type: str = dc_field( + default="review_queue_item.new", 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"), + ), + ) + flags: "Optional[List[FlagResponse]]" = dc_field( + default=None, metadata=dc_config(field_name="flags") + ) + action: "Optional[ActionLogResponse]" = dc_field( + default=None, metadata=dc_config(field_name="action") + ) + review_queue_item: "Optional[ReviewQueueItemResponse]" = dc_field( + default=None, metadata=dc_config(field_name="review_queue_item") + ) @dataclass @@ -10010,6 +10097,7 @@ class ReviewQueueItemResponse(DataClassJsonMixin): ) entity_id: str = dc_field(metadata=dc_config(field_name="entity_id")) 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")) recommended_action: str = dc_field( metadata=dc_config(field_name="recommended_action") @@ -10029,7 +10117,7 @@ class ReviewQueueItemResponse(DataClassJsonMixin): metadata=dc_config(field_name="actions") ) bans: "List[Ban]" = dc_field(metadata=dc_config(field_name="bans")) - flags: "List[Flag2Response]" = dc_field(metadata=dc_config(field_name="flags")) + flags: "List[FlagResponse]" = dc_field(metadata=dc_config(field_name="flags")) languages: List[str] = dc_field(metadata=dc_config(field_name="languages")) completed_at: Optional[datetime] = dc_field( default=None, @@ -10040,6 +10128,9 @@ class ReviewQueueItemResponse(DataClassJsonMixin): mm_field=fields.DateTime(format="iso"), ), ) + config_key: Optional[str] = dc_field( + default=None, metadata=dc_config(field_name="config_key") + ) entity_creator_id: Optional[str] = dc_field( default=None, metadata=dc_config(field_name="entity_creator_id") ) @@ -10055,6 +10146,9 @@ class ReviewQueueItemResponse(DataClassJsonMixin): teams: Optional[List[str]] = dc_field( default=None, metadata=dc_config(field_name="teams") ) + activity: "Optional[EnrichedActivity]" = dc_field( + default=None, metadata=dc_config(field_name="activity") + ) assigned_to: "Optional[UserResponse]" = dc_field( default=None, metadata=dc_config(field_name="assigned_to") ) @@ -10073,6 +10167,43 @@ class ReviewQueueItemResponse(DataClassJsonMixin): moderation_payload: "Optional[ModerationPayload]" = dc_field( default=None, metadata=dc_config(field_name="moderation_payload") ) + reaction: "Optional[Reaction]" = dc_field( + default=None, metadata=dc_config(field_name="reaction") + ) + + +@dataclass +class ReviewQueueItemUpdatedEvent(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"), + ) + ) + custom: Dict[str, object] = dc_field(metadata=dc_config(field_name="custom")) + type: str = dc_field( + default="review_queue_item.updated", 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"), + ), + ) + flags: "Optional[List[FlagResponse]]" = dc_field( + default=None, metadata=dc_config(field_name="flags") + ) + action: "Optional[ActionLogResponse]" = dc_field( + default=None, metadata=dc_config(field_name="action") + ) + review_queue_item: "Optional[ReviewQueueItemResponse]" = dc_field( + default=None, metadata=dc_config(field_name="review_queue_item") + ) @dataclass @@ -10226,6 +10357,9 @@ class SearchPayload(DataClassJsonMixin): message_filter_conditions: Optional[Dict[str, object]] = dc_field( default=None, metadata=dc_config(field_name="message_filter_conditions") ) + message_options: "Optional[MessageOptions]" = dc_field( + default=None, metadata=dc_config(field_name="message_options") + ) @dataclass @@ -10290,6 +10424,9 @@ class SearchResultMessage(DataClassJsonMixin): own_reactions: "List[ReactionResponse]" = dc_field( metadata=dc_config(field_name="own_reactions") ) + restricted_visibility: List[str] = dc_field( + metadata=dc_config(field_name="restricted_visibility") + ) custom: Dict[str, object] = dc_field(metadata=dc_config(field_name="custom")) reaction_counts: "Dict[str, int]" = dc_field( metadata=dc_config(field_name="reaction_counts") @@ -10356,6 +10493,9 @@ class SearchResultMessage(DataClassJsonMixin): channel: "Optional[ChannelResponse]" = dc_field( default=None, metadata=dc_config(field_name="channel") ) + draft: "Optional[DraftResponse]" = dc_field( + default=None, metadata=dc_config(field_name="draft") + ) i18n: "Optional[Dict[str, str]]" = dc_field( default=None, metadata=dc_config(field_name="i18n") ) @@ -10591,6 +10731,11 @@ class SessionSettingsResponse(DataClassJsonMixin): ) +@dataclass +class ShadowBlockActionRequest(DataClassJsonMixin): + pass + + @dataclass class ShowChannelRequest(DataClassJsonMixin): user_id: Optional[str] = dc_field( @@ -10644,6 +10789,9 @@ class StartCampaignResponse(DataClassJsonMixin): campaign: "Optional[CampaignResponse]" = dc_field( default=None, metadata=dc_config(field_name="campaign") ) + users: "Optional[PagerResponse]" = dc_field( + default=None, metadata=dc_config(field_name="users") + ) @dataclass @@ -11091,6 +11239,9 @@ class ThreadStateResponse(DataClassJsonMixin): created_by: "Optional[UserResponse]" = dc_field( default=None, metadata=dc_config(field_name="created_by") ) + draft: "Optional[DraftResponse]" = dc_field( + default=None, metadata=dc_config(field_name="draft") + ) parent_message: "Optional[MessageResponse]" = dc_field( default=None, metadata=dc_config(field_name="parent_message") ) @@ -11472,6 +11623,9 @@ class UpdateAppRequest(DataClassJsonMixin): feeds_v2_region: Optional[str] = dc_field( default=None, metadata=dc_config(field_name="feeds_v2_region") ) + guest_user_creation_disabled: Optional[bool] = dc_field( + default=None, metadata=dc_config(field_name="guest_user_creation_disabled") + ) image_moderation_enabled: Optional[bool] = dc_field( default=None, metadata=dc_config(field_name="image_moderation_enabled") ) @@ -12333,6 +12487,7 @@ class User(DataClassJsonMixin): online: bool = dc_field(metadata=dc_config(field_name="online")) role: str = dc_field(metadata=dc_config(field_name="role")) custom: Dict[str, object] = dc_field(metadata=dc_config(field_name="custom")) + teams_role: "Dict[str, str]" = dc_field(metadata=dc_config(field_name="teams_role")) ban_expires: Optional[datetime] = dc_field( default=None, metadata=dc_config( @@ -12453,22 +12608,6 @@ class UserBannedEvent(DataClassJsonMixin): ) -@dataclass -class UserBlock(DataClassJsonMixin): - blocked_by_user_id: str = dc_field( - metadata=dc_config(field_name="blocked_by_user_id") - ) - blocked_user_id: str = dc_field(metadata=dc_config(field_name="blocked_user_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"), - ) - ) - - @dataclass class UserCustomEventRequest(DataClassJsonMixin): type: str = dc_field(metadata=dc_config(field_name="type")) @@ -12721,6 +12860,9 @@ class UserRequest(DataClassJsonMixin): privacy_settings: "Optional[PrivacySettingsResponse]" = dc_field( default=None, metadata=dc_config(field_name="privacy_settings") ) + teams_role: "Optional[Dict[str, str]]" = dc_field( + default=None, metadata=dc_config(field_name="teams_role") + ) @dataclass @@ -12811,6 +12953,9 @@ class UserResponse(DataClassJsonMixin): push_notifications: "Optional[PushNotificationSettingsResponse]" = dc_field( default=None, metadata=dc_config(field_name="push_notifications") ) + teams_role: "Optional[Dict[str, str]]" = dc_field( + default=None, metadata=dc_config(field_name="teams_role") + ) @dataclass @@ -12881,6 +13026,9 @@ class UserResponseCommonFields(DataClassJsonMixin): mm_field=fields.DateTime(format="iso"), ), ) + teams_role: "Optional[Dict[str, str]]" = dc_field( + default=None, metadata=dc_config(field_name="teams_role") + ) @dataclass @@ -12957,6 +13105,9 @@ class UserResponsePrivacyFields(DataClassJsonMixin): privacy_settings: "Optional[PrivacySettingsResponse]" = dc_field( default=None, metadata=dc_config(field_name="privacy_settings") ) + teams_role: "Optional[Dict[str, str]]" = dc_field( + default=None, metadata=dc_config(field_name="teams_role") + ) @dataclass @@ -13070,6 +13221,9 @@ class UserSessionStats(DataClassJsonMixin): subsessions: "Optional[List[Subsession]]" = dc_field( default=None, metadata=dc_config(field_name="subsessions") ) + fps: "Optional[FPSStats]" = dc_field( + default=None, metadata=dc_config(field_name="fps") + ) geolocation: "Optional[GeolocationResult]" = dc_field( default=None, metadata=dc_config(field_name="geolocation") ) @@ -13118,6 +13272,9 @@ class UserStats(DataClassJsonMixin): metadata=dc_config(field_name="session_stats") ) info: "UserInfoResponse" = dc_field(metadata=dc_config(field_name="info")) + feedback: Optional[str] = dc_field( + default=None, metadata=dc_config(field_name="feedback") + ) rating: Optional[int] = dc_field( default=None, metadata=dc_config(field_name="rating") ) @@ -13213,9 +13370,11 @@ class UserUpdatedEvent(DataClassJsonMixin): @dataclass class VelocityFilterConfig(DataClassJsonMixin): + advanced_filters: bool = dc_field(metadata=dc_config(field_name="advanced_filters")) cascading_actions: bool = dc_field( metadata=dc_config(field_name="cascading_actions") ) + cids_per_user: int = dc_field(metadata=dc_config(field_name="cids_per_user")) enabled: bool = dc_field(metadata=dc_config(field_name="enabled")) first_message_only: bool = dc_field( metadata=dc_config(field_name="first_message_only") @@ -13244,11 +13403,13 @@ class VelocityFilterConfigRule(DataClassJsonMixin): ) fast_spam_ttl: int = dc_field(metadata=dc_config(field_name="fast_spam_ttl")) ip_ban: bool = dc_field(metadata=dc_config(field_name="ip_ban")) + probation_period: int = dc_field(metadata=dc_config(field_name="probation_period")) shadow_ban: bool = dc_field(metadata=dc_config(field_name="shadow_ban")) slow_spam_threshold: int = dc_field( metadata=dc_config(field_name="slow_spam_threshold") ) slow_spam_ttl: int = dc_field(metadata=dc_config(field_name="slow_spam_ttl")) + url_only: bool = dc_field(metadata=dc_config(field_name="url_only")) slow_spam_ban_duration: Optional[int] = dc_field( default=None, metadata=dc_config(field_name="slow_spam_ban_duration") ) diff --git a/getstream/video/call.py b/getstream/video/call.py index 451524ed..81b7b1ff 100644 --- a/getstream/video/call.py +++ b/getstream/video/call.py @@ -16,36 +16,13 @@ def _sync_from_response(self, data): if hasattr(data, "call") and isinstance(data.call, CallResponse): self.custom_data = data.call.custom - def connect_openai( - self, openai_api_key, agent_user_id, model="gpt-4o-realtime-preview" - ): - from .openai import get_openai_realtime_client, ConnectionManagerWrapper - - client = get_openai_realtime_client(openai_api_key, self.client.base_url) - token = self.client.stream.create_token(agent_user_id) - connection_manager = client.beta.realtime.connect( - extra_query={ - "call_type": self.call_type, - "call_id": self.id, - "api_key": self.client.api_key, - }, - model=model, - extra_headers={ - "Authorization": f"Bearer {openai_api_key}", - "OpenAI-Beta": "realtime=v1", - "Stream-Authorization": token, - }, - ) - - # Wrap the connection manager to check for errors in the first message - return ConnectionManagerWrapper(connection_manager, self.call_type, self.id) - def get( self, members_limit: Optional[int] = None, ring: Optional[bool] = None, notify: Optional[bool] = None, video: Optional[bool] = None, + member_ids: Optional[List[str]] = None, ) -> StreamResponse[GetCallResponse]: response = self.client.get_call( type=self.call_type, @@ -54,6 +31,7 @@ def get( ring=ring, notify=notify, video=video, + member_ids=member_ids, ) self._sync_from_response(response.data) return response @@ -146,7 +124,6 @@ def go_live( start_closed_caption: Optional[bool] = None, start_hls: Optional[bool] = None, start_recording: Optional[bool] = None, - start_rtmp_broadcasts: Optional[bool] = None, start_transcription: Optional[bool] = None, transcription_storage_name: Optional[str] = None, ) -> StreamResponse[GoLiveResponse]: @@ -157,7 +134,6 @@ def go_live( start_closed_caption=start_closed_caption, start_hls=start_hls, start_recording=start_recording, - start_rtmp_broadcasts=start_rtmp_broadcasts, start_transcription=start_transcription, transcription_storage_name=transcription_storage_name, ) @@ -430,4 +406,18 @@ def delete_transcription( self._sync_from_response(response.data) return response + def ring( + self, member_ids: Optional[List[str]] = None + ) -> StreamResponse[GetCallResponse]: + """ + Ring method as a shorthand for call.get({ ring: true }). + + Args: + member_ids: Optional list of member IDs to ring + + Returns: + StreamResponse[GetCallResponse] from the get_call operation with ring=True + """ + return self.get(ring=True, member_ids=member_ids) + create = get_or_create diff --git a/getstream/video/rest_client.py b/getstream/video/rest_client.py index 3582d154..97de49b9 100644 --- a/getstream/video/rest_client.py +++ b/getstream/video/rest_client.py @@ -96,9 +96,14 @@ def get_call( ring: Optional[bool] = None, notify: Optional[bool] = None, video: Optional[bool] = None, + member_ids: Optional[List[str]] = None, ) -> StreamResponse[GetCallResponse]: query_params = build_query_param( - members_limit=members_limit, ring=ring, notify=notify, video=video + members_limit=members_limit, + ring=ring, + notify=notify, + video=video, + member_ids=member_ids, ) path_params = { "type": type, @@ -256,7 +261,6 @@ def go_live( start_closed_caption: Optional[bool] = None, start_hls: Optional[bool] = None, start_recording: Optional[bool] = None, - start_rtmp_broadcasts: Optional[bool] = None, start_transcription: Optional[bool] = None, transcription_storage_name: Optional[str] = None, ) -> StreamResponse[GoLiveResponse]: @@ -269,7 +273,6 @@ def go_live( start_closed_caption=start_closed_caption, start_hls=start_hls, start_recording=start_recording, - start_rtmp_broadcasts=start_rtmp_broadcasts, start_transcription=start_transcription, transcription_storage_name=transcription_storage_name, ) diff --git a/tests/test_video_examples.py b/tests/test_video_examples.py index c93a052e..e2b8936d 100644 --- a/tests/test_video_examples.py +++ b/tests/test_video_examples.py @@ -7,6 +7,7 @@ from getstream.models import ( CallRequest, CallSettingsRequest, + MemberRequest, ScreensharingSettingsRequest, OwnCapability, LimitsSettingsRequest, @@ -447,3 +448,37 @@ async def test_event_representation(): for key, value in event_dict.items(): assert f"{key}=" in event_str assert str(repr(value)) in event_str + + + +def test_ring_individual_members(client: Stream, get_user): + """Test ringing individual members in a call.""" + call_id = str(uuid.uuid4()) + call = client.video.call("default", call_id) + + # Create users + myself = get_user(name="myself") + my_friend = get_user(name="my-friend") + my_other_friend = get_user(name="my-other-friend") + + # Create call with two members + call.get_or_create( + data=CallRequest( + created_by_id=myself.id, + members=[ + MemberRequest(user_id=myself.id), + MemberRequest(user_id=my_friend.id) + ], + ) + ) + + # Ring existing member + response = call.ring(member_ids=[my_friend.id]) + assert response.status_code() == 200 + + # Add and ring a new member + call.update_call_members( + update_members=[{"user_id": my_other_friend.id}] + ) + response = call.ring(member_ids=[my_other_friend.id]) + assert response.status_code() == 200