diff --git a/getstream/chat/rest_client.py b/getstream/chat/rest_client.py index cb070c4e..45bc07c9 100644 --- a/getstream/chat/rest_client.py +++ b/getstream/chat/rest_client.py @@ -645,6 +645,7 @@ def create_channel_type( typing_events: Optional[bool] = None, uploads: Optional[bool] = None, url_enrichment: Optional[bool] = None, + user_message_reminders: Optional[bool] = None, blocklists: Optional[List[BlockListOptions]] = None, commands: Optional[List[str]] = None, permissions: Optional[List[PolicyRequest]] = None, @@ -674,6 +675,7 @@ def create_channel_type( typing_events=typing_events, uploads=uploads, url_enrichment=url_enrichment, + user_message_reminders=user_message_reminders, blocklists=blocklists, commands=commands, permissions=permissions, @@ -730,6 +732,7 @@ def update_channel_type( typing_events: Optional[bool] = None, uploads: Optional[bool] = None, url_enrichment: Optional[bool] = None, + user_message_reminders: Optional[bool] = None, allowed_flag_reasons: Optional[List[str]] = None, blocklists: Optional[List[BlockListOptions]] = None, commands: Optional[List[str]] = None, @@ -764,6 +767,7 @@ def update_channel_type( typing_events=typing_events, uploads=uploads, url_enrichment=url_enrichment, + user_message_reminders=user_message_reminders, allowed_flag_reasons=allowed_flag_reasons, blocklists=blocklists, commands=commands, @@ -1171,6 +1175,59 @@ def remove_poll_vote( path_params=path_params, ) + def delete_reminder( + self, message_id: str, user_id: Optional[str] = None + ) -> StreamResponse[DeleteReminderResponse]: + query_params = build_query_param(user_id=user_id) + path_params = { + "message_id": message_id, + } + + return self.delete( + "/api/v2/chat/messages/{message_id}/reminders", + DeleteReminderResponse, + query_params=query_params, + path_params=path_params, + ) + + def update_reminder( + self, + message_id: str, + remind_at: Optional[datetime] = None, + user_id: Optional[str] = None, + user: Optional[UserRequest] = None, + ) -> StreamResponse[UpdateReminderResponse]: + path_params = { + "message_id": message_id, + } + json = build_body_dict(remind_at=remind_at, user_id=user_id, user=user) + + return self.patch( + "/api/v2/chat/messages/{message_id}/reminders", + UpdateReminderResponse, + path_params=path_params, + json=json, + ) + + def create_reminder( + self, + message_id: str, + remind_at: Optional[datetime] = None, + user_id: Optional[str] = None, + user: Optional[UserRequest] = None, + ) -> StreamResponse[ReminderResponseData]: + path_params = { + "message_id": message_id, + } + json = build_body_dict(remind_at=remind_at, user_id=user_id, user=user) + + return self.post( + "/api/v2/chat/messages/{message_id}/reminders", + ReminderResponseData, + path_params=path_params, + json=json, + ) + def get_replies( self, parent_id: str, @@ -1551,6 +1608,30 @@ def query_banned_users( query_params=query_params, ) + def query_reminders( + 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[QueryRemindersResponse]: + 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/reminders/query", QueryRemindersResponse, json=json + ) + def search( self, payload: Optional[SearchPayload] = None ) -> StreamResponse[SearchResponse]: diff --git a/getstream/common/rest_client.py b/getstream/common/rest_client.py index 7ce3a49e..45928998 100644 --- a/getstream/common/rest_client.py +++ b/getstream/common/rest_client.py @@ -55,6 +55,7 @@ def update_app( sqs_url: Optional[str] = None, webhook_url: Optional[str] = None, allowed_flag_reasons: Optional[List[str]] = None, + event_hooks: Optional[List[EventHook]] = None, image_moderation_block_labels: Optional[List[str]] = None, image_moderation_labels: Optional[List[str]] = None, user_search_disallowed_roles: Optional[List[str]] = None, @@ -103,6 +104,7 @@ def update_app( sqs_url=sqs_url, webhook_url=webhook_url, allowed_flag_reasons=allowed_flag_reasons, + event_hooks=event_hooks, image_moderation_block_labels=image_moderation_block_labels, image_moderation_labels=image_moderation_labels, user_search_disallowed_roles=user_search_disallowed_roles, @@ -190,6 +192,7 @@ def update_block_list( def check_push( self, apn_template: Optional[str] = None, + event_type: Optional[str] = None, firebase_data_template: Optional[str] = None, firebase_template: Optional[str] = None, message_id: Optional[str] = None, @@ -201,6 +204,7 @@ def check_push( ) -> StreamResponse[CheckPushResponse]: json = build_body_dict( apn_template=apn_template, + event_type=event_type, firebase_data_template=firebase_data_template, firebase_template=firebase_template, message_id=message_id, @@ -472,6 +476,33 @@ def get_task(self, id: str) -> StreamResponse[GetTaskResponse]: return self.get("/api/v2/tasks/{id}", GetTaskResponse, path_params=path_params) + def delete_file(self, url: Optional[str] = None) -> StreamResponse[Response]: + query_params = build_query_param(url=url) + + return self.delete("/api/v2/uploads/file", Response, query_params=query_params) + + def upload_file( + self, file: Optional[str] = None, user: Optional[OnlyUserID] = None + ) -> StreamResponse[FileUploadResponse]: + json = build_body_dict(file=file, user=user) + + return self.post("/api/v2/uploads/file", FileUploadResponse, json=json) + + def delete_image(self, url: Optional[str] = None) -> StreamResponse[Response]: + query_params = build_query_param(url=url) + + return self.delete("/api/v2/uploads/image", Response, query_params=query_params) + + def upload_image( + self, + file: Optional[str] = None, + upload_sizes: Optional[List[ImageSize]] = None, + user: Optional[OnlyUserID] = None, + ) -> StreamResponse[ImageUploadResponse]: + json = build_body_dict(file=file, upload_sizes=upload_sizes, user=user) + + return self.post("/api/v2/uploads/image", ImageUploadResponse, json=json) + def query_users( self, payload: Optional[QueryUsersPayload] = None ) -> StreamResponse[QueryUsersResponse]: diff --git a/getstream/models/__init__.py b/getstream/models/__init__.py index c85174a4..5032c546 100644 --- a/getstream/models/__init__.py +++ b/getstream/models/__init__.py @@ -212,6 +212,17 @@ class ActionLogResponse(DataClassJsonMixin): ) +@dataclass +class ActionSequence(DataClassJsonMixin): + action: str = dc_field(metadata=dc_config(field_name="action")) + blur: bool = dc_field(metadata=dc_config(field_name="blur")) + cooldown_period: int = dc_field(metadata=dc_config(field_name="cooldown_period")) + threshold: int = dc_field(metadata=dc_config(field_name="threshold")) + time_window: int = dc_field(metadata=dc_config(field_name="time_window")) + warning: bool = dc_field(metadata=dc_config(field_name="warning")) + warning_text: str = dc_field(metadata=dc_config(field_name="warning_text")) + + @dataclass class AnyEvent(DataClassJsonMixin): created_at: datetime = dc_field( @@ -285,7 +296,11 @@ class AppResponseFields(DataClassJsonMixin): suspended_explanation: str = dc_field( metadata=dc_config(field_name="suspended_explanation") ) + use_hook_v2: bool = dc_field(metadata=dc_config(field_name="use_hook_v2")) webhook_url: str = dc_field(metadata=dc_config(field_name="webhook_url")) + event_hooks: "List[EventHook]" = dc_field( + metadata=dc_config(field_name="event_hooks") + ) user_search_disallowed_roles: List[str] = dc_field( metadata=dc_config(field_name="user_search_disallowed_roles") ) @@ -295,7 +310,7 @@ class AppResponseFields(DataClassJsonMixin): call_types: "Dict[str, Optional[CallType]]" = dc_field( metadata=dc_config(field_name="call_types") ) - channel_configs: "Dict[str, Optional[ChannelConfig]]" = dc_field( + channel_configs: "Dict[str, ChannelConfig]" = dc_field( metadata=dc_config(field_name="channel_configs") ) file_upload_config: "FileUploadConfig" = dc_field( @@ -1713,6 +1728,43 @@ class CallMissedEvent(DataClassJsonMixin): type: str = dc_field(default="call.missed", metadata=dc_config(field_name="type")) +@dataclass +class CallModerationBlurEvent(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"), + ) + ) + user_id: str = dc_field(metadata=dc_config(field_name="user_id")) + custom: Dict[str, object] = dc_field(metadata=dc_config(field_name="custom")) + type: str = dc_field( + default="call.moderation_blur", metadata=dc_config(field_name="type") + ) + + +@dataclass +class CallModerationWarningEvent(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"), + ) + ) + message: str = dc_field(metadata=dc_config(field_name="message")) + user_id: str = dc_field(metadata=dc_config(field_name="user_id")) + custom: Dict[str, object] = dc_field(metadata=dc_config(field_name="custom")) + type: str = dc_field( + default="call.moderation_warning", metadata=dc_config(field_name="type") + ) + + @dataclass class CallNotificationEvent(DataClassJsonMixin): call_cid: str = dc_field(metadata=dc_config(field_name="call_cid")) @@ -2692,6 +2744,9 @@ class CallTranscriptionFailedEvent(DataClassJsonMixin): type: str = dc_field( default="call.transcription_failed", metadata=dc_config(field_name="type") ) + error: Optional[str] = dc_field( + default=None, metadata=dc_config(field_name="error") + ) @dataclass @@ -2759,9 +2814,6 @@ class CallType(DataClassJsonMixin): mm_field=fields.DateTime(format="iso"), ) ) - enable_live_insights: bool = dc_field( - metadata=dc_config(field_name="EnableLiveInsights") - ) external_storage: str = dc_field(metadata=dc_config(field_name="ExternalStorage")) name: str = dc_field(metadata=dc_config(field_name="Name")) pk: int = dc_field(metadata=dc_config(field_name="PK")) @@ -3196,6 +3248,9 @@ class ChannelConfig(DataClassJsonMixin): ) uploads: bool = dc_field(metadata=dc_config(field_name="uploads")) url_enrichment: bool = dc_field(metadata=dc_config(field_name="url_enrichment")) + user_message_reminders: bool = dc_field( + metadata=dc_config(field_name="user_message_reminders") + ) commands: List[str] = dc_field(metadata=dc_config(field_name="commands")) blocklist: Optional[str] = dc_field( default=None, metadata=dc_config(field_name="blocklist") @@ -3206,7 +3261,7 @@ class ChannelConfig(DataClassJsonMixin): partition_size: Optional[int] = dc_field( default=None, metadata=dc_config(field_name="partition_size") ) - partition_ttl: Optional[str] = dc_field( + partition_ttl: Optional[int] = dc_field( default=None, metadata=dc_config(field_name="partition_ttl") ) allowed_flag_reasons: Optional[List[str]] = dc_field( @@ -3266,6 +3321,9 @@ class ChannelConfigWithInfo(DataClassJsonMixin): ) uploads: bool = dc_field(metadata=dc_config(field_name="uploads")) url_enrichment: bool = dc_field(metadata=dc_config(field_name="url_enrichment")) + user_message_reminders: bool = dc_field( + metadata=dc_config(field_name="user_message_reminders") + ) commands: "List[Command]" = dc_field(metadata=dc_config(field_name="commands")) blocklist: Optional[str] = dc_field( default=None, metadata=dc_config(field_name="blocklist") @@ -4055,6 +4113,9 @@ class ChannelTypeConfig(DataClassJsonMixin): ) uploads: bool = dc_field(metadata=dc_config(field_name="uploads")) url_enrichment: bool = dc_field(metadata=dc_config(field_name="url_enrichment")) + user_message_reminders: bool = dc_field( + metadata=dc_config(field_name="user_message_reminders") + ) commands: "List[Command]" = dc_field(metadata=dc_config(field_name="commands")) permissions: "List[PolicyRequest]" = dc_field( metadata=dc_config(field_name="permissions") @@ -4186,6 +4247,9 @@ class CheckPushRequest(DataClassJsonMixin): apn_template: Optional[str] = dc_field( default=None, metadata=dc_config(field_name="apn_template") ) + event_type: Optional[str] = dc_field( + default=None, metadata=dc_config(field_name="event_type") + ) firebase_data_template: Optional[str] = dc_field( default=None, metadata=dc_config(field_name="firebase_data_template") ) @@ -4215,6 +4279,9 @@ class CheckPushRequest(DataClassJsonMixin): @dataclass class CheckPushResponse(DataClassJsonMixin): duration: str = dc_field(metadata=dc_config(field_name="duration")) + event_type: Optional[str] = dc_field( + default=None, metadata=dc_config(field_name="event_type") + ) rendered_apn_template: Optional[str] = dc_field( default=None, metadata=dc_config(field_name="rendered_apn_template") ) @@ -4449,6 +4516,9 @@ class ConfigOverrides(DataClassJsonMixin): url_enrichment: Optional[bool] = dc_field( default=None, metadata=dc_config(field_name="url_enrichment") ) + user_message_reminders: Optional[bool] = dc_field( + default=None, metadata=dc_config(field_name="user_message_reminders") + ) @dataclass @@ -4500,6 +4570,9 @@ class ConfigResponse(DataClassJsonMixin): velocity_filter_config: "Optional[VelocityFilterConfig]" = dc_field( default=None, metadata=dc_config(field_name="velocity_filter_config") ) + video_call_rule_config: "Optional[VideoCallRuleConfig]" = dc_field( + default=None, metadata=dc_config(field_name="video_call_rule_config") + ) @dataclass @@ -4646,6 +4719,9 @@ class CreateChannelTypeRequest(DataClassJsonMixin): url_enrichment: Optional[bool] = dc_field( default=None, metadata=dc_config(field_name="url_enrichment") ) + user_message_reminders: Optional[bool] = dc_field( + default=None, metadata=dc_config(field_name="user_message_reminders") + ) blocklists: "Optional[List[BlockListOptions]]" = dc_field( default=None, metadata=dc_config(field_name="blocklists") ) @@ -4707,6 +4783,9 @@ class CreateChannelTypeResponse(DataClassJsonMixin): ) uploads: bool = dc_field(metadata=dc_config(field_name="uploads")) url_enrichment: bool = dc_field(metadata=dc_config(field_name="url_enrichment")) + user_message_reminders: bool = dc_field( + metadata=dc_config(field_name="user_message_reminders") + ) commands: List[str] = dc_field(metadata=dc_config(field_name="commands")) permissions: "List[PolicyRequest]" = dc_field( metadata=dc_config(field_name="permissions") @@ -4887,6 +4966,25 @@ class CreatePollRequest(DataClassJsonMixin): ) +@dataclass +class CreateReminderRequest(DataClassJsonMixin): + remind_at: Optional[datetime] = dc_field( + default=None, + metadata=dc_config( + field_name="remind_at", + encoder=encode_datetime, + decoder=datetime_from_unix_ns, + mm_field=fields.DateTime(format="iso"), + ), + ) + 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 CreateRoleRequest(DataClassJsonMixin): name: str = dc_field(metadata=dc_config(field_name="name")) @@ -5166,6 +5264,11 @@ class DeleteRecordingResponse(DataClassJsonMixin): duration: str = dc_field(metadata=dc_config(field_name="duration")) +@dataclass +class DeleteReminderResponse(DataClassJsonMixin): + duration: str = dc_field(metadata=dc_config(field_name="duration")) + + @dataclass class DeleteSegmentTargetsRequest(DataClassJsonMixin): target_ids: List[str] = dc_field(metadata=dc_config(field_name="target_ids")) @@ -5711,6 +5814,83 @@ class ErrorResult(DataClassJsonMixin): ) +@dataclass +class EventHook(DataClassJsonMixin): + created_at: Optional[datetime] = dc_field( + default=None, + metadata=dc_config( + field_name="created_at", + encoder=encode_datetime, + decoder=datetime_from_unix_ns, + mm_field=fields.DateTime(format="iso"), + ), + ) + enabled: Optional[bool] = dc_field( + default=None, metadata=dc_config(field_name="enabled") + ) + hook_type: Optional[str] = dc_field( + default=None, metadata=dc_config(field_name="hook_type") + ) + id: Optional[str] = dc_field(default=None, metadata=dc_config(field_name="id")) + sns_auth_type: Optional[str] = dc_field( + default=None, metadata=dc_config(field_name="sns_auth_type") + ) + sns_key: Optional[str] = dc_field( + default=None, metadata=dc_config(field_name="sns_key") + ) + sns_region: Optional[str] = dc_field( + default=None, metadata=dc_config(field_name="sns_region") + ) + sns_role_arn: Optional[str] = dc_field( + default=None, metadata=dc_config(field_name="sns_role_arn") + ) + sns_secret: Optional[str] = dc_field( + default=None, metadata=dc_config(field_name="sns_secret") + ) + sns_topic_arn: Optional[str] = dc_field( + default=None, metadata=dc_config(field_name="sns_topic_arn") + ) + sqs_auth_type: Optional[str] = dc_field( + default=None, metadata=dc_config(field_name="sqs_auth_type") + ) + sqs_key: Optional[str] = dc_field( + default=None, metadata=dc_config(field_name="sqs_key") + ) + sqs_queue_url: Optional[str] = dc_field( + default=None, metadata=dc_config(field_name="sqs_queue_url") + ) + sqs_region: Optional[str] = dc_field( + default=None, metadata=dc_config(field_name="sqs_region") + ) + sqs_role_arn: Optional[str] = dc_field( + default=None, metadata=dc_config(field_name="sqs_role_arn") + ) + sqs_secret: Optional[str] = dc_field( + default=None, metadata=dc_config(field_name="sqs_secret") + ) + timeout_ms: Optional[int] = dc_field( + default=None, metadata=dc_config(field_name="timeout_ms") + ) + updated_at: Optional[datetime] = dc_field( + default=None, + metadata=dc_config( + field_name="updated_at", + encoder=encode_datetime, + decoder=datetime_from_unix_ns, + mm_field=fields.DateTime(format="iso"), + ), + ) + webhook_url: Optional[str] = dc_field( + default=None, metadata=dc_config(field_name="webhook_url") + ) + event_types: Optional[List[str]] = dc_field( + default=None, metadata=dc_config(field_name="event_types") + ) + callback: "Optional[AsyncModerationCallbackConfig]" = dc_field( + default=None, metadata=dc_config(field_name="callback") + ) + + @dataclass class EventNotificationSettings(DataClassJsonMixin): enabled: bool = dc_field(metadata=dc_config(field_name="enabled")) @@ -6307,6 +6487,9 @@ class GetCallReportResponse(DataClassJsonMixin): duration: str = dc_field(metadata=dc_config(field_name="duration")) session_id: str = dc_field(metadata=dc_config(field_name="session_id")) report: "ReportResponse" = dc_field(metadata=dc_config(field_name="report")) + video_reactions: "Optional[List[VideoReactionsResponse]]" = dc_field( + default=None, metadata=dc_config(field_name="video_reactions") + ) chat_activity: "Optional[ChatActivityStatsResponse]" = dc_field( default=None, metadata=dc_config(field_name="chat_activity") ) @@ -6412,6 +6595,9 @@ class GetChannelTypeResponse(DataClassJsonMixin): ) uploads: bool = dc_field(metadata=dc_config(field_name="uploads")) url_enrichment: bool = dc_field(metadata=dc_config(field_name="url_enrichment")) + user_message_reminders: bool = dc_field( + metadata=dc_config(field_name="user_message_reminders") + ) commands: "List[Command]" = dc_field(metadata=dc_config(field_name="commands")) permissions: "List[PolicyRequest]" = dc_field( metadata=dc_config(field_name="permissions") @@ -6807,6 +6993,14 @@ class HLSSettingsResponse(DataClassJsonMixin): layout: "LayoutSettingsResponse" = dc_field(metadata=dc_config(field_name="layout")) +@dataclass +class HarmConfig(DataClassJsonMixin): + severity: int = dc_field(metadata=dc_config(field_name="severity")) + action_sequences: "List[ActionSequence]" = dc_field( + metadata=dc_config(field_name="action_sequences") + ) + + @dataclass class HideChannelRequest(DataClassJsonMixin): clear_history: Optional[bool] = dc_field( @@ -7463,6 +7657,9 @@ class Message(DataClassJsonMixin): quoted_message: "Optional[Message]" = dc_field( default=None, metadata=dc_config(field_name="quoted_message") ) + reminder: "Optional[MessageReminder]" = dc_field( + default=None, metadata=dc_config(field_name="reminder") + ) user: "Optional[User]" = dc_field( default=None, metadata=dc_config(field_name="user") ) @@ -7764,6 +7961,48 @@ class MessageReadEvent(DataClassJsonMixin): ) +@dataclass +class MessageReminder(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_id: str = dc_field(metadata=dc_config(field_name="message_id")) + 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"), + ) + ) + user_id: str = dc_field(metadata=dc_config(field_name="user_id")) + remind_at: Optional[datetime] = dc_field( + default=None, + metadata=dc_config( + field_name="remind_at", + encoder=encode_datetime, + decoder=datetime_from_unix_ns, + mm_field=fields.DateTime(format="iso"), + ), + ) + 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") + ) + user: "Optional[User]" = dc_field( + default=None, metadata=dc_config(field_name="user") + ) + + @dataclass class MessageRequest(DataClassJsonMixin): html: Optional[str] = dc_field(default=None, metadata=dc_config(field_name="html")) @@ -7959,6 +8198,9 @@ class MessageResponse(DataClassJsonMixin): reaction_groups: "Optional[Dict[str, Optional[ReactionGroupResponse]]]" = dc_field( default=None, metadata=dc_config(field_name="reaction_groups") ) + reminder: "Optional[ReminderResponseData]" = dc_field( + default=None, metadata=dc_config(field_name="reminder") + ) @dataclass @@ -8192,6 +8434,9 @@ class MessageWithChannelResponse(DataClassJsonMixin): reaction_groups: "Optional[Dict[str, Optional[ReactionGroupResponse]]]" = dc_field( default=None, metadata=dc_config(field_name="reaction_groups") ) + reminder: "Optional[ReminderResponseData]" = dc_field( + default=None, metadata=dc_config(field_name="reminder") + ) @dataclass @@ -10147,6 +10392,37 @@ class QueryReactionsResponse(DataClassJsonMixin): prev: Optional[str] = dc_field(default=None, metadata=dc_config(field_name="prev")) +@dataclass +class QueryRemindersRequest(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 QueryRemindersResponse(DataClassJsonMixin): + duration: str = dc_field(metadata=dc_config(field_name="duration")) + reminders: "List[ReminderResponseData]" = dc_field( + metadata=dc_config(field_name="reminders") + ) + 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 QueryReviewQueueRequest(DataClassJsonMixin): limit: Optional[int] = dc_field( @@ -10738,6 +11014,47 @@ class RecordingEgressConfig(DataClassJsonMixin): ) +@dataclass +class ReminderResponseData(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_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")) + remind_at: Optional[datetime] = dc_field( + default=None, + metadata=dc_config( + field_name="remind_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[Message]" = dc_field( + default=None, metadata=dc_config(field_name="message") + ) + user: "Optional[User]" = dc_field( + default=None, metadata=dc_config(field_name="user") + ) + + @dataclass class ReportByHistogramBucket(DataClassJsonMixin): category: str = dc_field(metadata=dc_config(field_name="category")) @@ -11420,6 +11737,9 @@ class SearchResultMessage(DataClassJsonMixin): reaction_groups: "Optional[Dict[str, Optional[ReactionGroupResponse]]]" = dc_field( default=None, metadata=dc_config(field_name="reaction_groups") ) + reminder: "Optional[ReminderResponseData]" = dc_field( + default=None, metadata=dc_config(field_name="reminder") + ) @dataclass @@ -12588,6 +12908,9 @@ class UpdateAppRequest(DataClassJsonMixin): allowed_flag_reasons: Optional[List[str]] = dc_field( default=None, metadata=dc_config(field_name="allowed_flag_reasons") ) + event_hooks: "Optional[List[EventHook]]" = dc_field( + default=None, metadata=dc_config(field_name="event_hooks") + ) image_moderation_block_labels: Optional[List[str]] = dc_field( default=None, metadata=dc_config(field_name="image_moderation_block_labels") ) @@ -12903,6 +13226,9 @@ class UpdateChannelTypeRequest(DataClassJsonMixin): url_enrichment: Optional[bool] = dc_field( default=None, metadata=dc_config(field_name="url_enrichment") ) + user_message_reminders: Optional[bool] = dc_field( + default=None, metadata=dc_config(field_name="user_message_reminders") + ) allowed_flag_reasons: Optional[List[str]] = dc_field( default=None, metadata=dc_config(field_name="allowed_flag_reasons") ) @@ -12970,6 +13296,9 @@ class UpdateChannelTypeResponse(DataClassJsonMixin): ) uploads: bool = dc_field(metadata=dc_config(field_name="uploads")) url_enrichment: bool = dc_field(metadata=dc_config(field_name="url_enrichment")) + user_message_reminders: bool = dc_field( + metadata=dc_config(field_name="user_message_reminders") + ) commands: List[str] = dc_field(metadata=dc_config(field_name="commands")) permissions: "List[PolicyRequest]" = dc_field( metadata=dc_config(field_name="permissions") @@ -13176,6 +13505,33 @@ class UpdatePollRequest(DataClassJsonMixin): ) +@dataclass +class UpdateReminderRequest(DataClassJsonMixin): + remind_at: Optional[datetime] = dc_field( + default=None, + metadata=dc_config( + field_name="remind_at", + encoder=encode_datetime, + decoder=datetime_from_unix_ns, + mm_field=fields.DateTime(format="iso"), + ), + ) + 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 UpdateReminderResponse(DataClassJsonMixin): + duration: str = dc_field(metadata=dc_config(field_name="duration")) + reminder: "ReminderResponseData" = dc_field( + metadata=dc_config(field_name="reminder") + ) + + @dataclass class UpdateThreadPartialRequest(DataClassJsonMixin): user_id: Optional[str] = dc_field( @@ -13321,6 +13677,9 @@ class UpsertConfigRequest(DataClassJsonMixin): velocity_filter_config: "Optional[VelocityFilterConfig]" = dc_field( default=None, metadata=dc_config(field_name="velocity_filter_config") ) + video_call_rule_config: "Optional[VideoCallRuleConfig]" = dc_field( + default=None, metadata=dc_config(field_name="video_call_rule_config") + ) @dataclass @@ -14178,6 +14537,11 @@ class VelocityFilterConfigRule(DataClassJsonMixin): ) +@dataclass +class VideoCallRuleConfig(DataClassJsonMixin): + rules: "Dict[str, HarmConfig]" = dc_field(metadata=dc_config(field_name="rules")) + + @dataclass class VideoEndCallRequest(DataClassJsonMixin): pass @@ -14195,6 +14559,21 @@ class VideoOrientation(DataClassJsonMixin): ) +@dataclass +class VideoReactionOverTimeResponse(DataClassJsonMixin): + by_minute: "Optional[List[CountByMinuteResponse]]" = dc_field( + default=None, metadata=dc_config(field_name="by_minute") + ) + + +@dataclass +class VideoReactionsResponse(DataClassJsonMixin): + reaction: str = dc_field(metadata=dc_config(field_name="reaction")) + count_over_time: "Optional[VideoReactionOverTimeResponse]" = dc_field( + default=None, metadata=dc_config(field_name="count_over_time") + ) + + @dataclass class VideoSettings(DataClassJsonMixin): access_request_enabled: bool = dc_field( diff --git a/getstream/moderation/rest_client.py b/getstream/moderation/rest_client.py index e9073a16..c51448f7 100644 --- a/getstream/moderation/rest_client.py +++ b/getstream/moderation/rest_client.py @@ -107,6 +107,7 @@ def upsert_config( rule_builder_config: Optional[RuleBuilderConfig] = None, user: Optional[UserRequest] = None, velocity_filter_config: Optional[VelocityFilterConfig] = None, + video_call_rule_config: Optional[VideoCallRuleConfig] = None, ) -> StreamResponse[UpsertConfigResponse]: json = build_body_dict( key=key, @@ -126,6 +127,7 @@ def upsert_config( rule_builder_config=rule_builder_config, user=user, velocity_filter_config=velocity_filter_config, + video_call_rule_config=video_call_rule_config, ) return self.post("/api/v2/moderation/config", UpsertConfigResponse, json=json) diff --git a/getstream/stream.py b/getstream/stream.py index 0d66ceaa..713733bf 100644 --- a/getstream/stream.py +++ b/getstream/stream.py @@ -70,7 +70,7 @@ def chat(self): timeout=self.timeout, stream=self, ) - + @cached_property def moderation(self): """ diff --git a/uv.lock b/uv.lock index e4c79726..e8609520 100644 --- a/uv.lock +++ b/uv.lock @@ -148,7 +148,7 @@ wheels = [ [[package]] name = "getstream" -version = "2.1.0" +version = "2.2.1" source = { editable = "." } dependencies = [ { name = "dataclasses-json" },