diff --git a/getstream/chat/async_rest_client.py b/getstream/chat/async_rest_client.py index 3b5f9cdc..1454872a 100644 --- a/getstream/chat/async_rest_client.py +++ b/getstream/chat/async_rest_client.py @@ -42,12 +42,14 @@ async def query_campaigns( filter: Optional[Dict[str, object]] = None, ) -> StreamResponse[QueryCampaignsResponse]: json = build_body_dict( - limit=limit, - next=next, - prev=prev, - user_limit=user_limit, - sort=sort, - filter=filter, + **{ + "limit": limit, + "next": next, + "prev": prev, + "user_limit": user_limit, + "sort": sort, + "filter": filter, + } ) return await self.post( "/api/v2/chat/campaigns/query", QueryCampaignsResponse, json=json @@ -61,7 +63,7 @@ async def get_campaign( next: Optional[str] = None, limit: Optional[int] = None, ) -> StreamResponse[GetCampaignResponse]: - query_params = build_query_param(prev=prev, next=next, limit=limit) + query_params = build_query_param(**{"prev": prev, "next": next, "limit": limit}) path_params = { "id": id, } @@ -82,7 +84,7 @@ async def start_campaign( path_params = { "id": id, } - json = build_body_dict(scheduled_for=scheduled_for, stop_at=stop_at) + json = build_body_dict(**{"scheduled_for": scheduled_for, "stop_at": stop_at}) return await self.post( "/api/v2/chat/campaigns/{id}/start", StartCampaignResponse, @@ -98,7 +100,7 @@ async def schedule_campaign( path_params = { "id": id, } - json = build_body_dict() + json = build_body_dict(**{}) return await self.post( "/api/v2/chat/campaigns/{id}/stop", CampaignResponse, @@ -113,22 +115,30 @@ async def query_channels( member_limit: Optional[int] = None, message_limit: Optional[int] = None, offset: Optional[int] = None, + predefined_filter: Optional[str] = None, state: Optional[bool] = None, user_id: Optional[str] = None, sort: Optional[List[SortParamRequest]] = None, filter_conditions: Optional[Dict[str, object]] = None, + filter_values: Optional[Dict[str, object]] = None, + sort_values: Optional[Dict[str, object]] = None, user: Optional[UserRequest] = None, ) -> StreamResponse[QueryChannelsResponse]: json = build_body_dict( - limit=limit, - member_limit=member_limit, - message_limit=message_limit, - offset=offset, - state=state, - user_id=user_id, - sort=sort, - filter_conditions=filter_conditions, - user=user, + **{ + "limit": limit, + "member_limit": member_limit, + "message_limit": message_limit, + "offset": offset, + "predefined_filter": predefined_filter, + "state": state, + "user_id": user_id, + "sort": sort, + "filter_conditions": filter_conditions, + "filter_values": filter_values, + "sort_values": sort_values, + "user": user, + } ) return await self.post( "/api/v2/chat/channels", QueryChannelsResponse, json=json @@ -138,7 +148,7 @@ async def query_channels( async def delete_channels( self, cids: List[str], hard_delete: Optional[bool] = None ) -> StreamResponse[DeleteChannelsResponse]: - json = build_body_dict(cids=cids, hard_delete=hard_delete) + json = build_body_dict(**{"cids": cids, "hard_delete": hard_delete}) return await self.post( "/api/v2/chat/channels/delete", DeleteChannelsResponse, json=json ) @@ -149,8 +159,10 @@ async def mark_delivered( user_id: Optional[str] = None, latest_delivered_messages: Optional[List[DeliveredMessagePayload]] = None, ) -> StreamResponse[MarkDeliveredResponse]: - query_params = build_query_param(user_id=user_id) - json = build_body_dict(latest_delivered_messages=latest_delivered_messages) + query_params = build_query_param(**{"user_id": user_id}) + json = build_body_dict( + **{"latest_delivered_messages": latest_delivered_messages} + ) return await self.post( "/api/v2/chat/channels/delivered", MarkDeliveredResponse, @@ -166,7 +178,7 @@ async def mark_channels_read( user: Optional[UserRequest] = None, ) -> StreamResponse[MarkReadResponse]: json = build_body_dict( - user_id=user_id, read_by_channel=read_by_channel, user=user + **{"user_id": user_id, "read_by_channel": read_by_channel, "user": user} ) return await self.post( "/api/v2/chat/channels/read", MarkReadResponse, json=json @@ -188,13 +200,15 @@ async def get_or_create_distinct_channel( "type": type, } json = build_body_dict( - hide_for_creator=hide_for_creator, - state=state, - thread_unread_counts=thread_unread_counts, - data=data, - members=members, - messages=messages, - watchers=watchers, + **{ + "hide_for_creator": hide_for_creator, + "state": state, + "thread_unread_counts": thread_unread_counts, + "data": data, + "members": members, + "messages": messages, + "watchers": watchers, + } ) return await self.post( "/api/v2/chat/channels/{type}/query", @@ -207,7 +221,7 @@ async def get_or_create_distinct_channel( async def delete_channel( self, type: str, id: str, hard_delete: Optional[bool] = None ) -> StreamResponse[DeleteChannelResponse]: - query_params = build_query_param(hard_delete=hard_delete) + query_params = build_query_param(**{"hard_delete": hard_delete}) path_params = { "type": type, "id": id, @@ -233,7 +247,9 @@ async def update_channel_partial( "type": type, "id": id, } - json = build_body_dict(user_id=user_id, unset=unset, set=set, user=user) + json = build_body_dict( + **{"user_id": user_id, "unset": unset, "set": set, "user": user} + ) return await self.patch( "/api/v2/chat/channels/{type}/{id}", UpdateChannelPartialResponse, @@ -270,24 +286,26 @@ async def update_channel( "id": id, } json = build_body_dict( - accept_invite=accept_invite, - cooldown=cooldown, - hide_history=hide_history, - hide_history_before=hide_history_before, - reject_invite=reject_invite, - skip_push=skip_push, - user_id=user_id, - add_filter_tags=add_filter_tags, - add_members=add_members, - add_moderators=add_moderators, - assign_roles=assign_roles, - demote_moderators=demote_moderators, - invites=invites, - remove_filter_tags=remove_filter_tags, - remove_members=remove_members, - data=data, - message=message, - user=user, + **{ + "accept_invite": accept_invite, + "cooldown": cooldown, + "hide_history": hide_history, + "hide_history_before": hide_history_before, + "reject_invite": reject_invite, + "skip_push": skip_push, + "user_id": user_id, + "add_filter_tags": add_filter_tags, + "add_members": add_members, + "add_moderators": add_moderators, + "assign_roles": assign_roles, + "demote_moderators": demote_moderators, + "invites": invites, + "remove_filter_tags": remove_filter_tags, + "remove_members": remove_members, + "data": data, + "message": message, + "user": user, + } ) return await self.post( "/api/v2/chat/channels/{type}/{id}", @@ -304,7 +322,7 @@ async def delete_draft( 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) + query_params = build_query_param(**{"parent_id": parent_id, "user_id": user_id}) path_params = { "type": type, "id": id, @@ -324,7 +342,7 @@ async def get_draft( 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) + query_params = build_query_param(**{"parent_id": parent_id, "user_id": user_id}) path_params = { "type": type, "id": id, @@ -344,7 +362,7 @@ async def send_event( "type": type, "id": id, } - json = build_body_dict(event=event) + json = build_body_dict(**{"event": event}) return await self.post( "/api/v2/chat/channels/{type}/{id}/event", EventResponse, @@ -356,7 +374,7 @@ async def send_event( async def delete_channel_file( self, type: str, id: str, url: Optional[str] = None ) -> StreamResponse[Response]: - query_params = build_query_param(url=url) + query_params = build_query_param(**{"url": url}) path_params = { "type": type, "id": id, @@ -380,7 +398,7 @@ async def upload_channel_file( "type": type, "id": id, } - json = build_body_dict(file=file, user=user) + json = build_body_dict(**{"file": file, "user": user}) return await self.post( "/api/v2/chat/channels/{type}/{id}/file", UploadChannelFileResponse, @@ -401,7 +419,9 @@ async def hide_channel( "type": type, "id": id, } - json = build_body_dict(clear_history=clear_history, user_id=user_id, user=user) + json = build_body_dict( + **{"clear_history": clear_history, "user_id": user_id, "user": user} + ) return await self.post( "/api/v2/chat/channels/{type}/{id}/hide", HideChannelResponse, @@ -413,7 +433,7 @@ async def hide_channel( async def delete_channel_image( self, type: str, id: str, url: Optional[str] = None ) -> StreamResponse[Response]: - query_params = build_query_param(url=url) + query_params = build_query_param(**{"url": url}) path_params = { "type": type, "id": id, @@ -438,7 +458,9 @@ async def upload_channel_image( "type": type, "id": id, } - json = build_body_dict(file=file, upload_sizes=upload_sizes, user=user) + json = build_body_dict( + **{"file": file, "upload_sizes": upload_sizes, "user": user} + ) return await self.post( "/api/v2/chat/channels/{type}/{id}/image", UploadChannelResponse, @@ -455,12 +477,12 @@ async def update_member_partial( unset: Optional[List[str]] = None, set: Optional[Dict[str, object]] = None, ) -> StreamResponse[UpdateMemberPartialResponse]: - query_params = build_query_param(user_id=user_id) + query_params = build_query_param(**{"user_id": user_id}) path_params = { "type": type, "id": id, } - json = build_body_dict(unset=unset, set=set) + json = build_body_dict(**{"unset": unset, "set": set}) return await self.patch( "/api/v2/chat/channels/{type}/{id}/member", UpdateMemberPartialResponse, @@ -487,13 +509,15 @@ async def send_message( "id": id, } json = build_body_dict( - message=message, - force_moderation=force_moderation, - keep_channel_hidden=keep_channel_hidden, - pending=pending, - skip_enrich_url=skip_enrich_url, - skip_push=skip_push, - pending_message_metadata=pending_message_metadata, + **{ + "message": message, + "force_moderation": force_moderation, + "keep_channel_hidden": keep_channel_hidden, + "pending": pending, + "skip_enrich_url": skip_enrich_url, + "skip_push": skip_push, + "pending_message_metadata": pending_message_metadata, + } ) return await self.post( "/api/v2/chat/channels/{type}/{id}/message", @@ -506,7 +530,7 @@ async def send_message( async def get_many_messages( self, type: str, id: str, ids: List[str] ) -> StreamResponse[GetManyMessagesResponse]: - query_params = build_query_param(ids=ids) + query_params = build_query_param(**{"ids": ids}) path_params = { "type": type, "id": id, @@ -536,13 +560,15 @@ async def get_or_create_channel( "id": id, } json = build_body_dict( - hide_for_creator=hide_for_creator, - state=state, - thread_unread_counts=thread_unread_counts, - data=data, - members=members, - messages=messages, - watchers=watchers, + **{ + "hide_for_creator": hide_for_creator, + "state": state, + "thread_unread_counts": thread_unread_counts, + "data": data, + "members": members, + "messages": messages, + "watchers": watchers, + } ) return await self.post( "/api/v2/chat/channels/{type}/{id}/query", @@ -566,7 +592,12 @@ async def mark_read( "id": id, } json = build_body_dict( - message_id=message_id, thread_id=thread_id, user_id=user_id, user=user + **{ + "message_id": message_id, + "thread_id": thread_id, + "user_id": user_id, + "user": user, + } ) return await self.post( "/api/v2/chat/channels/{type}/{id}/read", @@ -587,7 +618,7 @@ async def show_channel( "type": type, "id": id, } - json = build_body_dict(user_id=user_id, user=user) + json = build_body_dict(**{"user_id": user_id, "user": user}) return await self.post( "/api/v2/chat/channels/{type}/{id}/show", ShowChannelResponse, @@ -613,13 +644,15 @@ async def truncate_channel( "id": id, } json = build_body_dict( - hard_delete=hard_delete, - skip_push=skip_push, - truncated_at=truncated_at, - user_id=user_id, - member_ids=member_ids, - message=message, - user=user, + **{ + "hard_delete": hard_delete, + "skip_push": skip_push, + "truncated_at": truncated_at, + "user_id": user_id, + "member_ids": member_ids, + "message": message, + "user": user, + } ) return await self.post( "/api/v2/chat/channels/{type}/{id}/truncate", @@ -644,11 +677,13 @@ async def mark_unread( "id": id, } json = build_body_dict( - message_id=message_id, - message_timestamp=message_timestamp, - thread_id=thread_id, - user_id=user_id, - user=user, + **{ + "message_id": message_id, + "message_timestamp": message_timestamp, + "thread_id": thread_id, + "user_id": user_id, + "user": user, + } ) return await self.post( "/api/v2/chat/channels/{type}/{id}/unread", @@ -680,6 +715,7 @@ async def create_channel_type( partition_size: Optional[int] = None, partition_ttl: Optional[str] = None, polls: Optional[bool] = None, + push_level: Optional[str] = None, push_notifications: Optional[bool] = None, reactions: Optional[bool] = None, read_events: Optional[bool] = None, @@ -697,37 +733,40 @@ async def create_channel_type( grants: Optional[Dict[str, List[str]]] = None, ) -> StreamResponse[CreateChannelTypeResponse]: json = build_body_dict( - automod=automod, - automod_behavior=automod_behavior, - max_message_length=max_message_length, - name=name, - blocklist=blocklist, - blocklist_behavior=blocklist_behavior, - connect_events=connect_events, - count_messages=count_messages, - custom_events=custom_events, - delivery_events=delivery_events, - mark_messages_pending=mark_messages_pending, - message_retention=message_retention, - mutes=mutes, - partition_size=partition_size, - partition_ttl=partition_ttl, - polls=polls, - push_notifications=push_notifications, - reactions=reactions, - read_events=read_events, - replies=replies, - search=search, - shared_locations=shared_locations, - skip_last_msg_update_for_system_msgs=skip_last_msg_update_for_system_msgs, - typing_events=typing_events, - uploads=uploads, - url_enrichment=url_enrichment, - user_message_reminders=user_message_reminders, - blocklists=blocklists, - commands=commands, - permissions=permissions, - grants=grants, + **{ + "automod": automod, + "automod_behavior": automod_behavior, + "max_message_length": max_message_length, + "name": name, + "blocklist": blocklist, + "blocklist_behavior": blocklist_behavior, + "connect_events": connect_events, + "count_messages": count_messages, + "custom_events": custom_events, + "delivery_events": delivery_events, + "mark_messages_pending": mark_messages_pending, + "message_retention": message_retention, + "mutes": mutes, + "partition_size": partition_size, + "partition_ttl": partition_ttl, + "polls": polls, + "push_level": push_level, + "push_notifications": push_notifications, + "reactions": reactions, + "read_events": read_events, + "replies": replies, + "search": search, + "shared_locations": shared_locations, + "skip_last_msg_update_for_system_msgs": skip_last_msg_update_for_system_msgs, + "typing_events": typing_events, + "uploads": uploads, + "url_enrichment": url_enrichment, + "user_message_reminders": user_message_reminders, + "blocklists": blocklists, + "commands": commands, + "permissions": permissions, + "grants": grants, + } ) return await self.post( "/api/v2/chat/channeltypes", CreateChannelTypeResponse, json=json @@ -773,6 +812,7 @@ async def update_channel_type( partition_size: Optional[int] = None, partition_ttl: Optional[str] = None, polls: Optional[bool] = None, + push_level: Optional[str] = None, push_notifications: Optional[bool] = None, quotes: Optional[bool] = None, reactions: Optional[bool] = None, @@ -797,39 +837,42 @@ async def update_channel_type( "name": name, } json = build_body_dict( - automod=automod, - automod_behavior=automod_behavior, - max_message_length=max_message_length, - blocklist=blocklist, - blocklist_behavior=blocklist_behavior, - connect_events=connect_events, - count_messages=count_messages, - custom_events=custom_events, - delivery_events=delivery_events, - mark_messages_pending=mark_messages_pending, - mutes=mutes, - partition_size=partition_size, - partition_ttl=partition_ttl, - polls=polls, - push_notifications=push_notifications, - quotes=quotes, - reactions=reactions, - read_events=read_events, - reminders=reminders, - replies=replies, - search=search, - shared_locations=shared_locations, - skip_last_msg_update_for_system_msgs=skip_last_msg_update_for_system_msgs, - typing_events=typing_events, - uploads=uploads, - url_enrichment=url_enrichment, - user_message_reminders=user_message_reminders, - allowed_flag_reasons=allowed_flag_reasons, - blocklists=blocklists, - commands=commands, - permissions=permissions, - automod_thresholds=automod_thresholds, - grants=grants, + **{ + "automod": automod, + "automod_behavior": automod_behavior, + "max_message_length": max_message_length, + "blocklist": blocklist, + "blocklist_behavior": blocklist_behavior, + "connect_events": connect_events, + "count_messages": count_messages, + "custom_events": custom_events, + "delivery_events": delivery_events, + "mark_messages_pending": mark_messages_pending, + "mutes": mutes, + "partition_size": partition_size, + "partition_ttl": partition_ttl, + "polls": polls, + "push_level": push_level, + "push_notifications": push_notifications, + "quotes": quotes, + "reactions": reactions, + "read_events": read_events, + "reminders": reminders, + "replies": replies, + "search": search, + "shared_locations": shared_locations, + "skip_last_msg_update_for_system_msgs": skip_last_msg_update_for_system_msgs, + "typing_events": typing_events, + "uploads": uploads, + "url_enrichment": url_enrichment, + "user_message_reminders": user_message_reminders, + "allowed_flag_reasons": allowed_flag_reasons, + "blocklists": blocklists, + "commands": commands, + "permissions": permissions, + "automod_thresholds": automod_thresholds, + "grants": grants, + } ) return await self.put( "/api/v2/chat/channeltypes/{name}", @@ -850,7 +893,9 @@ async def create_command( args: Optional[str] = None, set: Optional[str] = None, ) -> StreamResponse[CreateCommandResponse]: - json = build_body_dict(description=description, name=name, args=args, set=set) + json = build_body_dict( + **{"description": description, "name": name, "args": args, "set": set} + ) return await self.post( "/api/v2/chat/commands", CreateCommandResponse, json=json ) @@ -886,7 +931,7 @@ async def update_command( path_params = { "name": name, } - json = build_body_dict(description=description, args=args, set=set) + json = build_body_dict(**{"description": description, "args": args, "set": set}) return await self.put( "/api/v2/chat/commands/{name}", UpdateCommandResponse, @@ -906,13 +951,15 @@ async def query_drafts( 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, + **{ + "limit": limit, + "next": next, + "prev": prev, + "user_id": user_id, + "sort": sort, + "filter": filter, + "user": user, + } ) return await self.post( "/api/v2/chat/drafts/query", QueryDraftsResponse, json=json @@ -929,12 +976,14 @@ async def export_channels( version: Optional[str] = None, ) -> StreamResponse[ExportChannelsResponse]: json = build_body_dict( - channels=channels, - clear_deleted_message_text=clear_deleted_message_text, - export_users=export_users, - include_soft_deleted_channels=include_soft_deleted_channels, - include_truncated_messages=include_truncated_messages, - version=version, + **{ + "channels": channels, + "clear_deleted_message_text": clear_deleted_message_text, + "export_users": export_users, + "include_soft_deleted_channels": include_soft_deleted_channels, + "include_truncated_messages": include_truncated_messages, + "version": version, + } ) return await self.post( "/api/v2/chat/export_channels", ExportChannelsResponse, json=json @@ -944,7 +993,7 @@ async def export_channels( async def query_members( self, payload: Optional[QueryMembersPayload] = None ) -> StreamResponse[MembersResponse]: - query_params = build_query_param(payload=payload) + query_params = build_query_param(**{"payload": payload}) return await self.get( "/api/v2/chat/members", MembersResponse, query_params=query_params ) @@ -959,7 +1008,13 @@ async def query_message_history( sort: Optional[List[SortParamRequest]] = None, ) -> StreamResponse[QueryMessageHistoryResponse]: json = build_body_dict( - filter=filter, limit=limit, next=next, prev=prev, sort=sort + **{ + "filter": filter, + "limit": limit, + "next": next, + "prev": prev, + "sort": sort, + } ) return await self.post( "/api/v2/chat/messages/history", QueryMessageHistoryResponse, json=json @@ -974,7 +1029,7 @@ async def delete_message( delete_for_me: Optional[bool] = None, ) -> StreamResponse[DeleteMessageResponse]: query_params = build_query_param( - hard=hard, deleted_by=deleted_by, delete_for_me=delete_for_me + **{"hard": hard, "deleted_by": deleted_by, "delete_for_me": delete_for_me} ) path_params = { "id": id, @@ -990,7 +1045,9 @@ async def delete_message( async def get_message( self, id: str, show_deleted_message: Optional[bool] = None ) -> StreamResponse[GetMessageResponse]: - query_params = build_query_param(show_deleted_message=show_deleted_message) + query_params = build_query_param( + **{"show_deleted_message": show_deleted_message} + ) path_params = { "id": id, } @@ -1013,7 +1070,11 @@ async def update_message( "id": id, } json = build_body_dict( - message=message, skip_enrich_url=skip_enrich_url, skip_push=skip_push + **{ + "message": message, + "skip_enrich_url": skip_enrich_url, + "skip_push": skip_push, + } ) return await self.post( "/api/v2/chat/messages/{id}", @@ -1027,6 +1088,7 @@ async def update_message_partial( self, id: str, skip_enrich_url: Optional[bool] = None, + skip_push: Optional[bool] = None, user_id: Optional[str] = None, unset: Optional[List[str]] = None, set: Optional[Dict[str, object]] = None, @@ -1036,11 +1098,14 @@ async def update_message_partial( "id": id, } json = build_body_dict( - skip_enrich_url=skip_enrich_url, - user_id=user_id, - unset=unset, - set=set, - user=user, + **{ + "skip_enrich_url": skip_enrich_url, + "skip_push": skip_push, + "user_id": user_id, + "unset": unset, + "set": set, + "user": user, + } ) return await self.put( "/api/v2/chat/messages/{id}", @@ -1056,14 +1121,16 @@ async def run_message_action( form_data: Dict[str, str], user_id: Optional[str] = None, user: Optional[UserRequest] = None, - ) -> StreamResponse[MessageResponse]: + ) -> StreamResponse[MessageActionResponse]: path_params = { "id": id, } - json = build_body_dict(form_data=form_data, user_id=user_id, user=user) + json = build_body_dict( + **{"form_data": form_data, "user_id": user_id, "user": user} + ) return await self.post( "/api/v2/chat/messages/{id}/action", - MessageResponse, + MessageActionResponse, path_params=path_params, json=json, ) @@ -1072,14 +1139,14 @@ async def run_message_action( async def commit_message( self, id: str, - ) -> StreamResponse[MessageResponse]: + ) -> StreamResponse[MessageActionResponse]: path_params = { "id": id, } - json = build_body_dict() + json = build_body_dict(**{}) return await self.post( "/api/v2/chat/messages/{id}/commit", - MessageResponse, + MessageActionResponse, path_params=path_params, json=json, ) @@ -1089,6 +1156,7 @@ async def ephemeral_message_update( self, id: str, skip_enrich_url: Optional[bool] = None, + skip_push: Optional[bool] = None, user_id: Optional[str] = None, unset: Optional[List[str]] = None, set: Optional[Dict[str, object]] = None, @@ -1098,11 +1166,14 @@ async def ephemeral_message_update( "id": id, } json = build_body_dict( - skip_enrich_url=skip_enrich_url, - user_id=user_id, - unset=unset, - set=set, - user=user, + **{ + "skip_enrich_url": skip_enrich_url, + "skip_push": skip_push, + "user_id": user_id, + "unset": unset, + "set": set, + "user": user, + } ) return await self.patch( "/api/v2/chat/messages/{id}/ephemeral", @@ -1123,7 +1194,11 @@ async def send_reaction( "id": id, } json = build_body_dict( - reaction=reaction, enforce_unique=enforce_unique, skip_push=skip_push + **{ + "reaction": reaction, + "enforce_unique": enforce_unique, + "skip_push": skip_push, + } ) return await self.post( "/api/v2/chat/messages/{id}/reaction", @@ -1136,7 +1211,7 @@ async def send_reaction( async def delete_reaction( self, id: str, type: str, user_id: Optional[str] = None ) -> StreamResponse[DeleteReactionResponse]: - query_params = build_query_param(user_id=user_id) + query_params = build_query_param(**{"user_id": user_id}) path_params = { "id": id, "type": type, @@ -1152,7 +1227,7 @@ async def delete_reaction( async def get_reactions( self, id: str, limit: Optional[int] = None, offset: Optional[int] = None ) -> StreamResponse[GetReactionsResponse]: - query_params = build_query_param(limit=limit, offset=offset) + query_params = build_query_param(**{"limit": limit, "offset": offset}) path_params = { "id": id, } @@ -1179,13 +1254,15 @@ async def query_reactions( "id": id, } json = build_body_dict( - limit=limit, - next=next, - prev=prev, - user_id=user_id, - sort=sort, - filter=filter, - user=user, + **{ + "limit": limit, + "next": next, + "prev": prev, + "user_id": user_id, + "sort": sort, + "filter": filter, + "user": user, + } ) return await self.post( "/api/v2/chat/messages/{id}/reactions", @@ -1197,14 +1274,14 @@ async def query_reactions( @telemetry.operation_name("getstream.api.chat.translate_message") async def translate_message( self, id: str, language: str - ) -> StreamResponse[MessageResponse]: + ) -> StreamResponse[MessageActionResponse]: path_params = { "id": id, } - json = build_body_dict(language=language) + json = build_body_dict(**{"language": language}) return await self.post( "/api/v2/chat/messages/{id}/translate", - MessageResponse, + MessageActionResponse, path_params=path_params, json=json, ) @@ -1221,7 +1298,11 @@ async def undelete_message( "id": id, } json = build_body_dict( - message=message, skip_enrich_url=skip_enrich_url, skip_push=skip_push + **{ + "message": message, + "skip_enrich_url": skip_enrich_url, + "skip_push": skip_push, + } ) return await self.post( "/api/v2/chat/messages/{id}/undelete", @@ -1243,7 +1324,7 @@ async def cast_poll_vote( "message_id": message_id, "poll_id": poll_id, } - json = build_body_dict(user_id=user_id, user=user, vote=vote) + json = build_body_dict(**{"user_id": user_id, "user": user, "vote": vote}) return await self.post( "/api/v2/chat/messages/{message_id}/polls/{poll_id}/vote", PollVoteResponse, @@ -1255,7 +1336,7 @@ async def cast_poll_vote( async def delete_poll_vote( self, message_id: str, poll_id: str, vote_id: str, user_id: Optional[str] = None ) -> StreamResponse[PollVoteResponse]: - query_params = build_query_param(user_id=user_id) + query_params = build_query_param(**{"user_id": user_id}) path_params = { "message_id": message_id, "poll_id": poll_id, @@ -1272,7 +1353,7 @@ async def delete_poll_vote( async def delete_reminder( self, message_id: str, user_id: Optional[str] = None ) -> StreamResponse[DeleteReminderResponse]: - query_params = build_query_param(user_id=user_id) + query_params = build_query_param(**{"user_id": user_id}) path_params = { "message_id": message_id, } @@ -1294,7 +1375,9 @@ async def update_reminder( path_params = { "message_id": message_id, } - json = build_body_dict(remind_at=remind_at, user_id=user_id, user=user) + json = build_body_dict( + **{"remind_at": remind_at, "user_id": user_id, "user": user} + ) return await self.patch( "/api/v2/chat/messages/{message_id}/reminders", UpdateReminderResponse, @@ -1313,7 +1396,9 @@ async def create_reminder( path_params = { "message_id": message_id, } - json = build_body_dict(remind_at=remind_at, user_id=user_id, user=user) + json = build_body_dict( + **{"remind_at": remind_at, "user_id": user_id, "user": user} + ) return await self.post( "/api/v2/chat/messages/{message_id}/reminders", ReminderResponseData, @@ -1334,13 +1419,15 @@ async def get_replies( sort: Optional[List[SortParamRequest]] = None, ) -> StreamResponse[GetRepliesResponse]: query_params = build_query_param( - limit=limit, - id_gte=id_gte, - id_gt=id_gt, - id_lte=id_lte, - id_lt=id_lt, - id_around=id_around, - sort=sort, + **{ + "limit": limit, + "id_gte": id_gte, + "id_gt": id_gt, + "id_lte": id_lte, + "id_lt": id_lt, + "id_around": id_around, + "sort": sort, + } ) path_params = { "parent_id": parent_id, @@ -1356,7 +1443,7 @@ async def get_replies( async def query_message_flags( self, payload: Optional[QueryMessageFlagsPayload] = None ) -> StreamResponse[QueryMessageFlagsResponse]: - query_params = build_query_param(payload=payload) + query_params = build_query_param(**{"payload": payload}) return await self.get( "/api/v2/chat/moderation/flags/message", QueryMessageFlagsResponse, @@ -1372,7 +1459,12 @@ async def mute_channel( user: Optional[UserRequest] = None, ) -> StreamResponse[MuteChannelResponse]: json = build_body_dict( - expiration=expiration, user_id=user_id, channel_cids=channel_cids, user=user + **{ + "expiration": expiration, + "user_id": user_id, + "channel_cids": channel_cids, + "user": user, + } ) return await self.post( "/api/v2/chat/moderation/mute/channel", MuteChannelResponse, json=json @@ -1387,7 +1479,12 @@ async def unmute_channel( user: Optional[UserRequest] = None, ) -> StreamResponse[UnmuteResponse]: json = build_body_dict( - expiration=expiration, user_id=user_id, channel_cids=channel_cids, user=user + **{ + "expiration": expiration, + "user_id": user_id, + "channel_cids": channel_cids, + "user": user, + } ) return await self.post( "/api/v2/chat/moderation/unmute/channel", UnmuteResponse, json=json @@ -1397,13 +1494,24 @@ async def unmute_channel( async def query_banned_users( self, payload: Optional[QueryBannedUsersPayload] = None ) -> StreamResponse[QueryBannedUsersResponse]: - query_params = build_query_param(payload=payload) + query_params = build_query_param(**{"payload": payload}) return await self.get( "/api/v2/chat/query_banned_users", QueryBannedUsersResponse, query_params=query_params, ) + @telemetry.operation_name("getstream.api.chat.query_future_channel_bans") + async def query_future_channel_bans( + self, payload: Optional[QueryFutureChannelBansPayload] = None + ) -> StreamResponse[QueryFutureChannelBansResponse]: + query_params = build_query_param(**{"payload": payload}) + return await self.get( + "/api/v2/chat/query_future_channel_bans", + QueryFutureChannelBansResponse, + query_params=query_params, + ) + @telemetry.operation_name("getstream.api.chat.query_reminders") async def query_reminders( self, @@ -1416,13 +1524,15 @@ async def query_reminders( 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, + **{ + "limit": limit, + "next": next, + "prev": prev, + "user_id": user_id, + "sort": sort, + "filter": filter, + "user": user, + } ) return await self.post( "/api/v2/chat/reminders/query", QueryRemindersResponse, json=json @@ -1432,7 +1542,7 @@ async def query_reminders( async def search( self, payload: Optional[SearchPayload] = None ) -> StreamResponse[SearchResponse]: - query_params = build_query_param(payload=payload) + query_params = build_query_param(**{"payload": payload}) return await self.get( "/api/v2/chat/search", SearchResponse, query_params=query_params ) @@ -1447,7 +1557,13 @@ async def query_segments( sort: Optional[List[SortParamRequest]] = None, ) -> StreamResponse[QuerySegmentsResponse]: json = build_body_dict( - filter=filter, limit=limit, next=next, prev=prev, sort=sort + **{ + "filter": filter, + "limit": limit, + "next": next, + "prev": prev, + "sort": sort, + } ) return await self.post( "/api/v2/chat/segments/query", QuerySegmentsResponse, json=json @@ -1478,7 +1594,7 @@ async def delete_segment_targets( path_params = { "id": id, } - json = build_body_dict(target_ids=target_ids) + json = build_body_dict(**{"target_ids": target_ids}) return await self.post( "/api/v2/chat/segments/{id}/deletetargets", Response, @@ -1514,7 +1630,13 @@ async def query_segment_targets( "id": id, } json = build_body_dict( - limit=limit, next=next, prev=prev, sort=sort, filter=filter + **{ + "limit": limit, + "next": next, + "prev": prev, + "Sort": sort, + "Filter": filter, + } ) return await self.post( "/api/v2/chat/segments/{id}/targets/query", @@ -1538,16 +1660,18 @@ async def query_threads( user: Optional[UserRequest] = None, ) -> StreamResponse[QueryThreadsResponse]: json = build_body_dict( - limit=limit, - member_limit=member_limit, - next=next, - participant_limit=participant_limit, - prev=prev, - reply_limit=reply_limit, - user_id=user_id, - sort=sort, - filter=filter, - user=user, + **{ + "limit": limit, + "member_limit": member_limit, + "next": next, + "participant_limit": participant_limit, + "prev": prev, + "reply_limit": reply_limit, + "user_id": user_id, + "sort": sort, + "filter": filter, + "user": user, + } ) return await self.post("/api/v2/chat/threads", QueryThreadsResponse, json=json) @@ -1560,9 +1684,11 @@ async def get_thread( member_limit: Optional[int] = None, ) -> StreamResponse[GetThreadResponse]: query_params = build_query_param( - reply_limit=reply_limit, - participant_limit=participant_limit, - member_limit=member_limit, + **{ + "reply_limit": reply_limit, + "participant_limit": participant_limit, + "member_limit": member_limit, + } ) path_params = { "message_id": message_id, @@ -1586,7 +1712,9 @@ async def update_thread_partial( path_params = { "message_id": message_id, } - json = build_body_dict(user_id=user_id, unset=unset, set=set, user=user) + json = build_body_dict( + **{"user_id": user_id, "unset": unset, "set": set, "user": user} + ) return await self.patch( "/api/v2/chat/threads/{message_id}", UpdateThreadPartialResponse, @@ -1598,7 +1726,7 @@ async def update_thread_partial( async def unread_counts( self, user_id: Optional[str] = None ) -> StreamResponse[WrappedUnreadCountsResponse]: - query_params = build_query_param(user_id=user_id) + query_params = build_query_param(**{"user_id": user_id}) return await self.get( "/api/v2/chat/unread", WrappedUnreadCountsResponse, @@ -1609,7 +1737,7 @@ async def unread_counts( async def unread_counts_batch( self, user_ids: List[str] ) -> StreamResponse[UnreadCountsBatchResponse]: - json = build_body_dict(user_ids=user_ids) + json = build_body_dict(**{"user_ids": user_ids}) return await self.post( "/api/v2/chat/unread_batch", UnreadCountsBatchResponse, json=json ) @@ -1621,7 +1749,7 @@ async def send_user_custom_event( path_params = { "user_id": user_id, } - json = build_body_dict(event=event) + json = build_body_dict(**{"event": event}) return await self.post( "/api/v2/chat/users/{user_id}/event", Response, diff --git a/getstream/chat/rest_client.py b/getstream/chat/rest_client.py index 7130c897..aaa19c17 100644 --- a/getstream/chat/rest_client.py +++ b/getstream/chat/rest_client.py @@ -42,12 +42,14 @@ def query_campaigns( filter: Optional[Dict[str, object]] = None, ) -> StreamResponse[QueryCampaignsResponse]: json = build_body_dict( - limit=limit, - next=next, - prev=prev, - user_limit=user_limit, - 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 @@ -61,7 +63,7 @@ def get_campaign( next: Optional[str] = None, limit: Optional[int] = None, ) -> StreamResponse[GetCampaignResponse]: - query_params = build_query_param(prev=prev, next=next, limit=limit) + query_params = build_query_param(**{"prev": prev, "next": next, "limit": limit}) path_params = { "id": id, } @@ -82,7 +84,7 @@ def start_campaign( path_params = { "id": id, } - json = build_body_dict(scheduled_for=scheduled_for, stop_at=stop_at) + json = build_body_dict(**{"scheduled_for": scheduled_for, "stop_at": stop_at}) return self.post( "/api/v2/chat/campaigns/{id}/start", StartCampaignResponse, @@ -98,7 +100,7 @@ def schedule_campaign( path_params = { "id": id, } - json = build_body_dict() + json = build_body_dict(**{}) return self.post( "/api/v2/chat/campaigns/{id}/stop", CampaignResponse, @@ -113,22 +115,30 @@ def query_channels( member_limit: Optional[int] = None, message_limit: Optional[int] = None, offset: Optional[int] = None, + predefined_filter: Optional[str] = None, state: Optional[bool] = None, user_id: Optional[str] = None, sort: Optional[List[SortParamRequest]] = None, filter_conditions: Optional[Dict[str, object]] = None, + filter_values: Optional[Dict[str, object]] = None, + sort_values: Optional[Dict[str, object]] = None, user: Optional[UserRequest] = None, ) -> StreamResponse[QueryChannelsResponse]: json = build_body_dict( - limit=limit, - member_limit=member_limit, - message_limit=message_limit, - offset=offset, - state=state, - user_id=user_id, - sort=sort, - filter_conditions=filter_conditions, - user=user, + **{ + "limit": limit, + "member_limit": member_limit, + "message_limit": message_limit, + "offset": offset, + "predefined_filter": predefined_filter, + "state": state, + "user_id": user_id, + "sort": sort, + "filter_conditions": filter_conditions, + "filter_values": filter_values, + "sort_values": sort_values, + "user": user, + } ) return self.post("/api/v2/chat/channels", QueryChannelsResponse, json=json) @@ -136,7 +146,7 @@ def query_channels( def delete_channels( self, cids: List[str], hard_delete: Optional[bool] = None ) -> StreamResponse[DeleteChannelsResponse]: - json = build_body_dict(cids=cids, hard_delete=hard_delete) + json = build_body_dict(**{"cids": cids, "hard_delete": hard_delete}) return self.post( "/api/v2/chat/channels/delete", DeleteChannelsResponse, json=json ) @@ -147,8 +157,10 @@ def mark_delivered( user_id: Optional[str] = None, latest_delivered_messages: Optional[List[DeliveredMessagePayload]] = None, ) -> StreamResponse[MarkDeliveredResponse]: - query_params = build_query_param(user_id=user_id) - json = build_body_dict(latest_delivered_messages=latest_delivered_messages) + query_params = build_query_param(**{"user_id": user_id}) + json = build_body_dict( + **{"latest_delivered_messages": latest_delivered_messages} + ) return self.post( "/api/v2/chat/channels/delivered", MarkDeliveredResponse, @@ -164,7 +176,7 @@ def mark_channels_read( user: Optional[UserRequest] = None, ) -> StreamResponse[MarkReadResponse]: json = build_body_dict( - user_id=user_id, read_by_channel=read_by_channel, user=user + **{"user_id": user_id, "read_by_channel": read_by_channel, "user": user} ) return self.post("/api/v2/chat/channels/read", MarkReadResponse, json=json) @@ -184,13 +196,15 @@ def get_or_create_distinct_channel( "type": type, } json = build_body_dict( - hide_for_creator=hide_for_creator, - state=state, - thread_unread_counts=thread_unread_counts, - data=data, - members=members, - messages=messages, - watchers=watchers, + **{ + "hide_for_creator": hide_for_creator, + "state": state, + "thread_unread_counts": thread_unread_counts, + "data": data, + "members": members, + "messages": messages, + "watchers": watchers, + } ) return self.post( "/api/v2/chat/channels/{type}/query", @@ -203,7 +217,7 @@ def get_or_create_distinct_channel( def delete_channel( self, type: str, id: str, hard_delete: Optional[bool] = None ) -> StreamResponse[DeleteChannelResponse]: - query_params = build_query_param(hard_delete=hard_delete) + query_params = build_query_param(**{"hard_delete": hard_delete}) path_params = { "type": type, "id": id, @@ -229,7 +243,9 @@ def update_channel_partial( "type": type, "id": id, } - json = build_body_dict(user_id=user_id, unset=unset, set=set, user=user) + json = build_body_dict( + **{"user_id": user_id, "unset": unset, "set": set, "user": user} + ) return self.patch( "/api/v2/chat/channels/{type}/{id}", UpdateChannelPartialResponse, @@ -266,24 +282,26 @@ def update_channel( "id": id, } json = build_body_dict( - accept_invite=accept_invite, - cooldown=cooldown, - hide_history=hide_history, - hide_history_before=hide_history_before, - reject_invite=reject_invite, - skip_push=skip_push, - user_id=user_id, - add_filter_tags=add_filter_tags, - add_members=add_members, - add_moderators=add_moderators, - assign_roles=assign_roles, - demote_moderators=demote_moderators, - invites=invites, - remove_filter_tags=remove_filter_tags, - remove_members=remove_members, - data=data, - message=message, - user=user, + **{ + "accept_invite": accept_invite, + "cooldown": cooldown, + "hide_history": hide_history, + "hide_history_before": hide_history_before, + "reject_invite": reject_invite, + "skip_push": skip_push, + "user_id": user_id, + "add_filter_tags": add_filter_tags, + "add_members": add_members, + "add_moderators": add_moderators, + "assign_roles": assign_roles, + "demote_moderators": demote_moderators, + "invites": invites, + "remove_filter_tags": remove_filter_tags, + "remove_members": remove_members, + "data": data, + "message": message, + "user": user, + } ) return self.post( "/api/v2/chat/channels/{type}/{id}", @@ -300,7 +318,7 @@ def delete_draft( 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) + query_params = build_query_param(**{"parent_id": parent_id, "user_id": user_id}) path_params = { "type": type, "id": id, @@ -320,7 +338,7 @@ def get_draft( 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) + query_params = build_query_param(**{"parent_id": parent_id, "user_id": user_id}) path_params = { "type": type, "id": id, @@ -340,7 +358,7 @@ def send_event( "type": type, "id": id, } - json = build_body_dict(event=event) + json = build_body_dict(**{"event": event}) return self.post( "/api/v2/chat/channels/{type}/{id}/event", EventResponse, @@ -352,7 +370,7 @@ def send_event( def delete_channel_file( self, type: str, id: str, url: Optional[str] = None ) -> StreamResponse[Response]: - query_params = build_query_param(url=url) + query_params = build_query_param(**{"url": url}) path_params = { "type": type, "id": id, @@ -376,7 +394,7 @@ def upload_channel_file( "type": type, "id": id, } - json = build_body_dict(file=file, user=user) + json = build_body_dict(**{"file": file, "user": user}) return self.post( "/api/v2/chat/channels/{type}/{id}/file", UploadChannelFileResponse, @@ -397,7 +415,9 @@ def hide_channel( "type": type, "id": id, } - json = build_body_dict(clear_history=clear_history, user_id=user_id, user=user) + json = build_body_dict( + **{"clear_history": clear_history, "user_id": user_id, "user": user} + ) return self.post( "/api/v2/chat/channels/{type}/{id}/hide", HideChannelResponse, @@ -409,7 +429,7 @@ def hide_channel( def delete_channel_image( self, type: str, id: str, url: Optional[str] = None ) -> StreamResponse[Response]: - query_params = build_query_param(url=url) + query_params = build_query_param(**{"url": url}) path_params = { "type": type, "id": id, @@ -434,7 +454,9 @@ def upload_channel_image( "type": type, "id": id, } - json = build_body_dict(file=file, upload_sizes=upload_sizes, user=user) + json = build_body_dict( + **{"file": file, "upload_sizes": upload_sizes, "user": user} + ) return self.post( "/api/v2/chat/channels/{type}/{id}/image", UploadChannelResponse, @@ -451,12 +473,12 @@ def update_member_partial( unset: Optional[List[str]] = None, set: Optional[Dict[str, object]] = None, ) -> StreamResponse[UpdateMemberPartialResponse]: - query_params = build_query_param(user_id=user_id) + query_params = build_query_param(**{"user_id": user_id}) path_params = { "type": type, "id": id, } - json = build_body_dict(unset=unset, set=set) + json = build_body_dict(**{"unset": unset, "set": set}) return self.patch( "/api/v2/chat/channels/{type}/{id}/member", UpdateMemberPartialResponse, @@ -483,13 +505,15 @@ def send_message( "id": id, } json = build_body_dict( - message=message, - force_moderation=force_moderation, - keep_channel_hidden=keep_channel_hidden, - pending=pending, - skip_enrich_url=skip_enrich_url, - skip_push=skip_push, - pending_message_metadata=pending_message_metadata, + **{ + "message": message, + "force_moderation": force_moderation, + "keep_channel_hidden": keep_channel_hidden, + "pending": pending, + "skip_enrich_url": skip_enrich_url, + "skip_push": skip_push, + "pending_message_metadata": pending_message_metadata, + } ) return self.post( "/api/v2/chat/channels/{type}/{id}/message", @@ -502,7 +526,7 @@ def send_message( def get_many_messages( self, type: str, id: str, ids: List[str] ) -> StreamResponse[GetManyMessagesResponse]: - query_params = build_query_param(ids=ids) + query_params = build_query_param(**{"ids": ids}) path_params = { "type": type, "id": id, @@ -532,13 +556,15 @@ def get_or_create_channel( "id": id, } json = build_body_dict( - hide_for_creator=hide_for_creator, - state=state, - thread_unread_counts=thread_unread_counts, - data=data, - members=members, - messages=messages, - watchers=watchers, + **{ + "hide_for_creator": hide_for_creator, + "state": state, + "thread_unread_counts": thread_unread_counts, + "data": data, + "members": members, + "messages": messages, + "watchers": watchers, + } ) return self.post( "/api/v2/chat/channels/{type}/{id}/query", @@ -562,7 +588,12 @@ def mark_read( "id": id, } json = build_body_dict( - message_id=message_id, thread_id=thread_id, user_id=user_id, user=user + **{ + "message_id": message_id, + "thread_id": thread_id, + "user_id": user_id, + "user": user, + } ) return self.post( "/api/v2/chat/channels/{type}/{id}/read", @@ -583,7 +614,7 @@ def show_channel( "type": type, "id": id, } - json = build_body_dict(user_id=user_id, user=user) + json = build_body_dict(**{"user_id": user_id, "user": user}) return self.post( "/api/v2/chat/channels/{type}/{id}/show", ShowChannelResponse, @@ -609,13 +640,15 @@ def truncate_channel( "id": id, } json = build_body_dict( - hard_delete=hard_delete, - skip_push=skip_push, - truncated_at=truncated_at, - user_id=user_id, - member_ids=member_ids, - message=message, - user=user, + **{ + "hard_delete": hard_delete, + "skip_push": skip_push, + "truncated_at": truncated_at, + "user_id": user_id, + "member_ids": member_ids, + "message": message, + "user": user, + } ) return self.post( "/api/v2/chat/channels/{type}/{id}/truncate", @@ -640,11 +673,13 @@ def mark_unread( "id": id, } json = build_body_dict( - message_id=message_id, - message_timestamp=message_timestamp, - thread_id=thread_id, - user_id=user_id, - user=user, + **{ + "message_id": message_id, + "message_timestamp": message_timestamp, + "thread_id": thread_id, + "user_id": user_id, + "user": user, + } ) return self.post( "/api/v2/chat/channels/{type}/{id}/unread", @@ -676,6 +711,7 @@ def create_channel_type( partition_size: Optional[int] = None, partition_ttl: Optional[str] = None, polls: Optional[bool] = None, + push_level: Optional[str] = None, push_notifications: Optional[bool] = None, reactions: Optional[bool] = None, read_events: Optional[bool] = None, @@ -693,37 +729,40 @@ def create_channel_type( grants: Optional[Dict[str, List[str]]] = None, ) -> StreamResponse[CreateChannelTypeResponse]: json = build_body_dict( - automod=automod, - automod_behavior=automod_behavior, - max_message_length=max_message_length, - name=name, - blocklist=blocklist, - blocklist_behavior=blocklist_behavior, - connect_events=connect_events, - count_messages=count_messages, - custom_events=custom_events, - delivery_events=delivery_events, - mark_messages_pending=mark_messages_pending, - message_retention=message_retention, - mutes=mutes, - partition_size=partition_size, - partition_ttl=partition_ttl, - polls=polls, - push_notifications=push_notifications, - reactions=reactions, - read_events=read_events, - replies=replies, - search=search, - shared_locations=shared_locations, - skip_last_msg_update_for_system_msgs=skip_last_msg_update_for_system_msgs, - typing_events=typing_events, - uploads=uploads, - url_enrichment=url_enrichment, - user_message_reminders=user_message_reminders, - blocklists=blocklists, - commands=commands, - permissions=permissions, - grants=grants, + **{ + "automod": automod, + "automod_behavior": automod_behavior, + "max_message_length": max_message_length, + "name": name, + "blocklist": blocklist, + "blocklist_behavior": blocklist_behavior, + "connect_events": connect_events, + "count_messages": count_messages, + "custom_events": custom_events, + "delivery_events": delivery_events, + "mark_messages_pending": mark_messages_pending, + "message_retention": message_retention, + "mutes": mutes, + "partition_size": partition_size, + "partition_ttl": partition_ttl, + "polls": polls, + "push_level": push_level, + "push_notifications": push_notifications, + "reactions": reactions, + "read_events": read_events, + "replies": replies, + "search": search, + "shared_locations": shared_locations, + "skip_last_msg_update_for_system_msgs": skip_last_msg_update_for_system_msgs, + "typing_events": typing_events, + "uploads": uploads, + "url_enrichment": url_enrichment, + "user_message_reminders": user_message_reminders, + "blocklists": blocklists, + "commands": commands, + "permissions": permissions, + "grants": grants, + } ) return self.post( "/api/v2/chat/channeltypes", CreateChannelTypeResponse, json=json @@ -767,6 +806,7 @@ def update_channel_type( partition_size: Optional[int] = None, partition_ttl: Optional[str] = None, polls: Optional[bool] = None, + push_level: Optional[str] = None, push_notifications: Optional[bool] = None, quotes: Optional[bool] = None, reactions: Optional[bool] = None, @@ -791,39 +831,42 @@ def update_channel_type( "name": name, } json = build_body_dict( - automod=automod, - automod_behavior=automod_behavior, - max_message_length=max_message_length, - blocklist=blocklist, - blocklist_behavior=blocklist_behavior, - connect_events=connect_events, - count_messages=count_messages, - custom_events=custom_events, - delivery_events=delivery_events, - mark_messages_pending=mark_messages_pending, - mutes=mutes, - partition_size=partition_size, - partition_ttl=partition_ttl, - polls=polls, - push_notifications=push_notifications, - quotes=quotes, - reactions=reactions, - read_events=read_events, - reminders=reminders, - replies=replies, - search=search, - shared_locations=shared_locations, - skip_last_msg_update_for_system_msgs=skip_last_msg_update_for_system_msgs, - typing_events=typing_events, - uploads=uploads, - url_enrichment=url_enrichment, - user_message_reminders=user_message_reminders, - allowed_flag_reasons=allowed_flag_reasons, - blocklists=blocklists, - commands=commands, - permissions=permissions, - automod_thresholds=automod_thresholds, - grants=grants, + **{ + "automod": automod, + "automod_behavior": automod_behavior, + "max_message_length": max_message_length, + "blocklist": blocklist, + "blocklist_behavior": blocklist_behavior, + "connect_events": connect_events, + "count_messages": count_messages, + "custom_events": custom_events, + "delivery_events": delivery_events, + "mark_messages_pending": mark_messages_pending, + "mutes": mutes, + "partition_size": partition_size, + "partition_ttl": partition_ttl, + "polls": polls, + "push_level": push_level, + "push_notifications": push_notifications, + "quotes": quotes, + "reactions": reactions, + "read_events": read_events, + "reminders": reminders, + "replies": replies, + "search": search, + "shared_locations": shared_locations, + "skip_last_msg_update_for_system_msgs": skip_last_msg_update_for_system_msgs, + "typing_events": typing_events, + "uploads": uploads, + "url_enrichment": url_enrichment, + "user_message_reminders": user_message_reminders, + "allowed_flag_reasons": allowed_flag_reasons, + "blocklists": blocklists, + "commands": commands, + "permissions": permissions, + "automod_thresholds": automod_thresholds, + "grants": grants, + } ) return self.put( "/api/v2/chat/channeltypes/{name}", @@ -844,7 +887,9 @@ def create_command( args: Optional[str] = None, set: Optional[str] = None, ) -> StreamResponse[CreateCommandResponse]: - json = build_body_dict(description=description, name=name, args=args, set=set) + json = build_body_dict( + **{"description": description, "name": name, "args": args, "set": set} + ) return self.post("/api/v2/chat/commands", CreateCommandResponse, json=json) @telemetry.operation_name("getstream.api.chat.delete_command") @@ -878,7 +923,7 @@ def update_command( path_params = { "name": name, } - json = build_body_dict(description=description, args=args, set=set) + json = build_body_dict(**{"description": description, "args": args, "set": set}) return self.put( "/api/v2/chat/commands/{name}", UpdateCommandResponse, @@ -898,13 +943,15 @@ def query_drafts( 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, + **{ + "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) @@ -919,12 +966,14 @@ def export_channels( version: Optional[str] = None, ) -> StreamResponse[ExportChannelsResponse]: json = build_body_dict( - channels=channels, - clear_deleted_message_text=clear_deleted_message_text, - export_users=export_users, - include_soft_deleted_channels=include_soft_deleted_channels, - include_truncated_messages=include_truncated_messages, - version=version, + **{ + "channels": channels, + "clear_deleted_message_text": clear_deleted_message_text, + "export_users": export_users, + "include_soft_deleted_channels": include_soft_deleted_channels, + "include_truncated_messages": include_truncated_messages, + "version": version, + } ) return self.post( "/api/v2/chat/export_channels", ExportChannelsResponse, json=json @@ -934,7 +983,7 @@ def export_channels( def query_members( self, payload: Optional[QueryMembersPayload] = None ) -> StreamResponse[MembersResponse]: - query_params = build_query_param(payload=payload) + query_params = build_query_param(**{"payload": payload}) return self.get( "/api/v2/chat/members", MembersResponse, query_params=query_params ) @@ -949,7 +998,13 @@ def query_message_history( sort: Optional[List[SortParamRequest]] = None, ) -> StreamResponse[QueryMessageHistoryResponse]: json = build_body_dict( - filter=filter, limit=limit, next=next, prev=prev, sort=sort + **{ + "filter": filter, + "limit": limit, + "next": next, + "prev": prev, + "sort": sort, + } ) return self.post( "/api/v2/chat/messages/history", QueryMessageHistoryResponse, json=json @@ -964,7 +1019,7 @@ def delete_message( delete_for_me: Optional[bool] = None, ) -> StreamResponse[DeleteMessageResponse]: query_params = build_query_param( - hard=hard, deleted_by=deleted_by, delete_for_me=delete_for_me + **{"hard": hard, "deleted_by": deleted_by, "delete_for_me": delete_for_me} ) path_params = { "id": id, @@ -980,7 +1035,9 @@ def delete_message( def get_message( self, id: str, show_deleted_message: Optional[bool] = None ) -> StreamResponse[GetMessageResponse]: - query_params = build_query_param(show_deleted_message=show_deleted_message) + query_params = build_query_param( + **{"show_deleted_message": show_deleted_message} + ) path_params = { "id": id, } @@ -1003,7 +1060,11 @@ def update_message( "id": id, } json = build_body_dict( - message=message, skip_enrich_url=skip_enrich_url, skip_push=skip_push + **{ + "message": message, + "skip_enrich_url": skip_enrich_url, + "skip_push": skip_push, + } ) return self.post( "/api/v2/chat/messages/{id}", @@ -1017,6 +1078,7 @@ def update_message_partial( self, id: str, skip_enrich_url: Optional[bool] = None, + skip_push: Optional[bool] = None, user_id: Optional[str] = None, unset: Optional[List[str]] = None, set: Optional[Dict[str, object]] = None, @@ -1026,11 +1088,14 @@ def update_message_partial( "id": id, } json = build_body_dict( - skip_enrich_url=skip_enrich_url, - user_id=user_id, - unset=unset, - set=set, - user=user, + **{ + "skip_enrich_url": skip_enrich_url, + "skip_push": skip_push, + "user_id": user_id, + "unset": unset, + "set": set, + "user": user, + } ) return self.put( "/api/v2/chat/messages/{id}", @@ -1046,14 +1111,16 @@ def run_message_action( form_data: Dict[str, str], user_id: Optional[str] = None, user: Optional[UserRequest] = None, - ) -> StreamResponse[MessageResponse]: + ) -> StreamResponse[MessageActionResponse]: path_params = { "id": id, } - json = build_body_dict(form_data=form_data, user_id=user_id, user=user) + json = build_body_dict( + **{"form_data": form_data, "user_id": user_id, "user": user} + ) return self.post( "/api/v2/chat/messages/{id}/action", - MessageResponse, + MessageActionResponse, path_params=path_params, json=json, ) @@ -1062,14 +1129,14 @@ def run_message_action( def commit_message( self, id: str, - ) -> StreamResponse[MessageResponse]: + ) -> StreamResponse[MessageActionResponse]: path_params = { "id": id, } - json = build_body_dict() + json = build_body_dict(**{}) return self.post( "/api/v2/chat/messages/{id}/commit", - MessageResponse, + MessageActionResponse, path_params=path_params, json=json, ) @@ -1079,6 +1146,7 @@ def ephemeral_message_update( self, id: str, skip_enrich_url: Optional[bool] = None, + skip_push: Optional[bool] = None, user_id: Optional[str] = None, unset: Optional[List[str]] = None, set: Optional[Dict[str, object]] = None, @@ -1088,11 +1156,14 @@ def ephemeral_message_update( "id": id, } json = build_body_dict( - skip_enrich_url=skip_enrich_url, - user_id=user_id, - unset=unset, - set=set, - user=user, + **{ + "skip_enrich_url": skip_enrich_url, + "skip_push": skip_push, + "user_id": user_id, + "unset": unset, + "set": set, + "user": user, + } ) return self.patch( "/api/v2/chat/messages/{id}/ephemeral", @@ -1113,7 +1184,11 @@ def send_reaction( "id": id, } json = build_body_dict( - reaction=reaction, enforce_unique=enforce_unique, skip_push=skip_push + **{ + "reaction": reaction, + "enforce_unique": enforce_unique, + "skip_push": skip_push, + } ) return self.post( "/api/v2/chat/messages/{id}/reaction", @@ -1126,7 +1201,7 @@ def send_reaction( def delete_reaction( self, id: str, type: str, user_id: Optional[str] = None ) -> StreamResponse[DeleteReactionResponse]: - query_params = build_query_param(user_id=user_id) + query_params = build_query_param(**{"user_id": user_id}) path_params = { "id": id, "type": type, @@ -1142,7 +1217,7 @@ def delete_reaction( def get_reactions( self, id: str, limit: Optional[int] = None, offset: Optional[int] = None ) -> StreamResponse[GetReactionsResponse]: - query_params = build_query_param(limit=limit, offset=offset) + query_params = build_query_param(**{"limit": limit, "offset": offset}) path_params = { "id": id, } @@ -1169,13 +1244,15 @@ def query_reactions( "id": id, } json = build_body_dict( - limit=limit, - next=next, - prev=prev, - user_id=user_id, - sort=sort, - filter=filter, - user=user, + **{ + "limit": limit, + "next": next, + "prev": prev, + "user_id": user_id, + "sort": sort, + "filter": filter, + "user": user, + } ) return self.post( "/api/v2/chat/messages/{id}/reactions", @@ -1187,14 +1264,14 @@ def query_reactions( @telemetry.operation_name("getstream.api.chat.translate_message") def translate_message( self, id: str, language: str - ) -> StreamResponse[MessageResponse]: + ) -> StreamResponse[MessageActionResponse]: path_params = { "id": id, } - json = build_body_dict(language=language) + json = build_body_dict(**{"language": language}) return self.post( "/api/v2/chat/messages/{id}/translate", - MessageResponse, + MessageActionResponse, path_params=path_params, json=json, ) @@ -1211,7 +1288,11 @@ def undelete_message( "id": id, } json = build_body_dict( - message=message, skip_enrich_url=skip_enrich_url, skip_push=skip_push + **{ + "message": message, + "skip_enrich_url": skip_enrich_url, + "skip_push": skip_push, + } ) return self.post( "/api/v2/chat/messages/{id}/undelete", @@ -1233,7 +1314,7 @@ def cast_poll_vote( "message_id": message_id, "poll_id": poll_id, } - json = build_body_dict(user_id=user_id, user=user, vote=vote) + json = build_body_dict(**{"user_id": user_id, "user": user, "vote": vote}) return self.post( "/api/v2/chat/messages/{message_id}/polls/{poll_id}/vote", PollVoteResponse, @@ -1245,7 +1326,7 @@ def cast_poll_vote( def delete_poll_vote( self, message_id: str, poll_id: str, vote_id: str, user_id: Optional[str] = None ) -> StreamResponse[PollVoteResponse]: - query_params = build_query_param(user_id=user_id) + query_params = build_query_param(**{"user_id": user_id}) path_params = { "message_id": message_id, "poll_id": poll_id, @@ -1262,7 +1343,7 @@ def delete_poll_vote( def delete_reminder( self, message_id: str, user_id: Optional[str] = None ) -> StreamResponse[DeleteReminderResponse]: - query_params = build_query_param(user_id=user_id) + query_params = build_query_param(**{"user_id": user_id}) path_params = { "message_id": message_id, } @@ -1284,7 +1365,9 @@ def update_reminder( path_params = { "message_id": message_id, } - json = build_body_dict(remind_at=remind_at, user_id=user_id, user=user) + 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, @@ -1303,7 +1386,9 @@ def create_reminder( path_params = { "message_id": message_id, } - json = build_body_dict(remind_at=remind_at, user_id=user_id, user=user) + 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, @@ -1324,13 +1409,15 @@ def get_replies( sort: Optional[List[SortParamRequest]] = None, ) -> StreamResponse[GetRepliesResponse]: query_params = build_query_param( - limit=limit, - id_gte=id_gte, - id_gt=id_gt, - id_lte=id_lte, - id_lt=id_lt, - id_around=id_around, - sort=sort, + **{ + "limit": limit, + "id_gte": id_gte, + "id_gt": id_gt, + "id_lte": id_lte, + "id_lt": id_lt, + "id_around": id_around, + "sort": sort, + } ) path_params = { "parent_id": parent_id, @@ -1346,7 +1433,7 @@ def get_replies( def query_message_flags( self, payload: Optional[QueryMessageFlagsPayload] = None ) -> StreamResponse[QueryMessageFlagsResponse]: - query_params = build_query_param(payload=payload) + query_params = build_query_param(**{"payload": payload}) return self.get( "/api/v2/chat/moderation/flags/message", QueryMessageFlagsResponse, @@ -1362,7 +1449,12 @@ def mute_channel( user: Optional[UserRequest] = None, ) -> StreamResponse[MuteChannelResponse]: json = build_body_dict( - expiration=expiration, user_id=user_id, channel_cids=channel_cids, user=user + **{ + "expiration": expiration, + "user_id": user_id, + "channel_cids": channel_cids, + "user": user, + } ) return self.post( "/api/v2/chat/moderation/mute/channel", MuteChannelResponse, json=json @@ -1377,7 +1469,12 @@ def unmute_channel( user: Optional[UserRequest] = None, ) -> StreamResponse[UnmuteResponse]: json = build_body_dict( - expiration=expiration, user_id=user_id, channel_cids=channel_cids, user=user + **{ + "expiration": expiration, + "user_id": user_id, + "channel_cids": channel_cids, + "user": user, + } ) return self.post( "/api/v2/chat/moderation/unmute/channel", UnmuteResponse, json=json @@ -1387,13 +1484,24 @@ def unmute_channel( def query_banned_users( self, payload: Optional[QueryBannedUsersPayload] = None ) -> StreamResponse[QueryBannedUsersResponse]: - query_params = build_query_param(payload=payload) + query_params = build_query_param(**{"payload": payload}) return self.get( "/api/v2/chat/query_banned_users", QueryBannedUsersResponse, query_params=query_params, ) + @telemetry.operation_name("getstream.api.chat.query_future_channel_bans") + def query_future_channel_bans( + self, payload: Optional[QueryFutureChannelBansPayload] = None + ) -> StreamResponse[QueryFutureChannelBansResponse]: + query_params = build_query_param(**{"payload": payload}) + return self.get( + "/api/v2/chat/query_future_channel_bans", + QueryFutureChannelBansResponse, + query_params=query_params, + ) + @telemetry.operation_name("getstream.api.chat.query_reminders") def query_reminders( self, @@ -1406,13 +1514,15 @@ def query_reminders( 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, + **{ + "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 @@ -1422,7 +1532,7 @@ def query_reminders( def search( self, payload: Optional[SearchPayload] = None ) -> StreamResponse[SearchResponse]: - query_params = build_query_param(payload=payload) + query_params = build_query_param(**{"payload": payload}) return self.get( "/api/v2/chat/search", SearchResponse, query_params=query_params ) @@ -1437,7 +1547,13 @@ def query_segments( sort: Optional[List[SortParamRequest]] = None, ) -> StreamResponse[QuerySegmentsResponse]: json = build_body_dict( - filter=filter, limit=limit, next=next, prev=prev, sort=sort + **{ + "filter": filter, + "limit": limit, + "next": next, + "prev": prev, + "sort": sort, + } ) return self.post( "/api/v2/chat/segments/query", QuerySegmentsResponse, json=json @@ -1468,7 +1584,7 @@ def delete_segment_targets( path_params = { "id": id, } - json = build_body_dict(target_ids=target_ids) + json = build_body_dict(**{"target_ids": target_ids}) return self.post( "/api/v2/chat/segments/{id}/deletetargets", Response, @@ -1504,7 +1620,13 @@ def query_segment_targets( "id": id, } json = build_body_dict( - limit=limit, next=next, prev=prev, sort=sort, filter=filter + **{ + "limit": limit, + "next": next, + "prev": prev, + "Sort": sort, + "Filter": filter, + } ) return self.post( "/api/v2/chat/segments/{id}/targets/query", @@ -1528,16 +1650,18 @@ def query_threads( user: Optional[UserRequest] = None, ) -> StreamResponse[QueryThreadsResponse]: json = build_body_dict( - limit=limit, - member_limit=member_limit, - next=next, - participant_limit=participant_limit, - prev=prev, - reply_limit=reply_limit, - user_id=user_id, - sort=sort, - filter=filter, - user=user, + **{ + "limit": limit, + "member_limit": member_limit, + "next": next, + "participant_limit": participant_limit, + "prev": prev, + "reply_limit": reply_limit, + "user_id": user_id, + "sort": sort, + "filter": filter, + "user": user, + } ) return self.post("/api/v2/chat/threads", QueryThreadsResponse, json=json) @@ -1550,9 +1674,11 @@ def get_thread( member_limit: Optional[int] = None, ) -> StreamResponse[GetThreadResponse]: query_params = build_query_param( - reply_limit=reply_limit, - participant_limit=participant_limit, - member_limit=member_limit, + **{ + "reply_limit": reply_limit, + "participant_limit": participant_limit, + "member_limit": member_limit, + } ) path_params = { "message_id": message_id, @@ -1576,7 +1702,9 @@ def update_thread_partial( path_params = { "message_id": message_id, } - json = build_body_dict(user_id=user_id, unset=unset, set=set, user=user) + json = build_body_dict( + **{"user_id": user_id, "unset": unset, "set": set, "user": user} + ) return self.patch( "/api/v2/chat/threads/{message_id}", UpdateThreadPartialResponse, @@ -1588,7 +1716,7 @@ def update_thread_partial( def unread_counts( self, user_id: Optional[str] = None ) -> StreamResponse[WrappedUnreadCountsResponse]: - query_params = build_query_param(user_id=user_id) + query_params = build_query_param(**{"user_id": user_id}) return self.get( "/api/v2/chat/unread", WrappedUnreadCountsResponse, @@ -1599,7 +1727,7 @@ def unread_counts( def unread_counts_batch( self, user_ids: List[str] ) -> StreamResponse[UnreadCountsBatchResponse]: - json = build_body_dict(user_ids=user_ids) + json = build_body_dict(**{"user_ids": user_ids}) return self.post( "/api/v2/chat/unread_batch", UnreadCountsBatchResponse, json=json ) @@ -1611,7 +1739,7 @@ def send_user_custom_event( path_params = { "user_id": user_id, } - json = build_body_dict(event=event) + json = build_body_dict(**{"event": event}) return self.post( "/api/v2/chat/users/{user_id}/event", Response, diff --git a/getstream/common/async_rest_client.py b/getstream/common/async_rest_client.py index 0f416c88..a71f281e 100644 --- a/getstream/common/async_rest_client.py +++ b/getstream/common/async_rest_client.py @@ -89,53 +89,55 @@ async def update_app( xiaomi_config: Optional[XiaomiConfig] = None, ) -> StreamResponse[Response]: json = build_body_dict( - async_url_enrich_enabled=async_url_enrich_enabled, - auto_translation_enabled=auto_translation_enabled, - before_message_send_hook_url=before_message_send_hook_url, - cdn_expiration_seconds=cdn_expiration_seconds, - channel_hide_members_only=channel_hide_members_only, - custom_action_handler_url=custom_action_handler_url, - disable_auth_checks=disable_auth_checks, - disable_permissions_checks=disable_permissions_checks, - 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, - max_aggregated_activities_length=max_aggregated_activities_length, - migrate_permissions_to_v2=migrate_permissions_to_v2, - moderation_enabled=moderation_enabled, - moderation_webhook_url=moderation_webhook_url, - multi_tenant_enabled=multi_tenant_enabled, - permission_version=permission_version, - reminders_interval=reminders_interval, - reminders_max_members=reminders_max_members, - revoke_tokens_issued_before=revoke_tokens_issued_before, - sns_key=sns_key, - sns_secret=sns_secret, - sns_topic_arn=sns_topic_arn, - sqs_key=sqs_key, - sqs_secret=sqs_secret, - sqs_url=sqs_url, - user_response_time_enabled=user_response_time_enabled, - 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, - webhook_events=webhook_events, - apn_config=apn_config, - async_moderation_config=async_moderation_config, - datadog_info=datadog_info, - file_upload_config=file_upload_config, - firebase_config=firebase_config, - grants=grants, - huawei_config=huawei_config, - image_upload_config=image_upload_config, - moderation_dashboard_preferences=moderation_dashboard_preferences, - push_config=push_config, - xiaomi_config=xiaomi_config, + **{ + "async_url_enrich_enabled": async_url_enrich_enabled, + "auto_translation_enabled": auto_translation_enabled, + "before_message_send_hook_url": before_message_send_hook_url, + "cdn_expiration_seconds": cdn_expiration_seconds, + "channel_hide_members_only": channel_hide_members_only, + "custom_action_handler_url": custom_action_handler_url, + "disable_auth_checks": disable_auth_checks, + "disable_permissions_checks": disable_permissions_checks, + "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, + "max_aggregated_activities_length": max_aggregated_activities_length, + "migrate_permissions_to_v2": migrate_permissions_to_v2, + "moderation_enabled": moderation_enabled, + "moderation_webhook_url": moderation_webhook_url, + "multi_tenant_enabled": multi_tenant_enabled, + "permission_version": permission_version, + "reminders_interval": reminders_interval, + "reminders_max_members": reminders_max_members, + "revoke_tokens_issued_before": revoke_tokens_issued_before, + "sns_key": sns_key, + "sns_secret": sns_secret, + "sns_topic_arn": sns_topic_arn, + "sqs_key": sqs_key, + "sqs_secret": sqs_secret, + "sqs_url": sqs_url, + "user_response_time_enabled": user_response_time_enabled, + "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, + "webhook_events": webhook_events, + "apn_config": apn_config, + "async_moderation_config": async_moderation_config, + "datadog_info": datadog_info, + "file_upload_config": file_upload_config, + "firebase_config": firebase_config, + "grants": grants, + "huawei_config": huawei_config, + "image_upload_config": image_upload_config, + "moderation_dashboard_preferences": moderation_dashboard_preferences, + "push_config": push_config, + "xiaomi_config": xiaomi_config, + } ) return await self.patch("/api/v2/app", Response, json=json) @@ -143,7 +145,7 @@ async def update_app( async def list_block_lists( self, team: Optional[str] = None ) -> StreamResponse[ListBlockListResponse]: - query_params = build_query_param(team=team) + query_params = build_query_param(**{"team": team}) return await self.get( "/api/v2/blocklists", ListBlockListResponse, query_params=query_params ) @@ -159,12 +161,14 @@ async def create_block_list( type: Optional[str] = None, ) -> StreamResponse[CreateBlockListResponse]: json = build_body_dict( - name=name, - words=words, - is_leet_check_enabled=is_leet_check_enabled, - is_plural_check_enabled=is_plural_check_enabled, - team=team, - type=type, + **{ + "name": name, + "words": words, + "is_leet_check_enabled": is_leet_check_enabled, + "is_plural_check_enabled": is_plural_check_enabled, + "team": team, + "type": type, + } ) return await self.post("/api/v2/blocklists", CreateBlockListResponse, json=json) @@ -172,7 +176,7 @@ async def create_block_list( async def delete_block_list( self, name: str, team: Optional[str] = None ) -> StreamResponse[Response]: - query_params = build_query_param(team=team) + query_params = build_query_param(**{"team": team}) path_params = { "name": name, } @@ -187,7 +191,7 @@ async def delete_block_list( async def get_block_list( self, name: str, team: Optional[str] = None ) -> StreamResponse[GetBlockListResponse]: - query_params = build_query_param(team=team) + query_params = build_query_param(**{"team": team}) path_params = { "name": name, } @@ -211,10 +215,12 @@ async def update_block_list( "name": name, } json = build_body_dict( - is_leet_check_enabled=is_leet_check_enabled, - is_plural_check_enabled=is_plural_check_enabled, - team=team, - words=words, + **{ + "is_leet_check_enabled": is_leet_check_enabled, + "is_plural_check_enabled": is_plural_check_enabled, + "team": team, + "words": words, + } ) return await self.put( "/api/v2/blocklists/{name}", @@ -238,16 +244,18 @@ async def check_push( user: Optional[UserRequest] = None, ) -> 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, - push_provider_name=push_provider_name, - push_provider_type=push_provider_type, - skip_devices=skip_devices, - user_id=user_id, - user=user, + **{ + "apn_template": apn_template, + "event_type": event_type, + "firebase_data_template": firebase_data_template, + "firebase_template": firebase_template, + "message_id": message_id, + "push_provider_name": push_provider_name, + "push_provider_type": push_provider_type, + "skip_devices": skip_devices, + "user_id": user_id, + "user": user, + } ) return await self.post("/api/v2/check_push", CheckPushResponse, json=json) @@ -259,7 +267,11 @@ async def check_sns( sns_topic_arn: Optional[str] = None, ) -> StreamResponse[CheckSNSResponse]: json = build_body_dict( - sns_key=sns_key, sns_secret=sns_secret, sns_topic_arn=sns_topic_arn + **{ + "sns_key": sns_key, + "sns_secret": sns_secret, + "sns_topic_arn": sns_topic_arn, + } ) return await self.post("/api/v2/check_sns", CheckSNSResponse, json=json) @@ -270,21 +282,23 @@ async def check_sqs( sqs_secret: Optional[str] = None, sqs_url: Optional[str] = None, ) -> StreamResponse[CheckSQSResponse]: - json = build_body_dict(sqs_key=sqs_key, sqs_secret=sqs_secret, sqs_url=sqs_url) + json = build_body_dict( + **{"sqs_key": sqs_key, "sqs_secret": sqs_secret, "sqs_url": sqs_url} + ) return await self.post("/api/v2/check_sqs", CheckSQSResponse, json=json) @telemetry.operation_name("getstream.api.common.delete_device") async def delete_device( self, id: str, user_id: Optional[str] = None ) -> StreamResponse[Response]: - query_params = build_query_param(id=id, user_id=user_id) + query_params = build_query_param(**{"id": id, "user_id": user_id}) return await self.delete("/api/v2/devices", Response, query_params=query_params) @telemetry.operation_name("getstream.api.common.list_devices") async def list_devices( self, user_id: Optional[str] = None ) -> StreamResponse[ListDevicesResponse]: - query_params = build_query_param(user_id=user_id) + query_params = build_query_param(**{"user_id": user_id}) return await self.get( "/api/v2/devices", ListDevicesResponse, query_params=query_params ) @@ -300,12 +314,14 @@ async def create_device( user: Optional[UserRequest] = None, ) -> StreamResponse[Response]: json = build_body_dict( - id=id, - push_provider=push_provider, - push_provider_name=push_provider_name, - user_id=user_id, - voip_token=voip_token, - user=user, + **{ + "id": id, + "push_provider": push_provider, + "push_provider_name": push_provider_name, + "user_id": user_id, + "voip_token": voip_token, + "user": user, + } ) return await self.post("/api/v2/devices", Response, json=json) @@ -313,7 +329,7 @@ async def create_device( async def export_users( self, user_ids: List[str] ) -> StreamResponse[ExportUsersResponse]: - json = build_body_dict(user_ids=user_ids) + json = build_body_dict(**{"user_ids": user_ids}) return await self.post("/api/v2/export/users", ExportUsersResponse, json=json) @telemetry.operation_name("getstream.api.common.list_external_storage") @@ -334,13 +350,15 @@ async def create_external_storage( azure_blob: Optional[AzureRequest] = None, ) -> StreamResponse[CreateExternalStorageResponse]: json = build_body_dict( - bucket=bucket, - name=name, - storage_type=storage_type, - gcs_credentials=gcs_credentials, - path=path, - aws_s3=aws_s3, - azure_blob=azure_blob, + **{ + "bucket": bucket, + "name": name, + "storage_type": storage_type, + "gcs_credentials": gcs_credentials, + "path": path, + "aws_s3": aws_s3, + "azure_blob": azure_blob, + } ) return await self.post( "/api/v2/external_storage", CreateExternalStorageResponse, json=json @@ -374,12 +392,14 @@ async def update_external_storage( "name": name, } json = build_body_dict( - bucket=bucket, - storage_type=storage_type, - gcs_credentials=gcs_credentials, - path=path, - aws_s3=aws_s3, - azure_blob=azure_blob, + **{ + "bucket": bucket, + "storage_type": storage_type, + "gcs_credentials": gcs_credentials, + "path": path, + "aws_s3": aws_s3, + "azure_blob": azure_blob, + } ) return await self.put( "/api/v2/external_storage/{name}", @@ -405,14 +425,14 @@ async def check_external_storage( async def create_guest( self, user: UserRequest ) -> StreamResponse[CreateGuestResponse]: - json = build_body_dict(user=user) + json = build_body_dict(**{"user": user}) return await self.post("/api/v2/guest", CreateGuestResponse, json=json) @telemetry.operation_name("getstream.api.common.create_import_url") async def create_import_url( self, filename: Optional[str] = None ) -> StreamResponse[CreateImportURLResponse]: - json = build_body_dict(filename=filename) + json = build_body_dict(**{"filename": filename}) return await self.post( "/api/v2/import_urls", CreateImportURLResponse, json=json ) @@ -425,14 +445,14 @@ async def list_imports(self) -> StreamResponse[ListImportsResponse]: async def create_import( self, mode: str, path: str ) -> StreamResponse[CreateImportResponse]: - json = build_body_dict(mode=mode, path=path) + json = build_body_dict(**{"mode": mode, "path": path}) return await self.post("/api/v2/imports", CreateImportResponse, json=json) @telemetry.operation_name("getstream.api.common.list_import_v2_tasks") async def list_import_v2_tasks( self, state: Optional[int] = None ) -> StreamResponse[ListImportV2TasksResponse]: - query_params = build_query_param(state=state) + query_params = build_query_param(**{"state": state}) return await self.get( "/api/v2/imports/v2", ListImportV2TasksResponse, query_params=query_params ) @@ -446,7 +466,12 @@ async def create_import_v2_task( user: Optional[UserRequest] = None, ) -> StreamResponse[CreateImportV2TaskResponse]: json = build_body_dict( - product=product, settings=settings, user_id=user_id, user=user + **{ + "product": product, + "settings": settings, + "user_id": user_id, + "user": user, + } ) return await self.post( "/api/v2/imports/v2", CreateImportV2TaskResponse, json=json @@ -487,7 +512,7 @@ async def get_import(self, id: str) -> StreamResponse[GetImportResponse]: @telemetry.operation_name("getstream.api.common.get_og") async def get_og(self, url: str) -> StreamResponse[GetOGResponse]: - query_params = build_query_param(url=url) + query_params = build_query_param(**{"url": url}) return await self.get("/api/v2/og", GetOGResponse, query_params=query_params) @telemetry.operation_name("getstream.api.common.list_permissions") @@ -525,19 +550,21 @@ async def create_poll( user: Optional[UserRequest] = None, ) -> StreamResponse[PollResponse]: json = build_body_dict( - name=name, - allow_answers=allow_answers, - allow_user_suggested_options=allow_user_suggested_options, - description=description, - enforce_unique_vote=enforce_unique_vote, - id=id, - is_closed=is_closed, - max_votes_allowed=max_votes_allowed, - user_id=user_id, - voting_visibility=voting_visibility, - options=options, - custom=custom, - user=user, + **{ + "name": name, + "allow_answers": allow_answers, + "allow_user_suggested_options": allow_user_suggested_options, + "description": description, + "enforce_unique_vote": enforce_unique_vote, + "id": id, + "is_closed": is_closed, + "max_votes_allowed": max_votes_allowed, + "user_id": user_id, + "voting_visibility": voting_visibility, + "options": options, + "Custom": custom, + "user": user, + } ) return await self.post("/api/v2/polls", PollResponse, json=json) @@ -559,19 +586,21 @@ async def update_poll( user: Optional[UserRequest] = None, ) -> StreamResponse[PollResponse]: json = build_body_dict( - id=id, - name=name, - allow_answers=allow_answers, - allow_user_suggested_options=allow_user_suggested_options, - description=description, - enforce_unique_vote=enforce_unique_vote, - is_closed=is_closed, - max_votes_allowed=max_votes_allowed, - user_id=user_id, - voting_visibility=voting_visibility, - options=options, - custom=custom, - user=user, + **{ + "id": id, + "name": name, + "allow_answers": allow_answers, + "allow_user_suggested_options": allow_user_suggested_options, + "description": description, + "enforce_unique_vote": enforce_unique_vote, + "is_closed": is_closed, + "max_votes_allowed": max_votes_allowed, + "user_id": user_id, + "voting_visibility": voting_visibility, + "options": options, + "Custom": custom, + "user": user, + } ) return await self.put("/api/v2/polls", PollResponse, json=json) @@ -585,9 +614,15 @@ async def query_polls( sort: Optional[List[SortParamRequest]] = None, filter: Optional[Dict[str, object]] = None, ) -> StreamResponse[QueryPollsResponse]: - query_params = build_query_param(user_id=user_id) + query_params = build_query_param(**{"user_id": user_id}) json = build_body_dict( - limit=limit, next=next, prev=prev, sort=sort, filter=filter + **{ + "limit": limit, + "next": next, + "prev": prev, + "sort": sort, + "filter": filter, + } ) return await self.post( "/api/v2/polls/query", @@ -600,7 +635,7 @@ async def query_polls( async def delete_poll( self, poll_id: str, user_id: Optional[str] = None ) -> StreamResponse[Response]: - query_params = build_query_param(user_id=user_id) + query_params = build_query_param(**{"user_id": user_id}) path_params = { "poll_id": poll_id, } @@ -615,7 +650,7 @@ async def delete_poll( async def get_poll( self, poll_id: str, user_id: Optional[str] = None ) -> StreamResponse[PollResponse]: - query_params = build_query_param(user_id=user_id) + query_params = build_query_param(**{"user_id": user_id}) path_params = { "poll_id": poll_id, } @@ -638,7 +673,9 @@ async def update_poll_partial( path_params = { "poll_id": poll_id, } - json = build_body_dict(user_id=user_id, unset=unset, set=set, user=user) + json = build_body_dict( + **{"user_id": user_id, "unset": unset, "set": set, "user": user} + ) return await self.patch( "/api/v2/polls/{poll_id}", PollResponse, path_params=path_params, json=json ) @@ -655,7 +692,9 @@ async def create_poll_option( path_params = { "poll_id": poll_id, } - json = build_body_dict(text=text, user_id=user_id, custom=custom, user=user) + json = build_body_dict( + **{"text": text, "user_id": user_id, "Custom": custom, "user": user} + ) return await self.post( "/api/v2/polls/{poll_id}/options", PollOptionResponse, @@ -677,7 +716,13 @@ async def update_poll_option( "poll_id": poll_id, } json = build_body_dict( - id=id, text=text, user_id=user_id, custom=custom, user=user + **{ + "id": id, + "text": text, + "user_id": user_id, + "Custom": custom, + "user": user, + } ) return await self.put( "/api/v2/polls/{poll_id}/options", @@ -690,7 +735,7 @@ async def update_poll_option( async def delete_poll_option( self, poll_id: str, option_id: str, user_id: Optional[str] = None ) -> StreamResponse[Response]: - query_params = build_query_param(user_id=user_id) + query_params = build_query_param(**{"user_id": user_id}) path_params = { "poll_id": poll_id, "option_id": option_id, @@ -706,7 +751,7 @@ async def delete_poll_option( async def get_poll_option( self, poll_id: str, option_id: str, user_id: Optional[str] = None ) -> StreamResponse[PollOptionResponse]: - query_params = build_query_param(user_id=user_id) + query_params = build_query_param(**{"user_id": user_id}) path_params = { "poll_id": poll_id, "option_id": option_id, @@ -729,12 +774,18 @@ async def query_poll_votes( sort: Optional[List[SortParamRequest]] = None, filter: Optional[Dict[str, object]] = None, ) -> StreamResponse[PollVotesResponse]: - query_params = build_query_param(user_id=user_id) + query_params = build_query_param(**{"user_id": user_id}) path_params = { "poll_id": poll_id, } json = build_body_dict( - limit=limit, next=next, prev=prev, sort=sort, filter=filter + **{ + "limit": limit, + "next": next, + "prev": prev, + "sort": sort, + "filter": filter, + } ) return await self.post( "/api/v2/polls/{poll_id}/votes", @@ -750,7 +801,7 @@ async def query_poll_votes( async def update_push_notification_preferences( self, preferences: List[PushPreferenceInput] ) -> StreamResponse[UpsertPushPreferencesResponse]: - json = build_body_dict(preferences=preferences) + json = build_body_dict(**{"preferences": preferences}) return await self.post( "/api/v2/push_preferences", UpsertPushPreferencesResponse, json=json ) @@ -761,9 +812,9 @@ async def list_push_providers(self) -> StreamResponse[ListPushProvidersResponse] @telemetry.operation_name("getstream.api.common.upsert_push_provider") async def upsert_push_provider( - self, push_provider: Optional[PushProvider] = None + self, push_provider: Optional[PushProviderRequest] = None ) -> StreamResponse[UpsertPushProviderResponse]: - json = build_body_dict(push_provider=push_provider) + json = build_body_dict(**{"push_provider": push_provider}) return await self.post( "/api/v2/push_providers", UpsertPushProviderResponse, json=json ) @@ -785,7 +836,10 @@ async def get_push_templates( self, push_provider_type: str, push_provider_name: Optional[str] = None ) -> StreamResponse[GetPushTemplatesResponse]: query_params = build_query_param( - push_provider_type=push_provider_type, push_provider_name=push_provider_name + **{ + "push_provider_type": push_provider_type, + "push_provider_name": push_provider_name, + } ) return await self.get( "/api/v2/push_templates", @@ -803,11 +857,13 @@ async def upsert_push_template( template: Optional[str] = None, ) -> StreamResponse[UpsertPushTemplateResponse]: json = build_body_dict( - event_type=event_type, - push_provider_type=push_provider_type, - enable_push=enable_push, - push_provider_name=push_provider_name, - template=template, + **{ + "event_type": event_type, + "push_provider_type": push_provider_type, + "enable_push": enable_push, + "push_provider_name": push_provider_name, + "template": template, + } ) return await self.post( "/api/v2/push_templates", UpsertPushTemplateResponse, json=json @@ -823,11 +879,13 @@ async def get_rate_limits( endpoints: Optional[str] = None, ) -> StreamResponse[GetRateLimitsResponse]: query_params = build_query_param( - server_side=server_side, - android=android, - ios=ios, - web=web, - endpoints=endpoints, + **{ + "server_side": server_side, + "android": android, + "ios": ios, + "web": web, + "endpoints": endpoints, + } ) return await self.get( "/api/v2/rate_limits", GetRateLimitsResponse, query_params=query_params @@ -839,7 +897,7 @@ async def list_roles(self) -> StreamResponse[ListRolesResponse]: @telemetry.operation_name("getstream.api.common.create_role") async def create_role(self, name: str) -> StreamResponse[CreateRoleResponse]: - json = build_body_dict(name=name) + json = build_body_dict(**{"name": name}) return await self.post("/api/v2/roles", CreateRoleResponse, json=json) @telemetry.operation_name("getstream.api.common.delete_role") @@ -862,7 +920,7 @@ async def get_task(self, id: str) -> StreamResponse[GetTaskResponse]: @telemetry.operation_name("getstream.api.common.delete_file") async def delete_file(self, url: Optional[str] = None) -> StreamResponse[Response]: - query_params = build_query_param(url=url) + query_params = build_query_param(**{"url": url}) return await self.delete( "/api/v2/uploads/file", Response, query_params=query_params ) @@ -871,12 +929,12 @@ async def delete_file(self, url: Optional[str] = None) -> StreamResponse[Respons async def upload_file( self, file: Optional[str] = None, user: Optional[OnlyUserID] = None ) -> StreamResponse[FileUploadResponse]: - json = build_body_dict(file=file, user=user) + json = build_body_dict(**{"file": file, "user": user}) return await self.post("/api/v2/uploads/file", FileUploadResponse, json=json) @telemetry.operation_name("getstream.api.common.delete_image") async def delete_image(self, url: Optional[str] = None) -> StreamResponse[Response]: - query_params = build_query_param(url=url) + query_params = build_query_param(**{"url": url}) return await self.delete( "/api/v2/uploads/image", Response, query_params=query_params ) @@ -888,14 +946,16 @@ async def upload_image( upload_sizes: Optional[List[ImageSize]] = None, user: Optional[OnlyUserID] = None, ) -> StreamResponse[ImageUploadResponse]: - json = build_body_dict(file=file, upload_sizes=upload_sizes, user=user) + json = build_body_dict( + **{"file": file, "upload_sizes": upload_sizes, "user": user} + ) return await self.post("/api/v2/uploads/image", ImageUploadResponse, json=json) @telemetry.operation_name("getstream.api.common.query_users") async def query_users( self, payload: Optional[QueryUsersPayload] = None ) -> StreamResponse[QueryUsersResponse]: - query_params = build_query_param(payload=payload) + query_params = build_query_param(**{"payload": payload}) return await self.get( "/api/v2/users", QueryUsersResponse, query_params=query_params ) @@ -904,21 +964,21 @@ async def query_users( async def update_users_partial( self, users: List[UpdateUserPartialRequest] ) -> StreamResponse[UpdateUsersResponse]: - json = build_body_dict(users=users) + json = build_body_dict(**{"users": users}) return await self.patch("/api/v2/users", UpdateUsersResponse, json=json) @telemetry.operation_name("getstream.api.common.update_users") async def update_users( self, users: Dict[str, UserRequest] ) -> StreamResponse[UpdateUsersResponse]: - json = build_body_dict(users=users) + json = build_body_dict(**{"users": users}) return await self.post("/api/v2/users", UpdateUsersResponse, json=json) @telemetry.operation_name("getstream.api.common.get_blocked_users") async def get_blocked_users( self, user_id: Optional[str] = None ) -> StreamResponse[GetBlockedUsersResponse]: - query_params = build_query_param(user_id=user_id) + query_params = build_query_param(**{"user_id": user_id}) return await self.get( "/api/v2/users/block", GetBlockedUsersResponse, query_params=query_params ) @@ -931,7 +991,7 @@ async def block_users( user: Optional[UserRequest] = None, ) -> StreamResponse[BlockUsersResponse]: json = build_body_dict( - blocked_user_id=blocked_user_id, user_id=user_id, user=user + **{"blocked_user_id": blocked_user_id, "user_id": user_id, "user": user} ) return await self.post("/api/v2/users/block", BlockUsersResponse, json=json) @@ -944,10 +1004,12 @@ async def deactivate_users( mark_messages_deleted: Optional[bool] = None, ) -> StreamResponse[DeactivateUsersResponse]: json = build_body_dict( - user_ids=user_ids, - created_by_id=created_by_id, - mark_channels_deleted=mark_channels_deleted, - mark_messages_deleted=mark_messages_deleted, + **{ + "user_ids": user_ids, + "created_by_id": created_by_id, + "mark_channels_deleted": mark_channels_deleted, + "mark_messages_deleted": mark_messages_deleted, + } ) return await self.post( "/api/v2/users/deactivate", DeactivateUsersResponse, json=json @@ -966,14 +1028,16 @@ async def delete_users( user: Optional[str] = None, ) -> StreamResponse[DeleteUsersResponse]: json = build_body_dict( - user_ids=user_ids, - calls=calls, - conversations=conversations, - files=files, - messages=messages, - new_call_owner_id=new_call_owner_id, - new_channel_owner_id=new_channel_owner_id, - user=user, + **{ + "user_ids": user_ids, + "calls": calls, + "conversations": conversations, + "files": files, + "messages": messages, + "new_call_owner_id": new_call_owner_id, + "new_channel_owner_id": new_channel_owner_id, + "user": user, + } ) return await self.post("/api/v2/users/delete", DeleteUsersResponse, json=json) @@ -981,7 +1045,7 @@ async def delete_users( async def get_user_live_locations( self, user_id: Optional[str] = None ) -> StreamResponse[SharedLocationsResponse]: - query_params = build_query_param(user_id=user_id) + query_params = build_query_param(**{"user_id": user_id}) return await self.get( "/api/v2/users/live_locations", SharedLocationsResponse, @@ -997,9 +1061,14 @@ async def update_live_location( longitude: Optional[float] = None, user_id: Optional[str] = None, ) -> StreamResponse[SharedLocationResponse]: - query_params = build_query_param(user_id=user_id) + query_params = build_query_param(**{"user_id": user_id}) json = build_body_dict( - message_id=message_id, end_at=end_at, latitude=latitude, longitude=longitude + **{ + "message_id": message_id, + "end_at": end_at, + "latitude": latitude, + "longitude": longitude, + } ) return await self.put( "/api/v2/users/live_locations", @@ -1017,10 +1086,12 @@ async def reactivate_users( restore_messages: Optional[bool] = None, ) -> StreamResponse[ReactivateUsersResponse]: json = build_body_dict( - user_ids=user_ids, - created_by_id=created_by_id, - restore_channels=restore_channels, - restore_messages=restore_messages, + **{ + "user_ids": user_ids, + "created_by_id": created_by_id, + "restore_channels": restore_channels, + "restore_messages": restore_messages, + } ) return await self.post( "/api/v2/users/reactivate", ReactivateUsersResponse, json=json @@ -1028,7 +1099,7 @@ async def reactivate_users( @telemetry.operation_name("getstream.api.common.restore_users") async def restore_users(self, user_ids: List[str]) -> StreamResponse[Response]: - json = build_body_dict(user_ids=user_ids) + json = build_body_dict(**{"user_ids": user_ids}) return await self.post("/api/v2/users/restore", Response, json=json) @telemetry.operation_name("getstream.api.common.unblock_users") @@ -1039,7 +1110,7 @@ async def unblock_users( user: Optional[UserRequest] = None, ) -> StreamResponse[UnblockUsersResponse]: json = build_body_dict( - blocked_user_id=blocked_user_id, user_id=user_id, user=user + **{"blocked_user_id": blocked_user_id, "user_id": user_id, "user": user} ) return await self.post("/api/v2/users/unblock", UnblockUsersResponse, json=json) @@ -1054,7 +1125,10 @@ async def deactivate_user( "user_id": user_id, } json = build_body_dict( - created_by_id=created_by_id, mark_messages_deleted=mark_messages_deleted + **{ + "created_by_id": created_by_id, + "mark_messages_deleted": mark_messages_deleted, + } ) return await self.post( "/api/v2/users/{user_id}/deactivate", @@ -1086,7 +1160,11 @@ async def reactivate_user( "user_id": user_id, } json = build_body_dict( - created_by_id=created_by_id, name=name, restore_messages=restore_messages + **{ + "created_by_id": created_by_id, + "name": name, + "restore_messages": restore_messages, + } ) return await self.post( "/api/v2/users/{user_id}/reactivate", diff --git a/getstream/common/rest_client.py b/getstream/common/rest_client.py index 49c1e524..90b8660e 100644 --- a/getstream/common/rest_client.py +++ b/getstream/common/rest_client.py @@ -89,53 +89,55 @@ def update_app( xiaomi_config: Optional[XiaomiConfig] = None, ) -> StreamResponse[Response]: json = build_body_dict( - async_url_enrich_enabled=async_url_enrich_enabled, - auto_translation_enabled=auto_translation_enabled, - before_message_send_hook_url=before_message_send_hook_url, - cdn_expiration_seconds=cdn_expiration_seconds, - channel_hide_members_only=channel_hide_members_only, - custom_action_handler_url=custom_action_handler_url, - disable_auth_checks=disable_auth_checks, - disable_permissions_checks=disable_permissions_checks, - 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, - max_aggregated_activities_length=max_aggregated_activities_length, - migrate_permissions_to_v2=migrate_permissions_to_v2, - moderation_enabled=moderation_enabled, - moderation_webhook_url=moderation_webhook_url, - multi_tenant_enabled=multi_tenant_enabled, - permission_version=permission_version, - reminders_interval=reminders_interval, - reminders_max_members=reminders_max_members, - revoke_tokens_issued_before=revoke_tokens_issued_before, - sns_key=sns_key, - sns_secret=sns_secret, - sns_topic_arn=sns_topic_arn, - sqs_key=sqs_key, - sqs_secret=sqs_secret, - sqs_url=sqs_url, - user_response_time_enabled=user_response_time_enabled, - 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, - webhook_events=webhook_events, - apn_config=apn_config, - async_moderation_config=async_moderation_config, - datadog_info=datadog_info, - file_upload_config=file_upload_config, - firebase_config=firebase_config, - grants=grants, - huawei_config=huawei_config, - image_upload_config=image_upload_config, - moderation_dashboard_preferences=moderation_dashboard_preferences, - push_config=push_config, - xiaomi_config=xiaomi_config, + **{ + "async_url_enrich_enabled": async_url_enrich_enabled, + "auto_translation_enabled": auto_translation_enabled, + "before_message_send_hook_url": before_message_send_hook_url, + "cdn_expiration_seconds": cdn_expiration_seconds, + "channel_hide_members_only": channel_hide_members_only, + "custom_action_handler_url": custom_action_handler_url, + "disable_auth_checks": disable_auth_checks, + "disable_permissions_checks": disable_permissions_checks, + "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, + "max_aggregated_activities_length": max_aggregated_activities_length, + "migrate_permissions_to_v2": migrate_permissions_to_v2, + "moderation_enabled": moderation_enabled, + "moderation_webhook_url": moderation_webhook_url, + "multi_tenant_enabled": multi_tenant_enabled, + "permission_version": permission_version, + "reminders_interval": reminders_interval, + "reminders_max_members": reminders_max_members, + "revoke_tokens_issued_before": revoke_tokens_issued_before, + "sns_key": sns_key, + "sns_secret": sns_secret, + "sns_topic_arn": sns_topic_arn, + "sqs_key": sqs_key, + "sqs_secret": sqs_secret, + "sqs_url": sqs_url, + "user_response_time_enabled": user_response_time_enabled, + "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, + "webhook_events": webhook_events, + "apn_config": apn_config, + "async_moderation_config": async_moderation_config, + "datadog_info": datadog_info, + "file_upload_config": file_upload_config, + "firebase_config": firebase_config, + "grants": grants, + "huawei_config": huawei_config, + "image_upload_config": image_upload_config, + "moderation_dashboard_preferences": moderation_dashboard_preferences, + "push_config": push_config, + "xiaomi_config": xiaomi_config, + } ) return self.patch("/api/v2/app", Response, json=json) @@ -143,7 +145,7 @@ def update_app( def list_block_lists( self, team: Optional[str] = None ) -> StreamResponse[ListBlockListResponse]: - query_params = build_query_param(team=team) + query_params = build_query_param(**{"team": team}) return self.get( "/api/v2/blocklists", ListBlockListResponse, query_params=query_params ) @@ -159,12 +161,14 @@ def create_block_list( type: Optional[str] = None, ) -> StreamResponse[CreateBlockListResponse]: json = build_body_dict( - name=name, - words=words, - is_leet_check_enabled=is_leet_check_enabled, - is_plural_check_enabled=is_plural_check_enabled, - team=team, - type=type, + **{ + "name": name, + "words": words, + "is_leet_check_enabled": is_leet_check_enabled, + "is_plural_check_enabled": is_plural_check_enabled, + "team": team, + "type": type, + } ) return self.post("/api/v2/blocklists", CreateBlockListResponse, json=json) @@ -172,7 +176,7 @@ def create_block_list( def delete_block_list( self, name: str, team: Optional[str] = None ) -> StreamResponse[Response]: - query_params = build_query_param(team=team) + query_params = build_query_param(**{"team": team}) path_params = { "name": name, } @@ -187,7 +191,7 @@ def delete_block_list( def get_block_list( self, name: str, team: Optional[str] = None ) -> StreamResponse[GetBlockListResponse]: - query_params = build_query_param(team=team) + query_params = build_query_param(**{"team": team}) path_params = { "name": name, } @@ -211,10 +215,12 @@ def update_block_list( "name": name, } json = build_body_dict( - is_leet_check_enabled=is_leet_check_enabled, - is_plural_check_enabled=is_plural_check_enabled, - team=team, - words=words, + **{ + "is_leet_check_enabled": is_leet_check_enabled, + "is_plural_check_enabled": is_plural_check_enabled, + "team": team, + "words": words, + } ) return self.put( "/api/v2/blocklists/{name}", @@ -238,16 +244,18 @@ def check_push( user: Optional[UserRequest] = None, ) -> 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, - push_provider_name=push_provider_name, - push_provider_type=push_provider_type, - skip_devices=skip_devices, - user_id=user_id, - user=user, + **{ + "apn_template": apn_template, + "event_type": event_type, + "firebase_data_template": firebase_data_template, + "firebase_template": firebase_template, + "message_id": message_id, + "push_provider_name": push_provider_name, + "push_provider_type": push_provider_type, + "skip_devices": skip_devices, + "user_id": user_id, + "user": user, + } ) return self.post("/api/v2/check_push", CheckPushResponse, json=json) @@ -259,7 +267,11 @@ def check_sns( sns_topic_arn: Optional[str] = None, ) -> StreamResponse[CheckSNSResponse]: json = build_body_dict( - sns_key=sns_key, sns_secret=sns_secret, sns_topic_arn=sns_topic_arn + **{ + "sns_key": sns_key, + "sns_secret": sns_secret, + "sns_topic_arn": sns_topic_arn, + } ) return self.post("/api/v2/check_sns", CheckSNSResponse, json=json) @@ -270,21 +282,23 @@ def check_sqs( sqs_secret: Optional[str] = None, sqs_url: Optional[str] = None, ) -> StreamResponse[CheckSQSResponse]: - json = build_body_dict(sqs_key=sqs_key, sqs_secret=sqs_secret, sqs_url=sqs_url) + json = build_body_dict( + **{"sqs_key": sqs_key, "sqs_secret": sqs_secret, "sqs_url": sqs_url} + ) return self.post("/api/v2/check_sqs", CheckSQSResponse, json=json) @telemetry.operation_name("getstream.api.common.delete_device") def delete_device( self, id: str, user_id: Optional[str] = None ) -> StreamResponse[Response]: - query_params = build_query_param(id=id, user_id=user_id) + query_params = build_query_param(**{"id": id, "user_id": user_id}) return self.delete("/api/v2/devices", Response, query_params=query_params) @telemetry.operation_name("getstream.api.common.list_devices") def list_devices( self, user_id: Optional[str] = None ) -> StreamResponse[ListDevicesResponse]: - query_params = build_query_param(user_id=user_id) + query_params = build_query_param(**{"user_id": user_id}) return self.get( "/api/v2/devices", ListDevicesResponse, query_params=query_params ) @@ -300,18 +314,20 @@ def create_device( user: Optional[UserRequest] = None, ) -> StreamResponse[Response]: json = build_body_dict( - id=id, - push_provider=push_provider, - push_provider_name=push_provider_name, - user_id=user_id, - voip_token=voip_token, - user=user, + **{ + "id": id, + "push_provider": push_provider, + "push_provider_name": push_provider_name, + "user_id": user_id, + "voip_token": voip_token, + "user": user, + } ) return self.post("/api/v2/devices", Response, json=json) @telemetry.operation_name("getstream.api.common.export_users") def export_users(self, user_ids: List[str]) -> StreamResponse[ExportUsersResponse]: - json = build_body_dict(user_ids=user_ids) + json = build_body_dict(**{"user_ids": user_ids}) return self.post("/api/v2/export/users", ExportUsersResponse, json=json) @telemetry.operation_name("getstream.api.common.list_external_storage") @@ -330,13 +346,15 @@ def create_external_storage( azure_blob: Optional[AzureRequest] = None, ) -> StreamResponse[CreateExternalStorageResponse]: json = build_body_dict( - bucket=bucket, - name=name, - storage_type=storage_type, - gcs_credentials=gcs_credentials, - path=path, - aws_s3=aws_s3, - azure_blob=azure_blob, + **{ + "bucket": bucket, + "name": name, + "storage_type": storage_type, + "gcs_credentials": gcs_credentials, + "path": path, + "aws_s3": aws_s3, + "azure_blob": azure_blob, + } ) return self.post( "/api/v2/external_storage", CreateExternalStorageResponse, json=json @@ -370,12 +388,14 @@ def update_external_storage( "name": name, } json = build_body_dict( - bucket=bucket, - storage_type=storage_type, - gcs_credentials=gcs_credentials, - path=path, - aws_s3=aws_s3, - azure_blob=azure_blob, + **{ + "bucket": bucket, + "storage_type": storage_type, + "gcs_credentials": gcs_credentials, + "path": path, + "aws_s3": aws_s3, + "azure_blob": azure_blob, + } ) return self.put( "/api/v2/external_storage/{name}", @@ -399,14 +419,14 @@ def check_external_storage( @telemetry.operation_name("getstream.api.common.create_guest") def create_guest(self, user: UserRequest) -> StreamResponse[CreateGuestResponse]: - json = build_body_dict(user=user) + json = build_body_dict(**{"user": user}) return self.post("/api/v2/guest", CreateGuestResponse, json=json) @telemetry.operation_name("getstream.api.common.create_import_url") def create_import_url( self, filename: Optional[str] = None ) -> StreamResponse[CreateImportURLResponse]: - json = build_body_dict(filename=filename) + json = build_body_dict(**{"filename": filename}) return self.post("/api/v2/import_urls", CreateImportURLResponse, json=json) @telemetry.operation_name("getstream.api.common.list_imports") @@ -417,14 +437,14 @@ def list_imports(self) -> StreamResponse[ListImportsResponse]: def create_import( self, mode: str, path: str ) -> StreamResponse[CreateImportResponse]: - json = build_body_dict(mode=mode, path=path) + json = build_body_dict(**{"mode": mode, "path": path}) return self.post("/api/v2/imports", CreateImportResponse, json=json) @telemetry.operation_name("getstream.api.common.list_import_v2_tasks") def list_import_v2_tasks( self, state: Optional[int] = None ) -> StreamResponse[ListImportV2TasksResponse]: - query_params = build_query_param(state=state) + query_params = build_query_param(**{"state": state}) return self.get( "/api/v2/imports/v2", ListImportV2TasksResponse, query_params=query_params ) @@ -438,7 +458,12 @@ def create_import_v2_task( user: Optional[UserRequest] = None, ) -> StreamResponse[CreateImportV2TaskResponse]: json = build_body_dict( - product=product, settings=settings, user_id=user_id, user=user + **{ + "product": product, + "settings": settings, + "user_id": user_id, + "user": user, + } ) return self.post("/api/v2/imports/v2", CreateImportV2TaskResponse, json=json) @@ -475,7 +500,7 @@ def get_import(self, id: str) -> StreamResponse[GetImportResponse]: @telemetry.operation_name("getstream.api.common.get_og") def get_og(self, url: str) -> StreamResponse[GetOGResponse]: - query_params = build_query_param(url=url) + query_params = build_query_param(**{"url": url}) return self.get("/api/v2/og", GetOGResponse, query_params=query_params) @telemetry.operation_name("getstream.api.common.list_permissions") @@ -511,19 +536,21 @@ def create_poll( user: Optional[UserRequest] = None, ) -> StreamResponse[PollResponse]: json = build_body_dict( - name=name, - allow_answers=allow_answers, - allow_user_suggested_options=allow_user_suggested_options, - description=description, - enforce_unique_vote=enforce_unique_vote, - id=id, - is_closed=is_closed, - max_votes_allowed=max_votes_allowed, - user_id=user_id, - voting_visibility=voting_visibility, - options=options, - custom=custom, - user=user, + **{ + "name": name, + "allow_answers": allow_answers, + "allow_user_suggested_options": allow_user_suggested_options, + "description": description, + "enforce_unique_vote": enforce_unique_vote, + "id": id, + "is_closed": is_closed, + "max_votes_allowed": max_votes_allowed, + "user_id": user_id, + "voting_visibility": voting_visibility, + "options": options, + "Custom": custom, + "user": user, + } ) return self.post("/api/v2/polls", PollResponse, json=json) @@ -545,19 +572,21 @@ def update_poll( user: Optional[UserRequest] = None, ) -> StreamResponse[PollResponse]: json = build_body_dict( - id=id, - name=name, - allow_answers=allow_answers, - allow_user_suggested_options=allow_user_suggested_options, - description=description, - enforce_unique_vote=enforce_unique_vote, - is_closed=is_closed, - max_votes_allowed=max_votes_allowed, - user_id=user_id, - voting_visibility=voting_visibility, - options=options, - custom=custom, - user=user, + **{ + "id": id, + "name": name, + "allow_answers": allow_answers, + "allow_user_suggested_options": allow_user_suggested_options, + "description": description, + "enforce_unique_vote": enforce_unique_vote, + "is_closed": is_closed, + "max_votes_allowed": max_votes_allowed, + "user_id": user_id, + "voting_visibility": voting_visibility, + "options": options, + "Custom": custom, + "user": user, + } ) return self.put("/api/v2/polls", PollResponse, json=json) @@ -571,9 +600,15 @@ def query_polls( sort: Optional[List[SortParamRequest]] = None, filter: Optional[Dict[str, object]] = None, ) -> StreamResponse[QueryPollsResponse]: - query_params = build_query_param(user_id=user_id) + query_params = build_query_param(**{"user_id": user_id}) json = build_body_dict( - limit=limit, next=next, prev=prev, sort=sort, filter=filter + **{ + "limit": limit, + "next": next, + "prev": prev, + "sort": sort, + "filter": filter, + } ) return self.post( "/api/v2/polls/query", @@ -586,7 +621,7 @@ def query_polls( def delete_poll( self, poll_id: str, user_id: Optional[str] = None ) -> StreamResponse[Response]: - query_params = build_query_param(user_id=user_id) + query_params = build_query_param(**{"user_id": user_id}) path_params = { "poll_id": poll_id, } @@ -601,7 +636,7 @@ def delete_poll( def get_poll( self, poll_id: str, user_id: Optional[str] = None ) -> StreamResponse[PollResponse]: - query_params = build_query_param(user_id=user_id) + query_params = build_query_param(**{"user_id": user_id}) path_params = { "poll_id": poll_id, } @@ -624,7 +659,9 @@ def update_poll_partial( path_params = { "poll_id": poll_id, } - json = build_body_dict(user_id=user_id, unset=unset, set=set, user=user) + json = build_body_dict( + **{"user_id": user_id, "unset": unset, "set": set, "user": user} + ) return self.patch( "/api/v2/polls/{poll_id}", PollResponse, path_params=path_params, json=json ) @@ -641,7 +678,9 @@ def create_poll_option( path_params = { "poll_id": poll_id, } - json = build_body_dict(text=text, user_id=user_id, custom=custom, user=user) + json = build_body_dict( + **{"text": text, "user_id": user_id, "Custom": custom, "user": user} + ) return self.post( "/api/v2/polls/{poll_id}/options", PollOptionResponse, @@ -663,7 +702,13 @@ def update_poll_option( "poll_id": poll_id, } json = build_body_dict( - id=id, text=text, user_id=user_id, custom=custom, user=user + **{ + "id": id, + "text": text, + "user_id": user_id, + "Custom": custom, + "user": user, + } ) return self.put( "/api/v2/polls/{poll_id}/options", @@ -676,7 +721,7 @@ def update_poll_option( def delete_poll_option( self, poll_id: str, option_id: str, user_id: Optional[str] = None ) -> StreamResponse[Response]: - query_params = build_query_param(user_id=user_id) + query_params = build_query_param(**{"user_id": user_id}) path_params = { "poll_id": poll_id, "option_id": option_id, @@ -692,7 +737,7 @@ def delete_poll_option( def get_poll_option( self, poll_id: str, option_id: str, user_id: Optional[str] = None ) -> StreamResponse[PollOptionResponse]: - query_params = build_query_param(user_id=user_id) + query_params = build_query_param(**{"user_id": user_id}) path_params = { "poll_id": poll_id, "option_id": option_id, @@ -715,12 +760,18 @@ def query_poll_votes( sort: Optional[List[SortParamRequest]] = None, filter: Optional[Dict[str, object]] = None, ) -> StreamResponse[PollVotesResponse]: - query_params = build_query_param(user_id=user_id) + query_params = build_query_param(**{"user_id": user_id}) path_params = { "poll_id": poll_id, } json = build_body_dict( - limit=limit, next=next, prev=prev, sort=sort, filter=filter + **{ + "limit": limit, + "next": next, + "prev": prev, + "sort": sort, + "filter": filter, + } ) return self.post( "/api/v2/polls/{poll_id}/votes", @@ -736,7 +787,7 @@ def query_poll_votes( def update_push_notification_preferences( self, preferences: List[PushPreferenceInput] ) -> StreamResponse[UpsertPushPreferencesResponse]: - json = build_body_dict(preferences=preferences) + json = build_body_dict(**{"preferences": preferences}) return self.post( "/api/v2/push_preferences", UpsertPushPreferencesResponse, json=json ) @@ -747,9 +798,9 @@ def list_push_providers(self) -> StreamResponse[ListPushProvidersResponse]: @telemetry.operation_name("getstream.api.common.upsert_push_provider") def upsert_push_provider( - self, push_provider: Optional[PushProvider] = None + self, push_provider: Optional[PushProviderRequest] = None ) -> StreamResponse[UpsertPushProviderResponse]: - json = build_body_dict(push_provider=push_provider) + json = build_body_dict(**{"push_provider": push_provider}) return self.post( "/api/v2/push_providers", UpsertPushProviderResponse, json=json ) @@ -769,7 +820,10 @@ def get_push_templates( self, push_provider_type: str, push_provider_name: Optional[str] = None ) -> StreamResponse[GetPushTemplatesResponse]: query_params = build_query_param( - push_provider_type=push_provider_type, push_provider_name=push_provider_name + **{ + "push_provider_type": push_provider_type, + "push_provider_name": push_provider_name, + } ) return self.get( "/api/v2/push_templates", @@ -787,11 +841,13 @@ def upsert_push_template( template: Optional[str] = None, ) -> StreamResponse[UpsertPushTemplateResponse]: json = build_body_dict( - event_type=event_type, - push_provider_type=push_provider_type, - enable_push=enable_push, - push_provider_name=push_provider_name, - template=template, + **{ + "event_type": event_type, + "push_provider_type": push_provider_type, + "enable_push": enable_push, + "push_provider_name": push_provider_name, + "template": template, + } ) return self.post( "/api/v2/push_templates", UpsertPushTemplateResponse, json=json @@ -807,11 +863,13 @@ def get_rate_limits( endpoints: Optional[str] = None, ) -> StreamResponse[GetRateLimitsResponse]: query_params = build_query_param( - server_side=server_side, - android=android, - ios=ios, - web=web, - endpoints=endpoints, + **{ + "server_side": server_side, + "android": android, + "ios": ios, + "web": web, + "endpoints": endpoints, + } ) return self.get( "/api/v2/rate_limits", GetRateLimitsResponse, query_params=query_params @@ -823,7 +881,7 @@ def list_roles(self) -> StreamResponse[ListRolesResponse]: @telemetry.operation_name("getstream.api.common.create_role") def create_role(self, name: str) -> StreamResponse[CreateRoleResponse]: - json = build_body_dict(name=name) + json = build_body_dict(**{"name": name}) return self.post("/api/v2/roles", CreateRoleResponse, json=json) @telemetry.operation_name("getstream.api.common.delete_role") @@ -842,19 +900,19 @@ def get_task(self, id: str) -> StreamResponse[GetTaskResponse]: @telemetry.operation_name("getstream.api.common.delete_file") def delete_file(self, url: Optional[str] = None) -> StreamResponse[Response]: - query_params = build_query_param(url=url) + query_params = build_query_param(**{"url": url}) return self.delete("/api/v2/uploads/file", Response, query_params=query_params) @telemetry.operation_name("getstream.api.common.upload_file") def upload_file( self, file: Optional[str] = None, user: Optional[OnlyUserID] = None ) -> StreamResponse[FileUploadResponse]: - json = build_body_dict(file=file, user=user) + json = build_body_dict(**{"file": file, "user": user}) return self.post("/api/v2/uploads/file", FileUploadResponse, json=json) @telemetry.operation_name("getstream.api.common.delete_image") def delete_image(self, url: Optional[str] = None) -> StreamResponse[Response]: - query_params = build_query_param(url=url) + query_params = build_query_param(**{"url": url}) return self.delete("/api/v2/uploads/image", Response, query_params=query_params) @telemetry.operation_name("getstream.api.common.upload_image") @@ -864,35 +922,37 @@ def upload_image( upload_sizes: Optional[List[ImageSize]] = None, user: Optional[OnlyUserID] = None, ) -> StreamResponse[ImageUploadResponse]: - json = build_body_dict(file=file, upload_sizes=upload_sizes, user=user) + json = build_body_dict( + **{"file": file, "upload_sizes": upload_sizes, "user": user} + ) return self.post("/api/v2/uploads/image", ImageUploadResponse, json=json) @telemetry.operation_name("getstream.api.common.query_users") def query_users( self, payload: Optional[QueryUsersPayload] = None ) -> StreamResponse[QueryUsersResponse]: - query_params = build_query_param(payload=payload) + query_params = build_query_param(**{"payload": payload}) return self.get("/api/v2/users", QueryUsersResponse, query_params=query_params) @telemetry.operation_name("getstream.api.common.update_users_partial") def update_users_partial( self, users: List[UpdateUserPartialRequest] ) -> StreamResponse[UpdateUsersResponse]: - json = build_body_dict(users=users) + json = build_body_dict(**{"users": users}) return self.patch("/api/v2/users", UpdateUsersResponse, json=json) @telemetry.operation_name("getstream.api.common.update_users") def update_users( self, users: Dict[str, UserRequest] ) -> StreamResponse[UpdateUsersResponse]: - json = build_body_dict(users=users) + json = build_body_dict(**{"users": users}) return self.post("/api/v2/users", UpdateUsersResponse, json=json) @telemetry.operation_name("getstream.api.common.get_blocked_users") def get_blocked_users( self, user_id: Optional[str] = None ) -> StreamResponse[GetBlockedUsersResponse]: - query_params = build_query_param(user_id=user_id) + query_params = build_query_param(**{"user_id": user_id}) return self.get( "/api/v2/users/block", GetBlockedUsersResponse, query_params=query_params ) @@ -905,7 +965,7 @@ def block_users( user: Optional[UserRequest] = None, ) -> StreamResponse[BlockUsersResponse]: json = build_body_dict( - blocked_user_id=blocked_user_id, user_id=user_id, user=user + **{"blocked_user_id": blocked_user_id, "user_id": user_id, "user": user} ) return self.post("/api/v2/users/block", BlockUsersResponse, json=json) @@ -918,10 +978,12 @@ def deactivate_users( mark_messages_deleted: Optional[bool] = None, ) -> StreamResponse[DeactivateUsersResponse]: json = build_body_dict( - user_ids=user_ids, - created_by_id=created_by_id, - mark_channels_deleted=mark_channels_deleted, - mark_messages_deleted=mark_messages_deleted, + **{ + "user_ids": user_ids, + "created_by_id": created_by_id, + "mark_channels_deleted": mark_channels_deleted, + "mark_messages_deleted": mark_messages_deleted, + } ) return self.post("/api/v2/users/deactivate", DeactivateUsersResponse, json=json) @@ -938,14 +1000,16 @@ def delete_users( user: Optional[str] = None, ) -> StreamResponse[DeleteUsersResponse]: json = build_body_dict( - user_ids=user_ids, - calls=calls, - conversations=conversations, - files=files, - messages=messages, - new_call_owner_id=new_call_owner_id, - new_channel_owner_id=new_channel_owner_id, - user=user, + **{ + "user_ids": user_ids, + "calls": calls, + "conversations": conversations, + "files": files, + "messages": messages, + "new_call_owner_id": new_call_owner_id, + "new_channel_owner_id": new_channel_owner_id, + "user": user, + } ) return self.post("/api/v2/users/delete", DeleteUsersResponse, json=json) @@ -953,7 +1017,7 @@ def delete_users( def get_user_live_locations( self, user_id: Optional[str] = None ) -> StreamResponse[SharedLocationsResponse]: - query_params = build_query_param(user_id=user_id) + query_params = build_query_param(**{"user_id": user_id}) return self.get( "/api/v2/users/live_locations", SharedLocationsResponse, @@ -969,9 +1033,14 @@ def update_live_location( longitude: Optional[float] = None, user_id: Optional[str] = None, ) -> StreamResponse[SharedLocationResponse]: - query_params = build_query_param(user_id=user_id) + query_params = build_query_param(**{"user_id": user_id}) json = build_body_dict( - message_id=message_id, end_at=end_at, latitude=latitude, longitude=longitude + **{ + "message_id": message_id, + "end_at": end_at, + "latitude": latitude, + "longitude": longitude, + } ) return self.put( "/api/v2/users/live_locations", @@ -989,16 +1058,18 @@ def reactivate_users( restore_messages: Optional[bool] = None, ) -> StreamResponse[ReactivateUsersResponse]: json = build_body_dict( - user_ids=user_ids, - created_by_id=created_by_id, - restore_channels=restore_channels, - restore_messages=restore_messages, + **{ + "user_ids": user_ids, + "created_by_id": created_by_id, + "restore_channels": restore_channels, + "restore_messages": restore_messages, + } ) return self.post("/api/v2/users/reactivate", ReactivateUsersResponse, json=json) @telemetry.operation_name("getstream.api.common.restore_users") def restore_users(self, user_ids: List[str]) -> StreamResponse[Response]: - json = build_body_dict(user_ids=user_ids) + json = build_body_dict(**{"user_ids": user_ids}) return self.post("/api/v2/users/restore", Response, json=json) @telemetry.operation_name("getstream.api.common.unblock_users") @@ -1009,7 +1080,7 @@ def unblock_users( user: Optional[UserRequest] = None, ) -> StreamResponse[UnblockUsersResponse]: json = build_body_dict( - blocked_user_id=blocked_user_id, user_id=user_id, user=user + **{"blocked_user_id": blocked_user_id, "user_id": user_id, "user": user} ) return self.post("/api/v2/users/unblock", UnblockUsersResponse, json=json) @@ -1024,7 +1095,10 @@ def deactivate_user( "user_id": user_id, } json = build_body_dict( - created_by_id=created_by_id, mark_messages_deleted=mark_messages_deleted + **{ + "created_by_id": created_by_id, + "mark_messages_deleted": mark_messages_deleted, + } ) return self.post( "/api/v2/users/{user_id}/deactivate", @@ -1056,7 +1130,11 @@ def reactivate_user( "user_id": user_id, } json = build_body_dict( - created_by_id=created_by_id, name=name, restore_messages=restore_messages + **{ + "created_by_id": created_by_id, + "name": name, + "restore_messages": restore_messages, + } ) return self.post( "/api/v2/users/{user_id}/reactivate", diff --git a/getstream/feeds/feeds.py b/getstream/feeds/feeds.py index d0c8c7a0..4378e8c5 100644 --- a/getstream/feeds/feeds.py +++ b/getstream/feeds/feeds.py @@ -38,6 +38,7 @@ def get_or_create( filter: Optional[Dict[str, object]] = None, followers_pagination: Optional[PagerRequest] = None, following_pagination: Optional[PagerRequest] = None, + friend_reactions_options: Optional[FriendReactionsOptions] = None, interest_weights: Optional[Dict[str, float]] = None, member_pagination: Optional[PagerRequest] = None, user: Optional[UserRequest] = None, @@ -58,6 +59,7 @@ def get_or_create( filter=filter, followers_pagination=followers_pagination, following_pagination=following_pagination, + friend_reactions_options=friend_reactions_options, interest_weights=interest_weights, member_pagination=member_pagination, user=user, diff --git a/getstream/feeds/rest_client.py b/getstream/feeds/rest_client.py index 9b43414b..b316ef2e 100644 --- a/getstream/feeds/rest_client.py +++ b/getstream/feeds/rest_client.py @@ -36,12 +36,15 @@ def add_activity( self, type: str, feeds: List[str], + copy_custom_to_notification: Optional[bool] = None, + create_notification_activity: Optional[bool] = None, expires_at: Optional[str] = None, id: Optional[str] = None, parent_id: Optional[str] = None, poll_id: Optional[str] = None, restrict_replies: Optional[str] = None, skip_enrich_url: Optional[bool] = None, + skip_push: Optional[bool] = None, text: Optional[str] = None, user_id: Optional[str] = None, visibility: Optional[str] = None, @@ -56,26 +59,31 @@ def add_activity( search_data: Optional[Dict[str, object]] = None, ) -> StreamResponse[AddActivityResponse]: json = build_body_dict( - type=type, - feeds=feeds, - expires_at=expires_at, - id=id, - parent_id=parent_id, - poll_id=poll_id, - restrict_replies=restrict_replies, - skip_enrich_url=skip_enrich_url, - text=text, - user_id=user_id, - visibility=visibility, - visibility_tag=visibility_tag, - attachments=attachments, - collection_refs=collection_refs, - filter_tags=filter_tags, - interest_tags=interest_tags, - mentioned_user_ids=mentioned_user_ids, - custom=custom, - location=location, - search_data=search_data, + **{ + "type": type, + "feeds": feeds, + "copy_custom_to_notification": copy_custom_to_notification, + "create_notification_activity": create_notification_activity, + "expires_at": expires_at, + "id": id, + "parent_id": parent_id, + "poll_id": poll_id, + "restrict_replies": restrict_replies, + "skip_enrich_url": skip_enrich_url, + "skip_push": skip_push, + "text": text, + "user_id": user_id, + "visibility": visibility, + "visibility_tag": visibility_tag, + "attachments": attachments, + "collection_refs": collection_refs, + "filter_tags": filter_tags, + "interest_tags": interest_tags, + "mentioned_user_ids": mentioned_user_ids, + "custom": custom, + "location": location, + "search_data": search_data, + } ) return self.post("/api/v2/feeds/activities", AddActivityResponse, json=json) @@ -83,21 +91,39 @@ def add_activity( def upsert_activities( self, activities: List[ActivityRequest] ) -> StreamResponse[UpsertActivitiesResponse]: - json = build_body_dict(activities=activities) + json = build_body_dict(**{"activities": activities}) return self.post( "/api/v2/feeds/activities/batch", UpsertActivitiesResponse, json=json ) + @telemetry.operation_name("getstream.api.feeds.update_activities_partial_batch") + def update_activities_partial_batch( + self, changes: List[UpdateActivityPartialChangeRequest] + ) -> StreamResponse[UpdateActivitiesPartialBatchResponse]: + json = build_body_dict(**{"changes": changes}) + return self.patch( + "/api/v2/feeds/activities/batch/partial", + UpdateActivitiesPartialBatchResponse, + json=json, + ) + @telemetry.operation_name("getstream.api.feeds.delete_activities") def delete_activities( self, ids: List[str], + delete_notification_activity: Optional[bool] = None, hard_delete: Optional[bool] = None, user_id: Optional[str] = None, user: Optional[UserRequest] = None, ) -> StreamResponse[DeleteActivitiesResponse]: json = build_body_dict( - ids=ids, hard_delete=hard_delete, user_id=user_id, user=user + **{ + "ids": ids, + "delete_notification_activity": delete_notification_activity, + "hard_delete": hard_delete, + "user_id": user_id, + "user": user, + } ) return self.post( "/api/v2/feeds/activities/delete", DeleteActivitiesResponse, json=json @@ -106,6 +132,7 @@ def delete_activities( @telemetry.operation_name("getstream.api.feeds.query_activities") def query_activities( self, + include_expired_activities: Optional[bool] = None, include_private_activities: Optional[bool] = None, limit: Optional[int] = None, next: Optional[str] = None, @@ -116,14 +143,17 @@ def query_activities( user: Optional[UserRequest] = None, ) -> StreamResponse[QueryActivitiesResponse]: json = build_body_dict( - include_private_activities=include_private_activities, - limit=limit, - next=next, - prev=prev, - user_id=user_id, - sort=sort, - filter=filter, - user=user, + **{ + "include_expired_activities": include_expired_activities, + "include_private_activities": include_private_activities, + "limit": limit, + "next": next, + "prev": prev, + "user_id": user_id, + "sort": sort, + "filter": filter, + "user": user, + } ) return self.post( "/api/v2/feeds/activities/query", QueryActivitiesResponse, json=json @@ -136,7 +166,7 @@ def delete_bookmark( folder_id: Optional[str] = None, user_id: Optional[str] = None, ) -> StreamResponse[DeleteBookmarkResponse]: - query_params = build_query_param(folder_id=folder_id, user_id=user_id) + query_params = build_query_param(**{"folder_id": folder_id, "user_id": user_id}) path_params = { "activity_id": activity_id, } @@ -162,12 +192,14 @@ def update_bookmark( "activity_id": activity_id, } json = build_body_dict( - folder_id=folder_id, - new_folder_id=new_folder_id, - user_id=user_id, - custom=custom, - new_folder=new_folder, - user=user, + **{ + "folder_id": folder_id, + "new_folder_id": new_folder_id, + "user_id": user_id, + "custom": custom, + "new_folder": new_folder, + "user": user, + } ) return self.patch( "/api/v2/feeds/activities/{activity_id}/bookmarks", @@ -190,11 +222,13 @@ def add_bookmark( "activity_id": activity_id, } json = build_body_dict( - folder_id=folder_id, - user_id=user_id, - custom=custom, - new_folder=new_folder, - user=user, + **{ + "folder_id": folder_id, + "user_id": user_id, + "custom": custom, + "new_folder": new_folder, + "user": user, + } ) return self.post( "/api/v2/feeds/activities/{activity_id}/bookmarks", @@ -217,11 +251,13 @@ def activity_feedback( "activity_id": activity_id, } json = build_body_dict( - hide=hide, - show_less=show_less, - show_more=show_more, - user_id=user_id, - user=user, + **{ + "hide": hide, + "show_less": show_less, + "show_more": show_more, + "user_id": user_id, + "user": user, + } ) return self.post( "/api/v2/feeds/activities/{activity_id}/feedback", @@ -243,7 +279,7 @@ def cast_poll_vote( "activity_id": activity_id, "poll_id": poll_id, } - json = build_body_dict(user_id=user_id, user=user, vote=vote) + json = build_body_dict(**{"user_id": user_id, "user": user, "vote": vote}) return self.post( "/api/v2/feeds/activities/{activity_id}/polls/{poll_id}/vote", PollVoteResponse, @@ -259,7 +295,7 @@ def delete_poll_vote( vote_id: str, user_id: Optional[str] = None, ) -> StreamResponse[PollVoteResponse]: - query_params = build_query_param(user_id=user_id) + query_params = build_query_param(**{"user_id": user_id}) path_params = { "activity_id": activity_id, "poll_id": poll_id, @@ -277,6 +313,7 @@ def add_activity_reaction( self, activity_id: str, type: str, + copy_custom_to_notification: Optional[bool] = None, create_notification_activity: Optional[bool] = None, enforce_unique: Optional[bool] = None, skip_push: Optional[bool] = None, @@ -288,13 +325,16 @@ def add_activity_reaction( "activity_id": activity_id, } json = build_body_dict( - type=type, - create_notification_activity=create_notification_activity, - enforce_unique=enforce_unique, - skip_push=skip_push, - user_id=user_id, - custom=custom, - user=user, + **{ + "type": type, + "copy_custom_to_notification": copy_custom_to_notification, + "create_notification_activity": create_notification_activity, + "enforce_unique": enforce_unique, + "skip_push": skip_push, + "user_id": user_id, + "custom": custom, + "user": user, + } ) return self.post( "/api/v2/feeds/activities/{activity_id}/reactions", @@ -317,7 +357,13 @@ def query_activity_reactions( "activity_id": activity_id, } json = build_body_dict( - limit=limit, next=next, prev=prev, sort=sort, filter=filter + **{ + "limit": limit, + "next": next, + "prev": prev, + "sort": sort, + "filter": filter, + } ) return self.post( "/api/v2/feeds/activities/{activity_id}/reactions/query", @@ -328,9 +374,18 @@ def query_activity_reactions( @telemetry.operation_name("getstream.api.feeds.delete_activity_reaction") def delete_activity_reaction( - self, activity_id: str, type: str, user_id: Optional[str] = None + self, + activity_id: str, + type: str, + delete_notification_activity: Optional[bool] = None, + user_id: Optional[str] = None, ) -> StreamResponse[DeleteActivityReactionResponse]: - query_params = build_query_param(user_id=user_id) + query_params = build_query_param( + **{ + "delete_notification_activity": delete_notification_activity, + "user_id": user_id, + } + ) path_params = { "activity_id": activity_id, "type": type, @@ -344,9 +399,17 @@ def delete_activity_reaction( @telemetry.operation_name("getstream.api.feeds.delete_activity") def delete_activity( - self, id: str, hard_delete: Optional[bool] = None + self, + id: str, + hard_delete: Optional[bool] = None, + delete_notification_activity: Optional[bool] = None, ) -> StreamResponse[DeleteActivityResponse]: - query_params = build_query_param(hard_delete=hard_delete) + query_params = build_query_param( + **{ + "hard_delete": hard_delete, + "delete_notification_activity": delete_notification_activity, + } + ) path_params = { "id": id, } @@ -372,6 +435,9 @@ def get_activity(self, id: str) -> StreamResponse[GetActivityResponse]: def update_activity_partial( self, id: str, + copy_custom_to_notification: Optional[bool] = None, + handle_mention_notifications: Optional[bool] = None, + run_activity_processors: Optional[bool] = None, user_id: Optional[str] = None, unset: Optional[List[str]] = None, set: Optional[Dict[str, object]] = None, @@ -380,7 +446,17 @@ def update_activity_partial( path_params = { "id": id, } - json = build_body_dict(user_id=user_id, unset=unset, set=set, user=user) + json = build_body_dict( + **{ + "copy_custom_to_notification": copy_custom_to_notification, + "handle_mention_notifications": handle_mention_notifications, + "run_activity_processors": run_activity_processors, + "user_id": user_id, + "unset": unset, + "set": set, + "user": user, + } + ) return self.patch( "/api/v2/feeds/activities/{id}", UpdateActivityPartialResponse, @@ -392,13 +468,17 @@ def update_activity_partial( def update_activity( self, id: str, + copy_custom_to_notification: Optional[bool] = None, expires_at: Optional[datetime] = None, + handle_mention_notifications: Optional[bool] = None, poll_id: Optional[str] = None, restrict_replies: Optional[str] = None, + run_activity_processors: Optional[bool] = None, skip_enrich_url: Optional[bool] = None, text: Optional[str] = None, user_id: Optional[str] = None, visibility: Optional[str] = None, + visibility_tag: Optional[str] = None, attachments: Optional[List[Attachment]] = None, collection_refs: Optional[List[str]] = None, feeds: Optional[List[str]] = None, @@ -407,28 +487,36 @@ def update_activity( mentioned_user_ids: Optional[List[str]] = None, custom: Optional[Dict[str, object]] = None, location: Optional[ActivityLocation] = None, + search_data: Optional[Dict[str, object]] = None, user: Optional[UserRequest] = None, ) -> StreamResponse[UpdateActivityResponse]: path_params = { "id": id, } json = build_body_dict( - expires_at=expires_at, - poll_id=poll_id, - restrict_replies=restrict_replies, - skip_enrich_url=skip_enrich_url, - text=text, - user_id=user_id, - visibility=visibility, - attachments=attachments, - collection_refs=collection_refs, - feeds=feeds, - filter_tags=filter_tags, - interest_tags=interest_tags, - mentioned_user_ids=mentioned_user_ids, - custom=custom, - location=location, - user=user, + **{ + "copy_custom_to_notification": copy_custom_to_notification, + "expires_at": expires_at, + "handle_mention_notifications": handle_mention_notifications, + "poll_id": poll_id, + "restrict_replies": restrict_replies, + "run_activity_processors": run_activity_processors, + "skip_enrich_url": skip_enrich_url, + "text": text, + "user_id": user_id, + "visibility": visibility, + "visibility_tag": visibility_tag, + "attachments": attachments, + "collection_refs": collection_refs, + "feeds": feeds, + "filter_tags": filter_tags, + "interest_tags": interest_tags, + "mentioned_user_ids": mentioned_user_ids, + "custom": custom, + "location": location, + "search_data": search_data, + "user": user, + } ) return self.put( "/api/v2/feeds/activities/{id}", @@ -437,6 +525,21 @@ def update_activity( json=json, ) + @telemetry.operation_name("getstream.api.feeds.restore_activity") + def restore_activity( + self, id: str, user_id: Optional[str] = None, user: Optional[UserRequest] = None + ) -> StreamResponse[RestoreActivityResponse]: + path_params = { + "id": id, + } + json = build_body_dict(**{"user_id": user_id, "user": user}) + return self.post( + "/api/v2/feeds/activities/{id}/restore", + RestoreActivityResponse, + path_params=path_params, + json=json, + ) + @telemetry.operation_name("getstream.api.feeds.query_bookmark_folders") def query_bookmark_folders( self, @@ -447,7 +550,13 @@ def query_bookmark_folders( filter: Optional[Dict[str, object]] = None, ) -> StreamResponse[QueryBookmarkFoldersResponse]: json = build_body_dict( - limit=limit, next=next, prev=prev, sort=sort, filter=filter + **{ + "limit": limit, + "next": next, + "prev": prev, + "sort": sort, + "filter": filter, + } ) return self.post( "/api/v2/feeds/bookmark_folders/query", @@ -480,7 +589,9 @@ def update_bookmark_folder( path_params = { "folder_id": folder_id, } - json = build_body_dict(name=name, user_id=user_id, custom=custom, user=user) + json = build_body_dict( + **{"name": name, "user_id": user_id, "custom": custom, "user": user} + ) return self.patch( "/api/v2/feeds/bookmark_folders/{folder_id}", UpdateBookmarkFolderResponse, @@ -498,7 +609,13 @@ def query_bookmarks( filter: Optional[Dict[str, object]] = None, ) -> StreamResponse[QueryBookmarksResponse]: json = build_body_dict( - limit=limit, next=next, prev=prev, sort=sort, filter=filter + **{ + "limit": limit, + "next": next, + "prev": prev, + "sort": sort, + "filter": filter, + } ) return self.post( "/api/v2/feeds/bookmarks/query", QueryBookmarksResponse, json=json @@ -508,7 +625,7 @@ def query_bookmarks( def delete_collections( self, collection_refs: List[str] ) -> StreamResponse[DeleteCollectionsResponse]: - query_params = build_query_param(collection_refs=collection_refs) + query_params = build_query_param(**{"collection_refs": collection_refs}) return self.delete( "/api/v2/feeds/collections", DeleteCollectionsResponse, @@ -520,7 +637,7 @@ def read_collections( self, collection_refs: List[str], user_id: Optional[str] = None ) -> StreamResponse[ReadCollectionsResponse]: query_params = build_query_param( - collection_refs=collection_refs, user_id=user_id + **{"collection_refs": collection_refs, "user_id": user_id} ) return self.get( "/api/v2/feeds/collections", @@ -535,7 +652,9 @@ def update_collections( user_id: Optional[str] = None, user: Optional[UserRequest] = None, ) -> StreamResponse[UpdateCollectionsResponse]: - json = build_body_dict(collections=collections, user_id=user_id, user=user) + json = build_body_dict( + **{"collections": collections, "user_id": user_id, "user": user} + ) return self.patch( "/api/v2/feeds/collections", UpdateCollectionsResponse, json=json ) @@ -547,7 +666,9 @@ def create_collections( user_id: Optional[str] = None, user: Optional[UserRequest] = None, ) -> StreamResponse[CreateCollectionsResponse]: - json = build_body_dict(collections=collections, user_id=user_id, user=user) + json = build_body_dict( + **{"collections": collections, "user_id": user_id, "user": user} + ) return self.post( "/api/v2/feeds/collections", CreateCollectionsResponse, json=json ) @@ -556,7 +677,7 @@ def create_collections( def upsert_collections( self, collections: List[CollectionRequest] ) -> StreamResponse[UpsertCollectionsResponse]: - json = build_body_dict(collections=collections) + json = build_body_dict(**{"collections": collections}) return self.put( "/api/v2/feeds/collections", UpsertCollectionsResponse, json=json ) @@ -569,19 +690,23 @@ def get_comments( depth: Optional[int] = None, sort: Optional[str] = None, replies_limit: Optional[int] = None, + user_id: Optional[str] = None, limit: Optional[int] = None, prev: Optional[str] = None, next: Optional[str] = None, ) -> StreamResponse[GetCommentsResponse]: query_params = build_query_param( - object_id=object_id, - object_type=object_type, - depth=depth, - sort=sort, - replies_limit=replies_limit, - limit=limit, - prev=prev, - next=next, + **{ + "object_id": object_id, + "object_type": object_type, + "depth": depth, + "sort": sort, + "replies_limit": replies_limit, + "user_id": user_id, + "limit": limit, + "prev": prev, + "next": next, + } ) return self.get( "/api/v2/feeds/comments", GetCommentsResponse, query_params=query_params @@ -591,6 +716,7 @@ def get_comments( def add_comment( self, comment: Optional[str] = None, + copy_custom_to_notification: Optional[bool] = None, create_notification_activity: Optional[bool] = None, id: Optional[str] = None, object_id: Optional[str] = None, @@ -605,19 +731,22 @@ def add_comment( user: Optional[UserRequest] = None, ) -> StreamResponse[AddCommentResponse]: json = build_body_dict( - comment=comment, - create_notification_activity=create_notification_activity, - id=id, - object_id=object_id, - object_type=object_type, - parent_id=parent_id, - skip_enrich_url=skip_enrich_url, - skip_push=skip_push, - user_id=user_id, - attachments=attachments, - mentioned_user_ids=mentioned_user_ids, - custom=custom, - user=user, + **{ + "comment": comment, + "copy_custom_to_notification": copy_custom_to_notification, + "create_notification_activity": create_notification_activity, + "id": id, + "object_id": object_id, + "object_type": object_type, + "parent_id": parent_id, + "skip_enrich_url": skip_enrich_url, + "skip_push": skip_push, + "user_id": user_id, + "attachments": attachments, + "mentioned_user_ids": mentioned_user_ids, + "custom": custom, + "user": user, + } ) return self.post("/api/v2/feeds/comments", AddCommentResponse, json=json) @@ -625,7 +754,7 @@ def add_comment( def add_comments_batch( self, comments: List[AddCommentRequest] ) -> StreamResponse[AddCommentsBatchResponse]: - json = build_body_dict(comments=comments) + json = build_body_dict(**{"comments": comments}) return self.post( "/api/v2/feeds/comments/batch", AddCommentsBatchResponse, json=json ) @@ -640,7 +769,13 @@ def query_comments( sort: Optional[str] = None, ) -> StreamResponse[QueryCommentsResponse]: json = build_body_dict( - filter=filter, limit=limit, next=next, prev=prev, sort=sort + **{ + "filter": filter, + "limit": limit, + "next": next, + "prev": prev, + "sort": sort, + } ) return self.post( "/api/v2/feeds/comments/query", QueryCommentsResponse, json=json @@ -648,9 +783,17 @@ def query_comments( @telemetry.operation_name("getstream.api.feeds.delete_comment") def delete_comment( - self, id: str, hard_delete: Optional[bool] = None + self, + id: str, + hard_delete: Optional[bool] = None, + delete_notification_activity: Optional[bool] = None, ) -> StreamResponse[DeleteCommentResponse]: - query_params = build_query_param(hard_delete=hard_delete) + query_params = build_query_param( + **{ + "hard_delete": hard_delete, + "delete_notification_activity": delete_notification_activity, + } + ) path_params = { "id": id, } @@ -675,10 +818,13 @@ def update_comment( self, id: str, comment: Optional[str] = None, + copy_custom_to_notification: Optional[bool] = None, + handle_mention_notifications: Optional[bool] = None, skip_enrich_url: Optional[bool] = None, skip_push: Optional[bool] = None, user_id: Optional[str] = None, attachments: Optional[List[Attachment]] = None, + mentioned_user_ids: Optional[List[str]] = None, custom: Optional[Dict[str, object]] = None, user: Optional[UserRequest] = None, ) -> StreamResponse[UpdateCommentResponse]: @@ -686,13 +832,18 @@ def update_comment( "id": id, } json = build_body_dict( - comment=comment, - skip_enrich_url=skip_enrich_url, - skip_push=skip_push, - user_id=user_id, - attachments=attachments, - custom=custom, - user=user, + **{ + "comment": comment, + "copy_custom_to_notification": copy_custom_to_notification, + "handle_mention_notifications": handle_mention_notifications, + "skip_enrich_url": skip_enrich_url, + "skip_push": skip_push, + "user_id": user_id, + "attachments": attachments, + "mentioned_user_ids": mentioned_user_ids, + "custom": custom, + "user": user, + } ) return self.patch( "/api/v2/feeds/comments/{id}", @@ -706,6 +857,7 @@ def add_comment_reaction( self, id: str, type: str, + copy_custom_to_notification: Optional[bool] = None, create_notification_activity: Optional[bool] = None, enforce_unique: Optional[bool] = None, skip_push: Optional[bool] = None, @@ -717,13 +869,16 @@ def add_comment_reaction( "id": id, } json = build_body_dict( - type=type, - create_notification_activity=create_notification_activity, - enforce_unique=enforce_unique, - skip_push=skip_push, - user_id=user_id, - custom=custom, - user=user, + **{ + "type": type, + "copy_custom_to_notification": copy_custom_to_notification, + "create_notification_activity": create_notification_activity, + "enforce_unique": enforce_unique, + "skip_push": skip_push, + "user_id": user_id, + "custom": custom, + "user": user, + } ) return self.post( "/api/v2/feeds/comments/{id}/reactions", @@ -746,7 +901,13 @@ def query_comment_reactions( "id": id, } json = build_body_dict( - limit=limit, next=next, prev=prev, sort=sort, filter=filter + **{ + "limit": limit, + "next": next, + "prev": prev, + "sort": sort, + "filter": filter, + } ) return self.post( "/api/v2/feeds/comments/{id}/reactions/query", @@ -757,9 +918,18 @@ def query_comment_reactions( @telemetry.operation_name("getstream.api.feeds.delete_comment_reaction") def delete_comment_reaction( - self, id: str, type: str, user_id: Optional[str] = None + self, + id: str, + type: str, + delete_notification_activity: Optional[bool] = None, + user_id: Optional[str] = None, ) -> StreamResponse[DeleteCommentReactionResponse]: - query_params = build_query_param(user_id=user_id) + query_params = build_query_param( + **{ + "delete_notification_activity": delete_notification_activity, + "user_id": user_id, + } + ) path_params = { "id": id, "type": type, @@ -778,17 +948,21 @@ def get_comment_replies( depth: Optional[int] = None, sort: Optional[str] = None, replies_limit: Optional[int] = None, + user_id: Optional[str] = None, limit: Optional[int] = None, prev: Optional[str] = None, next: Optional[str] = None, ) -> StreamResponse[GetCommentRepliesResponse]: query_params = build_query_param( - depth=depth, - sort=sort, - replies_limit=replies_limit, - limit=limit, - prev=prev, - next=next, + **{ + "depth": depth, + "sort": sort, + "replies_limit": replies_limit, + "user_id": user_id, + "limit": limit, + "prev": prev, + "next": next, + } ) path_params = { "id": id, @@ -804,7 +978,9 @@ def get_comment_replies( def list_feed_groups( self, include_soft_deleted: Optional[bool] = None ) -> StreamResponse[ListFeedGroupsResponse]: - query_params = build_query_param(include_soft_deleted=include_soft_deleted) + query_params = build_query_param( + **{"include_soft_deleted": include_soft_deleted} + ) return self.get( "/api/v2/feeds/feed_groups", ListFeedGroupsResponse, @@ -826,16 +1002,18 @@ def create_feed_group( stories: Optional[StoriesConfig] = None, ) -> StreamResponse[CreateFeedGroupResponse]: json = build_body_dict( - id=id, - default_visibility=default_visibility, - activity_processors=activity_processors, - activity_selectors=activity_selectors, - aggregation=aggregation, - custom=custom, - notification=notification, - push_notification=push_notification, - ranking=ranking, - stories=stories, + **{ + "id": id, + "default_visibility": default_visibility, + "activity_processors": activity_processors, + "activity_selectors": activity_selectors, + "aggregation": aggregation, + "custom": custom, + "notification": notification, + "push_notification": push_notification, + "ranking": ranking, + "stories": stories, + } ) return self.post( "/api/v2/feeds/feed_groups", CreateFeedGroupResponse, json=json @@ -845,7 +1023,7 @@ def create_feed_group( def delete_feed( self, feed_group_id: str, feed_id: str, hard_delete: Optional[bool] = None ) -> StreamResponse[DeleteFeedResponse]: - query_params = build_query_param(hard_delete=hard_delete) + query_params = build_query_param(**{"hard_delete": hard_delete}) path_params = { "feed_group_id": feed_group_id, "feed_id": feed_id, @@ -875,6 +1053,7 @@ def get_or_create_feed( filter: Optional[Dict[str, object]] = None, followers_pagination: Optional[PagerRequest] = None, following_pagination: Optional[PagerRequest] = None, + friend_reactions_options: Optional[FriendReactionsOptions] = None, interest_weights: Optional[Dict[str, float]] = None, member_pagination: Optional[PagerRequest] = None, user: Optional[UserRequest] = None, @@ -884,22 +1063,25 @@ def get_or_create_feed( "feed_id": feed_id, } json = build_body_dict( - id_around=id_around, - limit=limit, - next=next, - prev=prev, - user_id=user_id, - view=view, - watch=watch, - data=data, - enrichment_options=enrichment_options, - external_ranking=external_ranking, - filter=filter, - followers_pagination=followers_pagination, - following_pagination=following_pagination, - interest_weights=interest_weights, - member_pagination=member_pagination, - user=user, + **{ + "id_around": id_around, + "limit": limit, + "next": next, + "prev": prev, + "user_id": user_id, + "view": view, + "watch": watch, + "data": data, + "enrichment_options": enrichment_options, + "external_ranking": external_ranking, + "filter": filter, + "followers_pagination": followers_pagination, + "following_pagination": following_pagination, + "friend_reactions_options": friend_reactions_options, + "interest_weights": interest_weights, + "member_pagination": member_pagination, + "user": user, + } ) return self.post( "/api/v2/feeds/feed_groups/{feed_group_id}/feeds/{feed_id}", @@ -924,11 +1106,13 @@ def update_feed( "feed_id": feed_id, } json = build_body_dict( - created_by_id=created_by_id, - description=description, - name=name, - filter_tags=filter_tags, - custom=custom, + **{ + "created_by_id": created_by_id, + "description": description, + "name": name, + "filter_tags": filter_tags, + "custom": custom, + } ) return self.put( "/api/v2/feeds/feed_groups/{feed_group_id}/feeds/{feed_id}", @@ -955,13 +1139,15 @@ def mark_activity( "feed_id": feed_id, } json = build_body_dict( - mark_all_read=mark_all_read, - mark_all_seen=mark_all_seen, - user_id=user_id, - mark_read=mark_read, - mark_seen=mark_seen, - mark_watched=mark_watched, - user=user, + **{ + "mark_all_read": mark_all_read, + "mark_all_seen": mark_all_seen, + "user_id": user_id, + "mark_read": mark_read, + "mark_seen": mark_seen, + "mark_watched": mark_watched, + "user": user, + } ) return self.post( "/api/v2/feeds/feed_groups/{feed_group_id}/feeds/{feed_id}/activities/mark/batch", @@ -978,7 +1164,7 @@ def unpin_activity( activity_id: str, user_id: Optional[str] = None, ) -> StreamResponse[UnpinActivityResponse]: - query_params = build_query_param(user_id=user_id) + query_params = build_query_param(**{"user_id": user_id}) path_params = { "feed_group_id": feed_group_id, "feed_id": feed_id, @@ -1005,7 +1191,7 @@ def pin_activity( "feed_id": feed_id, "activity_id": activity_id, } - json = build_body_dict(user_id=user_id, user=user) + json = build_body_dict(**{"user_id": user_id, "user": user}) return self.post( "/api/v2/feeds/feed_groups/{feed_group_id}/feeds/{feed_id}/activities/{activity_id}/pin", PinActivityResponse, @@ -1029,7 +1215,13 @@ def update_feed_members( "feed_id": feed_id, } json = build_body_dict( - operation=operation, limit=limit, next=next, prev=prev, members=members + **{ + "operation": operation, + "limit": limit, + "next": next, + "prev": prev, + "members": members, + } ) return self.patch( "/api/v2/feeds/feed_groups/{feed_group_id}/feeds/{feed_id}/members", @@ -1050,7 +1242,7 @@ def accept_feed_member_invite( "feed_id": feed_id, "feed_group_id": feed_group_id, } - json = build_body_dict(user_id=user_id, user=user) + json = build_body_dict(**{"user_id": user_id, "user": user}) return self.post( "/api/v2/feeds/feed_groups/{feed_group_id}/feeds/{feed_id}/members/accept", AcceptFeedMemberInviteResponse, @@ -1074,7 +1266,13 @@ def query_feed_members( "feed_id": feed_id, } json = build_body_dict( - limit=limit, next=next, prev=prev, sort=sort, filter=filter + **{ + "limit": limit, + "next": next, + "prev": prev, + "sort": sort, + "filter": filter, + } ) return self.post( "/api/v2/feeds/feed_groups/{feed_group_id}/feeds/{feed_id}/members/query", @@ -1095,7 +1293,7 @@ def reject_feed_member_invite( "feed_group_id": feed_group_id, "feed_id": feed_id, } - json = build_body_dict(user_id=user_id, user=user) + json = build_body_dict(**{"user_id": user_id, "user": user}) return self.post( "/api/v2/feeds/feed_groups/{feed_group_id}/feeds/{feed_id}/members/reject", RejectFeedMemberInviteResponse, @@ -1110,7 +1308,7 @@ def get_follow_suggestions( limit: Optional[int] = None, user_id: Optional[str] = None, ) -> StreamResponse[GetFollowSuggestionsResponse]: - query_params = build_query_param(limit=limit, user_id=user_id) + query_params = build_query_param(**{"limit": limit, "user_id": user_id}) path_params = { "feed_group_id": feed_group_id, } @@ -1125,7 +1323,7 @@ def get_follow_suggestions( def delete_feed_group( self, id: str, hard_delete: Optional[bool] = None ) -> StreamResponse[DeleteFeedGroupResponse]: - query_params = build_query_param(hard_delete=hard_delete) + query_params = build_query_param(**{"hard_delete": hard_delete}) path_params = { "id": id, } @@ -1140,7 +1338,9 @@ def delete_feed_group( def get_feed_group( self, id: str, include_soft_deleted: Optional[bool] = None ) -> StreamResponse[GetFeedGroupResponse]: - query_params = build_query_param(include_soft_deleted=include_soft_deleted) + query_params = build_query_param( + **{"include_soft_deleted": include_soft_deleted} + ) path_params = { "id": id, } @@ -1169,15 +1369,17 @@ def get_or_create_feed_group( "id": id, } json = build_body_dict( - default_visibility=default_visibility, - activity_processors=activity_processors, - activity_selectors=activity_selectors, - aggregation=aggregation, - custom=custom, - notification=notification, - push_notification=push_notification, - ranking=ranking, - stories=stories, + **{ + "default_visibility": default_visibility, + "activity_processors": activity_processors, + "activity_selectors": activity_selectors, + "aggregation": aggregation, + "custom": custom, + "notification": notification, + "push_notification": push_notification, + "ranking": ranking, + "stories": stories, + } ) return self.post( "/api/v2/feeds/feed_groups/{id}", @@ -1204,15 +1406,17 @@ def update_feed_group( "id": id, } json = build_body_dict( - default_visibility=default_visibility, - activity_processors=activity_processors, - activity_selectors=activity_selectors, - aggregation=aggregation, - custom=custom, - notification=notification, - push_notification=push_notification, - ranking=ranking, - stories=stories, + **{ + "default_visibility": default_visibility, + "activity_processors": activity_processors, + "activity_selectors": activity_selectors, + "aggregation": aggregation, + "custom": custom, + "notification": notification, + "push_notification": push_notification, + "ranking": ranking, + "stories": stories, + } ) return self.put( "/api/v2/feeds/feed_groups/{id}", @@ -1234,10 +1438,12 @@ def create_feed_view( ranking: Optional[RankingConfig] = None, ) -> StreamResponse[CreateFeedViewResponse]: json = build_body_dict( - id=id, - activity_selectors=activity_selectors, - aggregation=aggregation, - ranking=ranking, + **{ + "id": id, + "activity_selectors": activity_selectors, + "aggregation": aggregation, + "ranking": ranking, + } ) return self.post("/api/v2/feeds/feed_views", CreateFeedViewResponse, json=json) @@ -1275,9 +1481,11 @@ def get_or_create_feed_view( "id": id, } json = build_body_dict( - activity_selectors=activity_selectors, - aggregation=aggregation, - ranking=ranking, + **{ + "activity_selectors": activity_selectors, + "aggregation": aggregation, + "ranking": ranking, + } ) return self.post( "/api/v2/feeds/feed_views/{id}", @@ -1298,9 +1506,11 @@ def update_feed_view( "id": id, } json = build_body_dict( - activity_selectors=activity_selectors, - aggregation=aggregation, - ranking=ranking, + **{ + "activity_selectors": activity_selectors, + "aggregation": aggregation, + "ranking": ranking, + } ) return self.put( "/api/v2/feeds/feed_views/{id}", @@ -1333,7 +1543,7 @@ def update_feed_visibility( path_params = { "name": name, } - json = build_body_dict(grants=grants) + json = build_body_dict(**{"grants": grants}) return self.put( "/api/v2/feeds/feed_visibilities/{name}", UpdateFeedVisibilityResponse, @@ -1345,7 +1555,7 @@ def update_feed_visibility( def create_feeds_batch( self, feeds: List[FeedRequest] ) -> StreamResponse[CreateFeedsBatchResponse]: - json = build_body_dict(feeds=feeds) + json = build_body_dict(**{"feeds": feeds}) return self.post( "/api/v2/feeds/feeds/batch", CreateFeedsBatchResponse, json=json ) @@ -1354,7 +1564,7 @@ def create_feeds_batch( def delete_feeds_batch( self, feeds: List[str], hard_delete: Optional[bool] = None ) -> StreamResponse[DeleteFeedsBatchResponse]: - json = build_body_dict(feeds=feeds, hard_delete=hard_delete) + json = build_body_dict(**{"feeds": feeds, "hard_delete": hard_delete}) return self.post( "/api/v2/feeds/feeds/delete", DeleteFeedsBatchResponse, json=json ) @@ -1367,7 +1577,9 @@ def own_batch( fields: Optional[List[str]] = None, user: Optional[UserRequest] = None, ) -> StreamResponse[OwnBatchResponse]: - json = build_body_dict(feeds=feeds, user_id=user_id, fields=fields, user=user) + json = build_body_dict( + **{"feeds": feeds, "user_id": user_id, "fields": fields, "user": user} + ) return self.post("/api/v2/feeds/feeds/own/batch", OwnBatchResponse, json=json) @telemetry.operation_name("getstream.api.feeds.query_feeds") @@ -1381,7 +1593,14 @@ def query_feeds( filter: Optional[Dict[str, object]] = None, ) -> StreamResponse[QueryFeedsResponse]: json = build_body_dict( - limit=limit, next=next, prev=prev, watch=watch, sort=sort, filter=filter + **{ + "limit": limit, + "next": next, + "prev": prev, + "watch": watch, + "sort": sort, + "filter": filter, + } ) return self.post("/api/v2/feeds/feeds/query", QueryFeedsResponse, json=json) @@ -1395,11 +1614,13 @@ def get_feeds_rate_limits( server_side: Optional[bool] = None, ) -> StreamResponse[GetFeedsRateLimitsResponse]: query_params = build_query_param( - endpoints=endpoints, - android=android, - ios=ios, - web=web, - server_side=server_side, + **{ + "endpoints": endpoints, + "android": android, + "ios": ios, + "web": web, + "server_side": server_side, + } ) return self.get( "/api/v2/feeds/feeds/rate_limits", @@ -1412,20 +1633,26 @@ def update_follow( self, source: str, target: str, + copy_custom_to_notification: Optional[bool] = None, create_notification_activity: Optional[bool] = None, follower_role: Optional[str] = None, push_preference: Optional[str] = None, skip_push: Optional[bool] = None, + status: Optional[str] = None, custom: Optional[Dict[str, object]] = None, ) -> StreamResponse[UpdateFollowResponse]: json = build_body_dict( - source=source, - target=target, - create_notification_activity=create_notification_activity, - follower_role=follower_role, - push_preference=push_preference, - skip_push=skip_push, - custom=custom, + **{ + "source": source, + "target": target, + "copy_custom_to_notification": copy_custom_to_notification, + "create_notification_activity": create_notification_activity, + "follower_role": follower_role, + "push_preference": push_preference, + "skip_push": skip_push, + "status": status, + "custom": custom, + } ) return self.patch("/api/v2/feeds/follows", UpdateFollowResponse, json=json) @@ -1434,18 +1661,24 @@ def follow( self, source: str, target: str, + copy_custom_to_notification: Optional[bool] = None, create_notification_activity: Optional[bool] = None, push_preference: Optional[str] = None, skip_push: Optional[bool] = None, + status: Optional[str] = None, custom: Optional[Dict[str, object]] = None, ) -> StreamResponse[SingleFollowResponse]: json = build_body_dict( - source=source, - target=target, - create_notification_activity=create_notification_activity, - push_preference=push_preference, - skip_push=skip_push, - custom=custom, + **{ + "source": source, + "target": target, + "copy_custom_to_notification": copy_custom_to_notification, + "create_notification_activity": create_notification_activity, + "push_preference": push_preference, + "skip_push": skip_push, + "status": status, + "custom": custom, + } ) return self.post("/api/v2/feeds/follows", SingleFollowResponse, json=json) @@ -1454,7 +1687,7 @@ def accept_follow( self, source: str, target: str, follower_role: Optional[str] = None ) -> StreamResponse[AcceptFollowResponse]: json = build_body_dict( - source=source, target=target, follower_role=follower_role + **{"source": source, "target": target, "follower_role": follower_role} ) return self.post( "/api/v2/feeds/follows/accept", AcceptFollowResponse, json=json @@ -1464,14 +1697,14 @@ def accept_follow( def follow_batch( self, follows: List[FollowRequest] ) -> StreamResponse[FollowBatchResponse]: - json = build_body_dict(follows=follows) + json = build_body_dict(**{"follows": follows}) return self.post("/api/v2/feeds/follows/batch", FollowBatchResponse, json=json) @telemetry.operation_name("getstream.api.feeds.get_or_create_follows") def get_or_create_follows( self, follows: List[FollowRequest] ) -> StreamResponse[FollowBatchResponse]: - json = build_body_dict(follows=follows) + json = build_body_dict(**{"follows": follows}) return self.post( "/api/v2/feeds/follows/batch/upsert", FollowBatchResponse, json=json ) @@ -1486,7 +1719,13 @@ def query_follows( filter: Optional[Dict[str, object]] = None, ) -> StreamResponse[QueryFollowsResponse]: json = build_body_dict( - limit=limit, next=next, prev=prev, sort=sort, filter=filter + **{ + "limit": limit, + "next": next, + "prev": prev, + "sort": sort, + "filter": filter, + } ) return self.post("/api/v2/feeds/follows/query", QueryFollowsResponse, json=json) @@ -1494,13 +1733,21 @@ def query_follows( def reject_follow( self, source: str, target: str ) -> StreamResponse[RejectFollowResponse]: - json = build_body_dict(source=source, target=target) + json = build_body_dict(**{"source": source, "target": target}) return self.post( "/api/v2/feeds/follows/reject", RejectFollowResponse, json=json ) @telemetry.operation_name("getstream.api.feeds.unfollow") - def unfollow(self, source: str, target: str) -> StreamResponse[UnfollowResponse]: + def unfollow( + self, + source: str, + target: str, + delete_notification_activity: Optional[bool] = None, + ) -> StreamResponse[UnfollowResponse]: + query_params = build_query_param( + **{"delete_notification_activity": delete_notification_activity} + ) path_params = { "source": source, "target": target, @@ -1508,6 +1755,7 @@ def unfollow(self, source: str, target: str) -> StreamResponse[UnfollowResponse] return self.delete( "/api/v2/feeds/follows/{source}/{target}", UnfollowResponse, + query_params=query_params, path_params=path_params, ) @@ -1522,12 +1770,14 @@ def create_membership_level( custom: Optional[Dict[str, object]] = None, ) -> StreamResponse[CreateMembershipLevelResponse]: json = build_body_dict( - id=id, - name=name, - description=description, - priority=priority, - tags=tags, - custom=custom, + **{ + "id": id, + "name": name, + "description": description, + "priority": priority, + "tags": tags, + "custom": custom, + } ) return self.post( "/api/v2/feeds/membership_levels", CreateMembershipLevelResponse, json=json @@ -1543,7 +1793,13 @@ def query_membership_levels( filter: Optional[Dict[str, object]] = None, ) -> StreamResponse[QueryMembershipLevelsResponse]: json = build_body_dict( - limit=limit, next=next, prev=prev, sort=sort, filter=filter + **{ + "limit": limit, + "next": next, + "prev": prev, + "sort": sort, + "filter": filter, + } ) return self.post( "/api/v2/feeds/membership_levels/query", @@ -1574,11 +1830,13 @@ def update_membership_level( "id": id, } json = build_body_dict( - description=description, - name=name, - priority=priority, - tags=tags, - custom=custom, + **{ + "description": description, + "name": name, + "priority": priority, + "tags": tags, + "custom": custom, + } ) return self.patch( "/api/v2/feeds/membership_levels/{id}", @@ -1591,25 +1849,39 @@ def update_membership_level( def query_feeds_usage_stats( self, _from: Optional[str] = None, to: Optional[str] = None ) -> StreamResponse[QueryFeedsUsageStatsResponse]: - json = build_body_dict(_from=_from, to=to) + json = build_body_dict(**{"from": _from, "to": to}) return self.post( "/api/v2/feeds/stats/usage", QueryFeedsUsageStatsResponse, json=json ) @telemetry.operation_name("getstream.api.feeds.unfollow_batch") def unfollow_batch( - self, follows: List[FollowPair] + self, + follows: List[FollowPair], + delete_notification_activity: Optional[bool] = None, ) -> StreamResponse[UnfollowBatchResponse]: - json = build_body_dict(follows=follows) + json = build_body_dict( + **{ + "follows": follows, + "delete_notification_activity": delete_notification_activity, + } + ) return self.post( "/api/v2/feeds/unfollow/batch", UnfollowBatchResponse, json=json ) @telemetry.operation_name("getstream.api.feeds.get_or_create_unfollows") def get_or_create_unfollows( - self, follows: List[FollowPair] + self, + follows: List[FollowPair], + delete_notification_activity: Optional[bool] = None, ) -> StreamResponse[UnfollowBatchResponse]: - json = build_body_dict(follows=follows) + json = build_body_dict( + **{ + "follows": follows, + "delete_notification_activity": delete_notification_activity, + } + ) return self.post( "/api/v2/feeds/unfollow/batch/upsert", UnfollowBatchResponse, json=json ) @@ -1621,7 +1893,7 @@ def delete_feed_user_data( path_params = { "user_id": user_id, } - json = build_body_dict(hard_delete=hard_delete) + json = build_body_dict(**{"hard_delete": hard_delete}) return self.post( "/api/v2/feeds/users/{user_id}/delete", DeleteFeedUserDataResponse, diff --git a/getstream/models/__init__.py b/getstream/models/__init__.py index 2006363c..2f0dacb0 100644 --- a/getstream/models/__init__.py +++ b/getstream/models/__init__.py @@ -151,6 +151,26 @@ class APNS(DataClassJsonMixin): ) +@dataclass +class APNSPayload(DataClassJsonMixin): + body: Optional[str] = dc_field(default=None, metadata=dc_config(field_name="body")) + content_available: Optional[int] = dc_field( + default=None, metadata=dc_config(field_name="content-available") + ) + mutable_content: Optional[int] = dc_field( + default=None, metadata=dc_config(field_name="mutable-content") + ) + sound: Optional[str] = dc_field( + default=None, metadata=dc_config(field_name="sound") + ) + title: Optional[str] = dc_field( + default=None, metadata=dc_config(field_name="title") + ) + data: Optional[Dict[str, object]] = dc_field( + default=None, metadata=dc_config(field_name="data") + ) + + @dataclass class AWSRekognitionRule(DataClassJsonMixin): action: str = dc_field(metadata=dc_config(field_name="action")) @@ -501,31 +521,6 @@ class ActivityMarkEvent(DataClassJsonMixin): ) -@dataclass -class ActivityMarkedEvent(DataClassJsonMixin): - all_read: bool = dc_field(metadata=dc_config(field_name="all_read")) - all_seen: bool = dc_field(metadata=dc_config(field_name="all_seen")) - 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"), - ) - ) - feed_id: str = dc_field(metadata=dc_config(field_name="feed_id")) - user_id: str = dc_field(metadata=dc_config(field_name="user_id")) - type: str = dc_field( - default="activity.marked", metadata=dc_config(field_name="type") - ) - marked_read: Optional[List[str]] = dc_field( - default=None, metadata=dc_config(field_name="marked_read") - ) - marked_watched: Optional[List[str]] = dc_field( - default=None, metadata=dc_config(field_name="marked_watched") - ) - - @dataclass class ActivityPinResponse(DataClassJsonMixin): created_at: datetime = dc_field( @@ -735,6 +730,12 @@ class ActivityRemovedFromFeedEvent(DataClassJsonMixin): class ActivityRequest(DataClassJsonMixin): type: str = dc_field(metadata=dc_config(field_name="type")) feeds: List[str] = dc_field(metadata=dc_config(field_name="feeds")) + copy_custom_to_notification: Optional[bool] = dc_field( + default=None, metadata=dc_config(field_name="copy_custom_to_notification") + ) + create_notification_activity: Optional[bool] = dc_field( + default=None, metadata=dc_config(field_name="create_notification_activity") + ) expires_at: Optional[str] = dc_field( default=None, metadata=dc_config(field_name="expires_at") ) @@ -751,6 +752,9 @@ class ActivityRequest(DataClassJsonMixin): skip_enrich_url: Optional[bool] = dc_field( default=None, metadata=dc_config(field_name="skip_enrich_url") ) + skip_push: Optional[bool] = dc_field( + default=None, metadata=dc_config(field_name="skip_push") + ) text: Optional[str] = dc_field(default=None, metadata=dc_config(field_name="text")) user_id: Optional[str] = dc_field( default=None, metadata=dc_config(field_name="user_id") @@ -842,7 +846,7 @@ class ActivityResponse(DataClassJsonMixin): metadata=dc_config(field_name="collections") ) custom: Dict[str, object] = dc_field(metadata=dc_config(field_name="custom")) - reaction_groups: "Dict[str, Optional[ReactionGroupResponse]]" = dc_field( + reaction_groups: "Dict[str, FeedsReactionGroupResponse]" = dc_field( metadata=dc_config(field_name="reaction_groups") ) search_data: Dict[str, object] = dc_field( @@ -876,16 +880,25 @@ class ActivityResponse(DataClassJsonMixin): mm_field=fields.DateTime(format="iso"), ), ) + friend_reaction_count: Optional[int] = dc_field( + default=None, metadata=dc_config(field_name="friend_reaction_count") + ) is_watched: Optional[bool] = dc_field( default=None, metadata=dc_config(field_name="is_watched") ) moderation_action: Optional[str] = dc_field( default=None, metadata=dc_config(field_name="moderation_action") ) + selector_source: Optional[str] = dc_field( + default=None, metadata=dc_config(field_name="selector_source") + ) text: Optional[str] = dc_field(default=None, metadata=dc_config(field_name="text")) visibility_tag: Optional[str] = dc_field( default=None, metadata=dc_config(field_name="visibility_tag") ) + friend_reactions: "Optional[List[FeedsReactionResponse]]" = dc_field( + default=None, metadata=dc_config(field_name="friend_reactions") + ) current_feed: "Optional[FeedResponse]" = dc_field( default=None, metadata=dc_config(field_name="current_feed") ) @@ -906,6 +919,39 @@ class ActivityResponse(DataClassJsonMixin): ) +@dataclass +class ActivityRestoredEvent(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"), + ) + ) + fid: str = dc_field(metadata=dc_config(field_name="fid")) + activity: "ActivityResponse" = dc_field(metadata=dc_config(field_name="activity")) + custom: Dict[str, object] = dc_field(metadata=dc_config(field_name="custom")) + type: str = dc_field( + default="feeds.activity.restored", metadata=dc_config(field_name="type") + ) + feed_visibility: Optional[str] = dc_field( + default=None, metadata=dc_config(field_name="feed_visibility") + ) + received_at: Optional[datetime] = dc_field( + default=None, + metadata=dc_config( + field_name="received_at", + encoder=encode_datetime, + decoder=datetime_from_unix_ns, + mm_field=fields.DateTime(format="iso"), + ), + ) + user: "Optional[UserResponseCommonFields]" = dc_field( + default=None, metadata=dc_config(field_name="user") + ) + + @dataclass class ActivitySelectorConfig(DataClassJsonMixin): type: str = dc_field(metadata=dc_config(field_name="type")) @@ -1030,6 +1076,12 @@ class ActivityUpdatedEvent(DataClassJsonMixin): class AddActivityRequest(DataClassJsonMixin): type: str = dc_field(metadata=dc_config(field_name="type")) feeds: List[str] = dc_field(metadata=dc_config(field_name="feeds")) + copy_custom_to_notification: Optional[bool] = dc_field( + default=None, metadata=dc_config(field_name="copy_custom_to_notification") + ) + create_notification_activity: Optional[bool] = dc_field( + default=None, metadata=dc_config(field_name="create_notification_activity") + ) expires_at: Optional[str] = dc_field( default=None, metadata=dc_config(field_name="expires_at") ) @@ -1046,6 +1098,9 @@ class AddActivityRequest(DataClassJsonMixin): skip_enrich_url: Optional[bool] = dc_field( default=None, metadata=dc_config(field_name="skip_enrich_url") ) + skip_push: Optional[bool] = dc_field( + default=None, metadata=dc_config(field_name="skip_push") + ) text: Optional[str] = dc_field(default=None, metadata=dc_config(field_name="text")) user_id: Optional[str] = dc_field( default=None, metadata=dc_config(field_name="user_id") @@ -1086,6 +1141,9 @@ class AddActivityRequest(DataClassJsonMixin): class AddActivityResponse(DataClassJsonMixin): duration: str = dc_field(metadata=dc_config(field_name="duration")) activity: "ActivityResponse" = dc_field(metadata=dc_config(field_name="activity")) + mention_notifications_created: Optional[int] = dc_field( + default=None, metadata=dc_config(field_name="mention_notifications_created") + ) @dataclass @@ -1116,6 +1174,9 @@ class AddBookmarkResponse(DataClassJsonMixin): @dataclass class AddCommentReactionRequest(DataClassJsonMixin): type: str = dc_field(metadata=dc_config(field_name="type")) + copy_custom_to_notification: Optional[bool] = dc_field( + default=None, metadata=dc_config(field_name="copy_custom_to_notification") + ) create_notification_activity: Optional[bool] = dc_field( default=None, metadata=dc_config(field_name="create_notification_activity") ) @@ -1143,6 +1204,9 @@ class AddCommentReactionResponse(DataClassJsonMixin): reaction: "FeedsReactionResponse" = dc_field( metadata=dc_config(field_name="reaction") ) + notification_created: Optional[bool] = dc_field( + default=None, metadata=dc_config(field_name="notification_created") + ) @dataclass @@ -1150,6 +1214,9 @@ class AddCommentRequest(DataClassJsonMixin): comment: Optional[str] = dc_field( default=None, metadata=dc_config(field_name="comment") ) + copy_custom_to_notification: Optional[bool] = dc_field( + default=None, metadata=dc_config(field_name="copy_custom_to_notification") + ) create_notification_activity: Optional[bool] = dc_field( default=None, metadata=dc_config(field_name="create_notification_activity") ) @@ -1190,6 +1257,12 @@ class AddCommentRequest(DataClassJsonMixin): class AddCommentResponse(DataClassJsonMixin): duration: str = dc_field(metadata=dc_config(field_name="duration")) comment: "CommentResponse" = dc_field(metadata=dc_config(field_name="comment")) + mention_notifications_created: Optional[int] = dc_field( + default=None, metadata=dc_config(field_name="mention_notifications_created") + ) + notification_created: Optional[bool] = dc_field( + default=None, metadata=dc_config(field_name="notification_created") + ) @dataclass @@ -1218,6 +1291,9 @@ class AddFolderRequest(DataClassJsonMixin): @dataclass class AddReactionRequest(DataClassJsonMixin): type: str = dc_field(metadata=dc_config(field_name="type")) + copy_custom_to_notification: Optional[bool] = dc_field( + default=None, metadata=dc_config(field_name="copy_custom_to_notification") + ) create_notification_activity: Optional[bool] = dc_field( default=None, metadata=dc_config(field_name="create_notification_activity") ) @@ -1245,6 +1321,9 @@ class AddReactionResponse(DataClassJsonMixin): reaction: "FeedsReactionResponse" = dc_field( metadata=dc_config(field_name="reaction") ) + notification_created: Optional[bool] = dc_field( + default=None, metadata=dc_config(field_name="notification_created") + ) @dataclass @@ -1287,19 +1366,6 @@ class AggregationConfig(DataClassJsonMixin): ) -@dataclass -class AnyEvent(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"), - ) - ) - type: str = dc_field(default="*", metadata=dc_config(field_name="type")) - - @dataclass class AppResponseFields(DataClassJsonMixin): allow_multi_user_devices: bool = dc_field( @@ -1337,9 +1403,6 @@ class AppResponseFields(DataClassJsonMixin): max_aggregated_activities_length: int = dc_field( metadata=dc_config(field_name="max_aggregated_activities_length") ) - moderation_bulk_submit_action_enabled: bool = dc_field( - metadata=dc_config(field_name="moderation_bulk_submit_action_enabled") - ) moderation_enabled: bool = dc_field( metadata=dc_config(field_name="moderation_enabled") ) @@ -1699,7 +1762,7 @@ class AsyncExportErrorEvent(DataClassJsonMixin): task_id: str = dc_field(metadata=dc_config(field_name="task_id")) custom: Dict[str, object] = dc_field(metadata=dc_config(field_name="custom")) type: str = dc_field( - default="export.users.error", metadata=dc_config(field_name="type") + default="export.moderation_logs.error", metadata=dc_config(field_name="type") ) received_at: Optional[datetime] = dc_field( default=None, @@ -1951,7 +2014,7 @@ class AudioSettingsResponse(DataClassJsonMixin): @dataclass -class AutomodDetails(DataClassJsonMixin): +class AutomodDetailsResponse(DataClassJsonMixin): action: Optional[str] = dc_field( default=None, metadata=dc_config(field_name="action") ) @@ -1961,7 +2024,7 @@ class AutomodDetails(DataClassJsonMixin): image_labels: Optional[List[str]] = dc_field( default=None, metadata=dc_config(field_name="image_labels") ) - message_details: "Optional[FlagMessageDetails]" = dc_field( + message_details: "Optional[FlagMessageDetailsResponse]" = dc_field( default=None, metadata=dc_config(field_name="message_details") ) result: "Optional[MessageModerationResult]" = dc_field( @@ -2059,7 +2122,32 @@ class BackstageSettingsResponse(DataClassJsonMixin): @dataclass -class Ban(DataClassJsonMixin): +class BanActionRequestPayload(DataClassJsonMixin): + channel_ban_only: Optional[bool] = dc_field( + default=None, metadata=dc_config(field_name="channel_ban_only") + ) + delete_messages: Optional[str] = dc_field( + default=None, metadata=dc_config(field_name="delete_messages") + ) + ip_ban: Optional[bool] = dc_field( + default=None, metadata=dc_config(field_name="ip_ban") + ) + reason: Optional[str] = dc_field( + default=None, metadata=dc_config(field_name="reason") + ) + shadow: Optional[bool] = dc_field( + default=None, metadata=dc_config(field_name="shadow") + ) + target_user_id: Optional[str] = dc_field( + default=None, metadata=dc_config(field_name="target_user_id") + ) + timeout: Optional[int] = dc_field( + default=None, metadata=dc_config(field_name="timeout") + ) + + +@dataclass +class BanInfoResponse(DataClassJsonMixin): created_at: datetime = dc_field( metadata=dc_config( field_name="created_at", @@ -2068,7 +2156,6 @@ class Ban(DataClassJsonMixin): mm_field=fields.DateTime(format="iso"), ) ) - shadow: bool = dc_field(metadata=dc_config(field_name="shadow")) expires: Optional[datetime] = dc_field( default=None, metadata=dc_config( @@ -2081,36 +2168,14 @@ class Ban(DataClassJsonMixin): reason: Optional[str] = dc_field( default=None, metadata=dc_config(field_name="reason") ) - channel: "Optional[Channel]" = dc_field( - default=None, metadata=dc_config(field_name="channel") - ) - created_by: "Optional[User]" = dc_field( - default=None, metadata=dc_config(field_name="created_by") - ) - target: "Optional[User]" = dc_field( - default=None, metadata=dc_config(field_name="target") - ) - - -@dataclass -class BanActionRequest(DataClassJsonMixin): - channel_ban_only: Optional[bool] = dc_field( - default=None, metadata=dc_config(field_name="channel_ban_only") - ) - delete_messages: Optional[str] = dc_field( - default=None, metadata=dc_config(field_name="delete_messages") - ) - ip_ban: Optional[bool] = dc_field( - default=None, metadata=dc_config(field_name="ip_ban") - ) - reason: Optional[str] = dc_field( - default=None, metadata=dc_config(field_name="reason") - ) shadow: Optional[bool] = dc_field( default=None, metadata=dc_config(field_name="shadow") ) - timeout: Optional[int] = dc_field( - default=None, metadata=dc_config(field_name="timeout") + created_by: "Optional[UserResponse]" = dc_field( + default=None, metadata=dc_config(field_name="created_by") + ) + user: "Optional[UserResponse]" = dc_field( + default=None, metadata=dc_config(field_name="user") ) @@ -2199,7 +2264,7 @@ class BanResponse(DataClassJsonMixin): @dataclass -class BlockActionRequest(DataClassJsonMixin): +class BlockActionRequestPayload(DataClassJsonMixin): reason: Optional[str] = dc_field( default=None, metadata=dc_config(field_name="reason") ) @@ -2639,6 +2704,31 @@ class CallAcceptedEvent(DataClassJsonMixin): type: str = dc_field(default="call.accepted", metadata=dc_config(field_name="type")) +@dataclass +class CallActionOptions(DataClassJsonMixin): + duration: Optional[int] = dc_field( + default=None, metadata=dc_config(field_name="duration") + ) + flag_reason: Optional[str] = dc_field( + default=None, metadata=dc_config(field_name="flag_reason") + ) + kick_reason: Optional[str] = dc_field( + default=None, metadata=dc_config(field_name="kick_reason") + ) + mute_audio: Optional[bool] = dc_field( + default=None, metadata=dc_config(field_name="mute_audio") + ) + mute_video: Optional[bool] = dc_field( + default=None, metadata=dc_config(field_name="mute_video") + ) + reason: Optional[str] = dc_field( + default=None, metadata=dc_config(field_name="reason") + ) + warning_text: Optional[str] = dc_field( + default=None, metadata=dc_config(field_name="warning_text") + ) + + @dataclass class CallClosedCaption(DataClassJsonMixin): end_time: datetime = dc_field( @@ -2732,6 +2822,42 @@ class CallCreatedEvent(DataClassJsonMixin): type: str = dc_field(default="call.created", metadata=dc_config(field_name="type")) +@dataclass +class CallCustomPropertyParameters(DataClassJsonMixin): + operator: Optional[str] = dc_field( + default=None, metadata=dc_config(field_name="operator") + ) + property_key: Optional[str] = dc_field( + default=None, metadata=dc_config(field_name="property_key") + ) + + +@dataclass +class CallDTMFEvent(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"), + ) + ) + digit: str = dc_field(metadata=dc_config(field_name="digit")) + duration_ms: int = dc_field(metadata=dc_config(field_name="duration_ms")) + seq_number: int = dc_field(metadata=dc_config(field_name="seq_number")) + timestamp: datetime = dc_field( + metadata=dc_config( + field_name="timestamp", + encoder=encode_datetime, + decoder=datetime_from_unix_ns, + mm_field=fields.DateTime(format="iso"), + ) + ) + user: "UserResponse" = dc_field(metadata=dc_config(field_name="user")) + type: str = dc_field(default="call.dtmf", metadata=dc_config(field_name="type")) + + @dataclass class CallDeletedEvent(DataClassJsonMixin): call_cid: str = dc_field(metadata=dc_config(field_name="call_cid")) @@ -3145,7 +3271,9 @@ class CallReactionEvent(DataClassJsonMixin): mm_field=fields.DateTime(format="iso"), ) ) - reaction: "ReactionResponse" = dc_field(metadata=dc_config(field_name="reaction")) + reaction: "VideoReactionResponse" = dc_field( + metadata=dc_config(field_name="reaction") + ) type: str = dc_field( default="call.reaction_new", metadata=dc_config(field_name="type") ) @@ -3381,6 +3509,9 @@ class CallResponse(DataClassJsonMixin): join_ahead_time_seconds: Optional[int] = dc_field( default=None, metadata=dc_config(field_name="join_ahead_time_seconds") ) + routing_number: Optional[str] = dc_field( + default=None, metadata=dc_config(field_name="routing_number") + ) starts_at: Optional[datetime] = dc_field( default=None, metadata=dc_config( @@ -3469,6 +3600,19 @@ class CallRtmpBroadcastStoppedEvent(DataClassJsonMixin): ) +@dataclass +class CallRuleActionSequence(DataClassJsonMixin): + violation_number: Optional[int] = dc_field( + default=None, metadata=dc_config(field_name="violation_number") + ) + actions: Optional[List[str]] = dc_field( + default=None, metadata=dc_config(field_name="actions") + ) + call_options: "Optional[CallActionOptions]" = dc_field( + default=None, metadata=dc_config(field_name="call_options") + ) + + @dataclass class CallSessionEndedEvent(DataClassJsonMixin): call_cid: str = dc_field(metadata=dc_config(field_name="call_cid")) @@ -3933,6 +4077,9 @@ class CallStatsParticipantCounts(DataClassJsonMixin): ) publishers: int = dc_field(metadata=dc_config(field_name="publishers")) sessions: int = dc_field(metadata=dc_config(field_name="sessions")) + total_participant_duration: Optional[int] = dc_field( + default=None, metadata=dc_config(field_name="total_participant_duration") + ) @dataclass @@ -4196,7 +4343,7 @@ class CallTypeResponse(DataClassJsonMixin): ) ) grants: "Dict[str, List[str]]" = dc_field(metadata=dc_config(field_name="grants")) - notification_settings: "NotificationSettings" = dc_field( + notification_settings: "NotificationSettingsResponse" = dc_field( metadata=dc_config(field_name="notification_settings") ) settings: "CallSettingsResponse" = dc_field( @@ -4207,6 +4354,13 @@ class CallTypeResponse(DataClassJsonMixin): ) +@dataclass +class CallTypeRuleParameters(DataClassJsonMixin): + call_type: Optional[str] = dc_field( + default=None, metadata=dc_config(field_name="call_type") + ) + + @dataclass class CallUpdatedEvent(DataClassJsonMixin): call_cid: str = dc_field(metadata=dc_config(field_name="call_cid")) @@ -4487,11 +4641,15 @@ class CastPollVoteRequest(DataClassJsonMixin): @dataclass -class Channel(DataClassJsonMixin): - auto_translation_language: str = dc_field( - metadata=dc_config(field_name="auto_translation_language") +class ChannelBatchCompletedEvent(DataClassJsonMixin): + batch_created_at: datetime = dc_field( + metadata=dc_config( + field_name="batch_created_at", + encoder=encode_datetime, + decoder=datetime_from_unix_ns, + mm_field=fields.DateTime(format="iso"), + ) ) - cid: str = dc_field(metadata=dc_config(field_name="cid")) created_at: datetime = dc_field( metadata=dc_config( field_name="created_at", @@ -4500,134 +4658,31 @@ class Channel(DataClassJsonMixin): mm_field=fields.DateTime(format="iso"), ) ) - disabled: bool = dc_field(metadata=dc_config(field_name="disabled")) - frozen: bool = dc_field(metadata=dc_config(field_name="frozen")) - id: str = dc_field(metadata=dc_config(field_name="id")) - type: str = dc_field(metadata=dc_config(field_name="type")) - updated_at: datetime = dc_field( + finished_at: datetime = dc_field( metadata=dc_config( - field_name="updated_at", + field_name="finished_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")) - auto_translation_enabled: Optional[bool] = dc_field( - default=None, metadata=dc_config(field_name="auto_translation_enabled") + operation: str = dc_field(metadata=dc_config(field_name="operation")) + status: str = dc_field(metadata=dc_config(field_name="status")) + success_channels_count: int = dc_field( + metadata=dc_config(field_name="success_channels_count") ) - cooldown: Optional[int] = dc_field( - default=None, metadata=dc_config(field_name="cooldown") + task_id: str = dc_field(metadata=dc_config(field_name="task_id")) + failed_channels: "List[FailedChannelUpdates]" = dc_field( + metadata=dc_config(field_name="failed_channels") ) - deleted_at: Optional[datetime] = dc_field( + custom: Dict[str, object] = dc_field(metadata=dc_config(field_name="custom")) + type: str = dc_field( + default="channel_batch_update.completed", metadata=dc_config(field_name="type") + ) + received_at: Optional[datetime] = dc_field( default=None, metadata=dc_config( - field_name="deleted_at", - encoder=encode_datetime, - decoder=datetime_from_unix_ns, - mm_field=fields.DateTime(format="iso"), - ), - ) - 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( - field_name="last_message_at", - encoder=encode_datetime, - decoder=datetime_from_unix_ns, - mm_field=fields.DateTime(format="iso"), - ), - ) - member_count: Optional[int] = dc_field( - default=None, metadata=dc_config(field_name="member_count") - ) - message_count: Optional[int] = dc_field( - default=None, metadata=dc_config(field_name="message_count") - ) - message_count_updated_at: Optional[datetime] = dc_field( - default=None, - metadata=dc_config( - field_name="message_count_updated_at", - encoder=encode_datetime, - decoder=datetime_from_unix_ns, - mm_field=fields.DateTime(format="iso"), - ), - ) - team: Optional[str] = dc_field(default=None, metadata=dc_config(field_name="team")) - active_live_locations: "Optional[List[SharedLocation]]" = dc_field( - default=None, metadata=dc_config(field_name="active_live_locations") - ) - filter_tags: Optional[List[str]] = dc_field( - default=None, metadata=dc_config(field_name="filter_tags") - ) - invites: "Optional[List[ChannelMember]]" = dc_field( - default=None, metadata=dc_config(field_name="invites") - ) - members: "Optional[List[ChannelMember]]" = dc_field( - default=None, metadata=dc_config(field_name="members") - ) - config: "Optional[ChannelConfig]" = dc_field( - default=None, metadata=dc_config(field_name="config") - ) - config_overrides: "Optional[ConfigOverrides]" = dc_field( - default=None, metadata=dc_config(field_name="config_overrides") - ) - created_by: "Optional[User]" = dc_field( - default=None, metadata=dc_config(field_name="created_by") - ) - members_lookup: "Optional[Dict[str, Optional[ChannelMemberLookup]]]" = dc_field( - default=None, metadata=dc_config(field_name="members_lookup") - ) - truncated_by: "Optional[User]" = dc_field( - default=None, metadata=dc_config(field_name="truncated_by") - ) - - -@dataclass -class ChannelBatchCompletedEvent(DataClassJsonMixin): - batch_created_at: datetime = dc_field( - metadata=dc_config( - field_name="batch_created_at", - encoder=encode_datetime, - decoder=datetime_from_unix_ns, - mm_field=fields.DateTime(format="iso"), - ) - ) - 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"), - ) - ) - operation: str = dc_field(metadata=dc_config(field_name="operation")) - status: str = dc_field(metadata=dc_config(field_name="status")) - success_channels_count: int = dc_field( - metadata=dc_config(field_name="success_channels_count") - ) - task_id: str = dc_field(metadata=dc_config(field_name="task_id")) - failed_channels: "List[FailedChannelUpdates]" = dc_field( - metadata=dc_config(field_name="failed_channels") - ) - custom: Dict[str, object] = dc_field(metadata=dc_config(field_name="custom")) - type: str = dc_field( - default="channel_batch_update.completed", metadata=dc_config(field_name="type") - ) - received_at: Optional[datetime] = dc_field( - default=None, - metadata=dc_config( - field_name="received_at", + field_name="received_at", encoder=encode_datetime, decoder=datetime_from_unix_ns, mm_field=fields.DateTime(format="iso"), @@ -4750,6 +4805,9 @@ class ChannelConfig(DataClassJsonMixin): partition_ttl: Optional[str] = dc_field( default=None, metadata=dc_config(field_name="partition_ttl") ) + push_level: Optional[str] = dc_field( + default=None, metadata=dc_config(field_name="push_level") + ) allowed_flag_reasons: Optional[List[str]] = dc_field( default=None, metadata=dc_config(field_name="allowed_flag_reasons") ) @@ -4826,6 +4884,9 @@ class ChannelConfigWithInfo(DataClassJsonMixin): partition_ttl: Optional[str] = dc_field( default=None, metadata=dc_config(field_name="partition_ttl") ) + push_level: Optional[str] = dc_field( + default=None, metadata=dc_config(field_name="push_level") + ) allowed_flag_reasons: Optional[List[str]] = dc_field( default=None, metadata=dc_config(field_name="allowed_flag_reasons") ) @@ -4850,19 +4911,44 @@ class ChannelCreatedEvent(DataClassJsonMixin): mm_field=fields.DateTime(format="iso"), ) ) + channel: "ChannelResponse" = dc_field(metadata=dc_config(field_name="channel")) + custom: Dict[str, object] = dc_field(metadata=dc_config(field_name="custom")) type: str = dc_field( default="channel.created", metadata=dc_config(field_name="type") ) + channel_id: Optional[str] = dc_field( + default=None, metadata=dc_config(field_name="channel_id") + ) + channel_member_count: Optional[int] = dc_field( + default=None, metadata=dc_config(field_name="channel_member_count") + ) + channel_message_count: Optional[int] = dc_field( + default=None, metadata=dc_config(field_name="channel_message_count") + ) + channel_type: Optional[str] = dc_field( + default=None, metadata=dc_config(field_name="channel_type") + ) + cid: Optional[str] = dc_field(default=None, metadata=dc_config(field_name="cid")) + 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"), + ), + ) + team: Optional[str] = dc_field(default=None, metadata=dc_config(field_name="team")) + channel_custom: Optional[Dict[str, object]] = dc_field( + default=None, metadata=dc_config(field_name="channel_custom") + ) + user: "Optional[UserResponseCommonFields]" = dc_field( + default=None, metadata=dc_config(field_name="user") + ) @dataclass class ChannelDeletedEvent(DataClassJsonMixin): - channel_id: str = dc_field(metadata=dc_config(field_name="channel_id")) - channel_member_count: int = dc_field( - metadata=dc_config(field_name="channel_member_count") - ) - channel_type: str = dc_field(metadata=dc_config(field_name="channel_type")) - cid: str = dc_field(metadata=dc_config(field_name="cid")) created_at: datetime = dc_field( metadata=dc_config( field_name="created_at", @@ -4871,12 +4957,39 @@ class ChannelDeletedEvent(DataClassJsonMixin): mm_field=fields.DateTime(format="iso"), ) ) + channel: "ChannelResponse" = dc_field(metadata=dc_config(field_name="channel")) + custom: Dict[str, object] = dc_field(metadata=dc_config(field_name="custom")) type: str = dc_field( default="channel.deleted", metadata=dc_config(field_name="type") ) + channel_id: Optional[str] = dc_field( + default=None, metadata=dc_config(field_name="channel_id") + ) + channel_member_count: Optional[int] = dc_field( + default=None, metadata=dc_config(field_name="channel_member_count") + ) + channel_message_count: Optional[int] = dc_field( + default=None, metadata=dc_config(field_name="channel_message_count") + ) + channel_type: Optional[str] = dc_field( + default=None, metadata=dc_config(field_name="channel_type") + ) + cid: Optional[str] = dc_field(default=None, metadata=dc_config(field_name="cid")) + 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"), + ), + ) team: Optional[str] = dc_field(default=None, metadata=dc_config(field_name="team")) - channel: "Optional[ChannelResponse]" = dc_field( - default=None, metadata=dc_config(field_name="channel") + channel_custom: Optional[Dict[str, object]] = dc_field( + default=None, metadata=dc_config(field_name="channel_custom") + ) + user: "Optional[UserResponseCommonFields]" = dc_field( + default=None, metadata=dc_config(field_name="user") ) @@ -4907,9 +5020,6 @@ class ChannelExport(DataClassJsonMixin): @dataclass class ChannelFrozenEvent(DataClassJsonMixin): - channel_id: str = dc_field(metadata=dc_config(field_name="channel_id")) - channel_type: str = dc_field(metadata=dc_config(field_name="channel_type")) - cid: str = dc_field(metadata=dc_config(field_name="cid")) created_at: datetime = dc_field( metadata=dc_config( field_name="created_at", @@ -4918,9 +5028,26 @@ class ChannelFrozenEvent(DataClassJsonMixin): mm_field=fields.DateTime(format="iso"), ) ) + custom: Dict[str, object] = dc_field(metadata=dc_config(field_name="custom")) type: str = dc_field( default="channel.frozen", metadata=dc_config(field_name="type") ) + channel_id: Optional[str] = dc_field( + default=None, metadata=dc_config(field_name="channel_id") + ) + channel_type: Optional[str] = dc_field( + default=None, metadata=dc_config(field_name="channel_type") + ) + cid: Optional[str] = dc_field(default=None, metadata=dc_config(field_name="cid")) + 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 @@ -4950,12 +5077,6 @@ class ChannelGetOrCreateRequest(DataClassJsonMixin): @dataclass class ChannelHiddenEvent(DataClassJsonMixin): - channel_id: str = dc_field(metadata=dc_config(field_name="channel_id")) - channel_member_count: int = dc_field( - metadata=dc_config(field_name="channel_member_count") - ) - channel_type: str = dc_field(metadata=dc_config(field_name="channel_type")) - cid: str = dc_field(metadata=dc_config(field_name="cid")) clear_history: bool = dc_field(metadata=dc_config(field_name="clear_history")) created_at: datetime = dc_field( metadata=dc_config( @@ -4965,13 +5086,38 @@ class ChannelHiddenEvent(DataClassJsonMixin): mm_field=fields.DateTime(format="iso"), ) ) + channel: "ChannelResponse" = dc_field(metadata=dc_config(field_name="channel")) + custom: Dict[str, object] = dc_field(metadata=dc_config(field_name="custom")) type: str = dc_field( default="channel.hidden", metadata=dc_config(field_name="type") ) - channel: "Optional[ChannelResponse]" = dc_field( - default=None, metadata=dc_config(field_name="channel") + channel_id: Optional[str] = dc_field( + default=None, metadata=dc_config(field_name="channel_id") ) - user: "Optional[User]" = dc_field( + channel_member_count: Optional[int] = dc_field( + default=None, metadata=dc_config(field_name="channel_member_count") + ) + channel_message_count: Optional[int] = dc_field( + default=None, metadata=dc_config(field_name="channel_message_count") + ) + channel_type: Optional[str] = dc_field( + default=None, metadata=dc_config(field_name="channel_type") + ) + cid: Optional[str] = dc_field(default=None, metadata=dc_config(field_name="cid")) + 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"), + ), + ) + team: Optional[str] = dc_field(default=None, metadata=dc_config(field_name="team")) + channel_custom: Optional[Dict[str, object]] = dc_field( + default=None, metadata=dc_config(field_name="channel_custom") + ) + user: "Optional[UserResponseCommonFields]" = dc_field( default=None, metadata=dc_config(field_name="user") ) @@ -5032,16 +5178,16 @@ class ChannelInputRequest(DataClassJsonMixin): default=None, metadata=dc_config(field_name="frozen") ) team: Optional[str] = dc_field(default=None, metadata=dc_config(field_name="team")) - invites: "Optional[List[ChannelMember]]" = dc_field( + invites: "Optional[List[ChannelMemberRequest]]" = dc_field( default=None, metadata=dc_config(field_name="invites") ) - members: "Optional[List[ChannelMember]]" = dc_field( + members: "Optional[List[ChannelMemberRequest]]" = dc_field( default=None, metadata=dc_config(field_name="members") ) - config_overrides: "Optional[ConfigOverrides]" = dc_field( + config_overrides: "Optional[ConfigOverridesRequest]" = dc_field( default=None, metadata=dc_config(field_name="config_overrides") ) - created_by: "Optional[User]" = dc_field( + created_by: "Optional[UserRequest]" = dc_field( default=None, metadata=dc_config(field_name="created_by") ) custom: Optional[Dict[str, object]] = dc_field( @@ -5050,7 +5196,44 @@ class ChannelInputRequest(DataClassJsonMixin): @dataclass -class ChannelMember(DataClassJsonMixin): +class ChannelMemberRequest(DataClassJsonMixin): + user_id: str = dc_field(metadata=dc_config(field_name="user_id")) + channel_role: Optional[str] = dc_field( + default=None, metadata=dc_config(field_name="channel_role") + ) + custom: Optional[Dict[str, object]] = dc_field( + default=None, metadata=dc_config(field_name="custom") + ) + user: "Optional[UserResponse]" = dc_field( + default=None, metadata=dc_config(field_name="user") + ) + + +@dataclass +class ChannelMemberResponse(DataClassJsonMixin): + banned: bool = dc_field(metadata=dc_config(field_name="banned")) + channel_role: str = dc_field(metadata=dc_config(field_name="channel_role")) + created_at: datetime = dc_field( + metadata=dc_config( + field_name="created_at", + encoder=encode_datetime, + decoder=datetime_from_unix_ns, + mm_field=fields.DateTime(format="iso"), + ) + ) + notifications_muted: bool = dc_field( + metadata=dc_config(field_name="notifications_muted") + ) + shadow_banned: bool = dc_field(metadata=dc_config(field_name="shadow_banned")) + updated_at: datetime = dc_field( + metadata=dc_config( + field_name="updated_at", + encoder=encode_datetime, + decoder=datetime_from_unix_ns, + mm_field=fields.DateTime(format="iso"), + ) + ) + custom: Dict[str, object] = dc_field(metadata=dc_config(field_name="custom")) archived_at: Optional[datetime] = dc_field( default=None, metadata=dc_config( @@ -5069,24 +5252,6 @@ class ChannelMember(DataClassJsonMixin): mm_field=fields.DateTime(format="iso"), ), ) - banned: Optional[bool] = dc_field( - default=None, metadata=dc_config(field_name="banned") - ) - blocked: Optional[bool] = dc_field( - default=None, metadata=dc_config(field_name="blocked") - ) - channel_role: Optional[str] = dc_field( - default=None, metadata=dc_config(field_name="channel_role") - ) - 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"), - ), - ) deleted_at: Optional[datetime] = dc_field( default=None, metadata=dc_config( @@ -5096,9 +5261,6 @@ class ChannelMember(DataClassJsonMixin): mm_field=fields.DateTime(format="iso"), ), ) - hidden: Optional[bool] = dc_field( - default=None, metadata=dc_config(field_name="hidden") - ) invite_accepted_at: Optional[datetime] = dc_field( default=None, metadata=dc_config( @@ -5120,15 +5282,9 @@ class ChannelMember(DataClassJsonMixin): invited: Optional[bool] = dc_field( default=None, metadata=dc_config(field_name="invited") ) - is_global_banned: Optional[bool] = dc_field( - default=None, metadata=dc_config(field_name="is_global_banned") - ) is_moderator: Optional[bool] = dc_field( default=None, metadata=dc_config(field_name="is_moderator") ) - notifications_muted: Optional[bool] = dc_field( - default=None, metadata=dc_config(field_name="notifications_muted") - ) pinned_at: Optional[datetime] = dc_field( default=None, metadata=dc_config( @@ -5138,92 +5294,31 @@ class ChannelMember(DataClassJsonMixin): mm_field=fields.DateTime(format="iso"), ), ) - shadow_banned: Optional[bool] = dc_field( - default=None, metadata=dc_config(field_name="shadow_banned") - ) + role: Optional[str] = dc_field(default=None, metadata=dc_config(field_name="role")) status: Optional[str] = dc_field( default=None, metadata=dc_config(field_name="status") ) - 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"), - ), - ) user_id: Optional[str] = dc_field( default=None, metadata=dc_config(field_name="user_id") ) deleted_messages: Optional[List[str]] = dc_field( default=None, metadata=dc_config(field_name="deleted_messages") ) - channel: "Optional[DenormalizedChannelFields]" = dc_field( - default=None, metadata=dc_config(field_name="channel") - ) - custom: Optional[Dict[str, object]] = dc_field( - default=None, metadata=dc_config(field_name="custom") - ) - user: "Optional[User]" = dc_field( + user: "Optional[UserResponse]" = dc_field( default=None, metadata=dc_config(field_name="user") ) @dataclass -class ChannelMemberLookup(DataClassJsonMixin): - archived: bool = dc_field(metadata=dc_config(field_name="archived")) - banned: bool = dc_field(metadata=dc_config(field_name="banned")) - blocked: bool = dc_field(metadata=dc_config(field_name="blocked")) - hidden: bool = dc_field(metadata=dc_config(field_name="hidden")) - pinned: bool = dc_field(metadata=dc_config(field_name="pinned")) - archived_at: Optional[datetime] = dc_field( - default=None, - metadata=dc_config( - field_name="archived_at", - encoder=encode_datetime, - decoder=datetime_from_unix_ns, - mm_field=fields.DateTime(format="iso"), - ), - ) - ban_expires: Optional[datetime] = dc_field( - default=None, - metadata=dc_config( - field_name="ban_expires", - encoder=encode_datetime, - decoder=datetime_from_unix_ns, - mm_field=fields.DateTime(format="iso"), - ), - ) - pinned_at: Optional[datetime] = dc_field( - default=None, - metadata=dc_config( - field_name="pinned_at", - encoder=encode_datetime, - decoder=datetime_from_unix_ns, - mm_field=fields.DateTime(format="iso"), - ), - ) - - -@dataclass -class ChannelMemberRequest(DataClassJsonMixin): - user_id: str = dc_field(metadata=dc_config(field_name="user_id")) - channel_role: Optional[str] = dc_field( - default=None, metadata=dc_config(field_name="channel_role") - ) - custom: Optional[Dict[str, object]] = dc_field( - default=None, metadata=dc_config(field_name="custom") - ) - user: "Optional[UserResponse]" = dc_field( - default=None, metadata=dc_config(field_name="user") +class ChannelMessagesResponse(DataClassJsonMixin): + messages: "List[MessageResponse]" = dc_field( + metadata=dc_config(field_name="messages") ) + channel: "ChannelResponse" = dc_field(metadata=dc_config(field_name="channel")) @dataclass -class ChannelMemberResponse(DataClassJsonMixin): - banned: bool = dc_field(metadata=dc_config(field_name="banned")) - channel_role: str = dc_field(metadata=dc_config(field_name="channel_role")) +class ChannelMute(DataClassJsonMixin): created_at: datetime = dc_field( metadata=dc_config( field_name="created_at", @@ -5232,10 +5327,6 @@ class ChannelMemberResponse(DataClassJsonMixin): mm_field=fields.DateTime(format="iso"), ) ) - notifications_muted: bool = dc_field( - metadata=dc_config(field_name="notifications_muted") - ) - shadow_banned: bool = dc_field(metadata=dc_config(field_name="shadow_banned")) updated_at: datetime = dc_field( metadata=dc_config( field_name="updated_at", @@ -5244,76 +5335,17 @@ class ChannelMemberResponse(DataClassJsonMixin): mm_field=fields.DateTime(format="iso"), ) ) - custom: Dict[str, object] = dc_field(metadata=dc_config(field_name="custom")) - archived_at: Optional[datetime] = dc_field( - default=None, - metadata=dc_config( - field_name="archived_at", - encoder=encode_datetime, - decoder=datetime_from_unix_ns, - mm_field=fields.DateTime(format="iso"), - ), - ) - ban_expires: Optional[datetime] = dc_field( - default=None, - metadata=dc_config( - field_name="ban_expires", - encoder=encode_datetime, - decoder=datetime_from_unix_ns, - mm_field=fields.DateTime(format="iso"), - ), - ) - deleted_at: Optional[datetime] = dc_field( - default=None, - metadata=dc_config( - field_name="deleted_at", - encoder=encode_datetime, - decoder=datetime_from_unix_ns, - mm_field=fields.DateTime(format="iso"), - ), - ) - invite_accepted_at: Optional[datetime] = dc_field( - default=None, - metadata=dc_config( - field_name="invite_accepted_at", - encoder=encode_datetime, - decoder=datetime_from_unix_ns, - mm_field=fields.DateTime(format="iso"), - ), - ) - invite_rejected_at: Optional[datetime] = dc_field( - default=None, - metadata=dc_config( - field_name="invite_rejected_at", - encoder=encode_datetime, - decoder=datetime_from_unix_ns, - mm_field=fields.DateTime(format="iso"), - ), - ) - invited: Optional[bool] = dc_field( - default=None, metadata=dc_config(field_name="invited") - ) - is_moderator: Optional[bool] = dc_field( - default=None, metadata=dc_config(field_name="is_moderator") - ) - pinned_at: Optional[datetime] = dc_field( + expires: Optional[datetime] = dc_field( default=None, metadata=dc_config( - field_name="pinned_at", + field_name="expires", encoder=encode_datetime, decoder=datetime_from_unix_ns, mm_field=fields.DateTime(format="iso"), ), ) - role: Optional[str] = dc_field(default=None, metadata=dc_config(field_name="role")) - status: Optional[str] = dc_field( - default=None, metadata=dc_config(field_name="status") - ) - user_id: Optional[str] = dc_field( - default=None, metadata=dc_config(field_name="user_id") - ) - deleted_messages: Optional[List[str]] = dc_field( - default=None, metadata=dc_config(field_name="deleted_messages") + channel: "Optional[ChannelResponse]" = dc_field( + default=None, metadata=dc_config(field_name="channel") ) user: "Optional[UserResponse]" = dc_field( default=None, metadata=dc_config(field_name="user") @@ -5321,15 +5353,7 @@ class ChannelMemberResponse(DataClassJsonMixin): @dataclass -class ChannelMessages(DataClassJsonMixin): - messages: "List[Message]" = dc_field(metadata=dc_config(field_name="messages")) - channel: "Optional[ChannelResponse]" = dc_field( - default=None, metadata=dc_config(field_name="channel") - ) - - -@dataclass -class ChannelMute(DataClassJsonMixin): +class ChannelMutedEvent(DataClassJsonMixin): created_at: datetime = dc_field( metadata=dc_config( field_name="created_at", @@ -5338,42 +5362,26 @@ class ChannelMute(DataClassJsonMixin): 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"), - ) - ) - expires: Optional[datetime] = dc_field( + custom: Dict[str, object] = dc_field(metadata=dc_config(field_name="custom")) + type: str = dc_field(default="channel.muted", metadata=dc_config(field_name="type")) + received_at: Optional[datetime] = dc_field( default=None, metadata=dc_config( - field_name="expires", + field_name="received_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") + mutes: "Optional[List[ChannelMute]]" = dc_field( + default=None, metadata=dc_config(field_name="mutes") ) - user: "Optional[UserResponse]" = dc_field( - default=None, metadata=dc_config(field_name="user") + mute: "Optional[ChannelMute]" = dc_field( + default=None, metadata=dc_config(field_name="mute") ) - - -@dataclass -class ChannelMutedEvent(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"), - ) + user: "Optional[UserResponseCommonFields]" = dc_field( + default=None, metadata=dc_config(field_name="user") ) - type: str = dc_field(default="channel.muted", metadata=dc_config(field_name="type")) ChannelOwnCapabilityType = NewType("ChannelOwnCapabilityType", str) @@ -5421,22 +5429,6 @@ class ChannelOwnCapability: UPLOAD_FILE: Final[ChannelOwnCapabilityType] = "upload-file" -@dataclass -class ChannelPushPreferences(DataClassJsonMixin): - chat_level: Optional[str] = dc_field( - default=None, metadata=dc_config(field_name="chat_level") - ) - disabled_until: Optional[datetime] = dc_field( - default=None, - metadata=dc_config( - field_name="disabled_until", - encoder=encode_datetime, - decoder=datetime_from_unix_ns, - mm_field=fields.DateTime(format="iso"), - ), - ) - - @dataclass class ChannelPushPreferencesResponse(DataClassJsonMixin): chat_level: Optional[str] = dc_field( @@ -5680,12 +5672,6 @@ class ChannelStateResponseFields(DataClassJsonMixin): @dataclass class ChannelTruncatedEvent(DataClassJsonMixin): - channel_id: str = dc_field(metadata=dc_config(field_name="channel_id")) - channel_member_count: int = dc_field( - metadata=dc_config(field_name="channel_member_count") - ) - channel_type: str = dc_field(metadata=dc_config(field_name="channel_type")) - cid: str = dc_field(metadata=dc_config(field_name="cid")) created_at: datetime = dc_field( metadata=dc_config( field_name="created_at", @@ -5694,11 +5680,45 @@ class ChannelTruncatedEvent(DataClassJsonMixin): mm_field=fields.DateTime(format="iso"), ) ) + channel: "ChannelResponse" = dc_field(metadata=dc_config(field_name="channel")) + custom: Dict[str, object] = dc_field(metadata=dc_config(field_name="custom")) type: str = dc_field( default="channel.truncated", metadata=dc_config(field_name="type") ) - channel: "Optional[ChannelResponse]" = dc_field( - default=None, metadata=dc_config(field_name="channel") + channel_id: Optional[str] = dc_field( + default=None, metadata=dc_config(field_name="channel_id") + ) + channel_member_count: Optional[int] = dc_field( + default=None, metadata=dc_config(field_name="channel_member_count") + ) + channel_message_count: Optional[int] = dc_field( + default=None, metadata=dc_config(field_name="channel_message_count") + ) + channel_type: Optional[str] = dc_field( + default=None, metadata=dc_config(field_name="channel_type") + ) + cid: Optional[str] = dc_field(default=None, metadata=dc_config(field_name="cid")) + message_id: Optional[str] = dc_field( + default=None, metadata=dc_config(field_name="message_id") + ) + 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"), + ), + ) + team: Optional[str] = dc_field(default=None, metadata=dc_config(field_name="team")) + channel_custom: Optional[Dict[str, object]] = dc_field( + default=None, metadata=dc_config(field_name="channel_custom") + ) + message: "Optional[MessageResponse]" = dc_field( + default=None, metadata=dc_config(field_name="message") + ) + user: "Optional[UserResponseCommonFields]" = dc_field( + default=None, metadata=dc_config(field_name="user") ) @@ -5771,6 +5791,9 @@ class ChannelTypeConfig(DataClassJsonMixin): partition_ttl: Optional[str] = dc_field( default=None, metadata=dc_config(field_name="partition_ttl") ) + push_level: Optional[str] = dc_field( + default=None, metadata=dc_config(field_name="push_level") + ) allowed_flag_reasons: Optional[List[str]] = dc_field( default=None, metadata=dc_config(field_name="allowed_flag_reasons") ) @@ -5784,9 +5807,6 @@ class ChannelTypeConfig(DataClassJsonMixin): @dataclass class ChannelUnFrozenEvent(DataClassJsonMixin): - channel_id: str = dc_field(metadata=dc_config(field_name="channel_id")) - channel_type: str = dc_field(metadata=dc_config(field_name="channel_type")) - cid: str = dc_field(metadata=dc_config(field_name="cid")) created_at: datetime = dc_field( metadata=dc_config( field_name="created_at", @@ -5795,9 +5815,26 @@ class ChannelUnFrozenEvent(DataClassJsonMixin): mm_field=fields.DateTime(format="iso"), ) ) + custom: Dict[str, object] = dc_field(metadata=dc_config(field_name="custom")) type: str = dc_field( default="channel.unfrozen", metadata=dc_config(field_name="type") ) + channel_id: Optional[str] = dc_field( + default=None, metadata=dc_config(field_name="channel_id") + ) + channel_type: Optional[str] = dc_field( + default=None, metadata=dc_config(field_name="channel_type") + ) + cid: Optional[str] = dc_field(default=None, metadata=dc_config(field_name="cid")) + 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 @@ -5810,19 +5847,32 @@ class ChannelUnmutedEvent(DataClassJsonMixin): mm_field=fields.DateTime(format="iso"), ) ) + custom: Dict[str, object] = dc_field(metadata=dc_config(field_name="custom")) type: str = dc_field( default="channel.unmuted", 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"), + ), + ) + mutes: "Optional[List[ChannelMute]]" = dc_field( + default=None, metadata=dc_config(field_name="mutes") + ) + mute: "Optional[ChannelMute]" = dc_field( + default=None, metadata=dc_config(field_name="mute") + ) + user: "Optional[UserResponseCommonFields]" = dc_field( + default=None, metadata=dc_config(field_name="user") + ) @dataclass class ChannelUpdatedEvent(DataClassJsonMixin): - channel_id: str = dc_field(metadata=dc_config(field_name="channel_id")) - channel_member_count: int = dc_field( - metadata=dc_config(field_name="channel_member_count") - ) - channel_type: str = dc_field(metadata=dc_config(field_name="channel_type")) - cid: str = dc_field(metadata=dc_config(field_name="cid")) created_at: datetime = dc_field( metadata=dc_config( field_name="created_at", @@ -5831,26 +5881,50 @@ class ChannelUpdatedEvent(DataClassJsonMixin): mm_field=fields.DateTime(format="iso"), ) ) + channel: "ChannelResponse" = dc_field(metadata=dc_config(field_name="channel")) + custom: Dict[str, object] = dc_field(metadata=dc_config(field_name="custom")) type: str = dc_field( default="channel.updated", metadata=dc_config(field_name="type") ) + channel_id: Optional[str] = dc_field( + default=None, metadata=dc_config(field_name="channel_id") + ) + channel_member_count: Optional[int] = dc_field( + default=None, metadata=dc_config(field_name="channel_member_count") + ) + channel_message_count: Optional[int] = dc_field( + default=None, metadata=dc_config(field_name="channel_message_count") + ) + channel_type: Optional[str] = dc_field( + default=None, metadata=dc_config(field_name="channel_type") + ) + cid: Optional[str] = dc_field(default=None, metadata=dc_config(field_name="cid")) + message_id: Optional[str] = dc_field( + default=None, metadata=dc_config(field_name="message_id") + ) + 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"), + ), + ) team: Optional[str] = dc_field(default=None, metadata=dc_config(field_name="team")) - channel: "Optional[ChannelResponse]" = dc_field( - default=None, metadata=dc_config(field_name="channel") + channel_custom: Optional[Dict[str, object]] = dc_field( + default=None, metadata=dc_config(field_name="channel_custom") ) - message: "Optional[Message]" = dc_field( + message: "Optional[MessageResponse]" = dc_field( default=None, metadata=dc_config(field_name="message") ) - user: "Optional[User]" = dc_field( + user: "Optional[UserResponseCommonFields]" = dc_field( default=None, metadata=dc_config(field_name="user") ) @dataclass class ChannelVisibleEvent(DataClassJsonMixin): - channel_id: str = dc_field(metadata=dc_config(field_name="channel_id")) - channel_type: str = dc_field(metadata=dc_config(field_name="channel_type")) - cid: str = dc_field(metadata=dc_config(field_name="cid")) created_at: datetime = dc_field( metadata=dc_config( field_name="created_at", @@ -5859,10 +5933,38 @@ class ChannelVisibleEvent(DataClassJsonMixin): mm_field=fields.DateTime(format="iso"), ) ) + channel: "ChannelResponse" = dc_field(metadata=dc_config(field_name="channel")) + custom: Dict[str, object] = dc_field(metadata=dc_config(field_name="custom")) type: str = dc_field( default="channel.visible", metadata=dc_config(field_name="type") ) - user: "Optional[User]" = dc_field( + channel_id: Optional[str] = dc_field( + default=None, metadata=dc_config(field_name="channel_id") + ) + channel_member_count: Optional[int] = dc_field( + default=None, metadata=dc_config(field_name="channel_member_count") + ) + channel_message_count: Optional[int] = dc_field( + default=None, metadata=dc_config(field_name="channel_message_count") + ) + channel_type: Optional[str] = dc_field( + default=None, metadata=dc_config(field_name="channel_type") + ) + cid: Optional[str] = dc_field(default=None, metadata=dc_config(field_name="cid")) + 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"), + ), + ) + team: Optional[str] = dc_field(default=None, metadata=dc_config(field_name="team")) + channel_custom: Optional[Dict[str, object]] = dc_field( + default=None, metadata=dc_config(field_name="channel_custom") + ) + user: "Optional[UserResponseCommonFields]" = dc_field( default=None, metadata=dc_config(field_name="user") ) @@ -6068,6 +6170,19 @@ class ClosedCaptionEvent(DataClassJsonMixin): ) +@dataclass +class ClosedCaptionRuleParameters(DataClassJsonMixin): + threshold: Optional[int] = dc_field( + default=None, metadata=dc_config(field_name="threshold") + ) + harm_labels: Optional[List[str]] = dc_field( + default=None, metadata=dc_config(field_name="harm_labels") + ) + llm_harm_labels: "Optional[Dict[str, str]]" = dc_field( + default=None, metadata=dc_config(field_name="llm_harm_labels") + ) + + @dataclass class CollectUserFeedbackRequest(DataClassJsonMixin): rating: int = dc_field(metadata=dc_config(field_name="rating")) @@ -6378,6 +6493,15 @@ class CommentResponse(DataClassJsonMixin): mm_field=fields.DateTime(format="iso"), ), ) + edited_at: Optional[datetime] = dc_field( + default=None, + metadata=dc_config( + field_name="edited_at", + encoder=encode_datetime, + decoder=datetime_from_unix_ns, + mm_field=fields.DateTime(format="iso"), + ), + ) parent_id: Optional[str] = dc_field( default=None, metadata=dc_config(field_name="parent_id") ) @@ -6394,7 +6518,7 @@ class CommentResponse(DataClassJsonMixin): moderation: "Optional[ModerationV2Response]" = dc_field( default=None, metadata=dc_config(field_name="moderation") ) - reaction_groups: "Optional[Dict[str, Optional[ReactionGroupResponse]]]" = dc_field( + reaction_groups: "Optional[Dict[str, FeedsReactionGroupResponse]]" = dc_field( default=None, metadata=dc_config(field_name="reaction_groups") ) @@ -6443,7 +6567,7 @@ class CompositeRecordingResponse(DataClassJsonMixin): @dataclass -class ConfigOverrides(DataClassJsonMixin): +class ConfigOverridesRequest(DataClassJsonMixin): blocklist: Optional[str] = dc_field( default=None, metadata=dc_config(field_name="blocklist") ) @@ -6559,7 +6683,7 @@ class ContentCountRuleParameters(DataClassJsonMixin): @dataclass -class Coordinates(DataClassJsonMixin): +class CoordinatesResponse(DataClassJsonMixin): latitude: float = dc_field(metadata=dc_config(field_name="latitude")) longitude: float = dc_field(metadata=dc_config(field_name="longitude")) @@ -6608,7 +6732,7 @@ class CreateCallTypeRequest(DataClassJsonMixin): grants: "Optional[Dict[str, List[str]]]" = dc_field( default=None, metadata=dc_config(field_name="grants") ) - notification_settings: "Optional[NotificationSettings]" = dc_field( + notification_settings: "Optional[NotificationSettingsRequest]" = dc_field( default=None, metadata=dc_config(field_name="notification_settings") ) settings: "Optional[CallSettingsRequest]" = dc_field( @@ -6637,7 +6761,7 @@ class CreateCallTypeResponse(DataClassJsonMixin): ) ) grants: "Dict[str, List[str]]" = dc_field(metadata=dc_config(field_name="grants")) - notification_settings: "NotificationSettings" = dc_field( + notification_settings: "NotificationSettingsResponse" = dc_field( metadata=dc_config(field_name="notification_settings") ) settings: "CallSettingsResponse" = dc_field( @@ -6692,6 +6816,9 @@ class CreateChannelTypeRequest(DataClassJsonMixin): polls: Optional[bool] = dc_field( default=None, metadata=dc_config(field_name="polls") ) + push_level: Optional[str] = dc_field( + default=None, metadata=dc_config(field_name="push_level") + ) push_notifications: Optional[bool] = dc_field( default=None, metadata=dc_config(field_name="push_notifications") ) @@ -6810,6 +6937,9 @@ class CreateChannelTypeResponse(DataClassJsonMixin): partition_ttl: Optional[str] = dc_field( default=None, metadata=dc_config(field_name="partition_ttl") ) + push_level: Optional[str] = dc_field( + default=None, metadata=dc_config(field_name="push_level") + ) allowed_flag_reasons: Optional[List[str]] = dc_field( default=None, metadata=dc_config(field_name="allowed_flag_reasons") ) @@ -7175,7 +7305,7 @@ class CreateSIPTrunkResponse(DataClassJsonMixin): @dataclass -class CustomActionRequest(DataClassJsonMixin): +class CustomActionRequestPayload(DataClassJsonMixin): id: Optional[str] = dc_field(default=None, metadata=dc_config(field_name="id")) options: Optional[Dict[str, object]] = dc_field( default=None, metadata=dc_config(field_name="options") @@ -7207,7 +7337,7 @@ class CustomCheckRequest(DataClassJsonMixin): user_id: Optional[str] = dc_field( default=None, metadata=dc_config(field_name="user_id") ) - moderation_payload: "Optional[ModerationPayload]" = dc_field( + moderation_payload: "Optional[ModerationPayloadRequest]" = dc_field( default=None, metadata=dc_config(field_name="moderation_payload") ) user: "Optional[UserRequest]" = dc_field( @@ -7225,6 +7355,29 @@ class CustomCheckResponse(DataClassJsonMixin): ) +@dataclass +class CustomEvent(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="*", 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 CustomVideoEvent(DataClassJsonMixin): call_cid: str = dc_field(metadata=dc_config(field_name="call_cid")) @@ -7370,6 +7523,9 @@ class DecayFunctionConfig(DataClassJsonMixin): @dataclass class DeleteActivitiesRequest(DataClassJsonMixin): ids: List[str] = dc_field(metadata=dc_config(field_name="ids")) + delete_notification_activity: Optional[bool] = dc_field( + default=None, metadata=dc_config(field_name="delete_notification_activity") + ) hard_delete: Optional[bool] = dc_field( default=None, metadata=dc_config(field_name="hard_delete") ) @@ -7397,7 +7553,7 @@ class DeleteActivityReactionResponse(DataClassJsonMixin): @dataclass -class DeleteActivityRequest(DataClassJsonMixin): +class DeleteActivityRequestPayload(DataClassJsonMixin): hard_delete: Optional[bool] = dc_field( default=None, metadata=dc_config(field_name="hard_delete") ) @@ -7492,7 +7648,7 @@ class DeleteCommentReactionResponse(DataClassJsonMixin): @dataclass -class DeleteCommentRequest(DataClassJsonMixin): +class DeleteCommentRequestPayload(DataClassJsonMixin): hard_delete: Optional[bool] = dc_field( default=None, metadata=dc_config(field_name="hard_delete") ) @@ -7562,7 +7718,7 @@ class DeleteImportV2TaskResponse(DataClassJsonMixin): @dataclass -class DeleteMessageRequest(DataClassJsonMixin): +class DeleteMessageRequestPayload(DataClassJsonMixin): hard_delete: Optional[bool] = dc_field( default=None, metadata=dc_config(field_name="hard_delete") ) @@ -7593,7 +7749,7 @@ class DeleteModerationTemplateResponse(DataClassJsonMixin): @dataclass -class DeleteReactionRequest(DataClassJsonMixin): +class DeleteReactionRequestPayload(DataClassJsonMixin): hard_delete: Optional[bool] = dc_field( default=None, metadata=dc_config(field_name="hard_delete") ) @@ -7640,7 +7796,7 @@ class DeleteTranscriptionResponse(DataClassJsonMixin): @dataclass -class DeleteUserRequest(DataClassJsonMixin): +class DeleteUserRequestPayload(DataClassJsonMixin): delete_conversation_channels: Optional[bool] = dc_field( default=None, metadata=dc_config(field_name="delete_conversation_channels") ) @@ -7694,13 +7850,6 @@ class DeliveredMessagePayload(DataClassJsonMixin): id: Optional[str] = dc_field(default=None, metadata=dc_config(field_name="id")) -@dataclass -class DeliveryReceipts(DataClassJsonMixin): - enabled: Optional[bool] = dc_field( - default=None, metadata=dc_config(field_name="enabled") - ) - - @dataclass class DeliveryReceiptsResponse(DataClassJsonMixin): enabled: Optional[bool] = dc_field( @@ -7708,62 +7857,6 @@ class DeliveryReceiptsResponse(DataClassJsonMixin): ) -@dataclass -class DenormalizedChannelFields(DataClassJsonMixin): - created_at: Optional[str] = dc_field( - default=None, metadata=dc_config(field_name="created_at") - ) - created_by_id: Optional[str] = dc_field( - default=None, metadata=dc_config(field_name="created_by_id") - ) - disabled: Optional[bool] = dc_field( - default=None, metadata=dc_config(field_name="disabled") - ) - frozen: Optional[bool] = dc_field( - default=None, metadata=dc_config(field_name="frozen") - ) - id: Optional[str] = dc_field(default=None, metadata=dc_config(field_name="id")) - last_message_at: Optional[str] = dc_field( - default=None, metadata=dc_config(field_name="last_message_at") - ) - member_count: Optional[int] = dc_field( - default=None, metadata=dc_config(field_name="member_count") - ) - team: Optional[str] = dc_field(default=None, metadata=dc_config(field_name="team")) - type: Optional[str] = dc_field(default=None, metadata=dc_config(field_name="type")) - updated_at: Optional[str] = dc_field( - default=None, metadata=dc_config(field_name="updated_at") - ) - custom: Optional[Dict[str, object]] = dc_field( - default=None, metadata=dc_config(field_name="custom") - ) - - -@dataclass -class Device(DataClassJsonMixin): - created_at: datetime = dc_field( - 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")) - push_provider: str = dc_field(metadata=dc_config(field_name="push_provider")) - user_id: str = dc_field(metadata=dc_config(field_name="user_id")) - disabled: Optional[bool] = dc_field( - default=None, metadata=dc_config(field_name="disabled") - ) - disabled_reason: Optional[str] = dc_field( - default=None, metadata=dc_config(field_name="disabled_reason") - ) - push_provider_name: Optional[str] = dc_field( - default=None, metadata=dc_config(field_name="push_provider_name") - ) - voip: Optional[bool] = dc_field(default=None, metadata=dc_config(field_name="voip")) - - @dataclass class DeviceDataResponse(DataClassJsonMixin): name: Optional[str] = dc_field(default=None, metadata=dc_config(field_name="name")) @@ -8299,6 +8392,26 @@ class EventNotificationSettings(DataClassJsonMixin): fcm: "FCM" = dc_field(metadata=dc_config(field_name="fcm")) +@dataclass +class EventNotificationSettingsRequest(DataClassJsonMixin): + enabled: Optional[bool] = dc_field( + default=None, metadata=dc_config(field_name="enabled") + ) + apns: "Optional[APNSPayload]" = dc_field( + default=None, metadata=dc_config(field_name="apns") + ) + fcm: "Optional[FCMPayload]" = dc_field( + default=None, metadata=dc_config(field_name="fcm") + ) + + +@dataclass +class EventNotificationSettingsResponse(DataClassJsonMixin): + enabled: bool = dc_field(metadata=dc_config(field_name="enabled")) + apns: "APNSPayload" = dc_field(metadata=dc_config(field_name="apns")) + fcm: "FCMPayload" = dc_field(metadata=dc_config(field_name="fcm")) + + @dataclass class EventRequest(DataClassJsonMixin): type: str = dc_field(metadata=dc_config(field_name="type")) @@ -8401,6 +8514,13 @@ class FCM(DataClassJsonMixin): ) +@dataclass +class FCMPayload(DataClassJsonMixin): + data: Optional[Dict[str, object]] = dc_field( + default=None, metadata=dc_config(field_name="data") + ) + + @dataclass class FailedChannelUpdates(DataClassJsonMixin): reason: str = dc_field(metadata=dc_config(field_name="reason")) @@ -9125,9 +9245,11 @@ class FeedVisibilityResponse(DataClassJsonMixin): @dataclass -class FeedsModerationTemplateConfig(DataClassJsonMixin): - config_key: str = dc_field(metadata=dc_config(field_name="config_key")) +class FeedsModerationTemplateConfigPayload(DataClassJsonMixin): data_types: "Dict[str, str]" = dc_field(metadata=dc_config(field_name="data_types")) + config_key: Optional[str] = dc_field( + default=None, metadata=dc_config(field_name="config_key") + ) @dataclass @@ -9163,6 +9285,9 @@ class FeedsPreferencesResponse(DataClassJsonMixin): comment_reaction: Optional[str] = dc_field( default=None, metadata=dc_config(field_name="comment_reaction") ) + comment_reply: Optional[str] = dc_field( + default=None, metadata=dc_config(field_name="comment_reply") + ) follow: Optional[str] = dc_field( default=None, metadata=dc_config(field_name="follow") ) @@ -9177,6 +9302,27 @@ class FeedsPreferencesResponse(DataClassJsonMixin): ) +@dataclass +class FeedsReactionGroupResponse(DataClassJsonMixin): + count: int = dc_field(metadata=dc_config(field_name="count")) + first_reaction_at: datetime = dc_field( + metadata=dc_config( + field_name="first_reaction_at", + encoder=encode_datetime, + decoder=datetime_from_unix_ns, + mm_field=fields.DateTime(format="iso"), + ) + ) + last_reaction_at: datetime = dc_field( + metadata=dc_config( + field_name="last_reaction_at", + encoder=encode_datetime, + decoder=datetime_from_unix_ns, + mm_field=fields.DateTime(format="iso"), + ) + ) + + @dataclass class FeedsReactionResponse(DataClassJsonMixin): activity_id: str = dc_field(metadata=dc_config(field_name="activity_id")) @@ -9297,80 +9443,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 FlagCountRuleParameters(DataClassJsonMixin): threshold: Optional[int] = dc_field( @@ -9379,16 +9451,18 @@ class FlagCountRuleParameters(DataClassJsonMixin): @dataclass -class FlagDetails(DataClassJsonMixin): +class FlagDetailsResponse(DataClassJsonMixin): original_text: str = dc_field(metadata=dc_config(field_name="original_text")) - extra: Dict[str, object] = dc_field(metadata=dc_config(field_name="Extra")) - automod: "Optional[AutomodDetails]" = dc_field( + automod: "Optional[AutomodDetailsResponse]" = dc_field( default=None, metadata=dc_config(field_name="automod") ) + extra: Optional[Dict[str, object]] = dc_field( + default=None, metadata=dc_config(field_name="extra") + ) @dataclass -class FlagFeedback(DataClassJsonMixin): +class FlagFeedbackResponse(DataClassJsonMixin): created_at: datetime = dc_field( metadata=dc_config( field_name="created_at", @@ -9398,11 +9472,11 @@ class FlagFeedback(DataClassJsonMixin): ) ) message_id: str = dc_field(metadata=dc_config(field_name="message_id")) - labels: "List[Label]" = dc_field(metadata=dc_config(field_name="labels")) + labels: "List[LabelResponse]" = dc_field(metadata=dc_config(field_name="labels")) @dataclass -class FlagMessageDetails(DataClassJsonMixin): +class FlagMessageDetailsResponse(DataClassJsonMixin): pin_changed: Optional[bool] = dc_field( default=None, metadata=dc_config(field_name="pin_changed") ) @@ -9568,6 +9642,9 @@ class FollowPair(DataClassJsonMixin): class FollowRequest(DataClassJsonMixin): source: str = dc_field(metadata=dc_config(field_name="source")) target: str = dc_field(metadata=dc_config(field_name="target")) + copy_custom_to_notification: Optional[bool] = dc_field( + default=None, metadata=dc_config(field_name="copy_custom_to_notification") + ) create_notification_activity: Optional[bool] = dc_field( default=None, metadata=dc_config(field_name="create_notification_activity") ) @@ -9577,6 +9654,9 @@ class FollowRequest(DataClassJsonMixin): skip_push: Optional[bool] = dc_field( default=None, metadata=dc_config(field_name="skip_push") ) + status: Optional[str] = dc_field( + default=None, metadata=dc_config(field_name="status") + ) custom: Optional[Dict[str, object]] = dc_field( default=None, metadata=dc_config(field_name="custom") ) @@ -9696,6 +9776,17 @@ class FrameRecordingSettingsResponse(DataClassJsonMixin): ) +@dataclass +class FriendReactionsOptions(DataClassJsonMixin): + enabled: Optional[bool] = dc_field( + default=None, metadata=dc_config(field_name="enabled") + ) + limit: Optional[int] = dc_field( + default=None, metadata=dc_config(field_name="limit") + ) + type: Optional[str] = dc_field(default=None, metadata=dc_config(field_name="type")) + + @dataclass class FullUserResponse(DataClassJsonMixin): banned: bool = dc_field(metadata=dc_config(field_name="banned")) @@ -9800,6 +9891,39 @@ class FullUserResponse(DataClassJsonMixin): ) +@dataclass +class FutureChannelBanResponse(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"), + ) + ) + expires: Optional[datetime] = dc_field( + default=None, + metadata=dc_config( + field_name="expires", + 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") + ) + shadow: Optional[bool] = dc_field( + default=None, metadata=dc_config(field_name="shadow") + ) + banned_by: "Optional[UserResponse]" = dc_field( + default=None, metadata=dc_config(field_name="banned_by") + ) + user: "Optional[UserResponse]" = dc_field( + default=None, metadata=dc_config(field_name="user") + ) + + @dataclass class GeofenceResponse(DataClassJsonMixin): name: str = dc_field(metadata=dc_config(field_name="name")) @@ -9892,6 +10016,41 @@ class GetBlockedUsersResponse(DataClassJsonMixin): ) +@dataclass +class GetCallParticipantSessionMetricsResponse(DataClassJsonMixin): + duration: str = dc_field(metadata=dc_config(field_name="duration")) + is_publisher: Optional[bool] = dc_field( + default=None, metadata=dc_config(field_name="is_publisher") + ) + is_subscriber: Optional[bool] = dc_field( + default=None, metadata=dc_config(field_name="is_subscriber") + ) + joined_at: Optional[datetime] = dc_field( + default=None, + metadata=dc_config( + field_name="joined_at", + encoder=encode_datetime, + decoder=datetime_from_unix_ns, + mm_field=fields.DateTime(format="iso"), + ), + ) + publisher_type: Optional[str] = dc_field( + default=None, metadata=dc_config(field_name="publisher_type") + ) + user_id: Optional[str] = dc_field( + default=None, metadata=dc_config(field_name="user_id") + ) + user_session_id: Optional[str] = dc_field( + default=None, metadata=dc_config(field_name="user_session_id") + ) + published_tracks: "Optional[List[PublishedTrackMetrics]]" = dc_field( + default=None, metadata=dc_config(field_name="published_tracks") + ) + client: "Optional[SessionClient]" = dc_field( + default=None, metadata=dc_config(field_name="client") + ) + + @dataclass class GetCallReportResponse(DataClassJsonMixin): duration: str = dc_field(metadata=dc_config(field_name="duration")) @@ -9961,7 +10120,7 @@ class GetCallTypeResponse(DataClassJsonMixin): ) ) grants: "Dict[str, List[str]]" = dc_field(metadata=dc_config(field_name="grants")) - notification_settings: "NotificationSettings" = dc_field( + notification_settings: "NotificationSettingsResponse" = dc_field( metadata=dc_config(field_name="notification_settings") ) settings: "CallSettingsResponse" = dc_field( @@ -10053,6 +10212,9 @@ class GetChannelTypeResponse(DataClassJsonMixin): partition_ttl: Optional[str] = dc_field( default=None, metadata=dc_config(field_name="partition_ttl") ) + push_level: Optional[str] = dc_field( + default=None, metadata=dc_config(field_name="push_level") + ) allowed_flag_reasons: Optional[List[str]] = dc_field( default=None, metadata=dc_config(field_name="allowed_flag_reasons") ) @@ -10168,16 +10330,16 @@ class GetFeedVisibilityResponse(DataClassJsonMixin): @dataclass class GetFeedsRateLimitsResponse(DataClassJsonMixin): duration: str = dc_field(metadata=dc_config(field_name="duration")) - android: "Optional[Dict[str, LimitInfo]]" = dc_field( + android: "Optional[Dict[str, LimitInfoResponse]]" = dc_field( default=None, metadata=dc_config(field_name="android") ) - ios: "Optional[Dict[str, LimitInfo]]" = dc_field( + ios: "Optional[Dict[str, LimitInfoResponse]]" = dc_field( default=None, metadata=dc_config(field_name="ios") ) - server_side: "Optional[Dict[str, LimitInfo]]" = dc_field( + server_side: "Optional[Dict[str, LimitInfoResponse]]" = dc_field( default=None, metadata=dc_config(field_name="server_side") ) - web: "Optional[Dict[str, LimitInfo]]" = dc_field( + web: "Optional[Dict[str, LimitInfoResponse]]" = dc_field( default=None, metadata=dc_config(field_name="web") ) @@ -10424,6 +10586,9 @@ class GetOrCreateFeedRequest(DataClassJsonMixin): following_pagination: "Optional[PagerRequest]" = dc_field( default=None, metadata=dc_config(field_name="following_pagination") ) + friend_reactions_options: "Optional[FriendReactionsOptions]" = dc_field( + default=None, metadata=dc_config(field_name="friend_reactions_options") + ) interest_weights: "Optional[Dict[str, float]]" = dc_field( default=None, metadata=dc_config(field_name="interest_weights") ) @@ -10497,7 +10662,7 @@ class GetOrCreateFeedViewResponse(DataClassJsonMixin): @dataclass class GetPushTemplatesResponse(DataClassJsonMixin): duration: str = dc_field(metadata=dc_config(field_name="duration")) - templates: "List[PushTemplate]" = dc_field( + templates: "List[PushTemplateResponse]" = dc_field( metadata=dc_config(field_name="templates") ) @@ -10505,16 +10670,16 @@ class GetPushTemplatesResponse(DataClassJsonMixin): @dataclass class GetRateLimitsResponse(DataClassJsonMixin): duration: str = dc_field(metadata=dc_config(field_name="duration")) - android: "Optional[Dict[str, LimitInfo]]" = dc_field( + android: "Optional[Dict[str, LimitInfoResponse]]" = dc_field( default=None, metadata=dc_config(field_name="android") ) - ios: "Optional[Dict[str, LimitInfo]]" = dc_field( + ios: "Optional[Dict[str, LimitInfoResponse]]" = dc_field( default=None, metadata=dc_config(field_name="ios") ) - server_side: "Optional[Dict[str, LimitInfo]]" = dc_field( + server_side: "Optional[Dict[str, LimitInfoResponse]]" = dc_field( default=None, metadata=dc_config(field_name="server_side") ) - web: "Optional[Dict[str, LimitInfo]]" = dc_field( + web: "Optional[Dict[str, LimitInfoResponse]]" = dc_field( default=None, metadata=dc_config(field_name="web") ) @@ -10887,6 +11052,8 @@ class ImportV2TaskItem(DataClassJsonMixin): @dataclass class ImportV2TaskSettings(DataClassJsonMixin): + mode: Optional[str] = dc_field(default=None, metadata=dc_config(field_name="mode")) + path: Optional[str] = dc_field(default=None, metadata=dc_config(field_name="path")) skip_references_check: Optional[bool] = dc_field( default=None, metadata=dc_config(field_name="skip_references_check") ) @@ -10949,6 +11116,26 @@ class IngressAudioEncodingResponse(DataClassJsonMixin): enable_dtx: bool = dc_field(metadata=dc_config(field_name="enable_dtx")) +@dataclass +class IngressErrorEvent(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"), + ) + ) + error: str = dc_field(metadata=dc_config(field_name="error")) + ingress_stream_id: str = dc_field( + metadata=dc_config(field_name="ingress_stream_id") + ) + user_id: str = dc_field(metadata=dc_config(field_name="user_id")) + type: str = dc_field(default="ingress.error", metadata=dc_config(field_name="type")) + code: Optional[str] = dc_field(default=None, metadata=dc_config(field_name="code")) + + @dataclass class IngressSettings(DataClassJsonMixin): enabled: bool = dc_field(metadata=dc_config(field_name="enabled")) @@ -11005,6 +11192,56 @@ class IngressSourceResponse(DataClassJsonMixin): width: int = dc_field(metadata=dc_config(field_name="width")) +@dataclass +class IngressStartedEvent(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"), + ) + ) + ingress_stream_id: str = dc_field( + metadata=dc_config(field_name="ingress_stream_id") + ) + publisher_type: str = dc_field(metadata=dc_config(field_name="publisher_type")) + user_id: str = dc_field(metadata=dc_config(field_name="user_id")) + type: str = dc_field( + default="ingress.started", metadata=dc_config(field_name="type") + ) + client_ip: Optional[str] = dc_field( + default=None, metadata=dc_config(field_name="client_ip") + ) + client_name: Optional[str] = dc_field( + default=None, metadata=dc_config(field_name="client_name") + ) + version: Optional[str] = dc_field( + default=None, metadata=dc_config(field_name="version") + ) + + +@dataclass +class IngressStoppedEvent(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"), + ) + ) + ingress_stream_id: str = dc_field( + metadata=dc_config(field_name="ingress_stream_id") + ) + user_id: str = dc_field(metadata=dc_config(field_name="user_id")) + type: str = dc_field( + default="ingress.stopped", metadata=dc_config(field_name="type") + ) + + @dataclass class IngressVideoEncodingOptions(DataClassJsonMixin): layers: "List[IngressVideoLayer]" = dc_field( @@ -11067,6 +11304,19 @@ class JoinCallAPIMetrics(DataClassJsonMixin): ) +@dataclass +class KeyframeRuleParameters(DataClassJsonMixin): + min_confidence: Optional[float] = dc_field( + default=None, metadata=dc_config(field_name="min_confidence") + ) + threshold: Optional[int] = dc_field( + default=None, metadata=dc_config(field_name="threshold") + ) + harm_labels: Optional[List[str]] = dc_field( + default=None, metadata=dc_config(field_name="harm_labels") + ) + + @dataclass class KickUserRequest(DataClassJsonMixin): user_id: str = dc_field(metadata=dc_config(field_name="user_id")) @@ -11138,7 +11388,7 @@ class LLMRule(DataClassJsonMixin): @dataclass -class Label(DataClassJsonMixin): +class LabelResponse(DataClassJsonMixin): name: str = dc_field(metadata=dc_config(field_name="name")) harm_labels: Optional[List[str]] = dc_field( default=None, metadata=dc_config(field_name="harm_labels") @@ -11202,7 +11452,7 @@ class LayoutSettingsResponse(DataClassJsonMixin): @dataclass -class LimitInfo(DataClassJsonMixin): +class LimitInfoResponse(DataClassJsonMixin): limit: int = dc_field(metadata=dc_config(field_name="limit")) remaining: int = dc_field(metadata=dc_config(field_name="remaining")) reset: int = dc_field(metadata=dc_config(field_name="reset")) @@ -11397,7 +11647,7 @@ class ListTranscriptionsResponse(DataClassJsonMixin): @dataclass -class Location(DataClassJsonMixin): +class LocationResponse(DataClassJsonMixin): continent_code: str = dc_field(metadata=dc_config(field_name="continent_code")) country_iso_code: str = dc_field(metadata=dc_config(field_name="country_iso_code")) subdivision_iso_code: str = dc_field( @@ -11474,13 +11724,51 @@ class MarkReadRequest(DataClassJsonMixin): @dataclass class MarkReadResponse(DataClassJsonMixin): duration: str = dc_field(metadata=dc_config(field_name="duration")) - event: "Optional[MessageReadEvent]" = dc_field( + event: "Optional[MarkReadResponseEvent]" = dc_field( default=None, metadata=dc_config(field_name="event") ) @dataclass -class MarkReviewedRequest(DataClassJsonMixin): +class MarkReadResponseEvent(DataClassJsonMixin): + channel_id: str = dc_field(metadata=dc_config(field_name="channel_id")) + channel_type: str = dc_field(metadata=dc_config(field_name="channel_type")) + cid: str = dc_field(metadata=dc_config(field_name="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"), + ) + ) + type: str = dc_field(metadata=dc_config(field_name="type")) + channel_last_message_at: Optional[datetime] = dc_field( + default=None, + metadata=dc_config( + field_name="channel_last_message_at", + encoder=encode_datetime, + decoder=datetime_from_unix_ns, + mm_field=fields.DateTime(format="iso"), + ), + ) + last_read_message_id: Optional[str] = dc_field( + default=None, metadata=dc_config(field_name="last_read_message_id") + ) + team: Optional[str] = dc_field(default=None, metadata=dc_config(field_name="team")) + channel: "Optional[ChannelResponse]" = dc_field( + default=None, metadata=dc_config(field_name="channel") + ) + thread: "Optional[ThreadResponse]" = dc_field( + default=None, metadata=dc_config(field_name="thread") + ) + user: "Optional[UserResponseCommonFields]" = dc_field( + default=None, metadata=dc_config(field_name="user") + ) + + +@dataclass +class MarkReviewedRequestPayload(DataClassJsonMixin): content_to_mark_as_reviewed_limit: Optional[int] = dc_field( default=None, metadata=dc_config(field_name="content_to_mark_as_reviewed_limit") ) @@ -11519,10 +11807,7 @@ class MarkUnreadRequest(DataClassJsonMixin): @dataclass -class MemberAddedEvent(DataClassJsonMixin): - channel_id: str = dc_field(metadata=dc_config(field_name="channel_id")) - channel_type: str = dc_field(metadata=dc_config(field_name="channel_type")) - cid: str = dc_field(metadata=dc_config(field_name="cid")) +class MaxStreakChangedEvent(DataClassJsonMixin): created_at: datetime = dc_field( metadata=dc_config( field_name="created_at", @@ -11531,21 +11816,68 @@ class MemberAddedEvent(DataClassJsonMixin): mm_field=fields.DateTime(format="iso"), ) ) - type: str = dc_field(default="member.added", metadata=dc_config(field_name="type")) - team: Optional[str] = dc_field(default=None, metadata=dc_config(field_name="team")) - member: "Optional[ChannelMember]" = dc_field( - default=None, metadata=dc_config(field_name="member") - ) - user: "Optional[User]" = dc_field( - default=None, metadata=dc_config(field_name="user") + custom: Dict[str, object] = dc_field(metadata=dc_config(field_name="custom")) + type: str = dc_field( + default="channel.max_streak_changed", metadata=dc_config(field_name="type") ) - - -@dataclass + 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 MemberAddedEvent(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"), + ) + ) + channel: "ChannelResponse" = dc_field(metadata=dc_config(field_name="channel")) + custom: Dict[str, object] = dc_field(metadata=dc_config(field_name="custom")) + member: "ChannelMemberResponse" = dc_field(metadata=dc_config(field_name="member")) + type: str = dc_field(default="member.added", metadata=dc_config(field_name="type")) + channel_id: Optional[str] = dc_field( + default=None, metadata=dc_config(field_name="channel_id") + ) + channel_member_count: Optional[int] = dc_field( + default=None, metadata=dc_config(field_name="channel_member_count") + ) + channel_message_count: Optional[int] = dc_field( + default=None, metadata=dc_config(field_name="channel_message_count") + ) + channel_type: Optional[str] = dc_field( + default=None, metadata=dc_config(field_name="channel_type") + ) + cid: Optional[str] = dc_field(default=None, metadata=dc_config(field_name="cid")) + 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"), + ), + ) + team: Optional[str] = dc_field(default=None, metadata=dc_config(field_name="team")) + channel_custom: Optional[Dict[str, object]] = dc_field( + default=None, metadata=dc_config(field_name="channel_custom") + ) + user: "Optional[UserResponseCommonFields]" = dc_field( + default=None, metadata=dc_config(field_name="user") + ) + + +@dataclass class MemberRemovedEvent(DataClassJsonMixin): - channel_id: str = dc_field(metadata=dc_config(field_name="channel_id")) - channel_type: str = dc_field(metadata=dc_config(field_name="channel_type")) - cid: str = dc_field(metadata=dc_config(field_name="cid")) created_at: datetime = dc_field( metadata=dc_config( field_name="created_at", @@ -11554,13 +11886,39 @@ class MemberRemovedEvent(DataClassJsonMixin): mm_field=fields.DateTime(format="iso"), ) ) + channel: "ChannelResponse" = dc_field(metadata=dc_config(field_name="channel")) + custom: Dict[str, object] = dc_field(metadata=dc_config(field_name="custom")) + member: "ChannelMemberResponse" = dc_field(metadata=dc_config(field_name="member")) type: str = dc_field( default="member.removed", metadata=dc_config(field_name="type") ) - member: "Optional[ChannelMember]" = dc_field( - default=None, metadata=dc_config(field_name="member") + channel_id: Optional[str] = dc_field( + default=None, metadata=dc_config(field_name="channel_id") ) - user: "Optional[User]" = dc_field( + channel_member_count: Optional[int] = dc_field( + default=None, metadata=dc_config(field_name="channel_member_count") + ) + channel_message_count: Optional[int] = dc_field( + default=None, metadata=dc_config(field_name="channel_message_count") + ) + channel_type: Optional[str] = dc_field( + default=None, metadata=dc_config(field_name="channel_type") + ) + cid: Optional[str] = dc_field(default=None, metadata=dc_config(field_name="cid")) + 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"), + ), + ) + team: Optional[str] = dc_field(default=None, metadata=dc_config(field_name="team")) + channel_custom: Optional[Dict[str, object]] = dc_field( + default=None, metadata=dc_config(field_name="channel_custom") + ) + user: "Optional[UserResponseCommonFields]" = dc_field( default=None, metadata=dc_config(field_name="user") ) @@ -11609,9 +11967,6 @@ class MemberResponse(DataClassJsonMixin): @dataclass class MemberUpdatedEvent(DataClassJsonMixin): - channel_id: str = dc_field(metadata=dc_config(field_name="channel_id")) - channel_type: str = dc_field(metadata=dc_config(field_name="channel_type")) - cid: str = dc_field(metadata=dc_config(field_name="cid")) created_at: datetime = dc_field( metadata=dc_config( field_name="created_at", @@ -11620,14 +11975,39 @@ class MemberUpdatedEvent(DataClassJsonMixin): mm_field=fields.DateTime(format="iso"), ) ) + channel: "ChannelResponse" = dc_field(metadata=dc_config(field_name="channel")) + custom: Dict[str, object] = dc_field(metadata=dc_config(field_name="custom")) + member: "ChannelMemberResponse" = dc_field(metadata=dc_config(field_name="member")) type: str = dc_field( default="member.updated", metadata=dc_config(field_name="type") ) + channel_id: Optional[str] = dc_field( + default=None, metadata=dc_config(field_name="channel_id") + ) + channel_member_count: Optional[int] = dc_field( + default=None, metadata=dc_config(field_name="channel_member_count") + ) + channel_message_count: Optional[int] = dc_field( + default=None, metadata=dc_config(field_name="channel_message_count") + ) + channel_type: Optional[str] = dc_field( + default=None, metadata=dc_config(field_name="channel_type") + ) + cid: Optional[str] = dc_field(default=None, metadata=dc_config(field_name="cid")) + 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"), + ), + ) team: Optional[str] = dc_field(default=None, metadata=dc_config(field_name="team")) - member: "Optional[ChannelMember]" = dc_field( - default=None, metadata=dc_config(field_name="member") + channel_custom: Optional[Dict[str, object]] = dc_field( + default=None, metadata=dc_config(field_name="channel_custom") ) - user: "Optional[User]" = dc_field( + user: "Optional[UserResponseCommonFields]" = dc_field( default=None, metadata=dc_config(field_name="user") ) @@ -11671,245 +12051,124 @@ class MembershipLevelResponse(DataClassJsonMixin): @dataclass -class Message(DataClassJsonMixin): - cid: str = dc_field(metadata=dc_config(field_name="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"), - ) +class MessageActionRequest(DataClassJsonMixin): + form_data: "Dict[str, str]" = dc_field(metadata=dc_config(field_name="form_data")) + user_id: Optional[str] = dc_field( + default=None, metadata=dc_config(field_name="user_id") ) - deleted_reply_count: int = dc_field( - metadata=dc_config(field_name="deleted_reply_count") + user: "Optional[UserRequest]" = dc_field( + default=None, metadata=dc_config(field_name="user") + ) + + +@dataclass +class MessageActionResponse(DataClassJsonMixin): + duration: str = dc_field(metadata=dc_config(field_name="duration")) + message: "Optional[MessageResponse]" = dc_field( + default=None, metadata=dc_config(field_name="message") + ) + + +@dataclass +class MessageChangeSet(DataClassJsonMixin): + attachments: bool = dc_field(metadata=dc_config(field_name="attachments")) + custom: bool = dc_field(metadata=dc_config(field_name="custom")) + html: bool = dc_field(metadata=dc_config(field_name="html")) + mentioned_user_ids: bool = dc_field( + metadata=dc_config(field_name="mentioned_user_ids") + ) + mml: bool = dc_field(metadata=dc_config(field_name="mml")) + pin: bool = dc_field(metadata=dc_config(field_name="pin")) + quoted_message_id: bool = dc_field( + metadata=dc_config(field_name="quoted_message_id") ) - html: str = dc_field(metadata=dc_config(field_name="html")) - id: str = dc_field(metadata=dc_config(field_name="id")) - pinned: bool = dc_field(metadata=dc_config(field_name="pinned")) - reply_count: int = dc_field(metadata=dc_config(field_name="reply_count")) - shadowed: bool = dc_field(metadata=dc_config(field_name="shadowed")) silent: bool = dc_field(metadata=dc_config(field_name="silent")) - text: str = dc_field(metadata=dc_config(field_name="text")) - type: str = dc_field(metadata=dc_config(field_name="type")) - updated_at: datetime = dc_field( + text: bool = dc_field(metadata=dc_config(field_name="text")) + + +@dataclass +class MessageDeletedEvent(DataClassJsonMixin): + created_at: datetime = dc_field( metadata=dc_config( - field_name="updated_at", + field_name="created_at", encoder=encode_datetime, decoder=datetime_from_unix_ns, mm_field=fields.DateTime(format="iso"), ) ) - attachments: "List[Attachment]" = dc_field( - metadata=dc_config(field_name="attachments") - ) - latest_reactions: "List[Reaction]" = dc_field( - metadata=dc_config(field_name="latest_reactions") - ) - mentioned_users: "List[User]" = dc_field( - metadata=dc_config(field_name="mentioned_users") - ) - 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") - ) + hard_delete: bool = dc_field(metadata=dc_config(field_name="hard_delete")) + message_id: str = dc_field(metadata=dc_config(field_name="message_id")) 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") + message: "MessageResponse" = dc_field(metadata=dc_config(field_name="message")) + type: str = dc_field( + default="message.deleted", metadata=dc_config(field_name="type") ) - reaction_groups: "Dict[str, Optional[ReactionGroupResponse]]" = dc_field( - metadata=dc_config(field_name="reaction_groups") + channel_id: Optional[str] = dc_field( + default=None, metadata=dc_config(field_name="channel_id") ) - reaction_scores: "Dict[str, int]" = dc_field( - metadata=dc_config(field_name="reaction_scores") + channel_member_count: Optional[int] = dc_field( + default=None, metadata=dc_config(field_name="channel_member_count") ) - before_message_send_failed: Optional[bool] = dc_field( - default=None, metadata=dc_config(field_name="before_message_send_failed") + channel_message_count: Optional[int] = dc_field( + default=None, metadata=dc_config(field_name="channel_message_count") ) - command: Optional[str] = dc_field( - default=None, metadata=dc_config(field_name="command") + channel_type: Optional[str] = dc_field( + default=None, metadata=dc_config(field_name="channel_type") ) - deleted_at: Optional[datetime] = dc_field( + cid: Optional[str] = dc_field(default=None, metadata=dc_config(field_name="cid")) + deleted_for_me: Optional[bool] = dc_field( + default=None, metadata=dc_config(field_name="deleted_for_me") + ) + received_at: Optional[datetime] = dc_field( default=None, metadata=dc_config( - field_name="deleted_at", + field_name="received_at", encoder=encode_datetime, decoder=datetime_from_unix_ns, mm_field=fields.DateTime(format="iso"), ), ) - deleted_for_me: Optional[bool] = dc_field( - default=None, metadata=dc_config(field_name="deleted_for_me") + team: Optional[str] = dc_field(default=None, metadata=dc_config(field_name="team")) + channel_custom: Optional[Dict[str, object]] = dc_field( + default=None, metadata=dc_config(field_name="channel_custom") ) - message_text_updated_at: Optional[datetime] = dc_field( - default=None, + user: "Optional[UserResponseCommonFields]" = dc_field( + default=None, metadata=dc_config(field_name="user") + ) + + +@dataclass +class MessageFlagResponse(DataClassJsonMixin): + created_at: datetime = dc_field( metadata=dc_config( - field_name="message_text_updated_at", + field_name="created_at", encoder=encode_datetime, decoder=datetime_from_unix_ns, mm_field=fields.DateTime(format="iso"), - ), + ) ) - 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") + created_by_automod: bool = dc_field( + metadata=dc_config(field_name="created_by_automod") ) - pin_expires: Optional[datetime] = dc_field( - default=None, + updated_at: datetime = dc_field( metadata=dc_config( - field_name="pin_expires", + field_name="updated_at", encoder=encode_datetime, decoder=datetime_from_unix_ns, mm_field=fields.DateTime(format="iso"), - ), + ) ) - pinned_at: Optional[datetime] = dc_field( + approved_at: Optional[datetime] = dc_field( default=None, metadata=dc_config( - field_name="pinned_at", + field_name="approved_at", encoder=encode_datetime, decoder=datetime_from_unix_ns, mm_field=fields.DateTime(format="iso"), ), ) - 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") - ) - thread_participants: "Optional[List[User]]" = dc_field( - default=None, metadata=dc_config(field_name="thread_participants") - ) - i18n: "Optional[Dict[str, str]]" = dc_field( - default=None, metadata=dc_config(field_name="i18n") - ) - image_labels: "Optional[Dict[str, List[str]]]" = dc_field( - default=None, metadata=dc_config(field_name="image_labels") - ) - member: "Optional[ChannelMember]" = dc_field( - default=None, metadata=dc_config(field_name="member") - ) - moderation: "Optional[ModerationV2Response]" = dc_field( - default=None, metadata=dc_config(field_name="moderation") - ) - pinned_by: "Optional[User]" = dc_field( - default=None, metadata=dc_config(field_name="pinned_by") - ) - poll: "Optional[Poll]" = dc_field( - default=None, metadata=dc_config(field_name="poll") - ) - 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") - ) - shared_location: "Optional[SharedLocation]" = dc_field( - default=None, metadata=dc_config(field_name="shared_location") - ) - user: "Optional[User]" = dc_field( - default=None, metadata=dc_config(field_name="user") - ) - - -@dataclass -class MessageActionRequest(DataClassJsonMixin): - form_data: "Dict[str, str]" = dc_field(metadata=dc_config(field_name="form_data")) - 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 MessageChangeSet(DataClassJsonMixin): - attachments: bool = dc_field(metadata=dc_config(field_name="attachments")) - custom: bool = dc_field(metadata=dc_config(field_name="custom")) - html: bool = dc_field(metadata=dc_config(field_name="html")) - mentioned_user_ids: bool = dc_field( - metadata=dc_config(field_name="mentioned_user_ids") - ) - mml: bool = dc_field(metadata=dc_config(field_name="mml")) - pin: bool = dc_field(metadata=dc_config(field_name="pin")) - quoted_message_id: bool = dc_field( - metadata=dc_config(field_name="quoted_message_id") - ) - silent: bool = dc_field(metadata=dc_config(field_name="silent")) - text: bool = dc_field(metadata=dc_config(field_name="text")) - - -@dataclass -class MessageDeletedEvent(DataClassJsonMixin): - channel_id: str = dc_field(metadata=dc_config(field_name="channel_id")) - channel_type: str = dc_field(metadata=dc_config(field_name="channel_type")) - cid: str = dc_field(metadata=dc_config(field_name="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"), - ) - ) - hard_delete: bool = dc_field(metadata=dc_config(field_name="hard_delete")) - type: str = dc_field( - default="message.deleted", metadata=dc_config(field_name="type") - ) - deleted_for_me: Optional[bool] = dc_field( - default=None, metadata=dc_config(field_name="deleted_for_me") - ) - 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") - ) - 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 MessageFlagResponse(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") + reason: Optional[str] = dc_field( + default=None, metadata=dc_config(field_name="reason") ) rejected_at: Optional[datetime] = dc_field( default=None, @@ -11932,13 +12191,13 @@ class MessageFlagResponse(DataClassJsonMixin): custom: Optional[Dict[str, object]] = dc_field( default=None, metadata=dc_config(field_name="custom") ) - details: "Optional[FlagDetails]" = dc_field( + details: "Optional[FlagDetailsResponse]" = dc_field( default=None, metadata=dc_config(field_name="details") ) - message: "Optional[Message]" = dc_field( + message: "Optional[MessageResponse]" = dc_field( default=None, metadata=dc_config(field_name="message") ) - moderation_feedback: "Optional[FlagFeedback]" = dc_field( + moderation_feedback: "Optional[FlagFeedbackResponse]" = dc_field( default=None, metadata=dc_config(field_name="moderation_feedback") ) moderation_result: "Optional[MessageModerationResult]" = dc_field( @@ -11954,7 +12213,6 @@ class MessageFlagResponse(DataClassJsonMixin): @dataclass class MessageFlaggedEvent(DataClassJsonMixin): - cid: str = dc_field(metadata=dc_config(field_name="cid")) created_at: datetime = dc_field( metadata=dc_config( field_name="created_at", @@ -11963,19 +12221,53 @@ class MessageFlaggedEvent(DataClassJsonMixin): mm_field=fields.DateTime(format="iso"), ) ) + message_id: str = dc_field(metadata=dc_config(field_name="message_id")) + message: "MessageResponse" = dc_field(metadata=dc_config(field_name="message")) type: str = dc_field( default="message.flagged", metadata=dc_config(field_name="type") ) - thread_participants: "Optional[List[User]]" = dc_field( - default=None, metadata=dc_config(field_name="thread_participants") + channel_id: Optional[str] = dc_field( + default=None, metadata=dc_config(field_name="channel_id") ) - flag: "Optional[Flag]" = dc_field( - default=None, metadata=dc_config(field_name="flag") + channel_member_count: Optional[int] = dc_field( + default=None, metadata=dc_config(field_name="channel_member_count") ) - message: "Optional[Message]" = dc_field( - default=None, metadata=dc_config(field_name="message") + channel_message_count: Optional[int] = dc_field( + default=None, metadata=dc_config(field_name="channel_message_count") ) - user: "Optional[User]" = dc_field( + channel_type: Optional[str] = dc_field( + default=None, metadata=dc_config(field_name="channel_type") + ) + cid: Optional[str] = dc_field(default=None, metadata=dc_config(field_name="cid")) + reason: Optional[str] = dc_field( + default=None, metadata=dc_config(field_name="reason") + ) + 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"), + ), + ) + team: Optional[str] = dc_field(default=None, metadata=dc_config(field_name="team")) + total_flags: Optional[int] = dc_field( + default=None, metadata=dc_config(field_name="total_flags") + ) + channel_custom: Optional[Dict[str, object]] = dc_field( + default=None, metadata=dc_config(field_name="channel_custom") + ) + custom: Optional[Dict[str, object]] = dc_field( + default=None, metadata=dc_config(field_name="custom") + ) + details: "Optional[MessageModerationResult]" = dc_field( + default=None, metadata=dc_config(field_name="details") + ) + flag: "Optional[FlagResponse]" = dc_field( + default=None, metadata=dc_config(field_name="flag") + ) + user: "Optional[UserResponseCommonFields]" = dc_field( default=None, metadata=dc_config(field_name="user") ) @@ -12043,9 +12335,6 @@ class MessageModerationResult(DataClassJsonMixin): @dataclass class MessageNewEvent(DataClassJsonMixin): - channel_id: str = dc_field(metadata=dc_config(field_name="channel_id")) - channel_type: str = dc_field(metadata=dc_config(field_name="channel_type")) - cid: str = dc_field(metadata=dc_config(field_name="cid")) created_at: datetime = dc_field( metadata=dc_config( field_name="created_at", @@ -12054,18 +12343,56 @@ class MessageNewEvent(DataClassJsonMixin): mm_field=fields.DateTime(format="iso"), ) ) + message_id: str = dc_field(metadata=dc_config(field_name="message_id")) 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") + custom: Dict[str, object] = dc_field(metadata=dc_config(field_name="custom")) + message: "MessageResponse" = dc_field(metadata=dc_config(field_name="message")) + type: str = dc_field(default="message.new", metadata=dc_config(field_name="type")) + channel_id: Optional[str] = dc_field( + default=None, metadata=dc_config(field_name="channel_id") + ) + channel_member_count: Optional[int] = dc_field( + default=None, metadata=dc_config(field_name="channel_member_count") + ) + channel_message_count: Optional[int] = dc_field( + default=None, metadata=dc_config(field_name="channel_message_count") + ) + channel_type: Optional[str] = dc_field( + default=None, metadata=dc_config(field_name="channel_type") + ) + cid: Optional[str] = dc_field(default=None, metadata=dc_config(field_name="cid")) + parent_author: Optional[str] = dc_field( + default=None, metadata=dc_config(field_name="parent_author") + ) + 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"), + ), ) team: Optional[str] = dc_field(default=None, metadata=dc_config(field_name="team")) - thread_participants: "Optional[List[User]]" = dc_field( + total_unread_count: Optional[int] = dc_field( + default=None, metadata=dc_config(field_name="total_unread_count") + ) + unread_channels: Optional[int] = dc_field( + default=None, metadata=dc_config(field_name="unread_channels") + ) + unread_count: Optional[int] = dc_field( + default=None, metadata=dc_config(field_name="unread_count") + ) + thread_participants: "Optional[List[UserResponseCommonFields]]" = dc_field( default=None, metadata=dc_config(field_name="thread_participants") ) - message: "Optional[Message]" = dc_field( - default=None, metadata=dc_config(field_name="message") + channel: "Optional[ChannelResponse]" = dc_field( + default=None, metadata=dc_config(field_name="channel") ) - user: "Optional[User]" = dc_field( + channel_custom: Optional[Dict[str, object]] = dc_field( + default=None, metadata=dc_config(field_name="channel_custom") + ) + user: "Optional[UserResponseCommonFields]" = dc_field( default=None, metadata=dc_config(field_name="user") ) @@ -12146,9 +12473,6 @@ class MessagePaginationParams(DataClassJsonMixin): @dataclass class MessageReadEvent(DataClassJsonMixin): - channel_id: str = dc_field(metadata=dc_config(field_name="channel_id")) - channel_type: str = dc_field(metadata=dc_config(field_name="channel_type")) - cid: str = dc_field(metadata=dc_config(field_name="cid")) created_at: datetime = dc_field( metadata=dc_config( field_name="created_at", @@ -12157,23 +12481,40 @@ class MessageReadEvent(DataClassJsonMixin): mm_field=fields.DateTime(format="iso"), ) ) + custom: Dict[str, object] = dc_field(metadata=dc_config(field_name="custom")) type: str = dc_field(default="message.read", metadata=dc_config(field_name="type")) - channel_last_message_at: Optional[datetime] = dc_field( + channel_id: Optional[str] = dc_field( + default=None, metadata=dc_config(field_name="channel_id") + ) + channel_member_count: Optional[int] = dc_field( + default=None, metadata=dc_config(field_name="channel_member_count") + ) + channel_message_count: Optional[int] = dc_field( + default=None, metadata=dc_config(field_name="channel_message_count") + ) + channel_type: Optional[str] = dc_field( + default=None, metadata=dc_config(field_name="channel_type") + ) + cid: Optional[str] = dc_field(default=None, metadata=dc_config(field_name="cid")) + last_read_message_id: Optional[str] = dc_field( + default=None, metadata=dc_config(field_name="last_read_message_id") + ) + received_at: Optional[datetime] = dc_field( default=None, metadata=dc_config( - field_name="channel_last_message_at", + field_name="received_at", encoder=encode_datetime, decoder=datetime_from_unix_ns, mm_field=fields.DateTime(format="iso"), ), ) - last_read_message_id: Optional[str] = dc_field( - default=None, metadata=dc_config(field_name="last_read_message_id") - ) team: Optional[str] = dc_field(default=None, metadata=dc_config(field_name="team")) channel: "Optional[ChannelResponse]" = dc_field( default=None, metadata=dc_config(field_name="channel") ) + channel_custom: Optional[Dict[str, object]] = dc_field( + default=None, metadata=dc_config(field_name="channel_custom") + ) thread: "Optional[ThreadResponse]" = dc_field( default=None, metadata=dc_config(field_name="thread") ) @@ -12183,63 +12524,24 @@ class MessageReadEvent(DataClassJsonMixin): @dataclass -class MessageReminder(DataClassJsonMixin): - channel_cid: str = dc_field(metadata=dc_config(field_name="channel_cid")) - created_at: datetime = dc_field( +class MessageRequest(DataClassJsonMixin): + html: Optional[str] = dc_field(default=None, metadata=dc_config(field_name="html")) + id: Optional[str] = dc_field(default=None, metadata=dc_config(field_name="id")) + mentioned_channel: Optional[bool] = dc_field( + default=None, metadata=dc_config(field_name="mentioned_channel") + ) + 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") + ) + pin_expires: Optional[datetime] = dc_field( + default=None, metadata=dc_config( - field_name="created_at", + field_name="pin_expires", 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")) - id: Optional[str] = dc_field(default=None, metadata=dc_config(field_name="id")) - 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") - ) - pin_expires: Optional[datetime] = dc_field( - default=None, - metadata=dc_config( - field_name="pin_expires", - encoder=encode_datetime, - decoder=datetime_from_unix_ns, - mm_field=fields.DateTime(format="iso"), - ), + ), ) pinned: Optional[bool] = dc_field( default=None, metadata=dc_config(field_name="pinned") @@ -12306,6 +12608,9 @@ class MessageResponse(DataClassJsonMixin): ) html: str = dc_field(metadata=dc_config(field_name="html")) id: str = dc_field(metadata=dc_config(field_name="id")) + mentioned_channel: bool = dc_field( + metadata=dc_config(field_name="mentioned_channel") + ) pinned: bool = dc_field(metadata=dc_config(field_name="pinned")) reply_count: int = dc_field(metadata=dc_config(field_name="reply_count")) shadowed: bool = dc_field(metadata=dc_config(field_name="shadowed")) @@ -12445,7 +12750,6 @@ class MessageStatsResponse(DataClassJsonMixin): @dataclass class MessageUnblockedEvent(DataClassJsonMixin): - cid: str = dc_field(metadata=dc_config(field_name="cid")) created_at: datetime = dc_field( metadata=dc_config( field_name="created_at", @@ -12454,25 +12758,29 @@ class MessageUnblockedEvent(DataClassJsonMixin): mm_field=fields.DateTime(format="iso"), ) ) + message_id: str = dc_field(metadata=dc_config(field_name="message_id")) + custom: Dict[str, object] = dc_field(metadata=dc_config(field_name="custom")) + message: "MessageResponse" = dc_field(metadata=dc_config(field_name="message")) type: str = dc_field( default="message.unblocked", metadata=dc_config(field_name="type") ) - thread_participants: "Optional[List[User]]" = dc_field( - default=None, metadata=dc_config(field_name="thread_participants") - ) - message: "Optional[Message]" = dc_field( - default=None, metadata=dc_config(field_name="message") + cid: Optional[str] = dc_field(default=None, metadata=dc_config(field_name="cid")) + received_at: Optional[datetime] = dc_field( + default=None, + metadata=dc_config( + field_name="received_at", + encoder=encode_datetime, + decoder=datetime_from_unix_ns, + mm_field=fields.DateTime(format="iso"), + ), ) - user: "Optional[User]" = dc_field( + user: "Optional[UserResponseCommonFields]" = dc_field( default=None, metadata=dc_config(field_name="user") ) @dataclass class MessageUndeletedEvent(DataClassJsonMixin): - channel_id: str = dc_field(metadata=dc_config(field_name="channel_id")) - channel_type: str = dc_field(metadata=dc_config(field_name="channel_type")) - cid: str = dc_field(metadata=dc_config(field_name="cid")) created_at: datetime = dc_field( metadata=dc_config( field_name="created_at", @@ -12481,18 +12789,37 @@ class MessageUndeletedEvent(DataClassJsonMixin): mm_field=fields.DateTime(format="iso"), ) ) + message_id: str = dc_field(metadata=dc_config(field_name="message_id")) + custom: Dict[str, object] = dc_field(metadata=dc_config(field_name="custom")) + message: "MessageResponse" = dc_field(metadata=dc_config(field_name="message")) type: str = dc_field( default="message.undeleted", 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") + channel_id: Optional[str] = dc_field( + default=None, metadata=dc_config(field_name="channel_id") ) - message: "Optional[Message]" = dc_field( - default=None, metadata=dc_config(field_name="message") + channel_member_count: Optional[int] = dc_field( + default=None, metadata=dc_config(field_name="channel_member_count") ) - user: "Optional[User]" = dc_field( - default=None, metadata=dc_config(field_name="user") + channel_message_count: Optional[int] = dc_field( + default=None, metadata=dc_config(field_name="channel_message_count") + ) + channel_type: Optional[str] = dc_field( + default=None, metadata=dc_config(field_name="channel_type") + ) + cid: Optional[str] = dc_field(default=None, metadata=dc_config(field_name="cid")) + 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"), + ), + ) + team: Optional[str] = dc_field(default=None, metadata=dc_config(field_name="team")) + channel_custom: Optional[Dict[str, object]] = dc_field( + default=None, metadata=dc_config(field_name="channel_custom") ) @@ -12508,9 +12835,6 @@ class MessageUpdate(DataClassJsonMixin): @dataclass class MessageUpdatedEvent(DataClassJsonMixin): - channel_id: str = dc_field(metadata=dc_config(field_name="channel_id")) - channel_type: str = dc_field(metadata=dc_config(field_name="channel_type")) - cid: str = dc_field(metadata=dc_config(field_name="cid")) created_at: datetime = dc_field( metadata=dc_config( field_name="created_at", @@ -12519,17 +12843,42 @@ class MessageUpdatedEvent(DataClassJsonMixin): mm_field=fields.DateTime(format="iso"), ) ) + message_id: str = dc_field(metadata=dc_config(field_name="message_id")) + custom: Dict[str, object] = dc_field(metadata=dc_config(field_name="custom")) + message: "MessageResponse" = dc_field(metadata=dc_config(field_name="message")) type: str = dc_field( default="message.updated", metadata=dc_config(field_name="type") ) + channel_id: Optional[str] = dc_field( + default=None, metadata=dc_config(field_name="channel_id") + ) + channel_member_count: Optional[int] = dc_field( + default=None, metadata=dc_config(field_name="channel_member_count") + ) + channel_message_count: Optional[int] = dc_field( + default=None, metadata=dc_config(field_name="channel_message_count") + ) + channel_type: Optional[str] = dc_field( + default=None, metadata=dc_config(field_name="channel_type") + ) + cid: Optional[str] = dc_field(default=None, metadata=dc_config(field_name="cid")) + 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"), + ), + ) 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") + channel_custom: Optional[Dict[str, object]] = dc_field( + default=None, metadata=dc_config(field_name="channel_custom") ) - message: "Optional[Message]" = dc_field( - default=None, metadata=dc_config(field_name="message") + message_update: "Optional[MessageUpdate]" = dc_field( + default=None, metadata=dc_config(field_name="message_update") ) - user: "Optional[User]" = dc_field( + user: "Optional[UserResponseCommonFields]" = dc_field( default=None, metadata=dc_config(field_name="user") ) @@ -12550,6 +12899,9 @@ class MessageWithChannelResponse(DataClassJsonMixin): ) html: str = dc_field(metadata=dc_config(field_name="html")) id: str = dc_field(metadata=dc_config(field_name="id")) + mentioned_channel: bool = dc_field( + metadata=dc_config(field_name="mentioned_channel") + ) pinned: bool = dc_field(metadata=dc_config(field_name="pinned")) reply_count: int = dc_field(metadata=dc_config(field_name="reply_count")) shadowed: bool = dc_field(metadata=dc_config(field_name="shadowed")) @@ -12704,13 +13056,22 @@ class MetricThreshold(DataClassJsonMixin): @dataclass -class ModerationActionConfig(DataClassJsonMixin): +class MetricTimeSeries(DataClassJsonMixin): + data_points: "Optional[List[List[float]]]" = dc_field( + default=None, metadata=dc_config(field_name="data_points") + ) + + +@dataclass +class ModerationActionConfigResponse(DataClassJsonMixin): action: str = dc_field(metadata=dc_config(field_name="action")) description: str = dc_field(metadata=dc_config(field_name="description")) entity_type: str = dc_field(metadata=dc_config(field_name="entity_type")) icon: str = dc_field(metadata=dc_config(field_name="icon")) order: int = dc_field(metadata=dc_config(field_name="order")) - custom: Dict[str, object] = dc_field(metadata=dc_config(field_name="custom")) + custom: Optional[Dict[str, object]] = dc_field( + default=None, metadata=dc_config(field_name="custom") + ) @dataclass @@ -12853,6 +13214,12 @@ class ModerationCustomActionEvent(DataClassJsonMixin): @dataclass class ModerationDashboardPreferences(DataClassJsonMixin): + async_review_queue_upsert: Optional[bool] = dc_field( + default=None, metadata=dc_config(field_name="async_review_queue_upsert") + ) + disable_audit_logs: Optional[bool] = dc_field( + default=None, metadata=dc_config(field_name="disable_audit_logs") + ) disable_flagging_reviewed_entity: Optional[bool] = dc_field( default=None, metadata=dc_config(field_name="disable_flagging_reviewed_entity") ) @@ -12910,7 +13277,7 @@ class ModerationFlagResponse(DataClassJsonMixin): custom: Optional[Dict[str, object]] = dc_field( default=None, metadata=dc_config(field_name="custom") ) - moderation_payload: "Optional[ModerationPayload]" = dc_field( + moderation_payload: "Optional[ModerationPayloadResponse]" = dc_field( default=None, metadata=dc_config(field_name="moderation_payload") ) review_queue_item: "Optional[ReviewQueueItemResponse]" = dc_field( @@ -12923,6 +13290,7 @@ class ModerationFlagResponse(DataClassJsonMixin): @dataclass class ModerationFlaggedEvent(DataClassJsonMixin): + content_type: str = dc_field(metadata=dc_config(field_name="content_type")) created_at: datetime = dc_field( metadata=dc_config( field_name="created_at", @@ -12931,15 +13299,19 @@ class ModerationFlaggedEvent(DataClassJsonMixin): mm_field=fields.DateTime(format="iso"), ) ) + object_id: str = dc_field(metadata=dc_config(field_name="object_id")) + custom: Dict[str, object] = dc_field(metadata=dc_config(field_name="custom")) type: str = dc_field( default="moderation.flagged", metadata=dc_config(field_name="type") ) - item: Optional[str] = dc_field(default=None, metadata=dc_config(field_name="item")) - object_id: Optional[str] = dc_field( - default=None, metadata=dc_config(field_name="object_id") - ) - user: "Optional[User]" = dc_field( - default=None, metadata=dc_config(field_name="user") + 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"), + ), ) @@ -12988,6 +13360,38 @@ class ModerationPayload(DataClassJsonMixin): ) +@dataclass +class ModerationPayloadRequest(DataClassJsonMixin): + images: Optional[List[str]] = dc_field( + default=None, metadata=dc_config(field_name="images") + ) + texts: Optional[List[str]] = dc_field( + default=None, metadata=dc_config(field_name="texts") + ) + videos: Optional[List[str]] = dc_field( + default=None, metadata=dc_config(field_name="videos") + ) + custom: Optional[Dict[str, object]] = dc_field( + default=None, metadata=dc_config(field_name="custom") + ) + + +@dataclass +class ModerationPayloadResponse(DataClassJsonMixin): + images: Optional[List[str]] = dc_field( + default=None, metadata=dc_config(field_name="images") + ) + texts: Optional[List[str]] = dc_field( + default=None, metadata=dc_config(field_name="texts") + ) + videos: Optional[List[str]] = dc_field( + default=None, metadata=dc_config(field_name="videos") + ) + custom: Optional[Dict[str, object]] = dc_field( + default=None, metadata=dc_config(field_name="custom") + ) + + @dataclass class ModerationResponse(DataClassJsonMixin): action: str = dc_field(metadata=dc_config(field_name="action")) @@ -12996,6 +13400,14 @@ class ModerationResponse(DataClassJsonMixin): toxic: float = dc_field(metadata=dc_config(field_name="toxic")) +@dataclass +class ModerationRuleInfo(DataClassJsonMixin): + description: str = dc_field(metadata=dc_config(field_name="description")) + id: str = dc_field(metadata=dc_config(field_name="id")) + name: str = dc_field(metadata=dc_config(field_name="name")) + type: str = dc_field(metadata=dc_config(field_name="type")) + + @dataclass class ModerationRuleV2Response(DataClassJsonMixin): created_at: datetime = dc_field( @@ -13021,19 +13433,62 @@ class ModerationRuleV2Response(DataClassJsonMixin): ) ) config_keys: List[str] = dc_field(metadata=dc_config(field_name="config_keys")) - action: "RuleBuilderAction" = dc_field(metadata=dc_config(field_name="action")) cooldown_period: Optional[str] = dc_field( default=None, metadata=dc_config(field_name="cooldown_period") ) logic: Optional[str] = dc_field( default=None, metadata=dc_config(field_name="logic") ) + action_sequences: "Optional[List[CallRuleActionSequence]]" = dc_field( + default=None, metadata=dc_config(field_name="action_sequences") + ) conditions: "Optional[List[RuleBuilderCondition]]" = dc_field( default=None, metadata=dc_config(field_name="conditions") ) groups: "Optional[List[RuleBuilderConditionGroup]]" = dc_field( default=None, metadata=dc_config(field_name="groups") ) + action: "Optional[RuleBuilderAction]" = dc_field( + default=None, metadata=dc_config(field_name="action") + ) + + +@dataclass +class ModerationRulesTriggeredEvent(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")) + user_id: str = dc_field(metadata=dc_config(field_name="user_id")) + triggered_actions: List[str] = dc_field( + metadata=dc_config(field_name="triggered_actions") + ) + custom: Dict[str, object] = dc_field(metadata=dc_config(field_name="custom")) + rule: "ModerationRuleInfo" = dc_field(metadata=dc_config(field_name="rule")) + type: str = dc_field( + default="moderation_rule.triggered", 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"), + ), + ) + review_queue_item_id: Optional[str] = dc_field( + default=None, metadata=dc_config(field_name="review_queue_item_id") + ) + violation_number: Optional[int] = dc_field( + default=None, metadata=dc_config(field_name="violation_number") + ) @dataclass @@ -13049,6 +13504,9 @@ class ModerationV2Response(DataClassJsonMixin): semantic_filter_matched: Optional[str] = dc_field( default=None, metadata=dc_config(field_name="semantic_filter_matched") ) + blocklists_matched: Optional[List[str]] = dc_field( + default=None, metadata=dc_config(field_name="blocklists_matched") + ) image_harms: Optional[List[str]] = dc_field( default=None, metadata=dc_config(field_name="image_harms") ) @@ -13082,7 +13540,7 @@ class MuteChannelResponse(DataClassJsonMixin): channel_mute: "Optional[ChannelMute]" = dc_field( default=None, metadata=dc_config(field_name="channel_mute") ) - own_user: "Optional[OwnUser]" = dc_field( + own_user: "Optional[OwnUserResponse]" = dc_field( default=None, metadata=dc_config(field_name="own_user") ) @@ -13104,13 +13562,13 @@ class MuteRequest(DataClassJsonMixin): @dataclass class MuteResponse(DataClassJsonMixin): duration: str = dc_field(metadata=dc_config(field_name="duration")) - mutes: "Optional[List[UserMute]]" = dc_field( + mutes: "Optional[List[UserMuteResponse]]" = dc_field( default=None, metadata=dc_config(field_name="mutes") ) non_existing_users: Optional[List[str]] = dc_field( default=None, metadata=dc_config(field_name="non_existing_users") ) - own_user: "Optional[OwnUser]" = dc_field( + own_user: "Optional[OwnUserResponse]" = dc_field( default=None, metadata=dc_config(field_name="own_user") ) @@ -13242,12 +13700,6 @@ class NotificationFeedUpdatedEvent(DataClassJsonMixin): @dataclass class NotificationMarkUnreadEvent(DataClassJsonMixin): - channel_id: str = dc_field(metadata=dc_config(field_name="channel_id")) - channel_member_count: int = dc_field( - metadata=dc_config(field_name="channel_member_count") - ) - channel_type: str = dc_field(metadata=dc_config(field_name="channel_type")) - cid: str = dc_field(metadata=dc_config(field_name="cid")) created_at: datetime = dc_field( metadata=dc_config( field_name="created_at", @@ -13256,42 +13708,93 @@ class NotificationMarkUnreadEvent(DataClassJsonMixin): mm_field=fields.DateTime(format="iso"), ) ) - first_unread_message_id: str = dc_field( - metadata=dc_config(field_name="first_unread_message_id") - ) - last_read_at: datetime = dc_field( - metadata=dc_config( - field_name="last_read_at", - encoder=encode_datetime, - decoder=datetime_from_unix_ns, - mm_field=fields.DateTime(format="iso"), - ) - ) - total_unread_count: int = dc_field( - metadata=dc_config(field_name="total_unread_count") - ) - unread_channels: int = dc_field(metadata=dc_config(field_name="unread_channels")) - unread_count: int = dc_field(metadata=dc_config(field_name="unread_count")) - unread_messages: int = dc_field(metadata=dc_config(field_name="unread_messages")) - unread_threads: int = dc_field(metadata=dc_config(field_name="unread_threads")) + custom: Dict[str, object] = dc_field(metadata=dc_config(field_name="custom")) type: str = dc_field( default="notification.mark_unread", metadata=dc_config(field_name="type") ) - last_read_message_id: Optional[str] = dc_field( - default=None, metadata=dc_config(field_name="last_read_message_id") + channel_id: Optional[str] = dc_field( + default=None, metadata=dc_config(field_name="channel_id") + ) + channel_member_count: Optional[int] = dc_field( + default=None, metadata=dc_config(field_name="channel_member_count") + ) + channel_message_count: Optional[int] = dc_field( + default=None, metadata=dc_config(field_name="channel_message_count") + ) + channel_type: Optional[str] = dc_field( + default=None, metadata=dc_config(field_name="channel_type") + ) + cid: Optional[str] = dc_field(default=None, metadata=dc_config(field_name="cid")) + first_unread_message_id: Optional[str] = dc_field( + default=None, metadata=dc_config(field_name="first_unread_message_id") + ) + last_read_at: Optional[datetime] = dc_field( + default=None, + metadata=dc_config( + field_name="last_read_at", + encoder=encode_datetime, + decoder=datetime_from_unix_ns, + mm_field=fields.DateTime(format="iso"), + ), + ) + last_read_message_id: Optional[str] = dc_field( + default=None, metadata=dc_config(field_name="last_read_message_id") + ) + 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"), + ), ) team: Optional[str] = dc_field(default=None, metadata=dc_config(field_name="team")) thread_id: Optional[str] = dc_field( default=None, metadata=dc_config(field_name="thread_id") ) + total_unread_count: Optional[int] = dc_field( + default=None, metadata=dc_config(field_name="total_unread_count") + ) + unread_channels: Optional[int] = dc_field( + default=None, metadata=dc_config(field_name="unread_channels") + ) + unread_count: Optional[int] = dc_field( + default=None, metadata=dc_config(field_name="unread_count") + ) + unread_messages: Optional[int] = dc_field( + default=None, metadata=dc_config(field_name="unread_messages") + ) + unread_thread_messages: Optional[int] = dc_field( + default=None, metadata=dc_config(field_name="unread_thread_messages") + ) + unread_threads: Optional[int] = dc_field( + default=None, metadata=dc_config(field_name="unread_threads") + ) channel: "Optional[ChannelResponse]" = dc_field( default=None, metadata=dc_config(field_name="channel") ) - user: "Optional[User]" = dc_field( + channel_custom: Optional[Dict[str, object]] = dc_field( + default=None, metadata=dc_config(field_name="channel_custom") + ) + user: "Optional[UserResponseCommonFields]" = dc_field( default=None, metadata=dc_config(field_name="user") ) +@dataclass +class NotificationParentActivity(DataClassJsonMixin): + id: str = dc_field(metadata=dc_config(field_name="id")) + text: Optional[str] = dc_field(default=None, metadata=dc_config(field_name="text")) + type: Optional[str] = dc_field(default=None, metadata=dc_config(field_name="type")) + user_id: Optional[str] = dc_field( + default=None, metadata=dc_config(field_name="user_id") + ) + attachments: "Optional[List[Attachment]]" = dc_field( + default=None, metadata=dc_config(field_name="attachments") + ) + + @dataclass class NotificationSettings(DataClassJsonMixin): enabled: bool = dc_field(metadata=dc_config(field_name="enabled")) @@ -13312,6 +13815,48 @@ class NotificationSettings(DataClassJsonMixin): ) +@dataclass +class NotificationSettingsRequest(DataClassJsonMixin): + enabled: Optional[bool] = dc_field( + default=None, metadata=dc_config(field_name="enabled") + ) + call_live_started: "Optional[EventNotificationSettingsRequest]" = dc_field( + default=None, metadata=dc_config(field_name="call_live_started") + ) + call_missed: "Optional[EventNotificationSettingsRequest]" = dc_field( + default=None, metadata=dc_config(field_name="call_missed") + ) + call_notification: "Optional[EventNotificationSettingsRequest]" = dc_field( + default=None, metadata=dc_config(field_name="call_notification") + ) + call_ring: "Optional[EventNotificationSettingsRequest]" = dc_field( + default=None, metadata=dc_config(field_name="call_ring") + ) + session_started: "Optional[EventNotificationSettingsRequest]" = dc_field( + default=None, metadata=dc_config(field_name="session_started") + ) + + +@dataclass +class NotificationSettingsResponse(DataClassJsonMixin): + enabled: bool = dc_field(metadata=dc_config(field_name="enabled")) + call_live_started: "EventNotificationSettingsResponse" = dc_field( + metadata=dc_config(field_name="call_live_started") + ) + call_missed: "EventNotificationSettingsResponse" = dc_field( + metadata=dc_config(field_name="call_missed") + ) + call_notification: "EventNotificationSettingsResponse" = dc_field( + metadata=dc_config(field_name="call_notification") + ) + call_ring: "EventNotificationSettingsResponse" = dc_field( + metadata=dc_config(field_name="call_ring") + ) + session_started: "EventNotificationSettingsResponse" = dc_field( + metadata=dc_config(field_name="session_started") + ) + + @dataclass class NotificationStatusResponse(DataClassJsonMixin): unread: int = dc_field(metadata=dc_config(field_name="unread")) @@ -13357,6 +13902,68 @@ class NotificationTarget(DataClassJsonMixin): comment: "Optional[NotificationComment]" = dc_field( default=None, metadata=dc_config(field_name="comment") ) + parent_activity: "Optional[NotificationParentActivity]" = dc_field( + default=None, metadata=dc_config(field_name="parent_activity") + ) + + +@dataclass +class NotificationThreadMessageNewEvent(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"), + ) + ) + message_id: str = dc_field(metadata=dc_config(field_name="message_id")) + thread_id: str = dc_field(metadata=dc_config(field_name="thread_id")) + watcher_count: int = dc_field(metadata=dc_config(field_name="watcher_count")) + channel: "ChannelResponse" = dc_field(metadata=dc_config(field_name="channel")) + custom: Dict[str, object] = dc_field(metadata=dc_config(field_name="custom")) + message: "MessageResponse" = dc_field(metadata=dc_config(field_name="message")) + type: str = dc_field( + default="notification.thread_message_new", metadata=dc_config(field_name="type") + ) + channel_id: Optional[str] = dc_field( + default=None, metadata=dc_config(field_name="channel_id") + ) + channel_member_count: Optional[int] = dc_field( + default=None, metadata=dc_config(field_name="channel_member_count") + ) + channel_message_count: Optional[int] = dc_field( + default=None, metadata=dc_config(field_name="channel_message_count") + ) + channel_type: Optional[str] = dc_field( + default=None, metadata=dc_config(field_name="channel_type") + ) + cid: Optional[str] = dc_field(default=None, metadata=dc_config(field_name="cid")) + parent_author: Optional[str] = dc_field( + default=None, metadata=dc_config(field_name="parent_author") + ) + 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"), + ), + ) + team: Optional[str] = dc_field(default=None, metadata=dc_config(field_name="team")) + unread_thread_messages: Optional[int] = dc_field( + default=None, metadata=dc_config(field_name="unread_thread_messages") + ) + unread_threads: Optional[int] = dc_field( + default=None, metadata=dc_config(field_name="unread_threads") + ) + thread_participants: "Optional[List[UserResponseCommonFields]]" = dc_field( + default=None, metadata=dc_config(field_name="thread_participants") + ) + channel_custom: Optional[Dict[str, object]] = dc_field( + default=None, metadata=dc_config(field_name="channel_custom") + ) @dataclass @@ -13398,161 +14005,61 @@ class OwnBatchRequest(DataClassJsonMixin): fields: Optional[List[str]] = dc_field( default=None, metadata=dc_config(field_name="fields") ) - user: "Optional[UserRequest]" = dc_field( - default=None, metadata=dc_config(field_name="user") - ) - - -@dataclass -class OwnBatchResponse(DataClassJsonMixin): - duration: str = dc_field(metadata=dc_config(field_name="duration")) - data: "Dict[str, FeedOwnData]" = dc_field(metadata=dc_config(field_name="data")) - - -OwnCapabilityType = NewType("OwnCapabilityType", str) - - -class OwnCapability: - BLOCK_USERS: Final[OwnCapabilityType] = "block-users" - CHANGE_MAX_DURATION: Final[OwnCapabilityType] = "change-max-duration" - CREATE_CALL: Final[OwnCapabilityType] = "create-call" - CREATE_REACTION: Final[OwnCapabilityType] = "create-reaction" - ENABLE_NOISE_CANCELLATION: Final[OwnCapabilityType] = "enable-noise-cancellation" - END_CALL: Final[OwnCapabilityType] = "end-call" - JOIN_BACKSTAGE: Final[OwnCapabilityType] = "join-backstage" - JOIN_CALL: Final[OwnCapabilityType] = "join-call" - JOIN_ENDED_CALL: Final[OwnCapabilityType] = "join-ended-call" - KICK_USER: Final[OwnCapabilityType] = "kick-user" - MUTE_USERS: Final[OwnCapabilityType] = "mute-users" - PIN_FOR_EVERYONE: Final[OwnCapabilityType] = "pin-for-everyone" - READ_CALL: Final[OwnCapabilityType] = "read-call" - REMOVE_CALL_MEMBER: Final[OwnCapabilityType] = "remove-call-member" - SCREENSHARE: Final[OwnCapabilityType] = "screenshare" - SEND_AUDIO: Final[OwnCapabilityType] = "send-audio" - SEND_CLOSED_CAPTIONS_CALL: Final[OwnCapabilityType] = "send-closed-captions-call" - SEND_VIDEO: Final[OwnCapabilityType] = "send-video" - START_BROADCAST_CALL: Final[OwnCapabilityType] = "start-broadcast-call" - START_CLOSED_CAPTIONS_CALL: Final[OwnCapabilityType] = "start-closed-captions-call" - START_FRAME_RECORD_CALL: Final[OwnCapabilityType] = "start-frame-record-call" - START_INDIVIDUAL_RECORD_CALL: Final[OwnCapabilityType] = ( - "start-individual-record-call" - ) - START_RAW_RECORD_CALL: Final[OwnCapabilityType] = "start-raw-record-call" - START_RECORD_CALL: Final[OwnCapabilityType] = "start-record-call" - START_TRANSCRIPTION_CALL: Final[OwnCapabilityType] = "start-transcription-call" - STOP_BROADCAST_CALL: Final[OwnCapabilityType] = "stop-broadcast-call" - STOP_CLOSED_CAPTIONS_CALL: Final[OwnCapabilityType] = "stop-closed-captions-call" - STOP_FRAME_RECORD_CALL: Final[OwnCapabilityType] = "stop-frame-record-call" - STOP_INDIVIDUAL_RECORD_CALL: Final[OwnCapabilityType] = ( - "stop-individual-record-call" - ) - STOP_RAW_RECORD_CALL: Final[OwnCapabilityType] = "stop-raw-record-call" - STOP_RECORD_CALL: Final[OwnCapabilityType] = "stop-record-call" - STOP_TRANSCRIPTION_CALL: Final[OwnCapabilityType] = "stop-transcription-call" - UPDATE_CALL: Final[OwnCapabilityType] = "update-call" - UPDATE_CALL_MEMBER: Final[OwnCapabilityType] = "update-call-member" - UPDATE_CALL_PERMISSIONS: Final[OwnCapabilityType] = "update-call-permissions" - UPDATE_CALL_SETTINGS: Final[OwnCapabilityType] = "update-call-settings" - - -@dataclass -class OwnUser(DataClassJsonMixin): - banned: bool = dc_field(metadata=dc_config(field_name="banned")) - 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")) - language: str = dc_field(metadata=dc_config(field_name="language")) - online: bool = dc_field(metadata=dc_config(field_name="online")) - role: str = dc_field(metadata=dc_config(field_name="role")) - total_unread_count: int = dc_field( - metadata=dc_config(field_name="total_unread_count") - ) - unread_channels: int = dc_field(metadata=dc_config(field_name="unread_channels")) - unread_count: int = dc_field(metadata=dc_config(field_name="unread_count")) - unread_threads: int = dc_field(metadata=dc_config(field_name="unread_threads")) - 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"), - ) - ) - channel_mutes: "List[ChannelMute]" = dc_field( - metadata=dc_config(field_name="channel_mutes") - ) - devices: "List[Device]" = dc_field(metadata=dc_config(field_name="devices")) - mutes: "List[UserMute]" = dc_field(metadata=dc_config(field_name="mutes")) - custom: Dict[str, object] = dc_field(metadata=dc_config(field_name="custom")) - total_unread_count_by_team: "Dict[str, int]" = dc_field( - metadata=dc_config(field_name="total_unread_count_by_team") - ) - avg_response_time: Optional[int] = dc_field( - default=None, metadata=dc_config(field_name="avg_response_time") - ) - deactivated_at: Optional[datetime] = dc_field( - default=None, - metadata=dc_config( - field_name="deactivated_at", - encoder=encode_datetime, - decoder=datetime_from_unix_ns, - mm_field=fields.DateTime(format="iso"), - ), - ) - deleted_at: Optional[datetime] = dc_field( - default=None, - metadata=dc_config( - field_name="deleted_at", - encoder=encode_datetime, - decoder=datetime_from_unix_ns, - mm_field=fields.DateTime(format="iso"), - ), - ) - invisible: Optional[bool] = dc_field( - default=None, metadata=dc_config(field_name="invisible") - ) - last_active: Optional[datetime] = dc_field( - default=None, - metadata=dc_config( - field_name="last_active", - encoder=encode_datetime, - decoder=datetime_from_unix_ns, - mm_field=fields.DateTime(format="iso"), - ), - ) - last_engaged_at: Optional[datetime] = dc_field( - default=None, - metadata=dc_config( - field_name="last_engaged_at", - encoder=encode_datetime, - decoder=datetime_from_unix_ns, - mm_field=fields.DateTime(format="iso"), - ), - ) - blocked_user_ids: Optional[List[str]] = dc_field( - default=None, metadata=dc_config(field_name="blocked_user_ids") - ) - latest_hidden_channels: Optional[List[str]] = dc_field( - default=None, metadata=dc_config(field_name="latest_hidden_channels") - ) - teams: Optional[List[str]] = dc_field( - default=None, metadata=dc_config(field_name="teams") - ) - privacy_settings: "Optional[PrivacySettings]" = dc_field( - default=None, metadata=dc_config(field_name="privacy_settings") + user: "Optional[UserRequest]" = dc_field( + default=None, metadata=dc_config(field_name="user") ) - push_preferences: "Optional[PushPreferences]" = dc_field( - default=None, metadata=dc_config(field_name="push_preferences") + + +@dataclass +class OwnBatchResponse(DataClassJsonMixin): + duration: str = dc_field(metadata=dc_config(field_name="duration")) + data: "Dict[str, FeedOwnData]" = dc_field(metadata=dc_config(field_name="data")) + + +OwnCapabilityType = NewType("OwnCapabilityType", str) + + +class OwnCapability: + BLOCK_USERS: Final[OwnCapabilityType] = "block-users" + CHANGE_MAX_DURATION: Final[OwnCapabilityType] = "change-max-duration" + CREATE_CALL: Final[OwnCapabilityType] = "create-call" + CREATE_REACTION: Final[OwnCapabilityType] = "create-reaction" + ENABLE_NOISE_CANCELLATION: Final[OwnCapabilityType] = "enable-noise-cancellation" + END_CALL: Final[OwnCapabilityType] = "end-call" + JOIN_BACKSTAGE: Final[OwnCapabilityType] = "join-backstage" + JOIN_CALL: Final[OwnCapabilityType] = "join-call" + JOIN_ENDED_CALL: Final[OwnCapabilityType] = "join-ended-call" + KICK_USER: Final[OwnCapabilityType] = "kick-user" + MUTE_USERS: Final[OwnCapabilityType] = "mute-users" + PIN_FOR_EVERYONE: Final[OwnCapabilityType] = "pin-for-everyone" + READ_CALL: Final[OwnCapabilityType] = "read-call" + REMOVE_CALL_MEMBER: Final[OwnCapabilityType] = "remove-call-member" + SCREENSHARE: Final[OwnCapabilityType] = "screenshare" + SEND_AUDIO: Final[OwnCapabilityType] = "send-audio" + SEND_CLOSED_CAPTIONS_CALL: Final[OwnCapabilityType] = "send-closed-captions-call" + SEND_VIDEO: Final[OwnCapabilityType] = "send-video" + START_BROADCAST_CALL: Final[OwnCapabilityType] = "start-broadcast-call" + START_CLOSED_CAPTIONS_CALL: Final[OwnCapabilityType] = "start-closed-captions-call" + START_FRAME_RECORD_CALL: Final[OwnCapabilityType] = "start-frame-record-call" + START_INDIVIDUAL_RECORD_CALL: Final[OwnCapabilityType] = ( + "start-individual-record-call" ) - teams_role: "Optional[Dict[str, str]]" = dc_field( - default=None, metadata=dc_config(field_name="teams_role") + START_RAW_RECORD_CALL: Final[OwnCapabilityType] = "start-raw-record-call" + START_RECORD_CALL: Final[OwnCapabilityType] = "start-record-call" + START_TRANSCRIPTION_CALL: Final[OwnCapabilityType] = "start-transcription-call" + STOP_BROADCAST_CALL: Final[OwnCapabilityType] = "stop-broadcast-call" + STOP_CLOSED_CAPTIONS_CALL: Final[OwnCapabilityType] = "stop-closed-captions-call" + STOP_FRAME_RECORD_CALL: Final[OwnCapabilityType] = "stop-frame-record-call" + STOP_INDIVIDUAL_RECORD_CALL: Final[OwnCapabilityType] = ( + "stop-individual-record-call" ) + STOP_RAW_RECORD_CALL: Final[OwnCapabilityType] = "stop-raw-record-call" + STOP_RECORD_CALL: Final[OwnCapabilityType] = "stop-record-call" + STOP_TRANSCRIPTION_CALL: Final[OwnCapabilityType] = "stop-transcription-call" + UPDATE_CALL: Final[OwnCapabilityType] = "update-call" + UPDATE_CALL_MEMBER: Final[OwnCapabilityType] = "update-call-member" + UPDATE_CALL_PERMISSIONS: Final[OwnCapabilityType] = "update-call-permissions" + UPDATE_CALL_SETTINGS: Final[OwnCapabilityType] = "update-call-settings" @dataclass @@ -13680,6 +14187,15 @@ class PaginationParams(DataClassJsonMixin): ) +@dataclass +class ParsedPredefinedFilterResponse(DataClassJsonMixin): + name: str = dc_field(metadata=dc_config(field_name="name")) + filter: Dict[str, object] = dc_field(metadata=dc_config(field_name="filter")) + sort: "Optional[List[SortParamRequest]]" = dc_field( + default=None, metadata=dc_config(field_name="sort") + ) + + @dataclass class ParticipantCountByMinuteResponse(DataClassJsonMixin): first: int = dc_field(metadata=dc_config(field_name="first")) @@ -13852,6 +14368,35 @@ class ParticipantSeriesUserStats(DataClassJsonMixin): ) +@dataclass +class ParticipantSessionDetails(DataClassJsonMixin): + publisher_type: str = dc_field(metadata=dc_config(field_name="publisher_type")) + user_id: str = dc_field(metadata=dc_config(field_name="user_id")) + user_session_id: str = dc_field(metadata=dc_config(field_name="user_session_id")) + roles: List[str] = dc_field(metadata=dc_config(field_name="roles")) + duration_in_seconds: Optional[int] = dc_field( + default=None, metadata=dc_config(field_name="duration_in_seconds") + ) + joined_at: Optional[datetime] = dc_field( + default=None, + metadata=dc_config( + field_name="joined_at", + encoder=encode_datetime, + decoder=datetime_from_unix_ns, + mm_field=fields.DateTime(format="iso"), + ), + ) + left_at: Optional[datetime] = dc_field( + default=None, + metadata=dc_config( + field_name="left_at", + encoder=encode_datetime, + decoder=datetime_from_unix_ns, + mm_field=fields.DateTime(format="iso"), + ), + ) + + @dataclass class PendingMessageEvent(DataClassJsonMixin): created_at: datetime = dc_field( @@ -13876,16 +14421,16 @@ class PendingMessageEvent(DataClassJsonMixin): mm_field=fields.DateTime(format="iso"), ), ) - channel: "Optional[Channel]" = dc_field( + channel: "Optional[ChannelResponse]" = dc_field( default=None, metadata=dc_config(field_name="channel") ) - message: "Optional[Message]" = dc_field( + message: "Optional[MessageResponse]" = dc_field( default=None, metadata=dc_config(field_name="message") ) metadata: "Optional[Dict[str, str]]" = dc_field( default=None, metadata=dc_config(field_name="metadata") ) - user: "Optional[User]" = dc_field( + user: "Optional[UserResponse]" = dc_field( default=None, metadata=dc_config(field_name="user") ) @@ -14026,70 +14571,6 @@ class PolicyRequest(DataClassJsonMixin): roles: List[str] = dc_field(metadata=dc_config(field_name="roles")) -@dataclass -class Poll(DataClassJsonMixin): - allow_answers: bool = dc_field(metadata=dc_config(field_name="allow_answers")) - allow_user_suggested_options: bool = dc_field( - metadata=dc_config(field_name="allow_user_suggested_options") - ) - answers_count: int = dc_field(metadata=dc_config(field_name="answers_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"), - ) - ) - created_by_id: str = dc_field(metadata=dc_config(field_name="created_by_id")) - description: str = dc_field(metadata=dc_config(field_name="description")) - enforce_unique_vote: bool = dc_field( - metadata=dc_config(field_name="enforce_unique_vote") - ) - id: str = dc_field(metadata=dc_config(field_name="id")) - name: str = dc_field(metadata=dc_config(field_name="name")) - updated_at: datetime = dc_field( - metadata=dc_config( - field_name="updated_at", - encoder=encode_datetime, - decoder=datetime_from_unix_ns, - mm_field=fields.DateTime(format="iso"), - ) - ) - vote_count: int = dc_field(metadata=dc_config(field_name="vote_count")) - latest_answers: "List[PollVote]" = dc_field( - metadata=dc_config(field_name="latest_answers") - ) - options: "List[PollOption]" = dc_field(metadata=dc_config(field_name="options")) - own_votes: "List[PollVote]" = dc_field(metadata=dc_config(field_name="own_votes")) - custom: Dict[str, object] = dc_field(metadata=dc_config(field_name="Custom")) - latest_votes_by_option: "Dict[str, List[PollVote]]" = dc_field( - metadata=dc_config(field_name="latest_votes_by_option") - ) - vote_counts_by_option: "Dict[str, int]" = dc_field( - metadata=dc_config(field_name="vote_counts_by_option") - ) - is_closed: Optional[bool] = dc_field( - default=None, metadata=dc_config(field_name="is_closed") - ) - max_votes_allowed: Optional[int] = dc_field( - default=None, metadata=dc_config(field_name="max_votes_allowed") - ) - voting_visibility: Optional[str] = dc_field( - default=None, metadata=dc_config(field_name="voting_visibility") - ) - created_by: "Optional[User]" = dc_field( - default=None, metadata=dc_config(field_name="created_by") - ) - - -@dataclass -class PollOption(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")) - - @dataclass class PollOptionInput(DataClassJsonMixin): text: Optional[str] = dc_field(default=None, metadata=dc_config(field_name="text")) @@ -14189,41 +14670,6 @@ class PollResponseData(DataClassJsonMixin): ) -@dataclass -class PollVote(DataClassJsonMixin): - created_at: datetime = dc_field( - metadata=dc_config( - field_name="created_at", - encoder=encode_datetime, - decoder=datetime_from_unix_ns, - mm_field=fields.DateTime(format="iso"), - ) - ) - id: str = dc_field(metadata=dc_config(field_name="id")) - option_id: str = dc_field(metadata=dc_config(field_name="option_id")) - poll_id: str = dc_field(metadata=dc_config(field_name="poll_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"), - ) - ) - answer_text: Optional[str] = dc_field( - default=None, metadata=dc_config(field_name="answer_text") - ) - is_answer: Optional[bool] = dc_field( - default=None, metadata=dc_config(field_name="is_answer") - ) - user_id: Optional[str] = dc_field( - default=None, metadata=dc_config(field_name="user_id") - ) - user: "Optional[User]" = dc_field( - default=None, metadata=dc_config(field_name="user") - ) - - @dataclass class PollVoteResponse(DataClassJsonMixin): duration: str = dc_field(metadata=dc_config(field_name="duration")) @@ -14280,19 +14726,6 @@ class PollVotesResponse(DataClassJsonMixin): prev: Optional[str] = dc_field(default=None, metadata=dc_config(field_name="prev")) -@dataclass -class PrivacySettings(DataClassJsonMixin): - delivery_receipts: "Optional[DeliveryReceipts]" = dc_field( - default=None, metadata=dc_config(field_name="delivery_receipts") - ) - read_receipts: "Optional[ReadReceipts]" = dc_field( - default=None, metadata=dc_config(field_name="read_receipts") - ) - typing_indicators: "Optional[TypingIndicators]" = dc_field( - default=None, metadata=dc_config(field_name="typing_indicators") - ) - - @dataclass class PrivacySettingsResponse(DataClassJsonMixin): delivery_receipts: "Optional[DeliveryReceiptsResponse]" = dc_field( @@ -14316,6 +14749,31 @@ class PublishedTrackFlags(DataClassJsonMixin): video: bool = dc_field(metadata=dc_config(field_name="video")) +@dataclass +class PublishedTrackMetrics(DataClassJsonMixin): + codec: Optional[str] = dc_field( + default=None, metadata=dc_config(field_name="codec") + ) + track_id: Optional[str] = dc_field( + default=None, metadata=dc_config(field_name="track_id") + ) + track_type: Optional[str] = dc_field( + default=None, metadata=dc_config(field_name="track_type") + ) + warnings: "Optional[List[SessionWarningResponse]]" = dc_field( + default=None, metadata=dc_config(field_name="warnings") + ) + bitrate: "Optional[MetricTimeSeries]" = dc_field( + default=None, metadata=dc_config(field_name="bitrate") + ) + framerate: "Optional[MetricTimeSeries]" = dc_field( + default=None, metadata=dc_config(field_name="framerate") + ) + resolution: "Optional[ResolutionMetricsTimeSeries]" = dc_field( + default=None, metadata=dc_config(field_name="resolution") + ) + + @dataclass class PublisherAllMetrics(DataClassJsonMixin): audio: "Optional[PublisherAudioMetrics]" = dc_field( @@ -14455,7 +14913,7 @@ class PushPreferenceInput(DataClassJsonMixin): @dataclass -class PushPreferences(DataClassJsonMixin): +class PushPreferencesResponse(DataClassJsonMixin): call_level: Optional[str] = dc_field( default=None, metadata=dc_config(field_name="call_level") ) @@ -14474,56 +14932,114 @@ class PushPreferences(DataClassJsonMixin): feeds_level: Optional[str] = dc_field( default=None, metadata=dc_config(field_name="feeds_level") ) - feeds_preferences: "Optional[FeedsPreferences]" = dc_field( + feeds_preferences: "Optional[FeedsPreferencesResponse]" = dc_field( default=None, metadata=dc_config(field_name="feeds_preferences") ) @dataclass -class PushPreferencesResponse(DataClassJsonMixin): - call_level: Optional[str] = dc_field( - default=None, metadata=dc_config(field_name="call_level") +class PushProvider(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"), + ) + ) + name: str = dc_field(metadata=dc_config(field_name="name")) + type: str = dc_field(metadata=dc_config(field_name="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"), + ) + ) + apn_auth_key: Optional[str] = dc_field( + default=None, metadata=dc_config(field_name="apn_auth_key") + ) + apn_auth_type: Optional[str] = dc_field( + default=None, metadata=dc_config(field_name="apn_auth_type") + ) + apn_development: Optional[bool] = dc_field( + default=None, metadata=dc_config(field_name="apn_development") + ) + apn_host: Optional[str] = dc_field( + default=None, metadata=dc_config(field_name="apn_host") + ) + apn_key_id: Optional[str] = dc_field( + default=None, metadata=dc_config(field_name="apn_key_id") + ) + apn_notification_template: Optional[str] = dc_field( + default=None, metadata=dc_config(field_name="apn_notification_template") + ) + apn_p12_cert: Optional[str] = dc_field( + default=None, metadata=dc_config(field_name="apn_p12_cert") + ) + apn_team_id: Optional[str] = dc_field( + default=None, metadata=dc_config(field_name="apn_team_id") + ) + apn_topic: Optional[str] = dc_field( + default=None, metadata=dc_config(field_name="apn_topic") ) - chat_level: Optional[str] = dc_field( - default=None, metadata=dc_config(field_name="chat_level") + description: Optional[str] = dc_field( + default=None, metadata=dc_config(field_name="description") ) - disabled_until: Optional[datetime] = dc_field( + disabled_at: Optional[datetime] = dc_field( default=None, metadata=dc_config( - field_name="disabled_until", + field_name="disabled_at", encoder=encode_datetime, decoder=datetime_from_unix_ns, mm_field=fields.DateTime(format="iso"), ), ) - feeds_level: Optional[str] = dc_field( - default=None, metadata=dc_config(field_name="feeds_level") + disabled_reason: Optional[str] = dc_field( + default=None, metadata=dc_config(field_name="disabled_reason") ) - feeds_preferences: "Optional[FeedsPreferencesResponse]" = dc_field( - default=None, metadata=dc_config(field_name="feeds_preferences") + firebase_apn_template: Optional[str] = dc_field( + default=None, metadata=dc_config(field_name="firebase_apn_template") + ) + firebase_credentials: Optional[str] = dc_field( + default=None, metadata=dc_config(field_name="firebase_credentials") + ) + firebase_data_template: Optional[str] = dc_field( + default=None, metadata=dc_config(field_name="firebase_data_template") + ) + firebase_host: Optional[str] = dc_field( + default=None, metadata=dc_config(field_name="firebase_host") + ) + firebase_notification_template: Optional[str] = dc_field( + default=None, metadata=dc_config(field_name="firebase_notification_template") + ) + firebase_server_key: Optional[str] = dc_field( + default=None, metadata=dc_config(field_name="firebase_server_key") + ) + huawei_app_id: Optional[str] = dc_field( + default=None, metadata=dc_config(field_name="huawei_app_id") + ) + huawei_app_secret: Optional[str] = dc_field( + default=None, metadata=dc_config(field_name="huawei_app_secret") + ) + huawei_host: Optional[str] = dc_field( + default=None, metadata=dc_config(field_name="huawei_host") + ) + xiaomi_app_secret: Optional[str] = dc_field( + default=None, metadata=dc_config(field_name="xiaomi_app_secret") + ) + xiaomi_package_name: Optional[str] = dc_field( + default=None, metadata=dc_config(field_name="xiaomi_package_name") + ) + push_templates: "Optional[List[PushTemplate]]" = dc_field( + default=None, metadata=dc_config(field_name="push_templates") ) @dataclass -class PushProvider(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 PushProviderRequest(DataClassJsonMixin): name: str = dc_field(metadata=dc_config(field_name="name")) - type: str = dc_field(metadata=dc_config(field_name="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"), - ) - ) apn_auth_key: Optional[str] = dc_field( default=None, metadata=dc_config(field_name="apn_auth_key") ) @@ -14590,18 +15106,13 @@ class PushProvider(DataClassJsonMixin): huawei_app_secret: Optional[str] = dc_field( default=None, metadata=dc_config(field_name="huawei_app_secret") ) - huawei_host: Optional[str] = dc_field( - default=None, metadata=dc_config(field_name="huawei_host") - ) + type: Optional[str] = dc_field(default=None, metadata=dc_config(field_name="type")) xiaomi_app_secret: Optional[str] = dc_field( default=None, metadata=dc_config(field_name="xiaomi_app_secret") ) xiaomi_package_name: Optional[str] = dc_field( default=None, metadata=dc_config(field_name="xiaomi_package_name") ) - push_templates: "Optional[List[PushTemplate]]" = dc_field( - default=None, metadata=dc_config(field_name="push_templates") - ) @dataclass @@ -14729,6 +15240,34 @@ class PushTemplate(DataClassJsonMixin): ) +@dataclass +class PushTemplateResponse(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"), + ) + ) + enable_push: bool = dc_field(metadata=dc_config(field_name="enable_push")) + event_type: str = dc_field(metadata=dc_config(field_name="event_type")) + push_provider_internal_id: str = dc_field( + metadata=dc_config(field_name="push_provider_internal_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"), + ) + ) + template: Optional[str] = dc_field( + default=None, metadata=dc_config(field_name="template") + ) + + @dataclass class QualityScoreReport(DataClassJsonMixin): histogram: "List[ReportByHistogramBucket]" = dc_field( @@ -14745,6 +15284,9 @@ class QualityScoreReportResponse(DataClassJsonMixin): @dataclass class QueryActivitiesRequest(DataClassJsonMixin): + include_expired_activities: Optional[bool] = dc_field( + default=None, metadata=dc_config(field_name="include_expired_activities") + ) include_private_activities: Optional[bool] = dc_field( default=None, metadata=dc_config(field_name="include_private_activities") ) @@ -14974,6 +15516,28 @@ class QueryCallMembersResponse(DataClassJsonMixin): prev: Optional[str] = dc_field(default=None, metadata=dc_config(field_name="prev")) +@dataclass +class QueryCallParticipantSessionsResponse(DataClassJsonMixin): + call_id: str = dc_field(metadata=dc_config(field_name="call_id")) + call_session_id: str = dc_field(metadata=dc_config(field_name="call_session_id")) + call_type: str = dc_field(metadata=dc_config(field_name="call_type")) + duration: int = dc_field(metadata=dc_config(field_name="duration")) + total_participant_duration: int = dc_field( + metadata=dc_config(field_name="total_participant_duration") + ) + total_participant_sessions: int = dc_field( + metadata=dc_config(field_name="total_participant_sessions") + ) + participants_sessions: "List[ParticipantSessionDetails]" = dc_field( + metadata=dc_config(field_name="participants_sessions") + ) + 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")) + session: "Optional[CallSessionResponse]" = dc_field( + default=None, metadata=dc_config(field_name="session") + ) + + @dataclass class QueryCallParticipantsRequest(DataClassJsonMixin): filter_conditions: Optional[Dict[str, object]] = dc_field( @@ -15207,6 +15771,9 @@ class QueryChannelsRequest(DataClassJsonMixin): offset: Optional[int] = dc_field( default=None, metadata=dc_config(field_name="offset") ) + predefined_filter: Optional[str] = dc_field( + default=None, metadata=dc_config(field_name="predefined_filter") + ) state: Optional[bool] = dc_field( default=None, metadata=dc_config(field_name="state") ) @@ -15219,6 +15786,12 @@ class QueryChannelsRequest(DataClassJsonMixin): filter_conditions: Optional[Dict[str, object]] = dc_field( default=None, metadata=dc_config(field_name="filter_conditions") ) + filter_values: Optional[Dict[str, object]] = dc_field( + default=None, metadata=dc_config(field_name="filter_values") + ) + sort_values: Optional[Dict[str, object]] = dc_field( + default=None, metadata=dc_config(field_name="sort_values") + ) user: "Optional[UserRequest]" = dc_field( default=None, metadata=dc_config(field_name="user") ) @@ -15230,6 +15803,9 @@ class QueryChannelsResponse(DataClassJsonMixin): channels: "List[ChannelStateResponseFields]" = dc_field( metadata=dc_config(field_name="channels") ) + predefined_filter: "Optional[ParsedPredefinedFilterResponse]" = dc_field( + default=None, metadata=dc_config(field_name="predefined_filter") + ) @dataclass @@ -15351,7 +15927,7 @@ class QueryFeedModerationTemplate(DataClassJsonMixin): mm_field=fields.DateTime(format="iso"), ) ) - config: "Optional[FeedsModerationTemplateConfig]" = dc_field( + config: "Optional[FeedsModerationTemplateConfigPayload]" = dc_field( default=None, metadata=dc_config(field_name="config") ) @@ -15436,6 +16012,36 @@ class QueryFollowsResponse(DataClassJsonMixin): prev: Optional[str] = dc_field(default=None, metadata=dc_config(field_name="prev")) +@dataclass +class QueryFutureChannelBansPayload(DataClassJsonMixin): + exclude_expired_bans: Optional[bool] = dc_field( + default=None, metadata=dc_config(field_name="exclude_expired_bans") + ) + limit: Optional[int] = dc_field( + default=None, metadata=dc_config(field_name="limit") + ) + offset: Optional[int] = dc_field( + default=None, metadata=dc_config(field_name="offset") + ) + target_user_id: Optional[str] = dc_field( + default=None, metadata=dc_config(field_name="target_user_id") + ) + user_id: Optional[str] = dc_field( + default=None, metadata=dc_config(field_name="user_id") + ) + user: "Optional[UserRequest]" = dc_field( + default=None, metadata=dc_config(field_name="user") + ) + + +@dataclass +class QueryFutureChannelBansResponse(DataClassJsonMixin): + duration: str = dc_field(metadata=dc_config(field_name="duration")) + bans: "List[FutureChannelBanResponse]" = dc_field( + metadata=dc_config(field_name="bans") + ) + + @dataclass class QueryMembersPayload(DataClassJsonMixin): type: str = dc_field(metadata=dc_config(field_name="type")) @@ -15580,7 +16186,7 @@ class QueryModerationFlagsRequest(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")) - sort: "Optional[List[SortParam]]" = dc_field( + sort: "Optional[List[SortParamRequest]]" = dc_field( default=None, metadata=dc_config(field_name="sort") ) filter: Optional[Dict[str, object]] = dc_field( @@ -15651,6 +16257,12 @@ class QueryModerationRulesRequest(DataClassJsonMixin): @dataclass class QueryModerationRulesResponse(DataClassJsonMixin): duration: str = dc_field(metadata=dc_config(field_name="duration")) + closed_caption_labels: List[str] = dc_field( + metadata=dc_config(field_name="closed_caption_labels") + ) + keyframe_labels: List[str] = dc_field( + metadata=dc_config(field_name="keyframe_labels") + ) rules: "List[ModerationRuleV2Response]" = dc_field( metadata=dc_config(field_name="rules") ) @@ -15800,7 +16412,7 @@ class QueryReviewQueueResponse(DataClassJsonMixin): items: "List[ReviewQueueItemResponse]" = dc_field( metadata=dc_config(field_name="items") ) - action_config: "Dict[str, List[ModerationActionConfig]]" = dc_field( + action_config: "Dict[str, List[ModerationActionConfigResponse]]" = dc_field( metadata=dc_config(field_name="action_config") ) stats: Dict[str, object] = dc_field(metadata=dc_config(field_name="stats")) @@ -16055,6 +16667,7 @@ class RawRecordingSettingsResponse(DataClassJsonMixin): @dataclass class Reaction(DataClassJsonMixin): + activity_id: str = dc_field(metadata=dc_config(field_name="activity_id")) created_at: datetime = dc_field( metadata=dc_config( field_name="created_at", @@ -16063,9 +16676,7 @@ class Reaction(DataClassJsonMixin): mm_field=fields.DateTime(format="iso"), ) ) - message_id: str = dc_field(metadata=dc_config(field_name="message_id")) - score: int = dc_field(metadata=dc_config(field_name="score")) - type: str = dc_field(metadata=dc_config(field_name="type")) + kind: str = dc_field(metadata=dc_config(field_name="kind")) updated_at: datetime = dc_field( metadata=dc_config( field_name="updated_at", @@ -16074,9 +16685,43 @@ class Reaction(DataClassJsonMixin): mm_field=fields.DateTime(format="iso"), ) ) - custom: Dict[str, object] = dc_field(metadata=dc_config(field_name="custom")) - user_id: Optional[str] = dc_field( - default=None, metadata=dc_config(field_name="user_id") + user_id: str = dc_field(metadata=dc_config(field_name="user_id")) + deleted_at: Optional[datetime] = dc_field( + default=None, + metadata=dc_config( + field_name="deleted_at", + encoder=encode_datetime, + decoder=datetime_from_unix_ns, + mm_field=fields.DateTime(format="iso"), + ), + ) + id: Optional[str] = dc_field(default=None, metadata=dc_config(field_name="id")) + parent: Optional[str] = dc_field( + default=None, metadata=dc_config(field_name="parent") + ) + score: Optional[float] = dc_field( + default=None, metadata=dc_config(field_name="score") + ) + target_feeds: Optional[List[str]] = dc_field( + default=None, metadata=dc_config(field_name="target_feeds") + ) + children_counts: Optional[Dict[str, object]] = dc_field( + default=None, metadata=dc_config(field_name="children_counts") + ) + data: Optional[Dict[str, object]] = dc_field( + default=None, metadata=dc_config(field_name="data") + ) + latest_children: "Optional[Dict[str, List[Reaction]]]" = dc_field( + default=None, metadata=dc_config(field_name="latest_children") + ) + moderation: Optional[Dict[str, object]] = dc_field( + default=None, metadata=dc_config(field_name="moderation") + ) + own_children: "Optional[Dict[str, List[Reaction]]]" = dc_field( + default=None, metadata=dc_config(field_name="own_children") + ) + target_feeds_extra_data: Optional[Dict[str, object]] = dc_field( + default=None, metadata=dc_config(field_name="target_feeds_extra_data") ) user: "Optional[User]" = dc_field( default=None, metadata=dc_config(field_name="user") @@ -16085,9 +16730,6 @@ class Reaction(DataClassJsonMixin): @dataclass class ReactionDeletedEvent(DataClassJsonMixin): - channel_id: str = dc_field(metadata=dc_config(field_name="channel_id")) - channel_type: str = dc_field(metadata=dc_config(field_name="channel_type")) - cid: str = dc_field(metadata=dc_config(field_name="cid")) created_at: datetime = dc_field( metadata=dc_config( field_name="created_at", @@ -16096,20 +16738,50 @@ class ReactionDeletedEvent(DataClassJsonMixin): mm_field=fields.DateTime(format="iso"), ) ) + channel: "ChannelResponse" = dc_field(metadata=dc_config(field_name="channel")) + custom: Dict[str, object] = dc_field(metadata=dc_config(field_name="custom")) type: str = dc_field( default="reaction.deleted", metadata=dc_config(field_name="type") ) + channel_id: Optional[str] = dc_field( + default=None, metadata=dc_config(field_name="channel_id") + ) + channel_member_count: Optional[int] = dc_field( + default=None, metadata=dc_config(field_name="channel_member_count") + ) + channel_message_count: Optional[int] = dc_field( + default=None, metadata=dc_config(field_name="channel_message_count") + ) + channel_type: Optional[str] = dc_field( + default=None, metadata=dc_config(field_name="channel_type") + ) + cid: Optional[str] = dc_field(default=None, metadata=dc_config(field_name="cid")) + message_id: Optional[str] = dc_field( + default=None, metadata=dc_config(field_name="message_id") + ) + 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"), + ), + ) team: Optional[str] = dc_field(default=None, metadata=dc_config(field_name="team")) - thread_participants: "Optional[List[User]]" = dc_field( + thread_participants: "Optional[List[UserResponseCommonFields]]" = dc_field( default=None, metadata=dc_config(field_name="thread_participants") ) - message: "Optional[Message]" = dc_field( + channel_custom: Optional[Dict[str, object]] = dc_field( + default=None, metadata=dc_config(field_name="channel_custom") + ) + message: "Optional[MessageResponse]" = dc_field( default=None, metadata=dc_config(field_name="message") ) - reaction: "Optional[Reaction]" = dc_field( + reaction: "Optional[ReactionResponse]" = dc_field( default=None, metadata=dc_config(field_name="reaction") ) - user: "Optional[User]" = dc_field( + user: "Optional[UserResponseCommonFields]" = dc_field( default=None, metadata=dc_config(field_name="user") ) @@ -16138,9 +16810,6 @@ class ReactionGroupResponse(DataClassJsonMixin): @dataclass class ReactionNewEvent(DataClassJsonMixin): - channel_id: str = dc_field(metadata=dc_config(field_name="channel_id")) - channel_type: str = dc_field(metadata=dc_config(field_name="channel_type")) - cid: str = dc_field(metadata=dc_config(field_name="cid")) created_at: datetime = dc_field( metadata=dc_config( field_name="created_at", @@ -16149,18 +16818,48 @@ class ReactionNewEvent(DataClassJsonMixin): mm_field=fields.DateTime(format="iso"), ) ) + channel: "ChannelResponse" = dc_field(metadata=dc_config(field_name="channel")) + custom: Dict[str, object] = dc_field(metadata=dc_config(field_name="custom")) type: str = dc_field(default="reaction.new", metadata=dc_config(field_name="type")) + channel_id: Optional[str] = dc_field( + default=None, metadata=dc_config(field_name="channel_id") + ) + channel_member_count: Optional[int] = dc_field( + default=None, metadata=dc_config(field_name="channel_member_count") + ) + channel_message_count: Optional[int] = dc_field( + default=None, metadata=dc_config(field_name="channel_message_count") + ) + channel_type: Optional[str] = dc_field( + default=None, metadata=dc_config(field_name="channel_type") + ) + cid: Optional[str] = dc_field(default=None, metadata=dc_config(field_name="cid")) + message_id: Optional[str] = dc_field( + default=None, metadata=dc_config(field_name="message_id") + ) + 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"), + ), + ) team: Optional[str] = dc_field(default=None, metadata=dc_config(field_name="team")) - thread_participants: "Optional[List[User]]" = dc_field( + thread_participants: "Optional[List[UserResponseCommonFields]]" = dc_field( default=None, metadata=dc_config(field_name="thread_participants") ) - message: "Optional[Message]" = dc_field( + channel_custom: Optional[Dict[str, object]] = dc_field( + default=None, metadata=dc_config(field_name="channel_custom") + ) + message: "Optional[MessageResponse]" = dc_field( default=None, metadata=dc_config(field_name="message") ) - reaction: "Optional[Reaction]" = dc_field( + reaction: "Optional[ReactionResponse]" = dc_field( default=None, metadata=dc_config(field_name="reaction") ) - user: "Optional[User]" = dc_field( + user: "Optional[UserResponseCommonFields]" = dc_field( default=None, metadata=dc_config(field_name="user") ) @@ -16228,9 +16927,6 @@ class ReactionResponse(DataClassJsonMixin): @dataclass class ReactionUpdatedEvent(DataClassJsonMixin): - channel_id: str = dc_field(metadata=dc_config(field_name="channel_id")) - channel_type: str = dc_field(metadata=dc_config(field_name="channel_type")) - cid: str = dc_field(metadata=dc_config(field_name="cid")) created_at: datetime = dc_field( metadata=dc_config( field_name="created_at", @@ -16239,13 +16935,43 @@ class ReactionUpdatedEvent(DataClassJsonMixin): mm_field=fields.DateTime(format="iso"), ) ) - message: "Message" = dc_field(metadata=dc_config(field_name="message")) - reaction: "Reaction" = dc_field(metadata=dc_config(field_name="reaction")) + message_id: str = dc_field(metadata=dc_config(field_name="message_id")) + channel: "ChannelResponse" = dc_field(metadata=dc_config(field_name="channel")) + custom: Dict[str, object] = dc_field(metadata=dc_config(field_name="custom")) + message: "MessageResponse" = dc_field(metadata=dc_config(field_name="message")) type: str = dc_field( default="reaction.updated", metadata=dc_config(field_name="type") ) + channel_id: Optional[str] = dc_field( + default=None, metadata=dc_config(field_name="channel_id") + ) + channel_member_count: Optional[int] = dc_field( + default=None, metadata=dc_config(field_name="channel_member_count") + ) + channel_message_count: Optional[int] = dc_field( + default=None, metadata=dc_config(field_name="channel_message_count") + ) + channel_type: Optional[str] = dc_field( + default=None, metadata=dc_config(field_name="channel_type") + ) + cid: Optional[str] = dc_field(default=None, metadata=dc_config(field_name="cid")) + 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"), + ), + ) team: Optional[str] = dc_field(default=None, metadata=dc_config(field_name="team")) - user: "Optional[User]" = dc_field( + channel_custom: Optional[Dict[str, object]] = dc_field( + default=None, metadata=dc_config(field_name="channel_custom") + ) + reaction: "Optional[ReactionResponse]" = dc_field( + default=None, metadata=dc_config(field_name="reaction") + ) + user: "Optional[UserResponseCommonFields]" = dc_field( default=None, metadata=dc_config(field_name="user") ) @@ -16297,13 +17023,6 @@ class ReadCollectionsResponse(DataClassJsonMixin): ) -@dataclass -class ReadReceipts(DataClassJsonMixin): - enabled: Optional[bool] = dc_field( - default=None, metadata=dc_config(field_name="enabled") - ) - - @dataclass class ReadReceiptsResponse(DataClassJsonMixin): enabled: Optional[bool] = dc_field( @@ -16377,7 +17096,7 @@ class RecordSettingsResponse(DataClassJsonMixin): @dataclass -class RejectAppealRequest(DataClassJsonMixin): +class RejectAppealRequestPayload(DataClassJsonMixin): decision_reason: str = dc_field(metadata=dc_config(field_name="decision_reason")) @@ -16620,13 +17339,28 @@ class ReportResponse(DataClassJsonMixin): ) +@dataclass +class ResolutionMetricsTimeSeries(DataClassJsonMixin): + height: "Optional[MetricTimeSeries]" = dc_field( + default=None, metadata=dc_config(field_name="height") + ) + width: "Optional[MetricTimeSeries]" = dc_field( + default=None, metadata=dc_config(field_name="width") + ) + + @dataclass class ResolveSipInboundRequest(DataClassJsonMixin): sip_caller_number: str = dc_field( metadata=dc_config(field_name="sip_caller_number") ) sip_trunk_number: str = dc_field(metadata=dc_config(field_name="sip_trunk_number")) - challenge: "SIPChallenge" = dc_field(metadata=dc_config(field_name="challenge")) + challenge: "SIPChallengeRequest" = dc_field( + metadata=dc_config(field_name="challenge") + ) + routing_number: Optional[str] = dc_field( + default=None, metadata=dc_config(field_name="routing_number") + ) sip_headers: "Optional[Dict[str, str]]" = dc_field( default=None, metadata=dc_config(field_name="sip_headers") ) @@ -16652,12 +17386,28 @@ class Response(DataClassJsonMixin): @dataclass -class RestoreActionRequest(DataClassJsonMixin): +class RestoreActionRequestPayload(DataClassJsonMixin): decision_reason: Optional[str] = dc_field( default=None, metadata=dc_config(field_name="decision_reason") ) +@dataclass +class RestoreActivityRequest(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 RestoreActivityResponse(DataClassJsonMixin): + duration: str = dc_field(metadata=dc_config(field_name="duration")) + activity: "ActivityResponse" = dc_field(metadata=dc_config(field_name="activity")) + + @dataclass class RestoreUsersRequest(DataClassJsonMixin): user_ids: List[str] = dc_field(metadata=dc_config(field_name="user_ids")) @@ -16732,7 +17482,7 @@ class ReviewQueueItemResponse(DataClassJsonMixin): actions: "List[ActionLogResponse]" = dc_field( metadata=dc_config(field_name="actions") ) - bans: "List[Ban]" = dc_field(metadata=dc_config(field_name="bans")) + bans: "List[BanInfoResponse]" = dc_field(metadata=dc_config(field_name="bans")) flags: "List[ModerationFlagResponse]" = dc_field( metadata=dc_config(field_name="flags") ) @@ -16794,7 +17544,7 @@ class ReviewQueueItemResponse(DataClassJsonMixin): message: "Optional[MessageResponse]" = dc_field( default=None, metadata=dc_config(field_name="message") ) - moderation_payload: "Optional[ModerationPayload]" = dc_field( + moderation_payload: "Optional[ModerationPayloadResponse]" = dc_field( default=None, metadata=dc_config(field_name="moderation_payload") ) reaction: "Optional[Reaction]" = dc_field( @@ -16916,10 +17666,13 @@ class Role(DataClassJsonMixin): @dataclass class RuleBuilderAction(DataClassJsonMixin): - type: str = dc_field(metadata=dc_config(field_name="type")) + type: Optional[str] = dc_field(default=None, metadata=dc_config(field_name="type")) ban_options: "Optional[BanOptions]" = dc_field( default=None, metadata=dc_config(field_name="ban_options") ) + call_options: "Optional[CallActionOptions]" = dc_field( + default=None, metadata=dc_config(field_name="call_options") + ) flag_user_options: "Optional[FlagUserOptions]" = dc_field( default=None, metadata=dc_config(field_name="flag_user_options") ) @@ -16931,6 +17684,15 @@ class RuleBuilderCondition(DataClassJsonMixin): default=None, metadata=dc_config(field_name="confidence") ) type: Optional[str] = dc_field(default=None, metadata=dc_config(field_name="type")) + call_custom_property_params: "Optional[CallCustomPropertyParameters]" = dc_field( + default=None, metadata=dc_config(field_name="call_custom_property_params") + ) + call_type_rule_params: "Optional[CallTypeRuleParameters]" = dc_field( + default=None, metadata=dc_config(field_name="call_type_rule_params") + ) + closed_caption_rule_params: "Optional[ClosedCaptionRuleParameters]" = dc_field( + default=None, metadata=dc_config(field_name="closed_caption_rule_params") + ) content_count_rule_params: "Optional[ContentCountRuleParameters]" = dc_field( default=None, metadata=dc_config(field_name="content_count_rule_params") ) @@ -16943,6 +17705,9 @@ class RuleBuilderCondition(DataClassJsonMixin): image_rule_params: "Optional[ImageRuleParameters]" = dc_field( default=None, metadata=dc_config(field_name="image_rule_params") ) + keyframe_rule_params: "Optional[KeyframeRuleParameters]" = dc_field( + default=None, metadata=dc_config(field_name="keyframe_rule_params") + ) text_content_params: "Optional[TextContentParameters]" = dc_field( default=None, metadata=dc_config(field_name="text_content_params") ) @@ -16999,7 +17764,6 @@ class RuleBuilderConfig(DataClassJsonMixin): @dataclass class RuleBuilderRule(DataClassJsonMixin): rule_type: str = dc_field(metadata=dc_config(field_name="rule_type")) - action: "RuleBuilderAction" = dc_field(metadata=dc_config(field_name="action")) cooldown_period: Optional[str] = dc_field( default=None, metadata=dc_config(field_name="cooldown_period") ) @@ -17007,12 +17771,18 @@ class RuleBuilderRule(DataClassJsonMixin): logic: Optional[str] = dc_field( default=None, metadata=dc_config(field_name="logic") ) + action_sequences: "Optional[List[CallRuleActionSequence]]" = dc_field( + default=None, metadata=dc_config(field_name="action_sequences") + ) conditions: "Optional[List[RuleBuilderCondition]]" = dc_field( default=None, metadata=dc_config(field_name="conditions") ) groups: "Optional[List[RuleBuilderConditionGroup]]" = dc_field( default=None, metadata=dc_config(field_name="groups") ) + action: "Optional[RuleBuilderAction]" = dc_field( + default=None, metadata=dc_config(field_name="action") + ) @dataclass @@ -17047,8 +17817,10 @@ class SDKUsageReportResponse(DataClassJsonMixin): class SFULocationResponse(DataClassJsonMixin): datacenter: str = dc_field(metadata=dc_config(field_name="datacenter")) id: str = dc_field(metadata=dc_config(field_name="id")) - coordinates: "Coordinates" = dc_field(metadata=dc_config(field_name="coordinates")) - location: "Location" = dc_field(metadata=dc_config(field_name="location")) + coordinates: "CoordinatesResponse" = dc_field( + metadata=dc_config(field_name="coordinates") + ) + location: "LocationResponse" = dc_field(metadata=dc_config(field_name="location")) count: Optional[int] = dc_field( default=None, metadata=dc_config(field_name="count") ) @@ -17085,7 +17857,7 @@ class SIPCallerConfigsResponse(DataClassJsonMixin): @dataclass -class SIPChallenge(DataClassJsonMixin): +class SIPChallengeRequest(DataClassJsonMixin): a1: Optional[str] = dc_field(default=None, metadata=dc_config(field_name="a1")) algorithm: Optional[str] = dc_field( default=None, metadata=dc_config(field_name="algorithm") @@ -17416,6 +18188,9 @@ class SearchResultMessage(DataClassJsonMixin): ) html: str = dc_field(metadata=dc_config(field_name="html")) id: str = dc_field(metadata=dc_config(field_name="id")) + mentioned_channel: bool = dc_field( + metadata=dc_config(field_name="mentioned_channel") + ) pinned: bool = dc_field(metadata=dc_config(field_name="pinned")) reply_count: int = dc_field(metadata=dc_config(field_name="reply_count")) shadowed: bool = dc_field(metadata=dc_config(field_name="shadowed")) @@ -17784,6 +18559,21 @@ class SendUserCustomEventRequest(DataClassJsonMixin): event: "UserCustomEventRequest" = dc_field(metadata=dc_config(field_name="event")) +@dataclass +class SessionClient(DataClassJsonMixin): + ip: Optional[str] = dc_field(default=None, metadata=dc_config(field_name="ip")) + name: Optional[str] = dc_field(default=None, metadata=dc_config(field_name="name")) + network_type: Optional[str] = dc_field( + default=None, metadata=dc_config(field_name="network_type") + ) + version: Optional[str] = dc_field( + default=None, metadata=dc_config(field_name="version") + ) + location: "Optional[CallStatsLocation]" = dc_field( + default=None, metadata=dc_config(field_name="location") + ) + + @dataclass class SessionSettings(DataClassJsonMixin): inactivity_timeout_seconds: int = dc_field( @@ -17806,7 +18596,22 @@ class SessionSettingsResponse(DataClassJsonMixin): @dataclass -class ShadowBlockActionRequest(DataClassJsonMixin): +class SessionWarningResponse(DataClassJsonMixin): + code: str = dc_field(metadata=dc_config(field_name="code")) + warning: str = dc_field(metadata=dc_config(field_name="warning")) + time: Optional[datetime] = dc_field( + default=None, + metadata=dc_config( + field_name="time", + encoder=encode_datetime, + decoder=datetime_from_unix_ns, + mm_field=fields.DateTime(format="iso"), + ), + ) + + +@dataclass +class ShadowBlockActionRequestPayload(DataClassJsonMixin): reason: Optional[str] = dc_field( default=None, metadata=dc_config(field_name="reason") ) @@ -17944,10 +18749,14 @@ class ShowChannelResponse(DataClassJsonMixin): class SingleFollowResponse(DataClassJsonMixin): duration: str = dc_field(metadata=dc_config(field_name="duration")) follow: "FollowResponse" = dc_field(metadata=dc_config(field_name="follow")) + notification_created: Optional[bool] = dc_field( + default=None, metadata=dc_config(field_name="notification_created") + ) @dataclass class SipInboundCredentials(DataClassJsonMixin): + api_key: str = dc_field(metadata=dc_config(field_name="api_key")) call_id: str = dc_field(metadata=dc_config(field_name="call_id")) call_type: str = dc_field(metadata=dc_config(field_name="call_type")) token: str = dc_field(metadata=dc_config(field_name="token")) @@ -17960,17 +18769,6 @@ class SipInboundCredentials(DataClassJsonMixin): ) -@dataclass -class SortParam(DataClassJsonMixin): - direction: Optional[int] = dc_field( - default=None, metadata=dc_config(field_name="direction") - ) - field: Optional[str] = dc_field( - default=None, metadata=dc_config(field_name="field") - ) - type: Optional[str] = dc_field(default=None, metadata=dc_config(field_name="type")) - - @dataclass class SortParamRequest(DataClassJsonMixin): direction: Optional[int] = dc_field( @@ -18284,46 +19082,49 @@ class SubmitActionRequest(DataClassJsonMixin): user_id: Optional[str] = dc_field( default=None, metadata=dc_config(field_name="user_id") ) - ban: "Optional[BanActionRequest]" = dc_field( + ban: "Optional[BanActionRequestPayload]" = dc_field( default=None, metadata=dc_config(field_name="ban") ) - block: "Optional[BlockActionRequest]" = dc_field( + block: "Optional[BlockActionRequestPayload]" = dc_field( default=None, metadata=dc_config(field_name="block") ) - custom: "Optional[CustomActionRequest]" = dc_field( + custom: "Optional[CustomActionRequestPayload]" = dc_field( default=None, metadata=dc_config(field_name="custom") ) - delete_activity: "Optional[DeleteActivityRequest]" = dc_field( + delete_activity: "Optional[DeleteActivityRequestPayload]" = dc_field( default=None, metadata=dc_config(field_name="delete_activity") ) - delete_comment: "Optional[DeleteCommentRequest]" = dc_field( + delete_comment: "Optional[DeleteCommentRequestPayload]" = dc_field( default=None, metadata=dc_config(field_name="delete_comment") ) - delete_message: "Optional[DeleteMessageRequest]" = dc_field( + delete_message: "Optional[DeleteMessageRequestPayload]" = dc_field( default=None, metadata=dc_config(field_name="delete_message") ) - delete_reaction: "Optional[DeleteReactionRequest]" = dc_field( + delete_reaction: "Optional[DeleteReactionRequestPayload]" = dc_field( default=None, metadata=dc_config(field_name="delete_reaction") ) - delete_user: "Optional[DeleteUserRequest]" = dc_field( + delete_user: "Optional[DeleteUserRequestPayload]" = dc_field( default=None, metadata=dc_config(field_name="delete_user") ) - mark_reviewed: "Optional[MarkReviewedRequest]" = dc_field( + flag: "Optional[FlagRequest]" = dc_field( + default=None, metadata=dc_config(field_name="flag") + ) + mark_reviewed: "Optional[MarkReviewedRequestPayload]" = dc_field( default=None, metadata=dc_config(field_name="mark_reviewed") ) - reject_appeal: "Optional[RejectAppealRequest]" = dc_field( + reject_appeal: "Optional[RejectAppealRequestPayload]" = dc_field( default=None, metadata=dc_config(field_name="reject_appeal") ) - restore: "Optional[RestoreActionRequest]" = dc_field( + restore: "Optional[RestoreActionRequestPayload]" = dc_field( default=None, metadata=dc_config(field_name="restore") ) - shadow_block: "Optional[ShadowBlockActionRequest]" = dc_field( + shadow_block: "Optional[ShadowBlockActionRequestPayload]" = dc_field( default=None, metadata=dc_config(field_name="shadow_block") ) - unban: "Optional[UnbanActionRequest]" = dc_field( + unban: "Optional[UnbanActionRequestPayload]" = dc_field( default=None, metadata=dc_config(field_name="unban") ) - unblock: "Optional[UnblockActionRequest]" = dc_field( + unblock: "Optional[UnblockActionRequestPayload]" = dc_field( default=None, metadata=dc_config(field_name="unblock") ) user: "Optional[UserRequest]" = dc_field( @@ -18651,9 +19452,6 @@ class ThreadStateResponse(DataClassJsonMixin): @dataclass class ThreadUpdatedEvent(DataClassJsonMixin): - channel_id: str = dc_field(metadata=dc_config(field_name="channel_id")) - channel_type: str = dc_field(metadata=dc_config(field_name="channel_type")) - cid: str = dc_field(metadata=dc_config(field_name="cid")) created_at: datetime = dc_field( metadata=dc_config( field_name="created_at", @@ -18662,15 +19460,29 @@ class ThreadUpdatedEvent(DataClassJsonMixin): mm_field=fields.DateTime(format="iso"), ) ) + custom: Dict[str, object] = dc_field(metadata=dc_config(field_name="custom")) type: str = dc_field( default="thread.updated", metadata=dc_config(field_name="type") ) + channel_id: Optional[str] = dc_field( + default=None, metadata=dc_config(field_name="channel_id") + ) + channel_type: Optional[str] = dc_field( + default=None, metadata=dc_config(field_name="channel_type") + ) + cid: Optional[str] = dc_field(default=None, metadata=dc_config(field_name="cid")) + 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"), + ), + ) thread: "Optional[ThreadResponse]" = dc_field( default=None, metadata=dc_config(field_name="thread") ) - user: "Optional[User]" = dc_field( - default=None, metadata=dc_config(field_name="user") - ) @dataclass @@ -18722,6 +19534,15 @@ class ThreadedCommentResponse(DataClassJsonMixin): mm_field=fields.DateTime(format="iso"), ), ) + edited_at: Optional[datetime] = dc_field( + default=None, + metadata=dc_config( + field_name="edited_at", + encoder=encode_datetime, + decoder=datetime_from_unix_ns, + mm_field=fields.DateTime(format="iso"), + ), + ) parent_id: Optional[str] = dc_field( default=None, metadata=dc_config(field_name="parent_id") ) @@ -18744,7 +19565,7 @@ class ThreadedCommentResponse(DataClassJsonMixin): moderation: "Optional[ModerationV2Response]" = dc_field( default=None, metadata=dc_config(field_name="moderation") ) - reaction_groups: "Optional[Dict[str, Optional[ReactionGroupResponse]]]" = dc_field( + reaction_groups: "Optional[Dict[str, FeedsReactionGroupResponse]]" = dc_field( default=None, metadata=dc_config(field_name="reaction_groups") ) @@ -18895,13 +19716,6 @@ class TruncateChannelResponse(DataClassJsonMixin): ) -@dataclass -class TypingIndicators(DataClassJsonMixin): - enabled: Optional[bool] = dc_field( - default=None, metadata=dc_config(field_name="enabled") - ) - - @dataclass class TypingIndicatorsResponse(DataClassJsonMixin): enabled: Optional[bool] = dc_field( @@ -18910,7 +19724,10 @@ class TypingIndicatorsResponse(DataClassJsonMixin): @dataclass -class UnbanActionRequest(DataClassJsonMixin): +class UnbanActionRequestPayload(DataClassJsonMixin): + channel_cid: Optional[str] = dc_field( + default=None, metadata=dc_config(field_name="channel_cid") + ) decision_reason: Optional[str] = dc_field( default=None, metadata=dc_config(field_name="decision_reason") ) @@ -18932,7 +19749,7 @@ class UnbanResponse(DataClassJsonMixin): @dataclass -class UnblockActionRequest(DataClassJsonMixin): +class UnblockActionRequestPayload(DataClassJsonMixin): decision_reason: Optional[str] = dc_field( default=None, metadata=dc_config(field_name="decision_reason") ) @@ -18984,6 +19801,9 @@ class UnblockedUserEvent(DataClassJsonMixin): @dataclass class UnfollowBatchRequest(DataClassJsonMixin): follows: "List[FollowPair]" = dc_field(metadata=dc_config(field_name="follows")) + delete_notification_activity: Optional[bool] = dc_field( + default=None, metadata=dc_config(field_name="delete_notification_activity") + ) @dataclass @@ -19127,8 +19947,49 @@ class UnreadCountsThread(DataClassJsonMixin): unread_count: int = dc_field(metadata=dc_config(field_name="unread_count")) +@dataclass +class UpdateActivitiesPartialBatchRequest(DataClassJsonMixin): + changes: "List[UpdateActivityPartialChangeRequest]" = dc_field( + metadata=dc_config(field_name="changes") + ) + + +@dataclass +class UpdateActivitiesPartialBatchResponse(DataClassJsonMixin): + duration: str = dc_field(metadata=dc_config(field_name="duration")) + activities: "List[ActivityResponse]" = dc_field( + metadata=dc_config(field_name="activities") + ) + + +@dataclass +class UpdateActivityPartialChangeRequest(DataClassJsonMixin): + activity_id: str = dc_field(metadata=dc_config(field_name="activity_id")) + copy_custom_to_notification: Optional[bool] = dc_field( + default=None, metadata=dc_config(field_name="copy_custom_to_notification") + ) + handle_mention_notifications: Optional[bool] = dc_field( + default=None, metadata=dc_config(field_name="handle_mention_notifications") + ) + unset: Optional[List[str]] = dc_field( + default=None, metadata=dc_config(field_name="unset") + ) + set: Optional[Dict[str, object]] = dc_field( + default=None, metadata=dc_config(field_name="set") + ) + + @dataclass class UpdateActivityPartialRequest(DataClassJsonMixin): + copy_custom_to_notification: Optional[bool] = dc_field( + default=None, metadata=dc_config(field_name="copy_custom_to_notification") + ) + handle_mention_notifications: Optional[bool] = dc_field( + default=None, metadata=dc_config(field_name="handle_mention_notifications") + ) + run_activity_processors: Optional[bool] = dc_field( + default=None, metadata=dc_config(field_name="run_activity_processors") + ) user_id: Optional[str] = dc_field( default=None, metadata=dc_config(field_name="user_id") ) @@ -19151,6 +20012,9 @@ class UpdateActivityPartialResponse(DataClassJsonMixin): @dataclass class UpdateActivityRequest(DataClassJsonMixin): + copy_custom_to_notification: Optional[bool] = dc_field( + default=None, metadata=dc_config(field_name="copy_custom_to_notification") + ) expires_at: Optional[datetime] = dc_field( default=None, metadata=dc_config( @@ -19160,12 +20024,18 @@ class UpdateActivityRequest(DataClassJsonMixin): mm_field=fields.DateTime(format="iso"), ), ) + handle_mention_notifications: Optional[bool] = dc_field( + default=None, metadata=dc_config(field_name="handle_mention_notifications") + ) poll_id: Optional[str] = dc_field( default=None, metadata=dc_config(field_name="poll_id") ) restrict_replies: Optional[str] = dc_field( default=None, metadata=dc_config(field_name="restrict_replies") ) + run_activity_processors: Optional[bool] = dc_field( + default=None, metadata=dc_config(field_name="run_activity_processors") + ) skip_enrich_url: Optional[bool] = dc_field( default=None, metadata=dc_config(field_name="skip_enrich_url") ) @@ -19176,6 +20046,9 @@ class UpdateActivityRequest(DataClassJsonMixin): visibility: Optional[str] = dc_field( default=None, metadata=dc_config(field_name="visibility") ) + visibility_tag: Optional[str] = dc_field( + default=None, metadata=dc_config(field_name="visibility_tag") + ) attachments: "Optional[List[Attachment]]" = dc_field( default=None, metadata=dc_config(field_name="attachments") ) @@ -19200,6 +20073,9 @@ class UpdateActivityRequest(DataClassJsonMixin): location: "Optional[ActivityLocation]" = dc_field( default=None, metadata=dc_config(field_name="location") ) + search_data: Optional[Dict[str, object]] = dc_field( + default=None, metadata=dc_config(field_name="search_data") + ) user: "Optional[UserRequest]" = dc_field( default=None, metadata=dc_config(field_name="user") ) @@ -19490,7 +20366,7 @@ class UpdateCallTypeRequest(DataClassJsonMixin): grants: "Optional[Dict[str, List[str]]]" = dc_field( default=None, metadata=dc_config(field_name="grants") ) - notification_settings: "Optional[NotificationSettings]" = dc_field( + notification_settings: "Optional[NotificationSettingsRequest]" = dc_field( default=None, metadata=dc_config(field_name="notification_settings") ) settings: "Optional[CallSettingsRequest]" = dc_field( @@ -19519,7 +20395,7 @@ class UpdateCallTypeResponse(DataClassJsonMixin): ) ) grants: "Dict[str, List[str]]" = dc_field(metadata=dc_config(field_name="grants")) - notification_settings: "NotificationSettings" = dc_field( + notification_settings: "NotificationSettingsResponse" = dc_field( metadata=dc_config(field_name="notification_settings") ) settings: "CallSettingsResponse" = dc_field( @@ -19675,6 +20551,9 @@ class UpdateChannelTypeRequest(DataClassJsonMixin): polls: Optional[bool] = dc_field( default=None, metadata=dc_config(field_name="polls") ) + push_level: Optional[str] = dc_field( + default=None, metadata=dc_config(field_name="push_level") + ) push_notifications: Optional[bool] = dc_field( default=None, metadata=dc_config(field_name="push_notifications") ) @@ -19805,6 +20684,9 @@ class UpdateChannelTypeResponse(DataClassJsonMixin): partition_ttl: Optional[str] = dc_field( default=None, metadata=dc_config(field_name="partition_ttl") ) + push_level: Optional[str] = dc_field( + default=None, metadata=dc_config(field_name="push_level") + ) allowed_flag_reasons: Optional[List[str]] = dc_field( default=None, metadata=dc_config(field_name="allowed_flag_reasons") ) @@ -19864,6 +20746,12 @@ class UpdateCommentRequest(DataClassJsonMixin): comment: Optional[str] = dc_field( default=None, metadata=dc_config(field_name="comment") ) + copy_custom_to_notification: Optional[bool] = dc_field( + default=None, metadata=dc_config(field_name="copy_custom_to_notification") + ) + handle_mention_notifications: Optional[bool] = dc_field( + default=None, metadata=dc_config(field_name="handle_mention_notifications") + ) skip_enrich_url: Optional[bool] = dc_field( default=None, metadata=dc_config(field_name="skip_enrich_url") ) @@ -19876,6 +20764,9 @@ class UpdateCommentRequest(DataClassJsonMixin): attachments: "Optional[List[Attachment]]" = dc_field( default=None, metadata=dc_config(field_name="attachments") ) + mentioned_user_ids: Optional[List[str]] = dc_field( + default=None, metadata=dc_config(field_name="mentioned_user_ids") + ) custom: Optional[Dict[str, object]] = dc_field( default=None, metadata=dc_config(field_name="custom") ) @@ -20038,6 +20929,9 @@ class UpdateFeedVisibilityResponse(DataClassJsonMixin): class UpdateFollowRequest(DataClassJsonMixin): source: str = dc_field(metadata=dc_config(field_name="source")) target: str = dc_field(metadata=dc_config(field_name="target")) + copy_custom_to_notification: Optional[bool] = dc_field( + default=None, metadata=dc_config(field_name="copy_custom_to_notification") + ) create_notification_activity: Optional[bool] = dc_field( default=None, metadata=dc_config(field_name="create_notification_activity") ) @@ -20050,6 +20944,9 @@ class UpdateFollowRequest(DataClassJsonMixin): skip_push: Optional[bool] = dc_field( default=None, metadata=dc_config(field_name="skip_push") ) + status: Optional[str] = dc_field( + default=None, metadata=dc_config(field_name="status") + ) custom: Optional[Dict[str, object]] = dc_field( default=None, metadata=dc_config(field_name="custom") ) @@ -20129,6 +21026,9 @@ class UpdateMessagePartialRequest(DataClassJsonMixin): skip_enrich_url: Optional[bool] = dc_field( default=None, metadata=dc_config(field_name="skip_enrich_url") ) + skip_push: Optional[bool] = dc_field( + default=None, metadata=dc_config(field_name="skip_push") + ) user_id: Optional[str] = dc_field( default=None, metadata=dc_config(field_name="user_id") ) @@ -20471,6 +21371,9 @@ class UpsertActivitiesResponse(DataClassJsonMixin): activities: "List[ActivityResponse]" = dc_field( metadata=dc_config(field_name="activities") ) + mention_notifications_created: Optional[int] = dc_field( + default=None, metadata=dc_config(field_name="mention_notifications_created") + ) @dataclass @@ -20561,7 +21464,6 @@ class UpsertConfigResponse(DataClassJsonMixin): class UpsertModerationRuleRequest(DataClassJsonMixin): name: str = dc_field(metadata=dc_config(field_name="name")) rule_type: str = dc_field(metadata=dc_config(field_name="rule_type")) - action: "RuleBuilderAction" = dc_field(metadata=dc_config(field_name="action")) cooldown_period: Optional[str] = dc_field( default=None, metadata=dc_config(field_name="cooldown_period") ) @@ -20575,6 +21477,9 @@ class UpsertModerationRuleRequest(DataClassJsonMixin): default=None, metadata=dc_config(field_name="logic") ) team: Optional[str] = dc_field(default=None, metadata=dc_config(field_name="team")) + action_sequences: "Optional[List[CallRuleActionSequence]]" = dc_field( + default=None, metadata=dc_config(field_name="action_sequences") + ) conditions: "Optional[List[RuleBuilderCondition]]" = dc_field( default=None, metadata=dc_config(field_name="conditions") ) @@ -20584,6 +21489,9 @@ class UpsertModerationRuleRequest(DataClassJsonMixin): groups: "Optional[List[RuleBuilderConditionGroup]]" = dc_field( default=None, metadata=dc_config(field_name="groups") ) + action: "Optional[RuleBuilderAction]" = dc_field( + default=None, metadata=dc_config(field_name="action") + ) @dataclass @@ -20597,7 +21505,7 @@ class UpsertModerationRuleResponse(DataClassJsonMixin): @dataclass class UpsertModerationTemplateRequest(DataClassJsonMixin): name: str = dc_field(metadata=dc_config(field_name="name")) - config: "FeedsModerationTemplateConfig" = dc_field( + config: "FeedsModerationTemplateConfigPayload" = dc_field( metadata=dc_config(field_name="config") ) @@ -20622,7 +21530,7 @@ class UpsertModerationTemplateResponse(DataClassJsonMixin): mm_field=fields.DateTime(format="iso"), ) ) - config: "Optional[FeedsModerationTemplateConfig]" = dc_field( + config: "Optional[FeedsModerationTemplateConfigPayload]" = dc_field( default=None, metadata=dc_config(field_name="config") ) @@ -20637,17 +21545,17 @@ class UpsertPushPreferencesRequest(DataClassJsonMixin): @dataclass class UpsertPushPreferencesResponse(DataClassJsonMixin): duration: str = dc_field(metadata=dc_config(field_name="duration")) - user_channel_preferences: "Dict[str, Dict[str, Optional[ChannelPushPreferences]]]" = dc_field( + user_channel_preferences: "Dict[str, Dict[str, Optional[ChannelPushPreferencesResponse]]]" = dc_field( metadata=dc_config(field_name="user_channel_preferences") ) - user_preferences: "Dict[str, Optional[PushPreferences]]" = dc_field( + user_preferences: "Dict[str, Optional[PushPreferencesResponse]]" = dc_field( metadata=dc_config(field_name="user_preferences") ) @dataclass class UpsertPushProviderRequest(DataClassJsonMixin): - push_provider: "Optional[PushProvider]" = dc_field( + push_provider: "Optional[PushProviderRequest]" = dc_field( default=None, metadata=dc_config(field_name="push_provider") ) @@ -20663,78 +21571,38 @@ class UpsertPushProviderResponse(DataClassJsonMixin): @dataclass class UpsertPushTemplateRequest(DataClassJsonMixin): event_type: str = dc_field(metadata=dc_config(field_name="event_type")) - push_provider_type: str = dc_field( - metadata=dc_config(field_name="push_provider_type") - ) - enable_push: Optional[bool] = dc_field( - default=None, metadata=dc_config(field_name="enable_push") - ) - push_provider_name: Optional[str] = dc_field( - default=None, metadata=dc_config(field_name="push_provider_name") - ) - template: Optional[str] = dc_field( - default=None, metadata=dc_config(field_name="template") - ) - - -@dataclass -class UpsertPushTemplateResponse(DataClassJsonMixin): - duration: str = dc_field(metadata=dc_config(field_name="duration")) - template: "Optional[PushTemplate]" = dc_field( - default=None, metadata=dc_config(field_name="template") - ) - - -@dataclass -class User(DataClassJsonMixin): - id: str = dc_field(metadata=dc_config(field_name="id")) - 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"), - ), - ) - banned: Optional[bool] = dc_field( - default=None, metadata=dc_config(field_name="banned") - ) - invisible: Optional[bool] = dc_field( - default=None, metadata=dc_config(field_name="invisible") - ) - language: Optional[str] = dc_field( - default=None, metadata=dc_config(field_name="language") + push_provider_type: str = dc_field( + metadata=dc_config(field_name="push_provider_type") ) - revoke_tokens_issued_before: Optional[datetime] = dc_field( - default=None, - metadata=dc_config( - field_name="revoke_tokens_issued_before", - encoder=encode_datetime, - decoder=datetime_from_unix_ns, - mm_field=fields.DateTime(format="iso"), - ), + enable_push: Optional[bool] = dc_field( + default=None, metadata=dc_config(field_name="enable_push") ) - role: Optional[str] = dc_field(default=None, metadata=dc_config(field_name="role")) - teams: Optional[List[str]] = dc_field( - default=None, metadata=dc_config(field_name="teams") + push_provider_name: Optional[str] = dc_field( + default=None, metadata=dc_config(field_name="push_provider_name") ) - custom: Optional[Dict[str, object]] = dc_field( - default=None, metadata=dc_config(field_name="custom") + template: Optional[str] = dc_field( + default=None, metadata=dc_config(field_name="template") ) - privacy_settings: "Optional[PrivacySettings]" = dc_field( - default=None, metadata=dc_config(field_name="privacy_settings") + + +@dataclass +class UpsertPushTemplateResponse(DataClassJsonMixin): + duration: str = dc_field(metadata=dc_config(field_name="duration")) + template: "Optional[PushTemplateResponse]" = dc_field( + default=None, metadata=dc_config(field_name="template") ) - teams_role: "Optional[Dict[str, str]]" = dc_field( - default=None, metadata=dc_config(field_name="teams_role") + + +@dataclass +class User(DataClassJsonMixin): + id: str = dc_field(metadata=dc_config(field_name="id")) + data: Optional[Dict[str, object]] = dc_field( + default=None, metadata=dc_config(field_name="data") ) @dataclass class UserBannedEvent(DataClassJsonMixin): - channel_id: str = dc_field(metadata=dc_config(field_name="channel_id")) - channel_type: str = dc_field(metadata=dc_config(field_name="channel_type")) - cid: str = dc_field(metadata=dc_config(field_name="cid")) created_at: datetime = dc_field( metadata=dc_config( field_name="created_at", @@ -20743,9 +21611,22 @@ class UserBannedEvent(DataClassJsonMixin): mm_field=fields.DateTime(format="iso"), ) ) - shadow: bool = dc_field(metadata=dc_config(field_name="shadow")) - created_by: "User" = dc_field(metadata=dc_config(field_name="created_by")) + custom: Dict[str, object] = dc_field(metadata=dc_config(field_name="custom")) + user: "UserResponseCommonFields" = dc_field(metadata=dc_config(field_name="user")) type: str = dc_field(default="user.banned", metadata=dc_config(field_name="type")) + channel_id: Optional[str] = dc_field( + default=None, metadata=dc_config(field_name="channel_id") + ) + channel_member_count: Optional[int] = dc_field( + default=None, metadata=dc_config(field_name="channel_member_count") + ) + channel_message_count: Optional[int] = dc_field( + default=None, metadata=dc_config(field_name="channel_message_count") + ) + channel_type: Optional[str] = dc_field( + default=None, metadata=dc_config(field_name="channel_type") + ) + cid: Optional[str] = dc_field(default=None, metadata=dc_config(field_name="cid")) expiration: Optional[datetime] = dc_field( default=None, metadata=dc_config( @@ -20758,9 +21639,27 @@ class UserBannedEvent(DataClassJsonMixin): reason: Optional[str] = dc_field( default=None, metadata=dc_config(field_name="reason") ) + 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"), + ), + ) + shadow: Optional[bool] = dc_field( + default=None, metadata=dc_config(field_name="shadow") + ) team: Optional[str] = dc_field(default=None, metadata=dc_config(field_name="team")) - user: "Optional[User]" = dc_field( - default=None, metadata=dc_config(field_name="user") + total_bans: Optional[int] = dc_field( + default=None, metadata=dc_config(field_name="total_bans") + ) + channel_custom: Optional[Dict[str, object]] = dc_field( + default=None, metadata=dc_config(field_name="channel_custom") + ) + created_by: "Optional[UserResponseCommonFields]" = dc_field( + default=None, metadata=dc_config(field_name="created_by") ) @@ -20799,12 +21698,22 @@ class UserDeactivatedEvent(DataClassJsonMixin): mm_field=fields.DateTime(format="iso"), ) ) - created_by: "User" = dc_field(metadata=dc_config(field_name="created_by")) + custom: Dict[str, object] = dc_field(metadata=dc_config(field_name="custom")) + user: "UserResponseCommonFields" = dc_field(metadata=dc_config(field_name="user")) type: str = dc_field( default="user.deactivated", metadata=dc_config(field_name="type") ) - user: "Optional[User]" = dc_field( - default=None, metadata=dc_config(field_name="user") + 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"), + ), + ) + created_by: "Optional[UserResponseCommonFields]" = dc_field( + default=None, metadata=dc_config(field_name="created_by") ) @@ -20818,16 +21727,29 @@ class UserDeletedEvent(DataClassJsonMixin): mm_field=fields.DateTime(format="iso"), ) ) + delete_conversation: str = dc_field( + metadata=dc_config(field_name="delete_conversation") + ) delete_conversation_channels: bool = dc_field( metadata=dc_config(field_name="delete_conversation_channels") ) + delete_messages: str = dc_field(metadata=dc_config(field_name="delete_messages")) + delete_user: str = dc_field(metadata=dc_config(field_name="delete_user")) hard_delete: bool = dc_field(metadata=dc_config(field_name="hard_delete")) mark_messages_deleted: bool = dc_field( metadata=dc_config(field_name="mark_messages_deleted") ) + custom: Dict[str, object] = dc_field(metadata=dc_config(field_name="custom")) + user: "UserResponseCommonFields" = dc_field(metadata=dc_config(field_name="user")) type: str = dc_field(default="user.deleted", metadata=dc_config(field_name="type")) - user: "Optional[User]" = dc_field( - default=None, metadata=dc_config(field_name="user") + 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"), + ), ) @@ -20873,15 +21795,24 @@ class UserFlaggedEvent(DataClassJsonMixin): mm_field=fields.DateTime(format="iso"), ) ) + reason: str = dc_field(metadata=dc_config(field_name="reason")) + total_flags: int = dc_field(metadata=dc_config(field_name="total_flags")) + user: "UserResponseCommonFields" = dc_field(metadata=dc_config(field_name="user")) type: str = dc_field(default="user.flagged", metadata=dc_config(field_name="type")) - target_user: Optional[str] = dc_field( - default=None, metadata=dc_config(field_name="target_user") + 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"), + ), ) - target_users: Optional[List[str]] = dc_field( - default=None, metadata=dc_config(field_name="target_users") + custom: Optional[Dict[str, object]] = dc_field( + default=None, metadata=dc_config(field_name="custom") ) - user: "Optional[User]" = dc_field( - default=None, metadata=dc_config(field_name="user") + target_user: "Optional[UserResponseCommonFields]" = dc_field( + default=None, metadata=dc_config(field_name="target_user") ) @@ -20942,7 +21873,7 @@ class UserMessagesDeletedEvent(DataClassJsonMixin): @dataclass -class UserMute(DataClassJsonMixin): +class UserMuteResponse(DataClassJsonMixin): created_at: datetime = dc_field( metadata=dc_config( field_name="created_at", @@ -20968,16 +21899,16 @@ class UserMute(DataClassJsonMixin): mm_field=fields.DateTime(format="iso"), ), ) - target: "Optional[User]" = dc_field( + target: "Optional[UserResponse]" = dc_field( default=None, metadata=dc_config(field_name="target") ) - user: "Optional[User]" = dc_field( + user: "Optional[UserResponse]" = dc_field( default=None, metadata=dc_config(field_name="user") ) @dataclass -class UserMuteResponse(DataClassJsonMixin): +class UserMutedEvent(DataClassJsonMixin): created_at: datetime = dc_field( metadata=dc_config( field_name="created_at", @@ -20986,50 +21917,23 @@ class UserMuteResponse(DataClassJsonMixin): 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"), - ) - ) - expires: Optional[datetime] = dc_field( + custom: Dict[str, object] = dc_field(metadata=dc_config(field_name="custom")) + user: "UserResponseCommonFields" = dc_field(metadata=dc_config(field_name="user")) + type: str = dc_field(default="user.muted", metadata=dc_config(field_name="type")) + received_at: Optional[datetime] = dc_field( default=None, metadata=dc_config( - field_name="expires", + field_name="received_at", encoder=encode_datetime, decoder=datetime_from_unix_ns, mm_field=fields.DateTime(format="iso"), ), ) - target: "Optional[UserResponse]" = dc_field( - default=None, metadata=dc_config(field_name="target") - ) - user: "Optional[UserResponse]" = dc_field( - default=None, metadata=dc_config(field_name="user") - ) - - -@dataclass -class UserMutedEvent(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"), - ) - ) - type: str = dc_field(default="user.muted", metadata=dc_config(field_name="type")) - target_user: Optional[str] = dc_field( - default=None, metadata=dc_config(field_name="target_user") - ) - target_users: Optional[List[str]] = dc_field( + target_users: "Optional[List[UserResponseCommonFields]]" = dc_field( default=None, metadata=dc_config(field_name="target_users") ) - user: "Optional[User]" = dc_field( - default=None, metadata=dc_config(field_name="user") + target_user: "Optional[UserResponseCommonFields]" = dc_field( + default=None, metadata=dc_config(field_name="target_user") ) @@ -21049,11 +21953,22 @@ class UserReactivatedEvent(DataClassJsonMixin): mm_field=fields.DateTime(format="iso"), ) ) + custom: Dict[str, object] = dc_field(metadata=dc_config(field_name="custom")) + user: "UserResponseCommonFields" = dc_field(metadata=dc_config(field_name="user")) type: str = dc_field( default="user.reactivated", metadata=dc_config(field_name="type") ) - user: "Optional[User]" = dc_field( - default=None, metadata=dc_config(field_name="user") + 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"), + ), + ) + created_by: "Optional[UserResponseCommonFields]" = dc_field( + default=None, metadata=dc_config(field_name="created_by") ) @@ -21356,9 +22271,6 @@ class UserRuleParameters(DataClassJsonMixin): @dataclass class UserUnbannedEvent(DataClassJsonMixin): - channel_id: str = dc_field(metadata=dc_config(field_name="channel_id")) - channel_type: str = dc_field(metadata=dc_config(field_name="channel_type")) - cid: str = dc_field(metadata=dc_config(field_name="cid")) created_at: datetime = dc_field( metadata=dc_config( field_name="created_at", @@ -21367,11 +22279,40 @@ class UserUnbannedEvent(DataClassJsonMixin): mm_field=fields.DateTime(format="iso"), ) ) - shadow: bool = dc_field(metadata=dc_config(field_name="shadow")) + custom: Dict[str, object] = dc_field(metadata=dc_config(field_name="custom")) + user: "UserResponseCommonFields" = dc_field(metadata=dc_config(field_name="user")) type: str = dc_field(default="user.unbanned", metadata=dc_config(field_name="type")) + channel_id: Optional[str] = dc_field( + default=None, metadata=dc_config(field_name="channel_id") + ) + channel_member_count: Optional[int] = dc_field( + default=None, metadata=dc_config(field_name="channel_member_count") + ) + channel_message_count: Optional[int] = dc_field( + default=None, metadata=dc_config(field_name="channel_message_count") + ) + channel_type: Optional[str] = dc_field( + default=None, metadata=dc_config(field_name="channel_type") + ) + cid: Optional[str] = dc_field(default=None, metadata=dc_config(field_name="cid")) + 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"), + ), + ) + shadow: Optional[bool] = dc_field( + default=None, metadata=dc_config(field_name="shadow") + ) team: Optional[str] = dc_field(default=None, metadata=dc_config(field_name="team")) - user: "Optional[User]" = dc_field( - default=None, metadata=dc_config(field_name="user") + channel_custom: Optional[Dict[str, object]] = dc_field( + default=None, metadata=dc_config(field_name="channel_custom") + ) + created_by: "Optional[UserResponseCommonFields]" = dc_field( + default=None, metadata=dc_config(field_name="created_by") ) @@ -21385,15 +22326,23 @@ class UserUnmutedEvent(DataClassJsonMixin): mm_field=fields.DateTime(format="iso"), ) ) + custom: Dict[str, object] = dc_field(metadata=dc_config(field_name="custom")) + user: "UserResponseCommonFields" = dc_field(metadata=dc_config(field_name="user")) type: str = dc_field(default="user.unmuted", metadata=dc_config(field_name="type")) - target_user: Optional[str] = dc_field( - default=None, metadata=dc_config(field_name="target_user") + 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"), + ), ) - target_users: Optional[List[str]] = dc_field( + target_users: "Optional[List[UserResponseCommonFields]]" = dc_field( default=None, metadata=dc_config(field_name="target_users") ) - user: "Optional[User]" = dc_field( - default=None, metadata=dc_config(field_name="user") + target_user: "Optional[UserResponseCommonFields]" = dc_field( + default=None, metadata=dc_config(field_name="target_user") ) @@ -21407,14 +22356,22 @@ class UserUnreadReminderEvent(DataClassJsonMixin): mm_field=fields.DateTime(format="iso"), ) ) - channels: "Dict[str, Optional[ChannelMessages]]" = dc_field( + channels: "Dict[str, Optional[ChannelMessagesResponse]]" = dc_field( metadata=dc_config(field_name="channels") ) + custom: Dict[str, object] = dc_field(metadata=dc_config(field_name="custom")) + user: "UserResponseCommonFields" = dc_field(metadata=dc_config(field_name="user")) type: str = dc_field( default="user.unread_message_reminder", metadata=dc_config(field_name="type") ) - user: "Optional[User]" = dc_field( - default=None, metadata=dc_config(field_name="user") + 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"), + ), ) @@ -21532,12 +22489,12 @@ class VideoContentParameters(DataClassJsonMixin): @dataclass -class VideoEndCallRequest(DataClassJsonMixin): +class VideoEndCallRequestPayload(DataClassJsonMixin): pass @dataclass -class VideoKickUserRequest(DataClassJsonMixin): +class VideoKickUserRequestPayload(DataClassJsonMixin): pass @@ -21548,6 +22505,18 @@ class VideoReactionOverTimeResponse(DataClassJsonMixin): ) +@dataclass +class VideoReactionResponse(DataClassJsonMixin): + type: str = dc_field(metadata=dc_config(field_name="type")) + user: "UserResponse" = dc_field(metadata=dc_config(field_name="user")) + emoji_code: Optional[str] = dc_field( + default=None, metadata=dc_config(field_name="emoji_code") + ) + custom: Optional[Dict[str, object]] = dc_field( + default=None, metadata=dc_config(field_name="custom") + ) + + @dataclass class VideoReactionsResponse(DataClassJsonMixin): reaction: str = dc_field(metadata=dc_config(field_name="reaction")) @@ -21628,6 +22597,11 @@ class VoteData(DataClassJsonMixin): ) +@dataclass +class WHEvent(DataClassJsonMixin): + type: str = dc_field(metadata=dc_config(field_name="type")) + + @dataclass class WHIPIngress(DataClassJsonMixin): address: str = dc_field(metadata=dc_config(field_name="address")) @@ -21721,11 +22695,6 @@ class WSEvent(DataClassJsonMixin): ) -@dataclass -class WebhookEvent(DataClassJsonMixin): - type: str = dc_field(metadata=dc_config(field_name="type")) - - @dataclass class WrappedUnreadCountsResponse(DataClassJsonMixin): duration: str = dc_field(metadata=dc_config(field_name="duration")) diff --git a/getstream/moderation/async_rest_client.py b/getstream/moderation/async_rest_client.py index 1272a45d..fcb9bbb4 100644 --- a/getstream/moderation/async_rest_client.py +++ b/getstream/moderation/async_rest_client.py @@ -42,12 +42,14 @@ async def appeal( user: Optional[UserRequest] = None, ) -> StreamResponse[AppealResponse]: json = build_body_dict( - appeal_reason=appeal_reason, - entity_id=entity_id, - entity_type=entity_type, - user_id=user_id, - attachments=attachments, - user=user, + **{ + "appeal_reason": appeal_reason, + "entity_id": entity_id, + "entity_type": entity_type, + "user_id": user_id, + "attachments": attachments, + "user": user, + } ) return await self.post("/api/v2/moderation/appeal", AppealResponse, json=json) @@ -72,13 +74,15 @@ async def query_appeals( user: Optional[UserRequest] = None, ) -> StreamResponse[QueryAppealsResponse]: json = build_body_dict( - limit=limit, - next=next, - prev=prev, - user_id=user_id, - sort=sort, - filter=filter, - user=user, + **{ + "limit": limit, + "next": next, + "prev": prev, + "user_id": user_id, + "sort": sort, + "filter": filter, + "user": user, + } ) return await self.post( "/api/v2/moderation/appeals", QueryAppealsResponse, json=json @@ -98,15 +102,17 @@ async def ban( banned_by: Optional[UserRequest] = None, ) -> StreamResponse[BanResponse]: json = build_body_dict( - target_user_id=target_user_id, - banned_by_id=banned_by_id, - channel_cid=channel_cid, - delete_messages=delete_messages, - ip_ban=ip_ban, - reason=reason, - shadow=shadow, - timeout=timeout, - banned_by=banned_by, + **{ + "target_user_id": target_user_id, + "banned_by_id": banned_by_id, + "channel_cid": channel_cid, + "delete_messages": delete_messages, + "ip_ban": ip_ban, + "reason": reason, + "shadow": shadow, + "timeout": timeout, + "banned_by": banned_by, + } ) return await self.post("/api/v2/moderation/ban", BanResponse, json=json) @@ -114,7 +120,7 @@ async def ban( async def bulk_image_moderation( self, csv_file: str ) -> StreamResponse[BulkImageModerationResponse]: - json = build_body_dict(csv_file=csv_file) + json = build_body_dict(**{"csv_file": csv_file}) return await self.post( "/api/v2/moderation/bulk_image_moderation", BulkImageModerationResponse, @@ -137,17 +143,19 @@ async def check( user: Optional[UserRequest] = None, ) -> StreamResponse[CheckResponse]: json = build_body_dict( - entity_creator_id=entity_creator_id, - entity_id=entity_id, - entity_type=entity_type, - config_key=config_key, - config_team=config_team, - test_mode=test_mode, - user_id=user_id, - config=config, - moderation_payload=moderation_payload, - options=options, - user=user, + **{ + "entity_creator_id": entity_creator_id, + "entity_id": entity_id, + "entity_type": entity_type, + "config_key": config_key, + "config_team": config_team, + "test_mode": test_mode, + "user_id": user_id, + "config": config, + "moderation_payload": moderation_payload, + "options": options, + "user": user, + } ) return await self.post("/api/v2/moderation/check", CheckResponse, json=json) @@ -177,25 +185,27 @@ async def upsert_config( video_call_rule_config: Optional[VideoCallRuleConfig] = None, ) -> StreamResponse[UpsertConfigResponse]: json = build_body_dict( - key=key, - _async=_async, - team=team, - user_id=user_id, - ai_image_config=ai_image_config, - ai_text_config=ai_text_config, - ai_video_config=ai_video_config, - automod_platform_circumvention_config=automod_platform_circumvention_config, - automod_semantic_filters_config=automod_semantic_filters_config, - automod_toxicity_config=automod_toxicity_config, - aws_rekognition_config=aws_rekognition_config, - block_list_config=block_list_config, - bodyguard_config=bodyguard_config, - google_vision_config=google_vision_config, - llm_config=llm_config, - rule_builder_config=rule_builder_config, - user=user, - velocity_filter_config=velocity_filter_config, - video_call_rule_config=video_call_rule_config, + **{ + "key": key, + "async": _async, + "team": team, + "user_id": user_id, + "ai_image_config": ai_image_config, + "ai_text_config": ai_text_config, + "ai_video_config": ai_video_config, + "automod_platform_circumvention_config": automod_platform_circumvention_config, + "automod_semantic_filters_config": automod_semantic_filters_config, + "automod_toxicity_config": automod_toxicity_config, + "aws_rekognition_config": aws_rekognition_config, + "block_list_config": block_list_config, + "bodyguard_config": bodyguard_config, + "google_vision_config": google_vision_config, + "llm_config": llm_config, + "rule_builder_config": rule_builder_config, + "user": user, + "velocity_filter_config": velocity_filter_config, + "video_call_rule_config": video_call_rule_config, + } ) return await self.post( "/api/v2/moderation/config", UpsertConfigResponse, json=json @@ -205,7 +215,7 @@ async def upsert_config( async def delete_config( self, key: str, team: Optional[str] = None ) -> StreamResponse[DeleteModerationConfigResponse]: - query_params = build_query_param(team=team) + query_params = build_query_param(**{"team": team}) path_params = { "key": key, } @@ -220,7 +230,7 @@ async def delete_config( async def get_config( self, key: str, team: Optional[str] = None ) -> StreamResponse[GetConfigResponse]: - query_params = build_query_param(team=team) + query_params = build_query_param(**{"team": team}) path_params = { "key": key, } @@ -243,13 +253,15 @@ async def query_moderation_configs( user: Optional[UserRequest] = None, ) -> StreamResponse[QueryModerationConfigsResponse]: json = build_body_dict( - limit=limit, - next=next, - prev=prev, - user_id=user_id, - sort=sort, - filter=filter, - user=user, + **{ + "limit": limit, + "next": next, + "prev": prev, + "user_id": user_id, + "sort": sort, + "filter": filter, + "user": user, + } ) return await self.post( "/api/v2/moderation/configs", QueryModerationConfigsResponse, json=json @@ -263,17 +275,19 @@ async def custom_check( flags: List[CustomCheckFlag], entity_creator_id: Optional[str] = None, user_id: Optional[str] = None, - moderation_payload: Optional[ModerationPayload] = None, + moderation_payload: Optional[ModerationPayloadRequest] = None, user: Optional[UserRequest] = None, ) -> StreamResponse[CustomCheckResponse]: json = build_body_dict( - entity_id=entity_id, - entity_type=entity_type, - flags=flags, - entity_creator_id=entity_creator_id, - user_id=user_id, - moderation_payload=moderation_payload, - user=user, + **{ + "entity_id": entity_id, + "entity_type": entity_type, + "flags": flags, + "entity_creator_id": entity_creator_id, + "user_id": user_id, + "moderation_payload": moderation_payload, + "user": user, + } ) return await self.post( "/api/v2/moderation/custom_check", CustomCheckResponse, json=json @@ -299,9 +313,9 @@ async def v2_query_templates( @telemetry.operation_name("getstream.api.moderation.v2_upsert_template") async def v2_upsert_template( - self, name: str, config: FeedsModerationTemplateConfig + self, name: str, config: FeedsModerationTemplateConfigPayload ) -> StreamResponse[UpsertModerationTemplateResponse]: - json = build_body_dict(name=name, config=config) + json = build_body_dict(**{"name": name, "config": config}) return await self.post( "/api/v2/moderation/feeds_moderation_template", UpsertModerationTemplateResponse, @@ -321,14 +335,16 @@ async def flag( user: Optional[UserRequest] = None, ) -> StreamResponse[FlagResponse]: json = build_body_dict( - entity_id=entity_id, - entity_type=entity_type, - entity_creator_id=entity_creator_id, - reason=reason, - user_id=user_id, - custom=custom, - moderation_payload=moderation_payload, - user=user, + **{ + "entity_id": entity_id, + "entity_type": entity_type, + "entity_creator_id": entity_creator_id, + "reason": reason, + "user_id": user_id, + "custom": custom, + "moderation_payload": moderation_payload, + "user": user, + } ) return await self.post("/api/v2/moderation/flag", FlagResponse, json=json) @@ -338,11 +354,17 @@ async def query_moderation_flags( limit: Optional[int] = None, next: Optional[str] = None, prev: Optional[str] = None, - sort: Optional[List[SortParam]] = None, + sort: Optional[List[SortParamRequest]] = None, filter: Optional[Dict[str, object]] = None, ) -> StreamResponse[QueryModerationFlagsResponse]: json = build_body_dict( - limit=limit, next=next, prev=prev, sort=sort, filter=filter + **{ + "limit": limit, + "next": next, + "prev": prev, + "sort": sort, + "filter": filter, + } ) return await self.post( "/api/v2/moderation/flags", QueryModerationFlagsResponse, json=json @@ -360,13 +382,15 @@ async def query_moderation_logs( user: Optional[UserRequest] = None, ) -> StreamResponse[QueryModerationLogsResponse]: json = build_body_dict( - limit=limit, - next=next, - prev=prev, - user_id=user_id, - sort=sort, - filter=filter, - user=user, + **{ + "limit": limit, + "next": next, + "prev": prev, + "user_id": user_id, + "sort": sort, + "filter": filter, + "user": user, + } ) return await self.post( "/api/v2/moderation/logs", QueryModerationLogsResponse, json=json @@ -377,28 +401,32 @@ async def upsert_moderation_rule( self, name: str, rule_type: str, - action: RuleBuilderAction, cooldown_period: Optional[str] = None, description: Optional[str] = None, enabled: Optional[bool] = None, logic: Optional[str] = None, team: Optional[str] = None, + action_sequences: Optional[List[CallRuleActionSequence]] = None, conditions: Optional[List[RuleBuilderCondition]] = None, config_keys: Optional[List[str]] = None, groups: Optional[List[RuleBuilderConditionGroup]] = None, + action: Optional[RuleBuilderAction] = None, ) -> StreamResponse[UpsertModerationRuleResponse]: json = build_body_dict( - name=name, - rule_type=rule_type, - action=action, - cooldown_period=cooldown_period, - description=description, - enabled=enabled, - logic=logic, - team=team, - conditions=conditions, - config_keys=config_keys, - groups=groups, + **{ + "name": name, + "rule_type": rule_type, + "cooldown_period": cooldown_period, + "description": description, + "enabled": enabled, + "logic": logic, + "team": team, + "action_sequences": action_sequences, + "conditions": conditions, + "config_keys": config_keys, + "groups": groups, + "action": action, + } ) return await self.post( "/api/v2/moderation/moderation_rule", @@ -432,13 +460,15 @@ async def query_moderation_rules( user: Optional[UserRequest] = None, ) -> StreamResponse[QueryModerationRulesResponse]: json = build_body_dict( - limit=limit, - next=next, - prev=prev, - user_id=user_id, - sort=sort, - filter=filter, - user=user, + **{ + "limit": limit, + "next": next, + "prev": prev, + "user_id": user_id, + "sort": sort, + "filter": filter, + "user": user, + } ) return await self.post( "/api/v2/moderation/moderation_rules", @@ -455,7 +485,12 @@ async def mute( user: Optional[UserRequest] = None, ) -> StreamResponse[MuteResponse]: json = build_body_dict( - target_ids=target_ids, timeout=timeout, user_id=user_id, user=user + **{ + "target_ids": target_ids, + "timeout": timeout, + "user_id": user_id, + "user": user, + } ) return await self.post("/api/v2/moderation/mute", MuteResponse, json=json) @@ -475,17 +510,19 @@ async def query_review_queue( user: Optional[UserRequest] = None, ) -> StreamResponse[QueryReviewQueueResponse]: json = build_body_dict( - limit=limit, - lock_count=lock_count, - lock_duration=lock_duration, - lock_items=lock_items, - next=next, - prev=prev, - stats_only=stats_only, - user_id=user_id, - sort=sort, - filter=filter, - user=user, + **{ + "limit": limit, + "lock_count": lock_count, + "lock_duration": lock_duration, + "lock_items": lock_items, + "next": next, + "prev": prev, + "stats_only": stats_only, + "user_id": user_id, + "sort": sort, + "filter": filter, + "user": user, + } ) return await self.post( "/api/v2/moderation/review_queue", QueryReviewQueueResponse, json=json @@ -511,42 +548,46 @@ async def submit_action( appeal_id: Optional[str] = None, item_id: Optional[str] = None, user_id: Optional[str] = None, - ban: Optional[BanActionRequest] = None, - block: Optional[BlockActionRequest] = None, - custom: Optional[CustomActionRequest] = None, - delete_activity: Optional[DeleteActivityRequest] = None, - delete_comment: Optional[DeleteCommentRequest] = None, - delete_message: Optional[DeleteMessageRequest] = None, - delete_reaction: Optional[DeleteReactionRequest] = None, - delete_user: Optional[DeleteUserRequest] = None, - mark_reviewed: Optional[MarkReviewedRequest] = None, - reject_appeal: Optional[RejectAppealRequest] = None, - restore: Optional[RestoreActionRequest] = None, - shadow_block: Optional[ShadowBlockActionRequest] = None, - unban: Optional[UnbanActionRequest] = None, - unblock: Optional[UnblockActionRequest] = None, + ban: Optional[BanActionRequestPayload] = None, + block: Optional[BlockActionRequestPayload] = None, + custom: Optional[CustomActionRequestPayload] = None, + delete_activity: Optional[DeleteActivityRequestPayload] = None, + delete_comment: Optional[DeleteCommentRequestPayload] = None, + delete_message: Optional[DeleteMessageRequestPayload] = None, + delete_reaction: Optional[DeleteReactionRequestPayload] = None, + delete_user: Optional[DeleteUserRequestPayload] = None, + flag: Optional[FlagRequest] = None, + mark_reviewed: Optional[MarkReviewedRequestPayload] = None, + reject_appeal: Optional[RejectAppealRequestPayload] = None, + restore: Optional[RestoreActionRequestPayload] = None, + shadow_block: Optional[ShadowBlockActionRequestPayload] = None, + unban: Optional[UnbanActionRequestPayload] = None, + unblock: Optional[UnblockActionRequestPayload] = None, user: Optional[UserRequest] = None, ) -> StreamResponse[SubmitActionResponse]: json = build_body_dict( - action_type=action_type, - appeal_id=appeal_id, - item_id=item_id, - user_id=user_id, - ban=ban, - block=block, - custom=custom, - delete_activity=delete_activity, - delete_comment=delete_comment, - delete_message=delete_message, - delete_reaction=delete_reaction, - delete_user=delete_user, - mark_reviewed=mark_reviewed, - reject_appeal=reject_appeal, - restore=restore, - shadow_block=shadow_block, - unban=unban, - unblock=unblock, - user=user, + **{ + "action_type": action_type, + "appeal_id": appeal_id, + "item_id": item_id, + "user_id": user_id, + "ban": ban, + "block": block, + "custom": custom, + "delete_activity": delete_activity, + "delete_comment": delete_comment, + "delete_message": delete_message, + "delete_reaction": delete_reaction, + "delete_user": delete_user, + "flag": flag, + "mark_reviewed": mark_reviewed, + "reject_appeal": reject_appeal, + "restore": restore, + "shadow_block": shadow_block, + "unban": unban, + "unblock": unblock, + "user": user, + } ) return await self.post( "/api/v2/moderation/submit_action", SubmitActionResponse, json=json @@ -562,11 +603,15 @@ async def unban( unbanned_by: Optional[UserRequest] = None, ) -> StreamResponse[UnbanResponse]: query_params = build_query_param( - target_user_id=target_user_id, - channel_cid=channel_cid, - created_by=created_by, + **{ + "target_user_id": target_user_id, + "channel_cid": channel_cid, + "created_by": created_by, + } + ) + json = build_body_dict( + **{"unbanned_by_id": unbanned_by_id, "unbanned_by": unbanned_by} ) - json = build_body_dict(unbanned_by_id=unbanned_by_id, unbanned_by=unbanned_by) return await self.post( "/api/v2/moderation/unban", UnbanResponse, @@ -581,5 +626,7 @@ async def unmute( user_id: Optional[str] = None, user: Optional[UserRequest] = None, ) -> StreamResponse[UnmuteResponse]: - json = build_body_dict(target_ids=target_ids, user_id=user_id, user=user) + json = build_body_dict( + **{"target_ids": target_ids, "user_id": user_id, "user": user} + ) return await self.post("/api/v2/moderation/unmute", UnmuteResponse, json=json) diff --git a/getstream/moderation/rest_client.py b/getstream/moderation/rest_client.py index e82f9a41..f76fd4a4 100644 --- a/getstream/moderation/rest_client.py +++ b/getstream/moderation/rest_client.py @@ -42,12 +42,14 @@ def appeal( user: Optional[UserRequest] = None, ) -> StreamResponse[AppealResponse]: json = build_body_dict( - appeal_reason=appeal_reason, - entity_id=entity_id, - entity_type=entity_type, - user_id=user_id, - attachments=attachments, - user=user, + **{ + "appeal_reason": appeal_reason, + "entity_id": entity_id, + "entity_type": entity_type, + "user_id": user_id, + "attachments": attachments, + "user": user, + } ) return self.post("/api/v2/moderation/appeal", AppealResponse, json=json) @@ -72,13 +74,15 @@ def query_appeals( user: Optional[UserRequest] = None, ) -> StreamResponse[QueryAppealsResponse]: json = build_body_dict( - limit=limit, - next=next, - prev=prev, - user_id=user_id, - sort=sort, - filter=filter, - user=user, + **{ + "limit": limit, + "next": next, + "prev": prev, + "user_id": user_id, + "sort": sort, + "filter": filter, + "user": user, + } ) return self.post("/api/v2/moderation/appeals", QueryAppealsResponse, json=json) @@ -96,15 +100,17 @@ def ban( banned_by: Optional[UserRequest] = None, ) -> StreamResponse[BanResponse]: json = build_body_dict( - target_user_id=target_user_id, - banned_by_id=banned_by_id, - channel_cid=channel_cid, - delete_messages=delete_messages, - ip_ban=ip_ban, - reason=reason, - shadow=shadow, - timeout=timeout, - banned_by=banned_by, + **{ + "target_user_id": target_user_id, + "banned_by_id": banned_by_id, + "channel_cid": channel_cid, + "delete_messages": delete_messages, + "ip_ban": ip_ban, + "reason": reason, + "shadow": shadow, + "timeout": timeout, + "banned_by": banned_by, + } ) return self.post("/api/v2/moderation/ban", BanResponse, json=json) @@ -112,7 +118,7 @@ def ban( def bulk_image_moderation( self, csv_file: str ) -> StreamResponse[BulkImageModerationResponse]: - json = build_body_dict(csv_file=csv_file) + json = build_body_dict(**{"csv_file": csv_file}) return self.post( "/api/v2/moderation/bulk_image_moderation", BulkImageModerationResponse, @@ -135,17 +141,19 @@ def check( user: Optional[UserRequest] = None, ) -> StreamResponse[CheckResponse]: json = build_body_dict( - entity_creator_id=entity_creator_id, - entity_id=entity_id, - entity_type=entity_type, - config_key=config_key, - config_team=config_team, - test_mode=test_mode, - user_id=user_id, - config=config, - moderation_payload=moderation_payload, - options=options, - user=user, + **{ + "entity_creator_id": entity_creator_id, + "entity_id": entity_id, + "entity_type": entity_type, + "config_key": config_key, + "config_team": config_team, + "test_mode": test_mode, + "user_id": user_id, + "config": config, + "moderation_payload": moderation_payload, + "options": options, + "user": user, + } ) return self.post("/api/v2/moderation/check", CheckResponse, json=json) @@ -175,25 +183,27 @@ def upsert_config( video_call_rule_config: Optional[VideoCallRuleConfig] = None, ) -> StreamResponse[UpsertConfigResponse]: json = build_body_dict( - key=key, - _async=_async, - team=team, - user_id=user_id, - ai_image_config=ai_image_config, - ai_text_config=ai_text_config, - ai_video_config=ai_video_config, - automod_platform_circumvention_config=automod_platform_circumvention_config, - automod_semantic_filters_config=automod_semantic_filters_config, - automod_toxicity_config=automod_toxicity_config, - aws_rekognition_config=aws_rekognition_config, - block_list_config=block_list_config, - bodyguard_config=bodyguard_config, - google_vision_config=google_vision_config, - llm_config=llm_config, - rule_builder_config=rule_builder_config, - user=user, - velocity_filter_config=velocity_filter_config, - video_call_rule_config=video_call_rule_config, + **{ + "key": key, + "async": _async, + "team": team, + "user_id": user_id, + "ai_image_config": ai_image_config, + "ai_text_config": ai_text_config, + "ai_video_config": ai_video_config, + "automod_platform_circumvention_config": automod_platform_circumvention_config, + "automod_semantic_filters_config": automod_semantic_filters_config, + "automod_toxicity_config": automod_toxicity_config, + "aws_rekognition_config": aws_rekognition_config, + "block_list_config": block_list_config, + "bodyguard_config": bodyguard_config, + "google_vision_config": google_vision_config, + "llm_config": llm_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) @@ -201,7 +211,7 @@ def upsert_config( def delete_config( self, key: str, team: Optional[str] = None ) -> StreamResponse[DeleteModerationConfigResponse]: - query_params = build_query_param(team=team) + query_params = build_query_param(**{"team": team}) path_params = { "key": key, } @@ -216,7 +226,7 @@ def delete_config( def get_config( self, key: str, team: Optional[str] = None ) -> StreamResponse[GetConfigResponse]: - query_params = build_query_param(team=team) + query_params = build_query_param(**{"team": team}) path_params = { "key": key, } @@ -239,13 +249,15 @@ def query_moderation_configs( user: Optional[UserRequest] = None, ) -> StreamResponse[QueryModerationConfigsResponse]: json = build_body_dict( - limit=limit, - next=next, - prev=prev, - user_id=user_id, - sort=sort, - filter=filter, - user=user, + **{ + "limit": limit, + "next": next, + "prev": prev, + "user_id": user_id, + "sort": sort, + "filter": filter, + "user": user, + } ) return self.post( "/api/v2/moderation/configs", QueryModerationConfigsResponse, json=json @@ -259,17 +271,19 @@ def custom_check( flags: List[CustomCheckFlag], entity_creator_id: Optional[str] = None, user_id: Optional[str] = None, - moderation_payload: Optional[ModerationPayload] = None, + moderation_payload: Optional[ModerationPayloadRequest] = None, user: Optional[UserRequest] = None, ) -> StreamResponse[CustomCheckResponse]: json = build_body_dict( - entity_id=entity_id, - entity_type=entity_type, - flags=flags, - entity_creator_id=entity_creator_id, - user_id=user_id, - moderation_payload=moderation_payload, - user=user, + **{ + "entity_id": entity_id, + "entity_type": entity_type, + "flags": flags, + "entity_creator_id": entity_creator_id, + "user_id": user_id, + "moderation_payload": moderation_payload, + "user": user, + } ) return self.post( "/api/v2/moderation/custom_check", CustomCheckResponse, json=json @@ -293,9 +307,9 @@ def v2_query_templates( @telemetry.operation_name("getstream.api.moderation.v2_upsert_template") def v2_upsert_template( - self, name: str, config: FeedsModerationTemplateConfig + self, name: str, config: FeedsModerationTemplateConfigPayload ) -> StreamResponse[UpsertModerationTemplateResponse]: - json = build_body_dict(name=name, config=config) + json = build_body_dict(**{"name": name, "config": config}) return self.post( "/api/v2/moderation/feeds_moderation_template", UpsertModerationTemplateResponse, @@ -315,14 +329,16 @@ def flag( user: Optional[UserRequest] = None, ) -> StreamResponse[FlagResponse]: json = build_body_dict( - entity_id=entity_id, - entity_type=entity_type, - entity_creator_id=entity_creator_id, - reason=reason, - user_id=user_id, - custom=custom, - moderation_payload=moderation_payload, - user=user, + **{ + "entity_id": entity_id, + "entity_type": entity_type, + "entity_creator_id": entity_creator_id, + "reason": reason, + "user_id": user_id, + "custom": custom, + "moderation_payload": moderation_payload, + "user": user, + } ) return self.post("/api/v2/moderation/flag", FlagResponse, json=json) @@ -332,11 +348,17 @@ def query_moderation_flags( limit: Optional[int] = None, next: Optional[str] = None, prev: Optional[str] = None, - sort: Optional[List[SortParam]] = None, + sort: Optional[List[SortParamRequest]] = None, filter: Optional[Dict[str, object]] = None, ) -> StreamResponse[QueryModerationFlagsResponse]: json = build_body_dict( - limit=limit, next=next, prev=prev, sort=sort, filter=filter + **{ + "limit": limit, + "next": next, + "prev": prev, + "sort": sort, + "filter": filter, + } ) return self.post( "/api/v2/moderation/flags", QueryModerationFlagsResponse, json=json @@ -354,13 +376,15 @@ def query_moderation_logs( user: Optional[UserRequest] = None, ) -> StreamResponse[QueryModerationLogsResponse]: json = build_body_dict( - limit=limit, - next=next, - prev=prev, - user_id=user_id, - sort=sort, - filter=filter, - user=user, + **{ + "limit": limit, + "next": next, + "prev": prev, + "user_id": user_id, + "sort": sort, + "filter": filter, + "user": user, + } ) return self.post( "/api/v2/moderation/logs", QueryModerationLogsResponse, json=json @@ -371,28 +395,32 @@ def upsert_moderation_rule( self, name: str, rule_type: str, - action: RuleBuilderAction, cooldown_period: Optional[str] = None, description: Optional[str] = None, enabled: Optional[bool] = None, logic: Optional[str] = None, team: Optional[str] = None, + action_sequences: Optional[List[CallRuleActionSequence]] = None, conditions: Optional[List[RuleBuilderCondition]] = None, config_keys: Optional[List[str]] = None, groups: Optional[List[RuleBuilderConditionGroup]] = None, + action: Optional[RuleBuilderAction] = None, ) -> StreamResponse[UpsertModerationRuleResponse]: json = build_body_dict( - name=name, - rule_type=rule_type, - action=action, - cooldown_period=cooldown_period, - description=description, - enabled=enabled, - logic=logic, - team=team, - conditions=conditions, - config_keys=config_keys, - groups=groups, + **{ + "name": name, + "rule_type": rule_type, + "cooldown_period": cooldown_period, + "description": description, + "enabled": enabled, + "logic": logic, + "team": team, + "action_sequences": action_sequences, + "conditions": conditions, + "config_keys": config_keys, + "groups": groups, + "action": action, + } ) return self.post( "/api/v2/moderation/moderation_rule", @@ -424,13 +452,15 @@ def query_moderation_rules( user: Optional[UserRequest] = None, ) -> StreamResponse[QueryModerationRulesResponse]: json = build_body_dict( - limit=limit, - next=next, - prev=prev, - user_id=user_id, - sort=sort, - filter=filter, - user=user, + **{ + "limit": limit, + "next": next, + "prev": prev, + "user_id": user_id, + "sort": sort, + "filter": filter, + "user": user, + } ) return self.post( "/api/v2/moderation/moderation_rules", @@ -447,7 +477,12 @@ def mute( user: Optional[UserRequest] = None, ) -> StreamResponse[MuteResponse]: json = build_body_dict( - target_ids=target_ids, timeout=timeout, user_id=user_id, user=user + **{ + "target_ids": target_ids, + "timeout": timeout, + "user_id": user_id, + "user": user, + } ) return self.post("/api/v2/moderation/mute", MuteResponse, json=json) @@ -467,17 +502,19 @@ def query_review_queue( user: Optional[UserRequest] = None, ) -> StreamResponse[QueryReviewQueueResponse]: json = build_body_dict( - limit=limit, - lock_count=lock_count, - lock_duration=lock_duration, - lock_items=lock_items, - next=next, - prev=prev, - stats_only=stats_only, - user_id=user_id, - sort=sort, - filter=filter, - user=user, + **{ + "limit": limit, + "lock_count": lock_count, + "lock_duration": lock_duration, + "lock_items": lock_items, + "next": next, + "prev": prev, + "stats_only": stats_only, + "user_id": user_id, + "sort": sort, + "filter": filter, + "user": user, + } ) return self.post( "/api/v2/moderation/review_queue", QueryReviewQueueResponse, json=json @@ -503,42 +540,46 @@ def submit_action( appeal_id: Optional[str] = None, item_id: Optional[str] = None, user_id: Optional[str] = None, - ban: Optional[BanActionRequest] = None, - block: Optional[BlockActionRequest] = None, - custom: Optional[CustomActionRequest] = None, - delete_activity: Optional[DeleteActivityRequest] = None, - delete_comment: Optional[DeleteCommentRequest] = None, - delete_message: Optional[DeleteMessageRequest] = None, - delete_reaction: Optional[DeleteReactionRequest] = None, - delete_user: Optional[DeleteUserRequest] = None, - mark_reviewed: Optional[MarkReviewedRequest] = None, - reject_appeal: Optional[RejectAppealRequest] = None, - restore: Optional[RestoreActionRequest] = None, - shadow_block: Optional[ShadowBlockActionRequest] = None, - unban: Optional[UnbanActionRequest] = None, - unblock: Optional[UnblockActionRequest] = None, + ban: Optional[BanActionRequestPayload] = None, + block: Optional[BlockActionRequestPayload] = None, + custom: Optional[CustomActionRequestPayload] = None, + delete_activity: Optional[DeleteActivityRequestPayload] = None, + delete_comment: Optional[DeleteCommentRequestPayload] = None, + delete_message: Optional[DeleteMessageRequestPayload] = None, + delete_reaction: Optional[DeleteReactionRequestPayload] = None, + delete_user: Optional[DeleteUserRequestPayload] = None, + flag: Optional[FlagRequest] = None, + mark_reviewed: Optional[MarkReviewedRequestPayload] = None, + reject_appeal: Optional[RejectAppealRequestPayload] = None, + restore: Optional[RestoreActionRequestPayload] = None, + shadow_block: Optional[ShadowBlockActionRequestPayload] = None, + unban: Optional[UnbanActionRequestPayload] = None, + unblock: Optional[UnblockActionRequestPayload] = None, user: Optional[UserRequest] = None, ) -> StreamResponse[SubmitActionResponse]: json = build_body_dict( - action_type=action_type, - appeal_id=appeal_id, - item_id=item_id, - user_id=user_id, - ban=ban, - block=block, - custom=custom, - delete_activity=delete_activity, - delete_comment=delete_comment, - delete_message=delete_message, - delete_reaction=delete_reaction, - delete_user=delete_user, - mark_reviewed=mark_reviewed, - reject_appeal=reject_appeal, - restore=restore, - shadow_block=shadow_block, - unban=unban, - unblock=unblock, - user=user, + **{ + "action_type": action_type, + "appeal_id": appeal_id, + "item_id": item_id, + "user_id": user_id, + "ban": ban, + "block": block, + "custom": custom, + "delete_activity": delete_activity, + "delete_comment": delete_comment, + "delete_message": delete_message, + "delete_reaction": delete_reaction, + "delete_user": delete_user, + "flag": flag, + "mark_reviewed": mark_reviewed, + "reject_appeal": reject_appeal, + "restore": restore, + "shadow_block": shadow_block, + "unban": unban, + "unblock": unblock, + "user": user, + } ) return self.post( "/api/v2/moderation/submit_action", SubmitActionResponse, json=json @@ -554,11 +595,15 @@ def unban( unbanned_by: Optional[UserRequest] = None, ) -> StreamResponse[UnbanResponse]: query_params = build_query_param( - target_user_id=target_user_id, - channel_cid=channel_cid, - created_by=created_by, + **{ + "target_user_id": target_user_id, + "channel_cid": channel_cid, + "created_by": created_by, + } + ) + json = build_body_dict( + **{"unbanned_by_id": unbanned_by_id, "unbanned_by": unbanned_by} ) - json = build_body_dict(unbanned_by_id=unbanned_by_id, unbanned_by=unbanned_by) return self.post( "/api/v2/moderation/unban", UnbanResponse, @@ -573,5 +618,7 @@ def unmute( user_id: Optional[str] = None, user: Optional[UserRequest] = None, ) -> StreamResponse[UnmuteResponse]: - json = build_body_dict(target_ids=target_ids, user_id=user_id, user=user) + json = build_body_dict( + **{"target_ids": target_ids, "user_id": user_id, "user": user} + ) return self.post("/api/v2/moderation/unmute", UnmuteResponse, json=json) diff --git a/getstream/tests/test_webhook.py b/getstream/tests/test_webhook.py new file mode 100644 index 00000000..b5d7ecb9 --- /dev/null +++ b/getstream/tests/test_webhook.py @@ -0,0 +1,1054 @@ +# Code generated by GetStream internal OpenAPI code generator. DO NOT EDIT. + +import hmac +import hashlib + +import warnings + +import pytest + +from getstream.webhook import ( + get_event_type, + parse_webhook_event, + verify_webhook_signature, +) + + +class TestVerifyWebhookSignature: + def setup_method(self): + self.secret = "test-webhook-secret" + self.body = b'{"type":"test.event"}' + self.valid_signature = hmac.new( + self.secret.encode("utf-8"), self.body, hashlib.sha256 + ).hexdigest() + + def test_valid_signature(self): + assert ( + verify_webhook_signature(self.body, self.valid_signature, self.secret) + is True + ) + + def test_wrong_signature(self): + assert ( + verify_webhook_signature(self.body, "invalidsignature", self.secret) + is False + ) + + def test_tampered_body(self): + assert ( + verify_webhook_signature( + b'{"type":"tampered"}', self.valid_signature, self.secret + ) + is False + ) + + def test_wrong_secret(self): + assert ( + verify_webhook_signature(self.body, self.valid_signature, "wrong-secret") + is False + ) + + def test_string_body(self): + body_str = '{"type":"test.event"}' + sig = hmac.new( + self.secret.encode("utf-8"), body_str.encode("utf-8"), hashlib.sha256 + ).hexdigest() + assert verify_webhook_signature(body_str, sig, self.secret) is True + + +class TestGetEventType: + def test_from_string(self): + assert get_event_type('{"type":"message.new"}') == "message.new" + + def test_from_bytes(self): + assert get_event_type(b'{"type":"message.new"}') == "message.new" + + def test_from_dict(self): + assert get_event_type({"type": "message.new"}) == "message.new" + + def test_missing_type(self): + assert get_event_type('{"foo":"bar"}') == "" + + def test_invalid_json(self): + assert get_event_type("not json") == "" + + def test_empty_object(self): + assert get_event_type("{}") == "" + + +class TestParseWebhookEvent: + def test_parse_(self): + with warnings.catch_warnings(): + warnings.simplefilter("ignore", RuntimeWarning) + event = parse_webhook_event({"type": "*"}) + assert type(event).__name__ == "CustomEvent" + + def test_parse_appeal_accepted(self): + with warnings.catch_warnings(): + warnings.simplefilter("ignore", RuntimeWarning) + event = parse_webhook_event({"type": "appeal.accepted"}) + assert type(event).__name__ == "AppealAcceptedEvent" + + def test_parse_appeal_created(self): + with warnings.catch_warnings(): + warnings.simplefilter("ignore", RuntimeWarning) + event = parse_webhook_event({"type": "appeal.created"}) + assert type(event).__name__ == "AppealCreatedEvent" + + def test_parse_appeal_rejected(self): + with warnings.catch_warnings(): + warnings.simplefilter("ignore", RuntimeWarning) + event = parse_webhook_event({"type": "appeal.rejected"}) + assert type(event).__name__ == "AppealRejectedEvent" + + def test_parse_call_accepted(self): + with warnings.catch_warnings(): + warnings.simplefilter("ignore", RuntimeWarning) + event = parse_webhook_event({"type": "call.accepted"}) + assert type(event).__name__ == "CallAcceptedEvent" + + def test_parse_call_blocked_user(self): + with warnings.catch_warnings(): + warnings.simplefilter("ignore", RuntimeWarning) + event = parse_webhook_event({"type": "call.blocked_user"}) + assert type(event).__name__ == "BlockedUserEvent" + + def test_parse_call_closed_caption(self): + with warnings.catch_warnings(): + warnings.simplefilter("ignore", RuntimeWarning) + event = parse_webhook_event({"type": "call.closed_caption"}) + assert type(event).__name__ == "ClosedCaptionEvent" + + def test_parse_call_closed_captions_failed(self): + with warnings.catch_warnings(): + warnings.simplefilter("ignore", RuntimeWarning) + event = parse_webhook_event({"type": "call.closed_captions_failed"}) + assert type(event).__name__ == "CallClosedCaptionsFailedEvent" + + def test_parse_call_closed_captions_started(self): + with warnings.catch_warnings(): + warnings.simplefilter("ignore", RuntimeWarning) + event = parse_webhook_event({"type": "call.closed_captions_started"}) + assert type(event).__name__ == "CallClosedCaptionsStartedEvent" + + def test_parse_call_closed_captions_stopped(self): + with warnings.catch_warnings(): + warnings.simplefilter("ignore", RuntimeWarning) + event = parse_webhook_event({"type": "call.closed_captions_stopped"}) + assert type(event).__name__ == "CallClosedCaptionsStoppedEvent" + + def test_parse_call_created(self): + with warnings.catch_warnings(): + warnings.simplefilter("ignore", RuntimeWarning) + event = parse_webhook_event({"type": "call.created"}) + assert type(event).__name__ == "CallCreatedEvent" + + def test_parse_call_deleted(self): + with warnings.catch_warnings(): + warnings.simplefilter("ignore", RuntimeWarning) + event = parse_webhook_event({"type": "call.deleted"}) + assert type(event).__name__ == "CallDeletedEvent" + + def test_parse_call_dtmf(self): + with warnings.catch_warnings(): + warnings.simplefilter("ignore", RuntimeWarning) + event = parse_webhook_event({"type": "call.dtmf"}) + assert type(event).__name__ == "CallDTMFEvent" + + def test_parse_call_ended(self): + with warnings.catch_warnings(): + warnings.simplefilter("ignore", RuntimeWarning) + event = parse_webhook_event({"type": "call.ended"}) + assert type(event).__name__ == "CallEndedEvent" + + def test_parse_call_frame_recording_failed(self): + with warnings.catch_warnings(): + warnings.simplefilter("ignore", RuntimeWarning) + event = parse_webhook_event({"type": "call.frame_recording_failed"}) + assert type(event).__name__ == "CallFrameRecordingFailedEvent" + + def test_parse_call_frame_recording_ready(self): + with warnings.catch_warnings(): + warnings.simplefilter("ignore", RuntimeWarning) + event = parse_webhook_event({"type": "call.frame_recording_ready"}) + assert type(event).__name__ == "CallFrameRecordingFrameReadyEvent" + + def test_parse_call_frame_recording_started(self): + with warnings.catch_warnings(): + warnings.simplefilter("ignore", RuntimeWarning) + event = parse_webhook_event({"type": "call.frame_recording_started"}) + assert type(event).__name__ == "CallFrameRecordingStartedEvent" + + def test_parse_call_frame_recording_stopped(self): + with warnings.catch_warnings(): + warnings.simplefilter("ignore", RuntimeWarning) + event = parse_webhook_event({"type": "call.frame_recording_stopped"}) + assert type(event).__name__ == "CallFrameRecordingStoppedEvent" + + def test_parse_call_hls_broadcasting_failed(self): + with warnings.catch_warnings(): + warnings.simplefilter("ignore", RuntimeWarning) + event = parse_webhook_event({"type": "call.hls_broadcasting_failed"}) + assert type(event).__name__ == "CallHLSBroadcastingFailedEvent" + + def test_parse_call_hls_broadcasting_started(self): + with warnings.catch_warnings(): + warnings.simplefilter("ignore", RuntimeWarning) + event = parse_webhook_event({"type": "call.hls_broadcasting_started"}) + assert type(event).__name__ == "CallHLSBroadcastingStartedEvent" + + def test_parse_call_hls_broadcasting_stopped(self): + with warnings.catch_warnings(): + warnings.simplefilter("ignore", RuntimeWarning) + event = parse_webhook_event({"type": "call.hls_broadcasting_stopped"}) + assert type(event).__name__ == "CallHLSBroadcastingStoppedEvent" + + def test_parse_call_kicked_user(self): + with warnings.catch_warnings(): + warnings.simplefilter("ignore", RuntimeWarning) + event = parse_webhook_event({"type": "call.kicked_user"}) + assert type(event).__name__ == "KickedUserEvent" + + def test_parse_call_live_started(self): + with warnings.catch_warnings(): + warnings.simplefilter("ignore", RuntimeWarning) + event = parse_webhook_event({"type": "call.live_started"}) + assert type(event).__name__ == "CallLiveStartedEvent" + + def test_parse_call_member_added(self): + with warnings.catch_warnings(): + warnings.simplefilter("ignore", RuntimeWarning) + event = parse_webhook_event({"type": "call.member_added"}) + assert type(event).__name__ == "CallMemberAddedEvent" + + def test_parse_call_member_removed(self): + with warnings.catch_warnings(): + warnings.simplefilter("ignore", RuntimeWarning) + event = parse_webhook_event({"type": "call.member_removed"}) + assert type(event).__name__ == "CallMemberRemovedEvent" + + def test_parse_call_member_updated(self): + with warnings.catch_warnings(): + warnings.simplefilter("ignore", RuntimeWarning) + event = parse_webhook_event({"type": "call.member_updated"}) + assert type(event).__name__ == "CallMemberUpdatedEvent" + + def test_parse_call_member_updated_permission(self): + with warnings.catch_warnings(): + warnings.simplefilter("ignore", RuntimeWarning) + event = parse_webhook_event({"type": "call.member_updated_permission"}) + assert type(event).__name__ == "CallMemberUpdatedPermissionEvent" + + def test_parse_call_missed(self): + with warnings.catch_warnings(): + warnings.simplefilter("ignore", RuntimeWarning) + event = parse_webhook_event({"type": "call.missed"}) + assert type(event).__name__ == "CallMissedEvent" + + def test_parse_call_moderation_blur(self): + with warnings.catch_warnings(): + warnings.simplefilter("ignore", RuntimeWarning) + event = parse_webhook_event({"type": "call.moderation_blur"}) + assert type(event).__name__ == "CallModerationBlurEvent" + + def test_parse_call_moderation_warning(self): + with warnings.catch_warnings(): + warnings.simplefilter("ignore", RuntimeWarning) + event = parse_webhook_event({"type": "call.moderation_warning"}) + assert type(event).__name__ == "CallModerationWarningEvent" + + def test_parse_call_notification(self): + with warnings.catch_warnings(): + warnings.simplefilter("ignore", RuntimeWarning) + event = parse_webhook_event({"type": "call.notification"}) + assert type(event).__name__ == "CallNotificationEvent" + + def test_parse_call_permission_request(self): + with warnings.catch_warnings(): + warnings.simplefilter("ignore", RuntimeWarning) + event = parse_webhook_event({"type": "call.permission_request"}) + assert type(event).__name__ == "PermissionRequestEvent" + + def test_parse_call_permissions_updated(self): + with warnings.catch_warnings(): + warnings.simplefilter("ignore", RuntimeWarning) + event = parse_webhook_event({"type": "call.permissions_updated"}) + assert type(event).__name__ == "UpdatedCallPermissionsEvent" + + def test_parse_call_reaction_new(self): + with warnings.catch_warnings(): + warnings.simplefilter("ignore", RuntimeWarning) + event = parse_webhook_event({"type": "call.reaction_new"}) + assert type(event).__name__ == "CallReactionEvent" + + def test_parse_call_recording_failed(self): + with warnings.catch_warnings(): + warnings.simplefilter("ignore", RuntimeWarning) + event = parse_webhook_event({"type": "call.recording_failed"}) + assert type(event).__name__ == "CallRecordingFailedEvent" + + def test_parse_call_recording_ready(self): + with warnings.catch_warnings(): + warnings.simplefilter("ignore", RuntimeWarning) + event = parse_webhook_event({"type": "call.recording_ready"}) + assert type(event).__name__ == "CallRecordingReadyEvent" + + def test_parse_call_recording_started(self): + with warnings.catch_warnings(): + warnings.simplefilter("ignore", RuntimeWarning) + event = parse_webhook_event({"type": "call.recording_started"}) + assert type(event).__name__ == "CallRecordingStartedEvent" + + def test_parse_call_recording_stopped(self): + with warnings.catch_warnings(): + warnings.simplefilter("ignore", RuntimeWarning) + event = parse_webhook_event({"type": "call.recording_stopped"}) + assert type(event).__name__ == "CallRecordingStoppedEvent" + + def test_parse_call_rejected(self): + with warnings.catch_warnings(): + warnings.simplefilter("ignore", RuntimeWarning) + event = parse_webhook_event({"type": "call.rejected"}) + assert type(event).__name__ == "CallRejectedEvent" + + def test_parse_call_ring(self): + with warnings.catch_warnings(): + warnings.simplefilter("ignore", RuntimeWarning) + event = parse_webhook_event({"type": "call.ring"}) + assert type(event).__name__ == "CallRingEvent" + + def test_parse_call_rtmp_broadcast_failed(self): + with warnings.catch_warnings(): + warnings.simplefilter("ignore", RuntimeWarning) + event = parse_webhook_event({"type": "call.rtmp_broadcast_failed"}) + assert type(event).__name__ == "CallRtmpBroadcastFailedEvent" + + def test_parse_call_rtmp_broadcast_started(self): + with warnings.catch_warnings(): + warnings.simplefilter("ignore", RuntimeWarning) + event = parse_webhook_event({"type": "call.rtmp_broadcast_started"}) + assert type(event).__name__ == "CallRtmpBroadcastStartedEvent" + + def test_parse_call_rtmp_broadcast_stopped(self): + with warnings.catch_warnings(): + warnings.simplefilter("ignore", RuntimeWarning) + event = parse_webhook_event({"type": "call.rtmp_broadcast_stopped"}) + assert type(event).__name__ == "CallRtmpBroadcastStoppedEvent" + + def test_parse_call_session_ended(self): + with warnings.catch_warnings(): + warnings.simplefilter("ignore", RuntimeWarning) + event = parse_webhook_event({"type": "call.session_ended"}) + assert type(event).__name__ == "CallSessionEndedEvent" + + def test_parse_call_session_participant_count_updated(self): + with warnings.catch_warnings(): + warnings.simplefilter("ignore", RuntimeWarning) + event = parse_webhook_event( + {"type": "call.session_participant_count_updated"} + ) + assert type(event).__name__ == "CallSessionParticipantCountsUpdatedEvent" + + def test_parse_call_session_participant_joined(self): + with warnings.catch_warnings(): + warnings.simplefilter("ignore", RuntimeWarning) + event = parse_webhook_event({"type": "call.session_participant_joined"}) + assert type(event).__name__ == "CallSessionParticipantJoinedEvent" + + def test_parse_call_session_participant_left(self): + with warnings.catch_warnings(): + warnings.simplefilter("ignore", RuntimeWarning) + event = parse_webhook_event({"type": "call.session_participant_left"}) + assert type(event).__name__ == "CallSessionParticipantLeftEvent" + + def test_parse_call_session_started(self): + with warnings.catch_warnings(): + warnings.simplefilter("ignore", RuntimeWarning) + event = parse_webhook_event({"type": "call.session_started"}) + assert type(event).__name__ == "CallSessionStartedEvent" + + def test_parse_call_stats_report_ready(self): + with warnings.catch_warnings(): + warnings.simplefilter("ignore", RuntimeWarning) + event = parse_webhook_event({"type": "call.stats_report_ready"}) + assert type(event).__name__ == "CallStatsReportReadyEvent" + + def test_parse_call_transcription_failed(self): + with warnings.catch_warnings(): + warnings.simplefilter("ignore", RuntimeWarning) + event = parse_webhook_event({"type": "call.transcription_failed"}) + assert type(event).__name__ == "CallTranscriptionFailedEvent" + + def test_parse_call_transcription_ready(self): + with warnings.catch_warnings(): + warnings.simplefilter("ignore", RuntimeWarning) + event = parse_webhook_event({"type": "call.transcription_ready"}) + assert type(event).__name__ == "CallTranscriptionReadyEvent" + + def test_parse_call_transcription_started(self): + with warnings.catch_warnings(): + warnings.simplefilter("ignore", RuntimeWarning) + event = parse_webhook_event({"type": "call.transcription_started"}) + assert type(event).__name__ == "CallTranscriptionStartedEvent" + + def test_parse_call_transcription_stopped(self): + with warnings.catch_warnings(): + warnings.simplefilter("ignore", RuntimeWarning) + event = parse_webhook_event({"type": "call.transcription_stopped"}) + assert type(event).__name__ == "CallTranscriptionStoppedEvent" + + def test_parse_call_unblocked_user(self): + with warnings.catch_warnings(): + warnings.simplefilter("ignore", RuntimeWarning) + event = parse_webhook_event({"type": "call.unblocked_user"}) + assert type(event).__name__ == "UnblockedUserEvent" + + def test_parse_call_updated(self): + with warnings.catch_warnings(): + warnings.simplefilter("ignore", RuntimeWarning) + event = parse_webhook_event({"type": "call.updated"}) + assert type(event).__name__ == "CallUpdatedEvent" + + def test_parse_call_user_feedback_submitted(self): + with warnings.catch_warnings(): + warnings.simplefilter("ignore", RuntimeWarning) + event = parse_webhook_event({"type": "call.user_feedback_submitted"}) + assert type(event).__name__ == "CallUserFeedbackSubmittedEvent" + + def test_parse_call_user_muted(self): + with warnings.catch_warnings(): + warnings.simplefilter("ignore", RuntimeWarning) + event = parse_webhook_event({"type": "call.user_muted"}) + assert type(event).__name__ == "CallUserMutedEvent" + + def test_parse_campaign_completed(self): + with warnings.catch_warnings(): + warnings.simplefilter("ignore", RuntimeWarning) + event = parse_webhook_event({"type": "campaign.completed"}) + assert type(event).__name__ == "CampaignCompletedEvent" + + def test_parse_campaign_started(self): + with warnings.catch_warnings(): + warnings.simplefilter("ignore", RuntimeWarning) + event = parse_webhook_event({"type": "campaign.started"}) + assert type(event).__name__ == "CampaignStartedEvent" + + def test_parse_channel_created(self): + with warnings.catch_warnings(): + warnings.simplefilter("ignore", RuntimeWarning) + event = parse_webhook_event({"type": "channel.created"}) + assert type(event).__name__ == "ChannelCreatedEvent" + + def test_parse_channel_deleted(self): + with warnings.catch_warnings(): + warnings.simplefilter("ignore", RuntimeWarning) + event = parse_webhook_event({"type": "channel.deleted"}) + assert type(event).__name__ == "ChannelDeletedEvent" + + def test_parse_channel_frozen(self): + with warnings.catch_warnings(): + warnings.simplefilter("ignore", RuntimeWarning) + event = parse_webhook_event({"type": "channel.frozen"}) + assert type(event).__name__ == "ChannelFrozenEvent" + + def test_parse_channel_hidden(self): + with warnings.catch_warnings(): + warnings.simplefilter("ignore", RuntimeWarning) + event = parse_webhook_event({"type": "channel.hidden"}) + assert type(event).__name__ == "ChannelHiddenEvent" + + def test_parse_channel_max_streak_changed(self): + with warnings.catch_warnings(): + warnings.simplefilter("ignore", RuntimeWarning) + event = parse_webhook_event({"type": "channel.max_streak_changed"}) + assert type(event).__name__ == "MaxStreakChangedEvent" + + def test_parse_channel_muted(self): + with warnings.catch_warnings(): + warnings.simplefilter("ignore", RuntimeWarning) + event = parse_webhook_event({"type": "channel.muted"}) + assert type(event).__name__ == "ChannelMutedEvent" + + def test_parse_channel_truncated(self): + with warnings.catch_warnings(): + warnings.simplefilter("ignore", RuntimeWarning) + event = parse_webhook_event({"type": "channel.truncated"}) + assert type(event).__name__ == "ChannelTruncatedEvent" + + def test_parse_channel_unfrozen(self): + with warnings.catch_warnings(): + warnings.simplefilter("ignore", RuntimeWarning) + event = parse_webhook_event({"type": "channel.unfrozen"}) + assert type(event).__name__ == "ChannelUnFrozenEvent" + + def test_parse_channel_unmuted(self): + with warnings.catch_warnings(): + warnings.simplefilter("ignore", RuntimeWarning) + event = parse_webhook_event({"type": "channel.unmuted"}) + assert type(event).__name__ == "ChannelUnmutedEvent" + + def test_parse_channel_updated(self): + with warnings.catch_warnings(): + warnings.simplefilter("ignore", RuntimeWarning) + event = parse_webhook_event({"type": "channel.updated"}) + assert type(event).__name__ == "ChannelUpdatedEvent" + + def test_parse_channel_visible(self): + with warnings.catch_warnings(): + warnings.simplefilter("ignore", RuntimeWarning) + event = parse_webhook_event({"type": "channel.visible"}) + assert type(event).__name__ == "ChannelVisibleEvent" + + def test_parse_channel_batch_update_completed(self): + with warnings.catch_warnings(): + warnings.simplefilter("ignore", RuntimeWarning) + event = parse_webhook_event({"type": "channel_batch_update.completed"}) + assert type(event).__name__ == "ChannelBatchCompletedEvent" + + def test_parse_channel_batch_update_started(self): + with warnings.catch_warnings(): + warnings.simplefilter("ignore", RuntimeWarning) + event = parse_webhook_event({"type": "channel_batch_update.started"}) + assert type(event).__name__ == "ChannelBatchStartedEvent" + + def test_parse_custom(self): + with warnings.catch_warnings(): + warnings.simplefilter("ignore", RuntimeWarning) + event = parse_webhook_event({"type": "custom"}) + assert type(event).__name__ == "CustomVideoEvent" + + def test_parse_export_bulk_image_moderation_error(self): + with warnings.catch_warnings(): + warnings.simplefilter("ignore", RuntimeWarning) + event = parse_webhook_event({"type": "export.bulk_image_moderation.error"}) + assert type(event).__name__ == "AsyncExportErrorEvent" + + def test_parse_export_bulk_image_moderation_success(self): + with warnings.catch_warnings(): + warnings.simplefilter("ignore", RuntimeWarning) + event = parse_webhook_event( + {"type": "export.bulk_image_moderation.success"} + ) + assert type(event).__name__ == "AsyncBulkImageModerationEvent" + + def test_parse_export_channels_error(self): + with warnings.catch_warnings(): + warnings.simplefilter("ignore", RuntimeWarning) + event = parse_webhook_event({"type": "export.channels.error"}) + assert type(event).__name__ == "AsyncExportErrorEvent" + + def test_parse_export_channels_success(self): + with warnings.catch_warnings(): + warnings.simplefilter("ignore", RuntimeWarning) + event = parse_webhook_event({"type": "export.channels.success"}) + assert type(event).__name__ == "AsyncExportChannelsEvent" + + def test_parse_export_moderation_logs_error(self): + with warnings.catch_warnings(): + warnings.simplefilter("ignore", RuntimeWarning) + event = parse_webhook_event({"type": "export.moderation_logs.error"}) + assert type(event).__name__ == "AsyncExportErrorEvent" + + def test_parse_export_moderation_logs_success(self): + with warnings.catch_warnings(): + warnings.simplefilter("ignore", RuntimeWarning) + event = parse_webhook_event({"type": "export.moderation_logs.success"}) + assert type(event).__name__ == "AsyncExportModerationLogsEvent" + + def test_parse_export_users_error(self): + with warnings.catch_warnings(): + warnings.simplefilter("ignore", RuntimeWarning) + event = parse_webhook_event({"type": "export.users.error"}) + assert type(event).__name__ == "AsyncExportErrorEvent" + + def test_parse_export_users_success(self): + with warnings.catch_warnings(): + warnings.simplefilter("ignore", RuntimeWarning) + event = parse_webhook_event({"type": "export.users.success"}) + assert type(event).__name__ == "AsyncExportUsersEvent" + + def test_parse_feeds_activity_added(self): + with warnings.catch_warnings(): + warnings.simplefilter("ignore", RuntimeWarning) + event = parse_webhook_event({"type": "feeds.activity.added"}) + assert type(event).__name__ == "ActivityAddedEvent" + + def test_parse_feeds_activity_deleted(self): + with warnings.catch_warnings(): + warnings.simplefilter("ignore", RuntimeWarning) + event = parse_webhook_event({"type": "feeds.activity.deleted"}) + assert type(event).__name__ == "ActivityDeletedEvent" + + def test_parse_feeds_activity_feedback(self): + with warnings.catch_warnings(): + warnings.simplefilter("ignore", RuntimeWarning) + event = parse_webhook_event({"type": "feeds.activity.feedback"}) + assert type(event).__name__ == "ActivityFeedbackEvent" + + def test_parse_feeds_activity_marked(self): + with warnings.catch_warnings(): + warnings.simplefilter("ignore", RuntimeWarning) + event = parse_webhook_event({"type": "feeds.activity.marked"}) + assert type(event).__name__ == "ActivityMarkEvent" + + def test_parse_feeds_activity_pinned(self): + with warnings.catch_warnings(): + warnings.simplefilter("ignore", RuntimeWarning) + event = parse_webhook_event({"type": "feeds.activity.pinned"}) + assert type(event).__name__ == "ActivityPinnedEvent" + + def test_parse_feeds_activity_reaction_added(self): + with warnings.catch_warnings(): + warnings.simplefilter("ignore", RuntimeWarning) + event = parse_webhook_event({"type": "feeds.activity.reaction.added"}) + assert type(event).__name__ == "ActivityReactionAddedEvent" + + def test_parse_feeds_activity_reaction_deleted(self): + with warnings.catch_warnings(): + warnings.simplefilter("ignore", RuntimeWarning) + event = parse_webhook_event({"type": "feeds.activity.reaction.deleted"}) + assert type(event).__name__ == "ActivityReactionDeletedEvent" + + def test_parse_feeds_activity_reaction_updated(self): + with warnings.catch_warnings(): + warnings.simplefilter("ignore", RuntimeWarning) + event = parse_webhook_event({"type": "feeds.activity.reaction.updated"}) + assert type(event).__name__ == "ActivityReactionUpdatedEvent" + + def test_parse_feeds_activity_removed_from_feed(self): + with warnings.catch_warnings(): + warnings.simplefilter("ignore", RuntimeWarning) + event = parse_webhook_event({"type": "feeds.activity.removed_from_feed"}) + assert type(event).__name__ == "ActivityRemovedFromFeedEvent" + + def test_parse_feeds_activity_restored(self): + with warnings.catch_warnings(): + warnings.simplefilter("ignore", RuntimeWarning) + event = parse_webhook_event({"type": "feeds.activity.restored"}) + assert type(event).__name__ == "ActivityRestoredEvent" + + def test_parse_feeds_activity_unpinned(self): + with warnings.catch_warnings(): + warnings.simplefilter("ignore", RuntimeWarning) + event = parse_webhook_event({"type": "feeds.activity.unpinned"}) + assert type(event).__name__ == "ActivityUnpinnedEvent" + + def test_parse_feeds_activity_updated(self): + with warnings.catch_warnings(): + warnings.simplefilter("ignore", RuntimeWarning) + event = parse_webhook_event({"type": "feeds.activity.updated"}) + assert type(event).__name__ == "ActivityUpdatedEvent" + + def test_parse_feeds_bookmark_added(self): + with warnings.catch_warnings(): + warnings.simplefilter("ignore", RuntimeWarning) + event = parse_webhook_event({"type": "feeds.bookmark.added"}) + assert type(event).__name__ == "BookmarkAddedEvent" + + def test_parse_feeds_bookmark_deleted(self): + with warnings.catch_warnings(): + warnings.simplefilter("ignore", RuntimeWarning) + event = parse_webhook_event({"type": "feeds.bookmark.deleted"}) + assert type(event).__name__ == "BookmarkDeletedEvent" + + def test_parse_feeds_bookmark_updated(self): + with warnings.catch_warnings(): + warnings.simplefilter("ignore", RuntimeWarning) + event = parse_webhook_event({"type": "feeds.bookmark.updated"}) + assert type(event).__name__ == "BookmarkUpdatedEvent" + + def test_parse_feeds_bookmark_folder_deleted(self): + with warnings.catch_warnings(): + warnings.simplefilter("ignore", RuntimeWarning) + event = parse_webhook_event({"type": "feeds.bookmark_folder.deleted"}) + assert type(event).__name__ == "BookmarkFolderDeletedEvent" + + def test_parse_feeds_bookmark_folder_updated(self): + with warnings.catch_warnings(): + warnings.simplefilter("ignore", RuntimeWarning) + event = parse_webhook_event({"type": "feeds.bookmark_folder.updated"}) + assert type(event).__name__ == "BookmarkFolderUpdatedEvent" + + def test_parse_feeds_comment_added(self): + with warnings.catch_warnings(): + warnings.simplefilter("ignore", RuntimeWarning) + event = parse_webhook_event({"type": "feeds.comment.added"}) + assert type(event).__name__ == "CommentAddedEvent" + + def test_parse_feeds_comment_deleted(self): + with warnings.catch_warnings(): + warnings.simplefilter("ignore", RuntimeWarning) + event = parse_webhook_event({"type": "feeds.comment.deleted"}) + assert type(event).__name__ == "CommentDeletedEvent" + + def test_parse_feeds_comment_reaction_added(self): + with warnings.catch_warnings(): + warnings.simplefilter("ignore", RuntimeWarning) + event = parse_webhook_event({"type": "feeds.comment.reaction.added"}) + assert type(event).__name__ == "CommentReactionAddedEvent" + + def test_parse_feeds_comment_reaction_deleted(self): + with warnings.catch_warnings(): + warnings.simplefilter("ignore", RuntimeWarning) + event = parse_webhook_event({"type": "feeds.comment.reaction.deleted"}) + assert type(event).__name__ == "CommentReactionDeletedEvent" + + def test_parse_feeds_comment_reaction_updated(self): + with warnings.catch_warnings(): + warnings.simplefilter("ignore", RuntimeWarning) + event = parse_webhook_event({"type": "feeds.comment.reaction.updated"}) + assert type(event).__name__ == "CommentReactionUpdatedEvent" + + def test_parse_feeds_comment_updated(self): + with warnings.catch_warnings(): + warnings.simplefilter("ignore", RuntimeWarning) + event = parse_webhook_event({"type": "feeds.comment.updated"}) + assert type(event).__name__ == "CommentUpdatedEvent" + + def test_parse_feeds_feed_created(self): + with warnings.catch_warnings(): + warnings.simplefilter("ignore", RuntimeWarning) + event = parse_webhook_event({"type": "feeds.feed.created"}) + assert type(event).__name__ == "FeedCreatedEvent" + + def test_parse_feeds_feed_deleted(self): + with warnings.catch_warnings(): + warnings.simplefilter("ignore", RuntimeWarning) + event = parse_webhook_event({"type": "feeds.feed.deleted"}) + assert type(event).__name__ == "FeedDeletedEvent" + + def test_parse_feeds_feed_updated(self): + with warnings.catch_warnings(): + warnings.simplefilter("ignore", RuntimeWarning) + event = parse_webhook_event({"type": "feeds.feed.updated"}) + assert type(event).__name__ == "FeedUpdatedEvent" + + def test_parse_feeds_feed_group_changed(self): + with warnings.catch_warnings(): + warnings.simplefilter("ignore", RuntimeWarning) + event = parse_webhook_event({"type": "feeds.feed_group.changed"}) + assert type(event).__name__ == "FeedGroupChangedEvent" + + def test_parse_feeds_feed_group_deleted(self): + with warnings.catch_warnings(): + warnings.simplefilter("ignore", RuntimeWarning) + event = parse_webhook_event({"type": "feeds.feed_group.deleted"}) + assert type(event).__name__ == "FeedGroupDeletedEvent" + + def test_parse_feeds_feed_member_added(self): + with warnings.catch_warnings(): + warnings.simplefilter("ignore", RuntimeWarning) + event = parse_webhook_event({"type": "feeds.feed_member.added"}) + assert type(event).__name__ == "FeedMemberAddedEvent" + + def test_parse_feeds_feed_member_removed(self): + with warnings.catch_warnings(): + warnings.simplefilter("ignore", RuntimeWarning) + event = parse_webhook_event({"type": "feeds.feed_member.removed"}) + assert type(event).__name__ == "FeedMemberRemovedEvent" + + def test_parse_feeds_feed_member_updated(self): + with warnings.catch_warnings(): + warnings.simplefilter("ignore", RuntimeWarning) + event = parse_webhook_event({"type": "feeds.feed_member.updated"}) + assert type(event).__name__ == "FeedMemberUpdatedEvent" + + def test_parse_feeds_follow_created(self): + with warnings.catch_warnings(): + warnings.simplefilter("ignore", RuntimeWarning) + event = parse_webhook_event({"type": "feeds.follow.created"}) + assert type(event).__name__ == "FollowCreatedEvent" + + def test_parse_feeds_follow_deleted(self): + with warnings.catch_warnings(): + warnings.simplefilter("ignore", RuntimeWarning) + event = parse_webhook_event({"type": "feeds.follow.deleted"}) + assert type(event).__name__ == "FollowDeletedEvent" + + def test_parse_feeds_follow_updated(self): + with warnings.catch_warnings(): + warnings.simplefilter("ignore", RuntimeWarning) + event = parse_webhook_event({"type": "feeds.follow.updated"}) + assert type(event).__name__ == "FollowUpdatedEvent" + + def test_parse_feeds_notification_feed_updated(self): + with warnings.catch_warnings(): + warnings.simplefilter("ignore", RuntimeWarning) + event = parse_webhook_event({"type": "feeds.notification_feed.updated"}) + assert type(event).__name__ == "NotificationFeedUpdatedEvent" + + def test_parse_feeds_stories_feed_updated(self): + with warnings.catch_warnings(): + warnings.simplefilter("ignore", RuntimeWarning) + event = parse_webhook_event({"type": "feeds.stories_feed.updated"}) + assert type(event).__name__ == "StoriesFeedUpdatedEvent" + + def test_parse_flag_updated(self): + with warnings.catch_warnings(): + warnings.simplefilter("ignore", RuntimeWarning) + event = parse_webhook_event({"type": "flag.updated"}) + assert type(event).__name__ == "FlagUpdatedEvent" + + def test_parse_ingress_error(self): + with warnings.catch_warnings(): + warnings.simplefilter("ignore", RuntimeWarning) + event = parse_webhook_event({"type": "ingress.error"}) + assert type(event).__name__ == "IngressErrorEvent" + + def test_parse_ingress_started(self): + with warnings.catch_warnings(): + warnings.simplefilter("ignore", RuntimeWarning) + event = parse_webhook_event({"type": "ingress.started"}) + assert type(event).__name__ == "IngressStartedEvent" + + def test_parse_ingress_stopped(self): + with warnings.catch_warnings(): + warnings.simplefilter("ignore", RuntimeWarning) + event = parse_webhook_event({"type": "ingress.stopped"}) + assert type(event).__name__ == "IngressStoppedEvent" + + def test_parse_member_added(self): + with warnings.catch_warnings(): + warnings.simplefilter("ignore", RuntimeWarning) + event = parse_webhook_event({"type": "member.added"}) + assert type(event).__name__ == "MemberAddedEvent" + + def test_parse_member_removed(self): + with warnings.catch_warnings(): + warnings.simplefilter("ignore", RuntimeWarning) + event = parse_webhook_event({"type": "member.removed"}) + assert type(event).__name__ == "MemberRemovedEvent" + + def test_parse_member_updated(self): + with warnings.catch_warnings(): + warnings.simplefilter("ignore", RuntimeWarning) + event = parse_webhook_event({"type": "member.updated"}) + assert type(event).__name__ == "MemberUpdatedEvent" + + def test_parse_message_deleted(self): + with warnings.catch_warnings(): + warnings.simplefilter("ignore", RuntimeWarning) + event = parse_webhook_event({"type": "message.deleted"}) + assert type(event).__name__ == "MessageDeletedEvent" + + def test_parse_message_flagged(self): + with warnings.catch_warnings(): + warnings.simplefilter("ignore", RuntimeWarning) + event = parse_webhook_event({"type": "message.flagged"}) + assert type(event).__name__ == "MessageFlaggedEvent" + + def test_parse_message_new(self): + with warnings.catch_warnings(): + warnings.simplefilter("ignore", RuntimeWarning) + event = parse_webhook_event({"type": "message.new"}) + assert type(event).__name__ == "MessageNewEvent" + + def test_parse_message_pending(self): + with warnings.catch_warnings(): + warnings.simplefilter("ignore", RuntimeWarning) + event = parse_webhook_event({"type": "message.pending"}) + assert type(event).__name__ == "PendingMessageEvent" + + def test_parse_message_read(self): + with warnings.catch_warnings(): + warnings.simplefilter("ignore", RuntimeWarning) + event = parse_webhook_event({"type": "message.read"}) + assert type(event).__name__ == "MessageReadEvent" + + def test_parse_message_unblocked(self): + with warnings.catch_warnings(): + warnings.simplefilter("ignore", RuntimeWarning) + event = parse_webhook_event({"type": "message.unblocked"}) + assert type(event).__name__ == "MessageUnblockedEvent" + + def test_parse_message_undeleted(self): + with warnings.catch_warnings(): + warnings.simplefilter("ignore", RuntimeWarning) + event = parse_webhook_event({"type": "message.undeleted"}) + assert type(event).__name__ == "MessageUndeletedEvent" + + def test_parse_message_updated(self): + with warnings.catch_warnings(): + warnings.simplefilter("ignore", RuntimeWarning) + event = parse_webhook_event({"type": "message.updated"}) + assert type(event).__name__ == "MessageUpdatedEvent" + + def test_parse_moderation_custom_action(self): + with warnings.catch_warnings(): + warnings.simplefilter("ignore", RuntimeWarning) + event = parse_webhook_event({"type": "moderation.custom_action"}) + assert type(event).__name__ == "ModerationCustomActionEvent" + + def test_parse_moderation_flagged(self): + with warnings.catch_warnings(): + warnings.simplefilter("ignore", RuntimeWarning) + event = parse_webhook_event({"type": "moderation.flagged"}) + assert type(event).__name__ == "ModerationFlaggedEvent" + + def test_parse_moderation_mark_reviewed(self): + with warnings.catch_warnings(): + warnings.simplefilter("ignore", RuntimeWarning) + event = parse_webhook_event({"type": "moderation.mark_reviewed"}) + assert type(event).__name__ == "ModerationMarkReviewedEvent" + + def test_parse_moderation_check_completed(self): + with warnings.catch_warnings(): + warnings.simplefilter("ignore", RuntimeWarning) + event = parse_webhook_event({"type": "moderation_check.completed"}) + assert type(event).__name__ == "ModerationCheckCompletedEvent" + + def test_parse_moderation_rule_triggered(self): + with warnings.catch_warnings(): + warnings.simplefilter("ignore", RuntimeWarning) + event = parse_webhook_event({"type": "moderation_rule.triggered"}) + assert type(event).__name__ == "ModerationRulesTriggeredEvent" + + def test_parse_notification_mark_unread(self): + with warnings.catch_warnings(): + warnings.simplefilter("ignore", RuntimeWarning) + event = parse_webhook_event({"type": "notification.mark_unread"}) + assert type(event).__name__ == "NotificationMarkUnreadEvent" + + def test_parse_notification_reminder_due(self): + with warnings.catch_warnings(): + warnings.simplefilter("ignore", RuntimeWarning) + event = parse_webhook_event({"type": "notification.reminder_due"}) + assert type(event).__name__ == "ReminderNotificationEvent" + + def test_parse_notification_thread_message_new(self): + with warnings.catch_warnings(): + warnings.simplefilter("ignore", RuntimeWarning) + event = parse_webhook_event({"type": "notification.thread_message_new"}) + assert type(event).__name__ == "NotificationThreadMessageNewEvent" + + def test_parse_reaction_deleted(self): + with warnings.catch_warnings(): + warnings.simplefilter("ignore", RuntimeWarning) + event = parse_webhook_event({"type": "reaction.deleted"}) + assert type(event).__name__ == "ReactionDeletedEvent" + + def test_parse_reaction_new(self): + with warnings.catch_warnings(): + warnings.simplefilter("ignore", RuntimeWarning) + event = parse_webhook_event({"type": "reaction.new"}) + assert type(event).__name__ == "ReactionNewEvent" + + def test_parse_reaction_updated(self): + with warnings.catch_warnings(): + warnings.simplefilter("ignore", RuntimeWarning) + event = parse_webhook_event({"type": "reaction.updated"}) + assert type(event).__name__ == "ReactionUpdatedEvent" + + def test_parse_reminder_created(self): + with warnings.catch_warnings(): + warnings.simplefilter("ignore", RuntimeWarning) + event = parse_webhook_event({"type": "reminder.created"}) + assert type(event).__name__ == "ReminderCreatedEvent" + + def test_parse_reminder_deleted(self): + with warnings.catch_warnings(): + warnings.simplefilter("ignore", RuntimeWarning) + event = parse_webhook_event({"type": "reminder.deleted"}) + assert type(event).__name__ == "ReminderDeletedEvent" + + def test_parse_reminder_updated(self): + with warnings.catch_warnings(): + warnings.simplefilter("ignore", RuntimeWarning) + event = parse_webhook_event({"type": "reminder.updated"}) + assert type(event).__name__ == "ReminderUpdatedEvent" + + def test_parse_review_queue_item_new(self): + with warnings.catch_warnings(): + warnings.simplefilter("ignore", RuntimeWarning) + event = parse_webhook_event({"type": "review_queue_item.new"}) + assert type(event).__name__ == "ReviewQueueItemNewEvent" + + def test_parse_review_queue_item_updated(self): + with warnings.catch_warnings(): + warnings.simplefilter("ignore", RuntimeWarning) + event = parse_webhook_event({"type": "review_queue_item.updated"}) + assert type(event).__name__ == "ReviewQueueItemUpdatedEvent" + + def test_parse_thread_updated(self): + with warnings.catch_warnings(): + warnings.simplefilter("ignore", RuntimeWarning) + event = parse_webhook_event({"type": "thread.updated"}) + assert type(event).__name__ == "ThreadUpdatedEvent" + + def test_parse_user_banned(self): + with warnings.catch_warnings(): + warnings.simplefilter("ignore", RuntimeWarning) + event = parse_webhook_event({"type": "user.banned"}) + assert type(event).__name__ == "UserBannedEvent" + + def test_parse_user_deactivated(self): + with warnings.catch_warnings(): + warnings.simplefilter("ignore", RuntimeWarning) + event = parse_webhook_event({"type": "user.deactivated"}) + assert type(event).__name__ == "UserDeactivatedEvent" + + def test_parse_user_deleted(self): + with warnings.catch_warnings(): + warnings.simplefilter("ignore", RuntimeWarning) + event = parse_webhook_event({"type": "user.deleted"}) + assert type(event).__name__ == "UserDeletedEvent" + + def test_parse_user_flagged(self): + with warnings.catch_warnings(): + warnings.simplefilter("ignore", RuntimeWarning) + event = parse_webhook_event({"type": "user.flagged"}) + assert type(event).__name__ == "UserFlaggedEvent" + + def test_parse_user_messages_deleted(self): + with warnings.catch_warnings(): + warnings.simplefilter("ignore", RuntimeWarning) + event = parse_webhook_event({"type": "user.messages.deleted"}) + assert type(event).__name__ == "UserMessagesDeletedEvent" + + def test_parse_user_muted(self): + with warnings.catch_warnings(): + warnings.simplefilter("ignore", RuntimeWarning) + event = parse_webhook_event({"type": "user.muted"}) + assert type(event).__name__ == "UserMutedEvent" + + def test_parse_user_reactivated(self): + with warnings.catch_warnings(): + warnings.simplefilter("ignore", RuntimeWarning) + event = parse_webhook_event({"type": "user.reactivated"}) + assert type(event).__name__ == "UserReactivatedEvent" + + def test_parse_user_unbanned(self): + with warnings.catch_warnings(): + warnings.simplefilter("ignore", RuntimeWarning) + event = parse_webhook_event({"type": "user.unbanned"}) + assert type(event).__name__ == "UserUnbannedEvent" + + def test_parse_user_unmuted(self): + with warnings.catch_warnings(): + warnings.simplefilter("ignore", RuntimeWarning) + event = parse_webhook_event({"type": "user.unmuted"}) + assert type(event).__name__ == "UserUnmutedEvent" + + def test_parse_user_unread_message_reminder(self): + with warnings.catch_warnings(): + warnings.simplefilter("ignore", RuntimeWarning) + event = parse_webhook_event({"type": "user.unread_message_reminder"}) + assert type(event).__name__ == "UserUnreadReminderEvent" + + def test_parse_user_updated(self): + with warnings.catch_warnings(): + warnings.simplefilter("ignore", RuntimeWarning) + event = parse_webhook_event({"type": "user.updated"}) + assert type(event).__name__ == "UserUpdatedEvent" + + def test_unknown_event_type(self): + with pytest.raises(ValueError, match="Unknown webhook event type"): + parse_webhook_event({"type": "unknown.event"}) + + def test_missing_type_field(self): + with pytest.raises(ValueError, match="missing 'type' field"): + parse_webhook_event({"foo": "bar"}) + + def test_invalid_json(self): + with pytest.raises(ValueError, match="Failed to parse"): + parse_webhook_event("not json") diff --git a/getstream/utils/__init__.py b/getstream/utils/__init__.py index 25756ecd..13ddfcbe 100644 --- a/getstream/utils/__init__.py +++ b/getstream/utils/__init__.py @@ -93,12 +93,22 @@ def datetime_from_unix_ns( raise TypeError(f"Unsupported type for ts: {type(ts)}") +def _serialize_query_value(value) -> str: + """Serialize a single value for use in a query parameter.""" + if hasattr(value, "to_json") and callable(value.to_json): + return value.to_json() + if isinstance(value, datetime): + return value.isoformat() + return str(value) + + def build_query_param(**kwargs): """ Constructs a dictionary of query parameters from keyword arguments. This function handles various data types: - JSON-serializable objects with a `to_json` method will be serialized using that method. + - datetime objects are converted to ISO 8601 strings. - Booleans are converted to lowercase strings. - Lists are converted to comma-separated strings with URL-encoded values. - Other types (strings, integers, dictionaries) are handled appropriately. @@ -115,13 +125,14 @@ def build_query_param(**kwargs): continue if hasattr(value, "to_json") and callable(value.to_json): params[key] = value.to_json() + elif isinstance(value, datetime): + params[key] = encode_datetime(value) elif isinstance(value, bool): params[key] = str(value).lower() elif isinstance(value, (str, int)): params[key] = str(value) elif isinstance(value, list): - # Process each element, escaping commas in the string representation - params[key] = ",".join(quote(str(v)) for v in value) + params[key] = ",".join(quote(_serialize_query_value(v)) for v in value) else: # For dictionaries or any other types of objects params[key] = json.dumps(value) diff --git a/getstream/video/async_call.py b/getstream/video/async_call.py index 2fe0b7ea..ec7fd972 100644 --- a/getstream/video/async_call.py +++ b/getstream/video/async_call.py @@ -273,6 +273,32 @@ async def list_recordings(self) -> StreamResponse[ListRecordingsResponse]: self._sync_from_response(response.data) return response + @attach_call_cid_async + async def start_recording( + self, recording_type: str, recording_external_storage: Optional[str] = None + ) -> StreamResponse[StartRecordingResponse]: + response = await self.client.start_recording( + type=self.call_type, + id=self.id, + recording_type=recording_type, + recording_external_storage=recording_external_storage, + ) + self._sync_from_response(response.data) + return response + + @attach_call_cid_async + async def stop_recording( + self, + recording_type: str, + ) -> StreamResponse[StopRecordingResponse]: + response = await self.client.stop_recording( + type=self.call_type, + id=self.id, + recording_type=recording_type, + ) + self._sync_from_response(response.data) + return response + @attach_call_cid_async async def get_call_report( self, session_id: Optional[str] = None @@ -326,6 +352,48 @@ async def stop_rtmp_broadcast( self._sync_from_response(response.data) return response + @attach_call_cid_async + async def get_call_participant_session_metrics( + self, + session: str, + user: str, + user_session: str, + since: Optional[datetime] = None, + until: Optional[datetime] = None, + ) -> StreamResponse[GetCallParticipantSessionMetricsResponse]: + response = await self.client.get_call_participant_session_metrics( + type=self.call_type, + id=self.id, + session=session, + user=user, + user_session=user_session, + since=since, + until=until, + ) + self._sync_from_response(response.data) + return response + + @attach_call_cid_async + async def query_call_participant_sessions( + self, + session: str, + limit: Optional[int] = None, + prev: Optional[str] = None, + next: Optional[str] = None, + filter_conditions: Optional[Dict[str, object]] = None, + ) -> StreamResponse[QueryCallParticipantSessionsResponse]: + response = await self.client.query_call_participant_sessions( + type=self.call_type, + id=self.id, + session=session, + limit=limit, + prev=prev, + next=next, + filter_conditions=filter_conditions, + ) + self._sync_from_response(response.data) + return response + @attach_call_cid_async async def start_hls_broadcasting( self, @@ -367,18 +435,6 @@ async def start_frame_recording( self._sync_from_response(response.data) return response - @attach_call_cid_async - async def start_recording( - self, recording_external_storage: Optional[str] = None - ) -> StreamResponse[StartRecordingResponse]: - response = await self.client.start_recording( - type=self.call_type, - id=self.id, - recording_external_storage=recording_external_storage, - ) - self._sync_from_response(response.data) - return response - @attach_call_cid_async async def start_transcription( self, @@ -451,17 +507,6 @@ async def stop_live( self._sync_from_response(response.data) return response - @attach_call_cid_async - async def stop_recording( - self, - ) -> StreamResponse[StopRecordingResponse]: - response = await self.client.stop_recording( - type=self.call_type, - id=self.id, - ) - self._sync_from_response(response.data) - return response - @attach_call_cid_async async def stop_transcription( self, stop_closed_captions: Optional[bool] = None diff --git a/getstream/video/async_rest_client.py b/getstream/video/async_rest_client.py index 815a4059..6a3580ed 100644 --- a/getstream/video/async_rest_client.py +++ b/getstream/video/async_rest_client.py @@ -49,13 +49,15 @@ async def query_user_feedback( sort: Optional[List[SortParamRequest]] = None, filter_conditions: Optional[Dict[str, object]] = None, ) -> StreamResponse[QueryUserFeedbackResponse]: - query_params = build_query_param(full=full) + query_params = build_query_param(**{"full": full}) json = build_body_dict( - limit=limit, - next=next, - prev=prev, - sort=sort, - filter_conditions=filter_conditions, + **{ + "limit": limit, + "next": next, + "prev": prev, + "sort": sort, + "filter_conditions": filter_conditions, + } ) return await self.post( "/api/v2/video/call/feedback", @@ -76,13 +78,15 @@ async def query_call_members( filter_conditions: Optional[Dict[str, object]] = None, ) -> StreamResponse[QueryCallMembersResponse]: json = build_body_dict( - id=id, - type=type, - limit=limit, - next=next, - prev=prev, - sort=sort, - filter_conditions=filter_conditions, + **{ + "id": id, + "type": type, + "limit": limit, + "next": next, + "prev": prev, + "sort": sort, + "filter_conditions": filter_conditions, + } ) return await self.post( "/api/v2/video/call/members", QueryCallMembersResponse, json=json @@ -98,11 +102,13 @@ async def query_call_stats( filter_conditions: Optional[Dict[str, object]] = None, ) -> StreamResponse[QueryCallStatsResponse]: json = build_body_dict( - limit=limit, - next=next, - prev=prev, - sort=sort, - filter_conditions=filter_conditions, + **{ + "limit": limit, + "next": next, + "prev": prev, + "sort": sort, + "filter_conditions": filter_conditions, + } ) return await self.post( "/api/v2/video/call/stats", QueryCallStatsResponse, json=json @@ -119,7 +125,12 @@ async def get_call( video: Optional[bool] = 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, + } ) path_params = { "type": type, @@ -146,7 +157,11 @@ async def update_call( "id": id, } json = build_body_dict( - starts_at=starts_at, custom=custom, settings_override=settings_override + **{ + "starts_at": starts_at, + "custom": custom, + "settings_override": settings_override, + } ) return await self.patch( "/api/v2/video/call/{type}/{id}", @@ -171,11 +186,13 @@ async def get_or_create_call( "id": id, } json = build_body_dict( - members_limit=members_limit, - notify=notify, - ring=ring, - video=video, - data=data, + **{ + "members_limit": members_limit, + "notify": notify, + "ring": ring, + "video": video, + "data": data, + } ) return await self.post( "/api/v2/video/call/{type}/{id}", @@ -192,7 +209,7 @@ async def block_user( "type": type, "id": id, } - json = build_body_dict(user_id=user_id) + json = build_body_dict(**{"user_id": user_id}) return await self.post( "/api/v2/video/call/{type}/{id}/block", BlockUserResponse, @@ -220,15 +237,17 @@ async def send_closed_caption( "id": id, } json = build_body_dict( - speaker_id=speaker_id, - text=text, - end_time=end_time, - language=language, - service=service, - start_time=start_time, - translated=translated, - user_id=user_id, - user=user, + **{ + "speaker_id": speaker_id, + "text": text, + "end_time": end_time, + "language": language, + "service": service, + "start_time": start_time, + "translated": translated, + "user_id": user_id, + "user": user, + } ) return await self.post( "/api/v2/video/call/{type}/{id}/closed_captions", @@ -245,7 +264,7 @@ async def delete_call( "type": type, "id": id, } - json = build_body_dict(hard=hard) + json = build_body_dict(**{"hard": hard}) return await self.post( "/api/v2/video/call/{type}/{id}/delete", DeleteCallResponse, @@ -266,7 +285,7 @@ async def send_call_event( "type": type, "id": id, } - json = build_body_dict(user_id=user_id, custom=custom, user=user) + json = build_body_dict(**{"user_id": user_id, "custom": custom, "user": user}) return await self.post( "/api/v2/video/call/{type}/{id}/event", SendCallEventResponse, @@ -291,12 +310,14 @@ async def collect_user_feedback( "id": id, } json = build_body_dict( - rating=rating, - sdk=sdk, - sdk_version=sdk_version, - reason=reason, - user_session_id=user_session_id, - custom=custom, + **{ + "rating": rating, + "sdk": sdk, + "sdk_version": sdk_version, + "reason": reason, + "user_session_id": user_session_id, + "custom": custom, + } ) return await self.post( "/api/v2/video/call/{type}/{id}/feedback", @@ -325,15 +346,17 @@ async def go_live( "id": id, } json = build_body_dict( - recording_storage_name=recording_storage_name, - start_closed_caption=start_closed_caption, - start_composite_recording=start_composite_recording, - start_hls=start_hls, - start_individual_recording=start_individual_recording, - start_raw_recording=start_raw_recording, - start_recording=start_recording, - start_transcription=start_transcription, - transcription_storage_name=transcription_storage_name, + **{ + "recording_storage_name": recording_storage_name, + "start_closed_caption": start_closed_caption, + "start_composite_recording": start_composite_recording, + "start_hls": start_hls, + "start_individual_recording": start_individual_recording, + "start_raw_recording": start_raw_recording, + "start_recording": start_recording, + "start_transcription": start_transcription, + "transcription_storage_name": transcription_storage_name, + } ) return await self.post( "/api/v2/video/call/{type}/{id}/go_live", @@ -357,7 +380,12 @@ async def kick_user( "id": id, } json = build_body_dict( - user_id=user_id, block=block, kicked_by_id=kicked_by_id, kicked_by=kicked_by + **{ + "user_id": user_id, + "block": block, + "kicked_by_id": kicked_by_id, + "kicked_by": kicked_by, + } ) return await self.post( "/api/v2/video/call/{type}/{id}/kick", @@ -391,7 +419,7 @@ async def update_call_members( "id": id, } json = build_body_dict( - remove_members=remove_members, update_members=update_members + **{"remove_members": remove_members, "update_members": update_members} ) return await self.post( "/api/v2/video/call/{type}/{id}/members", @@ -419,14 +447,16 @@ async def mute_users( "id": id, } json = build_body_dict( - audio=audio, - mute_all_users=mute_all_users, - muted_by_id=muted_by_id, - screenshare=screenshare, - screenshare_audio=screenshare_audio, - video=video, - user_ids=user_ids, - muted_by=muted_by, + **{ + "audio": audio, + "mute_all_users": mute_all_users, + "muted_by_id": muted_by_id, + "screenshare": screenshare, + "screenshare_audio": screenshare_audio, + "video": video, + "user_ids": user_ids, + "muted_by": muted_by, + } ) return await self.post( "/api/v2/video/call/{type}/{id}/mute_users", @@ -443,12 +473,12 @@ async def query_call_participants( limit: Optional[int] = None, filter_conditions: Optional[Dict[str, object]] = None, ) -> StreamResponse[QueryCallParticipantsResponse]: - query_params = build_query_param(limit=limit) + query_params = build_query_param(**{"limit": limit}) path_params = { "id": id, "type": type, } - json = build_body_dict(filter_conditions=filter_conditions) + json = build_body_dict(**{"filter_conditions": filter_conditions}) return await self.post( "/api/v2/video/call/{type}/{id}/participants", QueryCallParticipantsResponse, @@ -465,7 +495,7 @@ async def video_pin( "type": type, "id": id, } - json = build_body_dict(session_id=session_id, user_id=user_id) + json = build_body_dict(**{"session_id": session_id, "user_id": user_id}) return await self.post( "/api/v2/video/call/{type}/{id}/pin", PinResponse, @@ -487,11 +517,54 @@ async def list_recordings( path_params=path_params, ) + @telemetry.operation_name("getstream.api.video.start_recording") + async def start_recording( + self, + type: str, + id: str, + recording_type: str, + recording_external_storage: Optional[str] = None, + ) -> StreamResponse[StartRecordingResponse]: + path_params = { + "type": type, + "id": id, + "recording_type": recording_type, + } + json = build_body_dict( + **{"recording_external_storage": recording_external_storage} + ) + return await self.post( + "/api/v2/video/call/{type}/{id}/recordings/{recording_type}/start", + StartRecordingResponse, + path_params=path_params, + json=json, + ) + + @telemetry.operation_name("getstream.api.video.stop_recording") + async def stop_recording( + self, + type: str, + id: str, + recording_type: str, + ) -> StreamResponse[StopRecordingResponse]: + path_params = { + "type": type, + "id": id, + "recording_type": recording_type, + } + json = build_body_dict(**{}) + return await self.post( + "/api/v2/video/call/{type}/{id}/recordings/{recording_type}/stop", + StopRecordingResponse, + path_params=path_params, + json=json, + ) + @telemetry.operation_name("getstream.api.video.get_call_report") async def get_call_report( self, type: str, id: str, session_id: Optional[str] = None ) -> StreamResponse[GetCallReportResponse]: - query_params = build_query_param(session_id=session_id) + query_params = build_query_param(**{"session_id": session_id}) path_params = { "type": type, "id": id, @@ -515,7 +588,7 @@ async def ring_call( "type": type, "id": id, } - json = build_body_dict(video=video, members_ids=members_ids) + json = build_body_dict(**{"video": video, "members_ids": members_ids}) return await self.post( "/api/v2/video/call/{type}/{id}/ring", RingCallResponse, @@ -531,7 +604,7 @@ async def start_rtmp_broadcasts( "type": type, "id": id, } - json = build_body_dict(broadcasts=broadcasts) + json = build_body_dict(**{"broadcasts": broadcasts}) return await self.post( "/api/v2/video/call/{type}/{id}/rtmp_broadcasts", StartRTMPBroadcastsResponse, @@ -565,7 +638,7 @@ async def stop_rtmp_broadcast( "id": id, "name": name, } - json = build_body_dict() + json = build_body_dict(**{}) return await self.post( "/api/v2/video/call/{type}/{id}/rtmp_broadcasts/{name}/stop", StopRTMPBroadcastsResponse, @@ -573,6 +646,65 @@ async def stop_rtmp_broadcast( json=json, ) + @telemetry.operation_name( + "getstream.api.video.get_call_participant_session_metrics" + ) + async def get_call_participant_session_metrics( + self, + type: str, + id: str, + session: str, + user: str, + user_session: str, + since: Optional[datetime] = None, + until: Optional[datetime] = None, + ) -> StreamResponse[GetCallParticipantSessionMetricsResponse]: + query_params = build_query_param(**{"since": since, "until": until}) + path_params = { + "type": type, + "id": id, + "session": session, + "user": user, + "user_session": user_session, + } + return await self.get( + "/api/v2/video/call/{type}/{id}/session/{session}/participant/{user}/{user_session}/details/track", + GetCallParticipantSessionMetricsResponse, + query_params=query_params, + path_params=path_params, + ) + + @telemetry.operation_name("getstream.api.video.query_call_participant_sessions") + async def query_call_participant_sessions( + self, + type: str, + id: str, + session: str, + limit: Optional[int] = None, + prev: Optional[str] = None, + next: Optional[str] = None, + filter_conditions: Optional[Dict[str, object]] = None, + ) -> StreamResponse[QueryCallParticipantSessionsResponse]: + query_params = build_query_param( + **{ + "limit": limit, + "prev": prev, + "next": next, + "filter_conditions": filter_conditions, + } + ) + path_params = { + "type": type, + "id": id, + "session": session, + } + return await self.get( + "/api/v2/video/call/{type}/{id}/session/{session}/participant_sessions", + QueryCallParticipantSessionsResponse, + query_params=query_params, + path_params=path_params, + ) + @telemetry.operation_name("getstream.api.video.start_hls_broadcasting") async def start_hls_broadcasting( self, type: str, id: str @@ -602,10 +734,12 @@ async def start_closed_captions( "id": id, } json = build_body_dict( - enable_transcription=enable_transcription, - external_storage=external_storage, - language=language, - speech_segment_config=speech_segment_config, + **{ + "enable_transcription": enable_transcription, + "external_storage": external_storage, + "language": language, + "speech_segment_config": speech_segment_config, + } ) return await self.post( "/api/v2/video/call/{type}/{id}/start_closed_captions", @@ -622,7 +756,9 @@ async def start_frame_recording( "type": type, "id": id, } - json = build_body_dict(recording_external_storage=recording_external_storage) + json = build_body_dict( + **{"recording_external_storage": recording_external_storage} + ) return await self.post( "/api/v2/video/call/{type}/{id}/start_frame_recording", StartFrameRecordingResponse, @@ -630,22 +766,6 @@ async def start_frame_recording( json=json, ) - @telemetry.operation_name("getstream.api.video.start_recording") - async def start_recording( - self, type: str, id: str, recording_external_storage: Optional[str] = None - ) -> StreamResponse[StartRecordingResponse]: - path_params = { - "type": type, - "id": id, - } - json = build_body_dict(recording_external_storage=recording_external_storage) - return await self.post( - "/api/v2/video/call/{type}/{id}/start_recording", - StartRecordingResponse, - path_params=path_params, - json=json, - ) - @telemetry.operation_name("getstream.api.video.start_transcription") async def start_transcription( self, @@ -660,9 +780,11 @@ async def start_transcription( "id": id, } json = build_body_dict( - enable_closed_captions=enable_closed_captions, - language=language, - transcription_external_storage=transcription_external_storage, + **{ + "enable_closed_captions": enable_closed_captions, + "language": language, + "transcription_external_storage": transcription_external_storage, + } ) return await self.post( "/api/v2/video/call/{type}/{id}/start_transcription", @@ -693,7 +815,7 @@ async def stop_closed_captions( "type": type, "id": id, } - json = build_body_dict(stop_transcription=stop_transcription) + json = build_body_dict(**{"stop_transcription": stop_transcription}) return await self.post( "/api/v2/video/call/{type}/{id}/stop_closed_captions", StopClosedCaptionsResponse, @@ -734,14 +856,16 @@ async def stop_live( "id": id, } json = build_body_dict( - continue_closed_caption=continue_closed_caption, - continue_composite_recording=continue_composite_recording, - continue_hls=continue_hls, - continue_individual_recording=continue_individual_recording, - continue_raw_recording=continue_raw_recording, - continue_recording=continue_recording, - continue_rtmp_broadcasts=continue_rtmp_broadcasts, - continue_transcription=continue_transcription, + **{ + "continue_closed_caption": continue_closed_caption, + "continue_composite_recording": continue_composite_recording, + "continue_hls": continue_hls, + "continue_individual_recording": continue_individual_recording, + "continue_raw_recording": continue_raw_recording, + "continue_recording": continue_recording, + "continue_rtmp_broadcasts": continue_rtmp_broadcasts, + "continue_transcription": continue_transcription, + } ) return await self.post( "/api/v2/video/call/{type}/{id}/stop_live", @@ -750,24 +874,6 @@ async def stop_live( json=json, ) - @telemetry.operation_name("getstream.api.video.stop_recording") - async def stop_recording( - self, - type: str, - id: str, - ) -> StreamResponse[StopRecordingResponse]: - path_params = { - "type": type, - "id": id, - } - json = build_body_dict() - return await self.post( - "/api/v2/video/call/{type}/{id}/stop_recording", - StopRecordingResponse, - path_params=path_params, - json=json, - ) - @telemetry.operation_name("getstream.api.video.stop_transcription") async def stop_transcription( self, type: str, id: str, stop_closed_captions: Optional[bool] = None @@ -776,7 +882,7 @@ async def stop_transcription( "type": type, "id": id, } - json = build_body_dict(stop_closed_captions=stop_closed_captions) + json = build_body_dict(**{"stop_closed_captions": stop_closed_captions}) return await self.post( "/api/v2/video/call/{type}/{id}/stop_transcription", StopTranscriptionResponse, @@ -806,7 +912,7 @@ async def unblock_user( "type": type, "id": id, } - json = build_body_dict(user_id=user_id) + json = build_body_dict(**{"user_id": user_id}) return await self.post( "/api/v2/video/call/{type}/{id}/unblock", UnblockUserResponse, @@ -822,7 +928,7 @@ async def video_unpin( "type": type, "id": id, } - json = build_body_dict(session_id=session_id, user_id=user_id) + json = build_body_dict(**{"session_id": session_id, "user_id": user_id}) return await self.post( "/api/v2/video/call/{type}/{id}/unpin", UnpinResponse, @@ -844,9 +950,11 @@ async def update_user_permissions( "id": id, } json = build_body_dict( - user_id=user_id, - grant_permissions=grant_permissions, - revoke_permissions=revoke_permissions, + **{ + "user_id": user_id, + "grant_permissions": grant_permissions, + "revoke_permissions": revoke_permissions, + } ) return await self.post( "/api/v2/video/call/{type}/{id}/user_permissions", @@ -900,11 +1008,13 @@ async def get_call_stats_map( exclude_sfus: Optional[bool] = None, ) -> StreamResponse[QueryCallStatsMapResponse]: query_params = build_query_param( - start_time=start_time, - end_time=end_time, - exclude_publishers=exclude_publishers, - exclude_subscribers=exclude_subscribers, - exclude_sfus=exclude_sfus, + **{ + "start_time": start_time, + "end_time": end_time, + "exclude_publishers": exclude_publishers, + "exclude_subscribers": exclude_subscribers, + "exclude_sfus": exclude_sfus, + } ) path_params = { "call_type": call_type, @@ -933,7 +1043,7 @@ async def get_call_session_participant_stats_details( max_points: Optional[int] = None, ) -> StreamResponse[GetCallSessionParticipantStatsDetailsResponse]: query_params = build_query_param( - since=since, until=until, max_points=max_points + **{"since": since, "until": until, "max_points": max_points} ) path_params = { "call_type": call_type, @@ -964,11 +1074,13 @@ async def query_call_session_participant_stats( filter_conditions: Optional[Dict[str, object]] = None, ) -> StreamResponse[QueryCallSessionParticipantStatsResponse]: query_params = build_query_param( - limit=limit, - prev=prev, - next=next, - sort=sort, - filter_conditions=filter_conditions, + **{ + "limit": limit, + "prev": prev, + "next": next, + "sort": sort, + "filter_conditions": filter_conditions, + } ) path_params = { "call_type": call_type, @@ -997,7 +1109,7 @@ async def get_call_session_participant_stats_timeline( severity: Optional[List[str]] = None, ) -> StreamResponse[QueryCallSessionParticipantStatsTimelineResponse]: query_params = build_query_param( - start_time=start_time, end_time=end_time, severity=severity + **{"start_time": start_time, "end_time": end_time, "severity": severity} ) path_params = { "call_type": call_type, @@ -1023,11 +1135,13 @@ async def query_calls( filter_conditions: Optional[Dict[str, object]] = None, ) -> StreamResponse[QueryCallsResponse]: json = build_body_dict( - limit=limit, - next=next, - prev=prev, - sort=sort, - filter_conditions=filter_conditions, + **{ + "limit": limit, + "next": next, + "prev": prev, + "sort": sort, + "filter_conditions": filter_conditions, + } ) return await self.post("/api/v2/video/calls", QueryCallsResponse, json=json) @@ -1041,15 +1155,17 @@ async def create_call_type( name: str, external_storage: Optional[str] = None, grants: Optional[Dict[str, List[str]]] = None, - notification_settings: Optional[NotificationSettings] = None, + notification_settings: Optional[NotificationSettingsRequest] = None, settings: Optional[CallSettingsRequest] = None, ) -> StreamResponse[CreateCallTypeResponse]: json = build_body_dict( - name=name, - external_storage=external_storage, - grants=grants, - notification_settings=notification_settings, - settings=settings, + **{ + "name": name, + "external_storage": external_storage, + "grants": grants, + "notification_settings": notification_settings, + "settings": settings, + } ) return await self.post( "/api/v2/video/calltypes", CreateCallTypeResponse, json=json @@ -1081,17 +1197,19 @@ async def update_call_type( name: str, external_storage: Optional[str] = None, grants: Optional[Dict[str, List[str]]] = None, - notification_settings: Optional[NotificationSettings] = None, + notification_settings: Optional[NotificationSettingsRequest] = None, settings: Optional[CallSettingsRequest] = None, ) -> StreamResponse[UpdateCallTypeResponse]: path_params = { "name": name, } json = build_body_dict( - external_storage=external_storage, - grants=grants, - notification_settings=notification_settings, - settings=settings, + **{ + "external_storage": external_storage, + "grants": grants, + "notification_settings": notification_settings, + "settings": settings, + } ) return await self.put( "/api/v2/video/calltypes/{name}", @@ -1104,30 +1222,12 @@ async def update_call_type( async def get_edges(self) -> StreamResponse[GetEdgesResponse]: return await self.get("/api/v2/video/edges", GetEdgesResponse) - @telemetry.operation_name("getstream.api.video.resolve_sip_inbound") - async def resolve_sip_inbound( - self, - sip_caller_number: str, - sip_trunk_number: str, - challenge: SIPChallenge, - sip_headers: Optional[Dict[str, str]] = None, - ) -> StreamResponse[ResolveSipInboundResponse]: - json = build_body_dict( - sip_caller_number=sip_caller_number, - sip_trunk_number=sip_trunk_number, - challenge=challenge, - sip_headers=sip_headers, - ) - return await self.post( - "/api/v2/video/sip/resolve", ResolveSipInboundResponse, json=json - ) - @telemetry.operation_name("getstream.api.video.list_sip_inbound_routing_rule") async def list_sip_inbound_routing_rule( self, ) -> StreamResponse[ListSIPInboundRoutingRuleResponse]: return await self.get( - "/api/v2/video/sip/routing_rules", ListSIPInboundRoutingRuleResponse + "/api/v2/video/sip/inbound_routing_rules", ListSIPInboundRoutingRuleResponse ) @telemetry.operation_name("getstream.api.video.create_sip_inbound_routing_rule") @@ -1144,18 +1244,22 @@ async def create_sip_inbound_routing_rule( pin_routing_configs: Optional[SIPInboundRoutingRulePinConfigsRequest] = None, ) -> StreamResponse[SIPInboundRoutingRuleResponse]: json = build_body_dict( - name=name, - trunk_ids=trunk_ids, - caller_configs=caller_configs, - called_numbers=called_numbers, - caller_numbers=caller_numbers, - call_configs=call_configs, - direct_routing_configs=direct_routing_configs, - pin_protection_configs=pin_protection_configs, - pin_routing_configs=pin_routing_configs, + **{ + "name": name, + "trunk_ids": trunk_ids, + "caller_configs": caller_configs, + "called_numbers": called_numbers, + "caller_numbers": caller_numbers, + "call_configs": call_configs, + "direct_routing_configs": direct_routing_configs, + "pin_protection_configs": pin_protection_configs, + "pin_routing_configs": pin_routing_configs, + } ) return await self.post( - "/api/v2/video/sip/routing_rules", SIPInboundRoutingRuleResponse, json=json + "/api/v2/video/sip/inbound_routing_rules", + SIPInboundRoutingRuleResponse, + json=json, ) @telemetry.operation_name("getstream.api.video.delete_sip_inbound_routing_rule") @@ -1166,7 +1270,7 @@ async def delete_sip_inbound_routing_rule( "id": id, } return await self.delete( - "/api/v2/video/sip/routing_rules/{id}", + "/api/v2/video/sip/inbound_routing_rules/{id}", DeleteSIPInboundRoutingRuleResponse, path_params=path_params, ) @@ -1189,18 +1293,20 @@ async def update_sip_inbound_routing_rule( "id": id, } json = build_body_dict( - name=name, - called_numbers=called_numbers, - trunk_ids=trunk_ids, - caller_configs=caller_configs, - caller_numbers=caller_numbers, - call_configs=call_configs, - direct_routing_configs=direct_routing_configs, - pin_protection_configs=pin_protection_configs, - pin_routing_configs=pin_routing_configs, + **{ + "name": name, + "called_numbers": called_numbers, + "trunk_ids": trunk_ids, + "caller_configs": caller_configs, + "caller_numbers": caller_numbers, + "call_configs": call_configs, + "direct_routing_configs": direct_routing_configs, + "pin_protection_configs": pin_protection_configs, + "pin_routing_configs": pin_routing_configs, + } ) return await self.put( - "/api/v2/video/sip/routing_rules/{id}", + "/api/v2/video/sip/inbound_routing_rules/{id}", UpdateSIPInboundRoutingRuleResponse, path_params=path_params, json=json, @@ -1208,15 +1314,15 @@ async def update_sip_inbound_routing_rule( @telemetry.operation_name("getstream.api.video.list_sip_trunks") async def list_sip_trunks(self) -> StreamResponse[ListSIPTrunksResponse]: - return await self.get("/api/v2/video/sip/trunks", ListSIPTrunksResponse) + return await self.get("/api/v2/video/sip/inbound_trunks", ListSIPTrunksResponse) @telemetry.operation_name("getstream.api.video.create_sip_trunk") async def create_sip_trunk( self, name: str, numbers: List[str] ) -> StreamResponse[CreateSIPTrunkResponse]: - json = build_body_dict(name=name, numbers=numbers) + json = build_body_dict(**{"name": name, "numbers": numbers}) return await self.post( - "/api/v2/video/sip/trunks", CreateSIPTrunkResponse, json=json + "/api/v2/video/sip/inbound_trunks", CreateSIPTrunkResponse, json=json ) @telemetry.operation_name("getstream.api.video.delete_sip_trunk") @@ -1225,7 +1331,7 @@ async def delete_sip_trunk(self, id: str) -> StreamResponse[DeleteSIPTrunkRespon "id": id, } return await self.delete( - "/api/v2/video/sip/trunks/{id}", + "/api/v2/video/sip/inbound_trunks/{id}", DeleteSIPTrunkResponse, path_params=path_params, ) @@ -1237,14 +1343,36 @@ async def update_sip_trunk( path_params = { "id": id, } - json = build_body_dict(name=name, numbers=numbers) + json = build_body_dict(**{"name": name, "numbers": numbers}) return await self.put( - "/api/v2/video/sip/trunks/{id}", + "/api/v2/video/sip/inbound_trunks/{id}", UpdateSIPTrunkResponse, path_params=path_params, json=json, ) + @telemetry.operation_name("getstream.api.video.resolve_sip_inbound") + async def resolve_sip_inbound( + self, + sip_caller_number: str, + sip_trunk_number: str, + challenge: SIPChallengeRequest, + routing_number: Optional[str] = None, + sip_headers: Optional[Dict[str, str]] = None, + ) -> StreamResponse[ResolveSipInboundResponse]: + json = build_body_dict( + **{ + "sip_caller_number": sip_caller_number, + "sip_trunk_number": sip_trunk_number, + "challenge": challenge, + "routing_number": routing_number, + "sip_headers": sip_headers, + } + ) + return await self.post( + "/api/v2/video/sip/resolve", ResolveSipInboundResponse, json=json + ) + @telemetry.operation_name("getstream.api.video.query_aggregate_call_stats") async def query_aggregate_call_stats( self, @@ -1252,7 +1380,9 @@ async def query_aggregate_call_stats( to: Optional[str] = None, report_types: Optional[List[str]] = None, ) -> StreamResponse[QueryAggregateCallStatsResponse]: - json = build_body_dict(_from=_from, to=to, report_types=report_types) + json = build_body_dict( + **{"from": _from, "to": to, "report_types": report_types} + ) return await self.post( "/api/v2/video/stats", QueryAggregateCallStatsResponse, json=json ) diff --git a/getstream/video/call.py b/getstream/video/call.py index 5dfef99d..197f5d0e 100644 --- a/getstream/video/call.py +++ b/getstream/video/call.py @@ -267,6 +267,32 @@ def list_recordings(self) -> StreamResponse[ListRecordingsResponse]: self._sync_from_response(response.data) return response + @attach_call_cid + def start_recording( + self, recording_type: str, recording_external_storage: Optional[str] = None + ) -> StreamResponse[StartRecordingResponse]: + response = self.client.start_recording( + type=self.call_type, + id=self.id, + recording_type=recording_type, + recording_external_storage=recording_external_storage, + ) + self._sync_from_response(response.data) + return response + + @attach_call_cid + def stop_recording( + self, + recording_type: str, + ) -> StreamResponse[StopRecordingResponse]: + response = self.client.stop_recording( + type=self.call_type, + id=self.id, + recording_type=recording_type, + ) + self._sync_from_response(response.data) + return response + @attach_call_cid def get_call_report( self, session_id: Optional[str] = None @@ -316,6 +342,48 @@ def stop_rtmp_broadcast( self._sync_from_response(response.data) return response + @attach_call_cid + def get_call_participant_session_metrics( + self, + session: str, + user: str, + user_session: str, + since: Optional[datetime] = None, + until: Optional[datetime] = None, + ) -> StreamResponse[GetCallParticipantSessionMetricsResponse]: + response = self.client.get_call_participant_session_metrics( + type=self.call_type, + id=self.id, + session=session, + user=user, + user_session=user_session, + since=since, + until=until, + ) + self._sync_from_response(response.data) + return response + + @attach_call_cid + def query_call_participant_sessions( + self, + session: str, + limit: Optional[int] = None, + prev: Optional[str] = None, + next: Optional[str] = None, + filter_conditions: Optional[Dict[str, object]] = None, + ) -> StreamResponse[QueryCallParticipantSessionsResponse]: + response = self.client.query_call_participant_sessions( + type=self.call_type, + id=self.id, + session=session, + limit=limit, + prev=prev, + next=next, + filter_conditions=filter_conditions, + ) + self._sync_from_response(response.data) + return response + @attach_call_cid def start_hls_broadcasting(self) -> StreamResponse[StartHLSBroadcastingResponse]: response = self.client.start_hls_broadcasting(type=self.call_type, id=self.id) @@ -353,18 +421,6 @@ def start_frame_recording( self._sync_from_response(response.data) return response - @attach_call_cid - def start_recording( - self, recording_external_storage: Optional[str] = None - ) -> StreamResponse[StartRecordingResponse]: - response = self.client.start_recording( - type=self.call_type, - id=self.id, - recording_external_storage=recording_external_storage, - ) - self._sync_from_response(response.data) - return response - @attach_call_cid def start_transcription( self, @@ -431,17 +487,6 @@ def stop_live( self._sync_from_response(response.data) return response - @attach_call_cid - def stop_recording( - self, - ) -> StreamResponse[StopRecordingResponse]: - response = self.client.stop_recording( - type=self.call_type, - id=self.id, - ) - self._sync_from_response(response.data) - return response - @attach_call_cid def stop_transcription( self, stop_closed_captions: Optional[bool] = None diff --git a/getstream/video/rest_client.py b/getstream/video/rest_client.py index 17dcd2d8..c13881e3 100644 --- a/getstream/video/rest_client.py +++ b/getstream/video/rest_client.py @@ -47,13 +47,15 @@ def query_user_feedback( sort: Optional[List[SortParamRequest]] = None, filter_conditions: Optional[Dict[str, object]] = None, ) -> StreamResponse[QueryUserFeedbackResponse]: - query_params = build_query_param(full=full) + query_params = build_query_param(**{"full": full}) json = build_body_dict( - limit=limit, - next=next, - prev=prev, - sort=sort, - filter_conditions=filter_conditions, + **{ + "limit": limit, + "next": next, + "prev": prev, + "sort": sort, + "filter_conditions": filter_conditions, + } ) return self.post( "/api/v2/video/call/feedback", @@ -74,13 +76,15 @@ def query_call_members( filter_conditions: Optional[Dict[str, object]] = None, ) -> StreamResponse[QueryCallMembersResponse]: json = build_body_dict( - id=id, - type=type, - limit=limit, - next=next, - prev=prev, - sort=sort, - filter_conditions=filter_conditions, + **{ + "id": id, + "type": type, + "limit": limit, + "next": next, + "prev": prev, + "sort": sort, + "filter_conditions": filter_conditions, + } ) return self.post( "/api/v2/video/call/members", QueryCallMembersResponse, json=json @@ -96,11 +100,13 @@ def query_call_stats( filter_conditions: Optional[Dict[str, object]] = None, ) -> StreamResponse[QueryCallStatsResponse]: json = build_body_dict( - limit=limit, - next=next, - prev=prev, - sort=sort, - filter_conditions=filter_conditions, + **{ + "limit": limit, + "next": next, + "prev": prev, + "sort": sort, + "filter_conditions": filter_conditions, + } ) return self.post("/api/v2/video/call/stats", QueryCallStatsResponse, json=json) @@ -115,7 +121,12 @@ def get_call( video: Optional[bool] = 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, + } ) path_params = { "type": type, @@ -142,7 +153,11 @@ def update_call( "id": id, } json = build_body_dict( - starts_at=starts_at, custom=custom, settings_override=settings_override + **{ + "starts_at": starts_at, + "custom": custom, + "settings_override": settings_override, + } ) return self.patch( "/api/v2/video/call/{type}/{id}", @@ -167,11 +182,13 @@ def get_or_create_call( "id": id, } json = build_body_dict( - members_limit=members_limit, - notify=notify, - ring=ring, - video=video, - data=data, + **{ + "members_limit": members_limit, + "notify": notify, + "ring": ring, + "video": video, + "data": data, + } ) return self.post( "/api/v2/video/call/{type}/{id}", @@ -188,7 +205,7 @@ def block_user( "type": type, "id": id, } - json = build_body_dict(user_id=user_id) + json = build_body_dict(**{"user_id": user_id}) return self.post( "/api/v2/video/call/{type}/{id}/block", BlockUserResponse, @@ -216,15 +233,17 @@ def send_closed_caption( "id": id, } json = build_body_dict( - speaker_id=speaker_id, - text=text, - end_time=end_time, - language=language, - service=service, - start_time=start_time, - translated=translated, - user_id=user_id, - user=user, + **{ + "speaker_id": speaker_id, + "text": text, + "end_time": end_time, + "language": language, + "service": service, + "start_time": start_time, + "translated": translated, + "user_id": user_id, + "user": user, + } ) return self.post( "/api/v2/video/call/{type}/{id}/closed_captions", @@ -241,7 +260,7 @@ def delete_call( "type": type, "id": id, } - json = build_body_dict(hard=hard) + json = build_body_dict(**{"hard": hard}) return self.post( "/api/v2/video/call/{type}/{id}/delete", DeleteCallResponse, @@ -262,7 +281,7 @@ def send_call_event( "type": type, "id": id, } - json = build_body_dict(user_id=user_id, custom=custom, user=user) + json = build_body_dict(**{"user_id": user_id, "custom": custom, "user": user}) return self.post( "/api/v2/video/call/{type}/{id}/event", SendCallEventResponse, @@ -287,12 +306,14 @@ def collect_user_feedback( "id": id, } json = build_body_dict( - rating=rating, - sdk=sdk, - sdk_version=sdk_version, - reason=reason, - user_session_id=user_session_id, - custom=custom, + **{ + "rating": rating, + "sdk": sdk, + "sdk_version": sdk_version, + "reason": reason, + "user_session_id": user_session_id, + "custom": custom, + } ) return self.post( "/api/v2/video/call/{type}/{id}/feedback", @@ -321,15 +342,17 @@ def go_live( "id": id, } json = build_body_dict( - recording_storage_name=recording_storage_name, - start_closed_caption=start_closed_caption, - start_composite_recording=start_composite_recording, - start_hls=start_hls, - start_individual_recording=start_individual_recording, - start_raw_recording=start_raw_recording, - start_recording=start_recording, - start_transcription=start_transcription, - transcription_storage_name=transcription_storage_name, + **{ + "recording_storage_name": recording_storage_name, + "start_closed_caption": start_closed_caption, + "start_composite_recording": start_composite_recording, + "start_hls": start_hls, + "start_individual_recording": start_individual_recording, + "start_raw_recording": start_raw_recording, + "start_recording": start_recording, + "start_transcription": start_transcription, + "transcription_storage_name": transcription_storage_name, + } ) return self.post( "/api/v2/video/call/{type}/{id}/go_live", @@ -353,7 +376,12 @@ def kick_user( "id": id, } json = build_body_dict( - user_id=user_id, block=block, kicked_by_id=kicked_by_id, kicked_by=kicked_by + **{ + "user_id": user_id, + "block": block, + "kicked_by_id": kicked_by_id, + "kicked_by": kicked_by, + } ) return self.post( "/api/v2/video/call/{type}/{id}/kick", @@ -387,7 +415,7 @@ def update_call_members( "id": id, } json = build_body_dict( - remove_members=remove_members, update_members=update_members + **{"remove_members": remove_members, "update_members": update_members} ) return self.post( "/api/v2/video/call/{type}/{id}/members", @@ -415,14 +443,16 @@ def mute_users( "id": id, } json = build_body_dict( - audio=audio, - mute_all_users=mute_all_users, - muted_by_id=muted_by_id, - screenshare=screenshare, - screenshare_audio=screenshare_audio, - video=video, - user_ids=user_ids, - muted_by=muted_by, + **{ + "audio": audio, + "mute_all_users": mute_all_users, + "muted_by_id": muted_by_id, + "screenshare": screenshare, + "screenshare_audio": screenshare_audio, + "video": video, + "user_ids": user_ids, + "muted_by": muted_by, + } ) return self.post( "/api/v2/video/call/{type}/{id}/mute_users", @@ -439,12 +469,12 @@ def query_call_participants( limit: Optional[int] = None, filter_conditions: Optional[Dict[str, object]] = None, ) -> StreamResponse[QueryCallParticipantsResponse]: - query_params = build_query_param(limit=limit) + query_params = build_query_param(**{"limit": limit}) path_params = { "id": id, "type": type, } - json = build_body_dict(filter_conditions=filter_conditions) + json = build_body_dict(**{"filter_conditions": filter_conditions}) return self.post( "/api/v2/video/call/{type}/{id}/participants", QueryCallParticipantsResponse, @@ -461,7 +491,7 @@ def video_pin( "type": type, "id": id, } - json = build_body_dict(session_id=session_id, user_id=user_id) + json = build_body_dict(**{"session_id": session_id, "user_id": user_id}) return self.post( "/api/v2/video/call/{type}/{id}/pin", PinResponse, @@ -483,11 +513,54 @@ def list_recordings( path_params=path_params, ) + @telemetry.operation_name("getstream.api.video.start_recording") + def start_recording( + self, + type: str, + id: str, + recording_type: str, + recording_external_storage: Optional[str] = None, + ) -> StreamResponse[StartRecordingResponse]: + path_params = { + "type": type, + "id": id, + "recording_type": recording_type, + } + json = build_body_dict( + **{"recording_external_storage": recording_external_storage} + ) + return self.post( + "/api/v2/video/call/{type}/{id}/recordings/{recording_type}/start", + StartRecordingResponse, + path_params=path_params, + json=json, + ) + + @telemetry.operation_name("getstream.api.video.stop_recording") + def stop_recording( + self, + type: str, + id: str, + recording_type: str, + ) -> StreamResponse[StopRecordingResponse]: + path_params = { + "type": type, + "id": id, + "recording_type": recording_type, + } + json = build_body_dict(**{}) + return self.post( + "/api/v2/video/call/{type}/{id}/recordings/{recording_type}/stop", + StopRecordingResponse, + path_params=path_params, + json=json, + ) + @telemetry.operation_name("getstream.api.video.get_call_report") def get_call_report( self, type: str, id: str, session_id: Optional[str] = None ) -> StreamResponse[GetCallReportResponse]: - query_params = build_query_param(session_id=session_id) + query_params = build_query_param(**{"session_id": session_id}) path_params = { "type": type, "id": id, @@ -511,7 +584,7 @@ def ring_call( "type": type, "id": id, } - json = build_body_dict(video=video, members_ids=members_ids) + json = build_body_dict(**{"video": video, "members_ids": members_ids}) return self.post( "/api/v2/video/call/{type}/{id}/ring", RingCallResponse, @@ -527,7 +600,7 @@ def start_rtmp_broadcasts( "type": type, "id": id, } - json = build_body_dict(broadcasts=broadcasts) + json = build_body_dict(**{"broadcasts": broadcasts}) return self.post( "/api/v2/video/call/{type}/{id}/rtmp_broadcasts", StartRTMPBroadcastsResponse, @@ -561,7 +634,7 @@ def stop_rtmp_broadcast( "id": id, "name": name, } - json = build_body_dict() + json = build_body_dict(**{}) return self.post( "/api/v2/video/call/{type}/{id}/rtmp_broadcasts/{name}/stop", StopRTMPBroadcastsResponse, @@ -569,6 +642,65 @@ def stop_rtmp_broadcast( json=json, ) + @telemetry.operation_name( + "getstream.api.video.get_call_participant_session_metrics" + ) + def get_call_participant_session_metrics( + self, + type: str, + id: str, + session: str, + user: str, + user_session: str, + since: Optional[datetime] = None, + until: Optional[datetime] = None, + ) -> StreamResponse[GetCallParticipantSessionMetricsResponse]: + query_params = build_query_param(**{"since": since, "until": until}) + path_params = { + "type": type, + "id": id, + "session": session, + "user": user, + "user_session": user_session, + } + return self.get( + "/api/v2/video/call/{type}/{id}/session/{session}/participant/{user}/{user_session}/details/track", + GetCallParticipantSessionMetricsResponse, + query_params=query_params, + path_params=path_params, + ) + + @telemetry.operation_name("getstream.api.video.query_call_participant_sessions") + def query_call_participant_sessions( + self, + type: str, + id: str, + session: str, + limit: Optional[int] = None, + prev: Optional[str] = None, + next: Optional[str] = None, + filter_conditions: Optional[Dict[str, object]] = None, + ) -> StreamResponse[QueryCallParticipantSessionsResponse]: + query_params = build_query_param( + **{ + "limit": limit, + "prev": prev, + "next": next, + "filter_conditions": filter_conditions, + } + ) + path_params = { + "type": type, + "id": id, + "session": session, + } + return self.get( + "/api/v2/video/call/{type}/{id}/session/{session}/participant_sessions", + QueryCallParticipantSessionsResponse, + query_params=query_params, + path_params=path_params, + ) + @telemetry.operation_name("getstream.api.video.start_hls_broadcasting") def start_hls_broadcasting( self, type: str, id: str @@ -598,10 +730,12 @@ def start_closed_captions( "id": id, } json = build_body_dict( - enable_transcription=enable_transcription, - external_storage=external_storage, - language=language, - speech_segment_config=speech_segment_config, + **{ + "enable_transcription": enable_transcription, + "external_storage": external_storage, + "language": language, + "speech_segment_config": speech_segment_config, + } ) return self.post( "/api/v2/video/call/{type}/{id}/start_closed_captions", @@ -618,7 +752,9 @@ def start_frame_recording( "type": type, "id": id, } - json = build_body_dict(recording_external_storage=recording_external_storage) + json = build_body_dict( + **{"recording_external_storage": recording_external_storage} + ) return self.post( "/api/v2/video/call/{type}/{id}/start_frame_recording", StartFrameRecordingResponse, @@ -626,22 +762,6 @@ def start_frame_recording( json=json, ) - @telemetry.operation_name("getstream.api.video.start_recording") - def start_recording( - self, type: str, id: str, recording_external_storage: Optional[str] = None - ) -> StreamResponse[StartRecordingResponse]: - path_params = { - "type": type, - "id": id, - } - json = build_body_dict(recording_external_storage=recording_external_storage) - return self.post( - "/api/v2/video/call/{type}/{id}/start_recording", - StartRecordingResponse, - path_params=path_params, - json=json, - ) - @telemetry.operation_name("getstream.api.video.start_transcription") def start_transcription( self, @@ -656,9 +776,11 @@ def start_transcription( "id": id, } json = build_body_dict( - enable_closed_captions=enable_closed_captions, - language=language, - transcription_external_storage=transcription_external_storage, + **{ + "enable_closed_captions": enable_closed_captions, + "language": language, + "transcription_external_storage": transcription_external_storage, + } ) return self.post( "/api/v2/video/call/{type}/{id}/start_transcription", @@ -689,7 +811,7 @@ def stop_closed_captions( "type": type, "id": id, } - json = build_body_dict(stop_transcription=stop_transcription) + json = build_body_dict(**{"stop_transcription": stop_transcription}) return self.post( "/api/v2/video/call/{type}/{id}/stop_closed_captions", StopClosedCaptionsResponse, @@ -730,14 +852,16 @@ def stop_live( "id": id, } json = build_body_dict( - continue_closed_caption=continue_closed_caption, - continue_composite_recording=continue_composite_recording, - continue_hls=continue_hls, - continue_individual_recording=continue_individual_recording, - continue_raw_recording=continue_raw_recording, - continue_recording=continue_recording, - continue_rtmp_broadcasts=continue_rtmp_broadcasts, - continue_transcription=continue_transcription, + **{ + "continue_closed_caption": continue_closed_caption, + "continue_composite_recording": continue_composite_recording, + "continue_hls": continue_hls, + "continue_individual_recording": continue_individual_recording, + "continue_raw_recording": continue_raw_recording, + "continue_recording": continue_recording, + "continue_rtmp_broadcasts": continue_rtmp_broadcasts, + "continue_transcription": continue_transcription, + } ) return self.post( "/api/v2/video/call/{type}/{id}/stop_live", @@ -746,24 +870,6 @@ def stop_live( json=json, ) - @telemetry.operation_name("getstream.api.video.stop_recording") - def stop_recording( - self, - type: str, - id: str, - ) -> StreamResponse[StopRecordingResponse]: - path_params = { - "type": type, - "id": id, - } - json = build_body_dict() - return self.post( - "/api/v2/video/call/{type}/{id}/stop_recording", - StopRecordingResponse, - path_params=path_params, - json=json, - ) - @telemetry.operation_name("getstream.api.video.stop_transcription") def stop_transcription( self, type: str, id: str, stop_closed_captions: Optional[bool] = None @@ -772,7 +878,7 @@ def stop_transcription( "type": type, "id": id, } - json = build_body_dict(stop_closed_captions=stop_closed_captions) + json = build_body_dict(**{"stop_closed_captions": stop_closed_captions}) return self.post( "/api/v2/video/call/{type}/{id}/stop_transcription", StopTranscriptionResponse, @@ -802,7 +908,7 @@ def unblock_user( "type": type, "id": id, } - json = build_body_dict(user_id=user_id) + json = build_body_dict(**{"user_id": user_id}) return self.post( "/api/v2/video/call/{type}/{id}/unblock", UnblockUserResponse, @@ -818,7 +924,7 @@ def video_unpin( "type": type, "id": id, } - json = build_body_dict(session_id=session_id, user_id=user_id) + json = build_body_dict(**{"session_id": session_id, "user_id": user_id}) return self.post( "/api/v2/video/call/{type}/{id}/unpin", UnpinResponse, @@ -840,9 +946,11 @@ def update_user_permissions( "id": id, } json = build_body_dict( - user_id=user_id, - grant_permissions=grant_permissions, - revoke_permissions=revoke_permissions, + **{ + "user_id": user_id, + "grant_permissions": grant_permissions, + "revoke_permissions": revoke_permissions, + } ) return self.post( "/api/v2/video/call/{type}/{id}/user_permissions", @@ -896,11 +1004,13 @@ def get_call_stats_map( exclude_sfus: Optional[bool] = None, ) -> StreamResponse[QueryCallStatsMapResponse]: query_params = build_query_param( - start_time=start_time, - end_time=end_time, - exclude_publishers=exclude_publishers, - exclude_subscribers=exclude_subscribers, - exclude_sfus=exclude_sfus, + **{ + "start_time": start_time, + "end_time": end_time, + "exclude_publishers": exclude_publishers, + "exclude_subscribers": exclude_subscribers, + "exclude_sfus": exclude_sfus, + } ) path_params = { "call_type": call_type, @@ -929,7 +1039,7 @@ def get_call_session_participant_stats_details( max_points: Optional[int] = None, ) -> StreamResponse[GetCallSessionParticipantStatsDetailsResponse]: query_params = build_query_param( - since=since, until=until, max_points=max_points + **{"since": since, "until": until, "max_points": max_points} ) path_params = { "call_type": call_type, @@ -960,11 +1070,13 @@ def query_call_session_participant_stats( filter_conditions: Optional[Dict[str, object]] = None, ) -> StreamResponse[QueryCallSessionParticipantStatsResponse]: query_params = build_query_param( - limit=limit, - prev=prev, - next=next, - sort=sort, - filter_conditions=filter_conditions, + **{ + "limit": limit, + "prev": prev, + "next": next, + "sort": sort, + "filter_conditions": filter_conditions, + } ) path_params = { "call_type": call_type, @@ -993,7 +1105,7 @@ def get_call_session_participant_stats_timeline( severity: Optional[List[str]] = None, ) -> StreamResponse[QueryCallSessionParticipantStatsTimelineResponse]: query_params = build_query_param( - start_time=start_time, end_time=end_time, severity=severity + **{"start_time": start_time, "end_time": end_time, "severity": severity} ) path_params = { "call_type": call_type, @@ -1019,11 +1131,13 @@ def query_calls( filter_conditions: Optional[Dict[str, object]] = None, ) -> StreamResponse[QueryCallsResponse]: json = build_body_dict( - limit=limit, - next=next, - prev=prev, - sort=sort, - filter_conditions=filter_conditions, + **{ + "limit": limit, + "next": next, + "prev": prev, + "sort": sort, + "filter_conditions": filter_conditions, + } ) return self.post("/api/v2/video/calls", QueryCallsResponse, json=json) @@ -1037,15 +1151,17 @@ def create_call_type( name: str, external_storage: Optional[str] = None, grants: Optional[Dict[str, List[str]]] = None, - notification_settings: Optional[NotificationSettings] = None, + notification_settings: Optional[NotificationSettingsRequest] = None, settings: Optional[CallSettingsRequest] = None, ) -> StreamResponse[CreateCallTypeResponse]: json = build_body_dict( - name=name, - external_storage=external_storage, - grants=grants, - notification_settings=notification_settings, - settings=settings, + **{ + "name": name, + "external_storage": external_storage, + "grants": grants, + "notification_settings": notification_settings, + "settings": settings, + } ) return self.post("/api/v2/video/calltypes", CreateCallTypeResponse, json=json) @@ -1075,17 +1191,19 @@ def update_call_type( name: str, external_storage: Optional[str] = None, grants: Optional[Dict[str, List[str]]] = None, - notification_settings: Optional[NotificationSettings] = None, + notification_settings: Optional[NotificationSettingsRequest] = None, settings: Optional[CallSettingsRequest] = None, ) -> StreamResponse[UpdateCallTypeResponse]: path_params = { "name": name, } json = build_body_dict( - external_storage=external_storage, - grants=grants, - notification_settings=notification_settings, - settings=settings, + **{ + "external_storage": external_storage, + "grants": grants, + "notification_settings": notification_settings, + "settings": settings, + } ) return self.put( "/api/v2/video/calltypes/{name}", @@ -1098,30 +1216,12 @@ def update_call_type( def get_edges(self) -> StreamResponse[GetEdgesResponse]: return self.get("/api/v2/video/edges", GetEdgesResponse) - @telemetry.operation_name("getstream.api.video.resolve_sip_inbound") - def resolve_sip_inbound( - self, - sip_caller_number: str, - sip_trunk_number: str, - challenge: SIPChallenge, - sip_headers: Optional[Dict[str, str]] = None, - ) -> StreamResponse[ResolveSipInboundResponse]: - json = build_body_dict( - sip_caller_number=sip_caller_number, - sip_trunk_number=sip_trunk_number, - challenge=challenge, - sip_headers=sip_headers, - ) - return self.post( - "/api/v2/video/sip/resolve", ResolveSipInboundResponse, json=json - ) - @telemetry.operation_name("getstream.api.video.list_sip_inbound_routing_rule") def list_sip_inbound_routing_rule( self, ) -> StreamResponse[ListSIPInboundRoutingRuleResponse]: return self.get( - "/api/v2/video/sip/routing_rules", ListSIPInboundRoutingRuleResponse + "/api/v2/video/sip/inbound_routing_rules", ListSIPInboundRoutingRuleResponse ) @telemetry.operation_name("getstream.api.video.create_sip_inbound_routing_rule") @@ -1138,18 +1238,22 @@ def create_sip_inbound_routing_rule( pin_routing_configs: Optional[SIPInboundRoutingRulePinConfigsRequest] = None, ) -> StreamResponse[SIPInboundRoutingRuleResponse]: json = build_body_dict( - name=name, - trunk_ids=trunk_ids, - caller_configs=caller_configs, - called_numbers=called_numbers, - caller_numbers=caller_numbers, - call_configs=call_configs, - direct_routing_configs=direct_routing_configs, - pin_protection_configs=pin_protection_configs, - pin_routing_configs=pin_routing_configs, + **{ + "name": name, + "trunk_ids": trunk_ids, + "caller_configs": caller_configs, + "called_numbers": called_numbers, + "caller_numbers": caller_numbers, + "call_configs": call_configs, + "direct_routing_configs": direct_routing_configs, + "pin_protection_configs": pin_protection_configs, + "pin_routing_configs": pin_routing_configs, + } ) return self.post( - "/api/v2/video/sip/routing_rules", SIPInboundRoutingRuleResponse, json=json + "/api/v2/video/sip/inbound_routing_rules", + SIPInboundRoutingRuleResponse, + json=json, ) @telemetry.operation_name("getstream.api.video.delete_sip_inbound_routing_rule") @@ -1160,7 +1264,7 @@ def delete_sip_inbound_routing_rule( "id": id, } return self.delete( - "/api/v2/video/sip/routing_rules/{id}", + "/api/v2/video/sip/inbound_routing_rules/{id}", DeleteSIPInboundRoutingRuleResponse, path_params=path_params, ) @@ -1183,18 +1287,20 @@ def update_sip_inbound_routing_rule( "id": id, } json = build_body_dict( - name=name, - called_numbers=called_numbers, - trunk_ids=trunk_ids, - caller_configs=caller_configs, - caller_numbers=caller_numbers, - call_configs=call_configs, - direct_routing_configs=direct_routing_configs, - pin_protection_configs=pin_protection_configs, - pin_routing_configs=pin_routing_configs, + **{ + "name": name, + "called_numbers": called_numbers, + "trunk_ids": trunk_ids, + "caller_configs": caller_configs, + "caller_numbers": caller_numbers, + "call_configs": call_configs, + "direct_routing_configs": direct_routing_configs, + "pin_protection_configs": pin_protection_configs, + "pin_routing_configs": pin_routing_configs, + } ) return self.put( - "/api/v2/video/sip/routing_rules/{id}", + "/api/v2/video/sip/inbound_routing_rules/{id}", UpdateSIPInboundRoutingRuleResponse, path_params=path_params, json=json, @@ -1202,14 +1308,16 @@ def update_sip_inbound_routing_rule( @telemetry.operation_name("getstream.api.video.list_sip_trunks") def list_sip_trunks(self) -> StreamResponse[ListSIPTrunksResponse]: - return self.get("/api/v2/video/sip/trunks", ListSIPTrunksResponse) + return self.get("/api/v2/video/sip/inbound_trunks", ListSIPTrunksResponse) @telemetry.operation_name("getstream.api.video.create_sip_trunk") def create_sip_trunk( self, name: str, numbers: List[str] ) -> StreamResponse[CreateSIPTrunkResponse]: - json = build_body_dict(name=name, numbers=numbers) - return self.post("/api/v2/video/sip/trunks", CreateSIPTrunkResponse, json=json) + json = build_body_dict(**{"name": name, "numbers": numbers}) + return self.post( + "/api/v2/video/sip/inbound_trunks", CreateSIPTrunkResponse, json=json + ) @telemetry.operation_name("getstream.api.video.delete_sip_trunk") def delete_sip_trunk(self, id: str) -> StreamResponse[DeleteSIPTrunkResponse]: @@ -1217,7 +1325,7 @@ def delete_sip_trunk(self, id: str) -> StreamResponse[DeleteSIPTrunkResponse]: "id": id, } return self.delete( - "/api/v2/video/sip/trunks/{id}", + "/api/v2/video/sip/inbound_trunks/{id}", DeleteSIPTrunkResponse, path_params=path_params, ) @@ -1229,14 +1337,36 @@ def update_sip_trunk( path_params = { "id": id, } - json = build_body_dict(name=name, numbers=numbers) + json = build_body_dict(**{"name": name, "numbers": numbers}) return self.put( - "/api/v2/video/sip/trunks/{id}", + "/api/v2/video/sip/inbound_trunks/{id}", UpdateSIPTrunkResponse, path_params=path_params, json=json, ) + @telemetry.operation_name("getstream.api.video.resolve_sip_inbound") + def resolve_sip_inbound( + self, + sip_caller_number: str, + sip_trunk_number: str, + challenge: SIPChallengeRequest, + routing_number: Optional[str] = None, + sip_headers: Optional[Dict[str, str]] = None, + ) -> StreamResponse[ResolveSipInboundResponse]: + json = build_body_dict( + **{ + "sip_caller_number": sip_caller_number, + "sip_trunk_number": sip_trunk_number, + "challenge": challenge, + "routing_number": routing_number, + "sip_headers": sip_headers, + } + ) + return self.post( + "/api/v2/video/sip/resolve", ResolveSipInboundResponse, json=json + ) + @telemetry.operation_name("getstream.api.video.query_aggregate_call_stats") def query_aggregate_call_stats( self, @@ -1244,7 +1374,9 @@ def query_aggregate_call_stats( to: Optional[str] = None, report_types: Optional[List[str]] = None, ) -> StreamResponse[QueryAggregateCallStatsResponse]: - json = build_body_dict(_from=_from, to=to, report_types=report_types) + json = build_body_dict( + **{"from": _from, "to": to, "report_types": report_types} + ) return self.post( "/api/v2/video/stats", QueryAggregateCallStatsResponse, json=json ) diff --git a/getstream/video/rtc/coordinator/ws.py b/getstream/video/rtc/coordinator/ws.py index 4b666d40..01b82099 100644 --- a/getstream/video/rtc/coordinator/ws.py +++ b/getstream/video/rtc/coordinator/ws.py @@ -9,12 +9,11 @@ import json import logging import time -from typing import TYPE_CHECKING, Optional +from typing import Optional import websockets -if TYPE_CHECKING: - from websockets.legacy.client import WebSocketClientProtocol +from websockets import ClientConnection from getstream import AsyncStream from getstream.utils import StreamAsyncIOEventEmitter @@ -88,7 +87,7 @@ def __init__( self._logger = logger or globals()["logger"] # Connection state - self._websocket: Optional["WebSocketClientProtocol"] = None + self._websocket: Optional[ClientConnection] = None self._connected = False self._client_id: Optional[str] = None @@ -152,6 +151,7 @@ async def _open_socket(self) -> dict: self._build_auth_payload(), ) self._logger.debug("WebSocket connection established") + assert self._websocket is not None # Send authentication payload immediately self._logger.debug("Sending auth payload") diff --git a/getstream/webhook.py b/getstream/webhook.py new file mode 100644 index 00000000..f7ec289b --- /dev/null +++ b/getstream/webhook.py @@ -0,0 +1,578 @@ +# Code generated by GetStream internal OpenAPI code generator. DO NOT EDIT. + +import hmac +import hashlib +import json +from typing import Union, Any, Dict +from .models import ( + CustomEvent, + AppealAcceptedEvent, + AppealCreatedEvent, + AppealRejectedEvent, + CallAcceptedEvent, + BlockedUserEvent, + ClosedCaptionEvent, + CallClosedCaptionsFailedEvent, + CallClosedCaptionsStartedEvent, + CallClosedCaptionsStoppedEvent, + CallCreatedEvent, + CallDeletedEvent, + CallDTMFEvent, + CallEndedEvent, + CallFrameRecordingFailedEvent, + CallFrameRecordingFrameReadyEvent, + CallFrameRecordingStartedEvent, + CallFrameRecordingStoppedEvent, + CallHLSBroadcastingFailedEvent, + CallHLSBroadcastingStartedEvent, + CallHLSBroadcastingStoppedEvent, + KickedUserEvent, + CallLiveStartedEvent, + CallMemberAddedEvent, + CallMemberRemovedEvent, + CallMemberUpdatedEvent, + CallMemberUpdatedPermissionEvent, + CallMissedEvent, + CallModerationBlurEvent, + CallModerationWarningEvent, + CallNotificationEvent, + PermissionRequestEvent, + UpdatedCallPermissionsEvent, + CallReactionEvent, + CallRecordingFailedEvent, + CallRecordingReadyEvent, + CallRecordingStartedEvent, + CallRecordingStoppedEvent, + CallRejectedEvent, + CallRingEvent, + CallRtmpBroadcastFailedEvent, + CallRtmpBroadcastStartedEvent, + CallRtmpBroadcastStoppedEvent, + CallSessionEndedEvent, + CallSessionParticipantCountsUpdatedEvent, + CallSessionParticipantJoinedEvent, + CallSessionParticipantLeftEvent, + CallSessionStartedEvent, + CallStatsReportReadyEvent, + CallTranscriptionFailedEvent, + CallTranscriptionReadyEvent, + CallTranscriptionStartedEvent, + CallTranscriptionStoppedEvent, + UnblockedUserEvent, + CallUpdatedEvent, + CallUserFeedbackSubmittedEvent, + CallUserMutedEvent, + CampaignCompletedEvent, + CampaignStartedEvent, + ChannelCreatedEvent, + ChannelDeletedEvent, + ChannelFrozenEvent, + ChannelHiddenEvent, + MaxStreakChangedEvent, + ChannelMutedEvent, + ChannelTruncatedEvent, + ChannelUnFrozenEvent, + ChannelUnmutedEvent, + ChannelUpdatedEvent, + ChannelVisibleEvent, + ChannelBatchCompletedEvent, + ChannelBatchStartedEvent, + CustomVideoEvent, + AsyncBulkImageModerationEvent, + AsyncExportChannelsEvent, + AsyncExportModerationLogsEvent, + AsyncExportErrorEvent, + AsyncExportUsersEvent, + ActivityAddedEvent, + ActivityDeletedEvent, + ActivityFeedbackEvent, + ActivityMarkEvent, + ActivityPinnedEvent, + ActivityReactionAddedEvent, + ActivityReactionDeletedEvent, + ActivityReactionUpdatedEvent, + ActivityRemovedFromFeedEvent, + ActivityRestoredEvent, + ActivityUnpinnedEvent, + ActivityUpdatedEvent, + BookmarkAddedEvent, + BookmarkDeletedEvent, + BookmarkUpdatedEvent, + BookmarkFolderDeletedEvent, + BookmarkFolderUpdatedEvent, + CommentAddedEvent, + CommentDeletedEvent, + CommentReactionAddedEvent, + CommentReactionDeletedEvent, + CommentReactionUpdatedEvent, + CommentUpdatedEvent, + FeedCreatedEvent, + FeedDeletedEvent, + FeedUpdatedEvent, + FeedGroupChangedEvent, + FeedGroupDeletedEvent, + FeedMemberAddedEvent, + FeedMemberRemovedEvent, + FeedMemberUpdatedEvent, + FollowCreatedEvent, + FollowDeletedEvent, + FollowUpdatedEvent, + NotificationFeedUpdatedEvent, + StoriesFeedUpdatedEvent, + FlagUpdatedEvent, + IngressErrorEvent, + IngressStartedEvent, + IngressStoppedEvent, + MemberAddedEvent, + MemberRemovedEvent, + MemberUpdatedEvent, + MessageDeletedEvent, + MessageFlaggedEvent, + MessageNewEvent, + PendingMessageEvent, + MessageReadEvent, + MessageUnblockedEvent, + MessageUndeletedEvent, + MessageUpdatedEvent, + ModerationCustomActionEvent, + ModerationFlaggedEvent, + ModerationMarkReviewedEvent, + ModerationCheckCompletedEvent, + ModerationRulesTriggeredEvent, + NotificationMarkUnreadEvent, + ReminderNotificationEvent, + NotificationThreadMessageNewEvent, + ReactionDeletedEvent, + ReactionNewEvent, + ReactionUpdatedEvent, + ReminderCreatedEvent, + ReminderDeletedEvent, + ReminderUpdatedEvent, + ReviewQueueItemNewEvent, + ReviewQueueItemUpdatedEvent, + ThreadUpdatedEvent, + UserBannedEvent, + UserDeactivatedEvent, + UserDeletedEvent, + UserFlaggedEvent, + UserMessagesDeletedEvent, + UserMutedEvent, + UserReactivatedEvent, + UserUnbannedEvent, + UserUnmutedEvent, + UserUnreadReminderEvent, + UserUpdatedEvent, +) + + +# Webhook event type constants +EVENT_TYPE_WILDCARD = "*" +EVENT_TYPE_APPEAL_ACCEPTED = "appeal.accepted" +EVENT_TYPE_APPEAL_CREATED = "appeal.created" +EVENT_TYPE_APPEAL_REJECTED = "appeal.rejected" +EVENT_TYPE_CALL_ACCEPTED = "call.accepted" +EVENT_TYPE_CALL_BLOCKED_USER = "call.blocked_user" +EVENT_TYPE_CALL_CLOSED_CAPTION = "call.closed_caption" +EVENT_TYPE_CALL_CLOSED_CAPTIONS_FAILED = "call.closed_captions_failed" +EVENT_TYPE_CALL_CLOSED_CAPTIONS_STARTED = "call.closed_captions_started" +EVENT_TYPE_CALL_CLOSED_CAPTIONS_STOPPED = "call.closed_captions_stopped" +EVENT_TYPE_CALL_CREATED = "call.created" +EVENT_TYPE_CALL_DELETED = "call.deleted" +EVENT_TYPE_CALL_DTMF = "call.dtmf" +EVENT_TYPE_CALL_ENDED = "call.ended" +EVENT_TYPE_CALL_FRAME_RECORDING_FAILED = "call.frame_recording_failed" +EVENT_TYPE_CALL_FRAME_RECORDING_READY = "call.frame_recording_ready" +EVENT_TYPE_CALL_FRAME_RECORDING_STARTED = "call.frame_recording_started" +EVENT_TYPE_CALL_FRAME_RECORDING_STOPPED = "call.frame_recording_stopped" +EVENT_TYPE_CALL_HLS_BROADCASTING_FAILED = "call.hls_broadcasting_failed" +EVENT_TYPE_CALL_HLS_BROADCASTING_STARTED = "call.hls_broadcasting_started" +EVENT_TYPE_CALL_HLS_BROADCASTING_STOPPED = "call.hls_broadcasting_stopped" +EVENT_TYPE_CALL_KICKED_USER = "call.kicked_user" +EVENT_TYPE_CALL_LIVE_STARTED = "call.live_started" +EVENT_TYPE_CALL_MEMBER_ADDED = "call.member_added" +EVENT_TYPE_CALL_MEMBER_REMOVED = "call.member_removed" +EVENT_TYPE_CALL_MEMBER_UPDATED = "call.member_updated" +EVENT_TYPE_CALL_MEMBER_UPDATED_PERMISSION = "call.member_updated_permission" +EVENT_TYPE_CALL_MISSED = "call.missed" +EVENT_TYPE_CALL_MODERATION_BLUR = "call.moderation_blur" +EVENT_TYPE_CALL_MODERATION_WARNING = "call.moderation_warning" +EVENT_TYPE_CALL_NOTIFICATION = "call.notification" +EVENT_TYPE_CALL_PERMISSION_REQUEST = "call.permission_request" +EVENT_TYPE_CALL_PERMISSIONS_UPDATED = "call.permissions_updated" +EVENT_TYPE_CALL_REACTION_NEW = "call.reaction_new" +EVENT_TYPE_CALL_RECORDING_FAILED = "call.recording_failed" +EVENT_TYPE_CALL_RECORDING_READY = "call.recording_ready" +EVENT_TYPE_CALL_RECORDING_STARTED = "call.recording_started" +EVENT_TYPE_CALL_RECORDING_STOPPED = "call.recording_stopped" +EVENT_TYPE_CALL_REJECTED = "call.rejected" +EVENT_TYPE_CALL_RING = "call.ring" +EVENT_TYPE_CALL_RTMP_BROADCAST_FAILED = "call.rtmp_broadcast_failed" +EVENT_TYPE_CALL_RTMP_BROADCAST_STARTED = "call.rtmp_broadcast_started" +EVENT_TYPE_CALL_RTMP_BROADCAST_STOPPED = "call.rtmp_broadcast_stopped" +EVENT_TYPE_CALL_SESSION_ENDED = "call.session_ended" +EVENT_TYPE_CALL_SESSION_PARTICIPANT_COUNT_UPDATED = ( + "call.session_participant_count_updated" +) +EVENT_TYPE_CALL_SESSION_PARTICIPANT_JOINED = "call.session_participant_joined" +EVENT_TYPE_CALL_SESSION_PARTICIPANT_LEFT = "call.session_participant_left" +EVENT_TYPE_CALL_SESSION_STARTED = "call.session_started" +EVENT_TYPE_CALL_STATS_REPORT_READY = "call.stats_report_ready" +EVENT_TYPE_CALL_TRANSCRIPTION_FAILED = "call.transcription_failed" +EVENT_TYPE_CALL_TRANSCRIPTION_READY = "call.transcription_ready" +EVENT_TYPE_CALL_TRANSCRIPTION_STARTED = "call.transcription_started" +EVENT_TYPE_CALL_TRANSCRIPTION_STOPPED = "call.transcription_stopped" +EVENT_TYPE_CALL_UNBLOCKED_USER = "call.unblocked_user" +EVENT_TYPE_CALL_UPDATED = "call.updated" +EVENT_TYPE_CALL_USER_FEEDBACK_SUBMITTED = "call.user_feedback_submitted" +EVENT_TYPE_CALL_USER_MUTED = "call.user_muted" +EVENT_TYPE_CAMPAIGN_COMPLETED = "campaign.completed" +EVENT_TYPE_CAMPAIGN_STARTED = "campaign.started" +EVENT_TYPE_CHANNEL_CREATED = "channel.created" +EVENT_TYPE_CHANNEL_DELETED = "channel.deleted" +EVENT_TYPE_CHANNEL_FROZEN = "channel.frozen" +EVENT_TYPE_CHANNEL_HIDDEN = "channel.hidden" +EVENT_TYPE_CHANNEL_MAX_STREAK_CHANGED = "channel.max_streak_changed" +EVENT_TYPE_CHANNEL_MUTED = "channel.muted" +EVENT_TYPE_CHANNEL_TRUNCATED = "channel.truncated" +EVENT_TYPE_CHANNEL_UNFROZEN = "channel.unfrozen" +EVENT_TYPE_CHANNEL_UNMUTED = "channel.unmuted" +EVENT_TYPE_CHANNEL_UPDATED = "channel.updated" +EVENT_TYPE_CHANNEL_VISIBLE = "channel.visible" +EVENT_TYPE_CHANNEL_BATCH_UPDATE_COMPLETED = "channel_batch_update.completed" +EVENT_TYPE_CHANNEL_BATCH_UPDATE_STARTED = "channel_batch_update.started" +EVENT_TYPE_CUSTOM = "custom" +EVENT_TYPE_EXPORT_BULK_IMAGE_MODERATION_ERROR = "export.bulk_image_moderation.error" +EVENT_TYPE_EXPORT_BULK_IMAGE_MODERATION_SUCCESS = "export.bulk_image_moderation.success" +EVENT_TYPE_EXPORT_CHANNELS_ERROR = "export.channels.error" +EVENT_TYPE_EXPORT_CHANNELS_SUCCESS = "export.channels.success" +EVENT_TYPE_EXPORT_MODERATION_LOGS_ERROR = "export.moderation_logs.error" +EVENT_TYPE_EXPORT_MODERATION_LOGS_SUCCESS = "export.moderation_logs.success" +EVENT_TYPE_EXPORT_USERS_ERROR = "export.users.error" +EVENT_TYPE_EXPORT_USERS_SUCCESS = "export.users.success" +EVENT_TYPE_FEEDS_ACTIVITY_ADDED = "feeds.activity.added" +EVENT_TYPE_FEEDS_ACTIVITY_DELETED = "feeds.activity.deleted" +EVENT_TYPE_FEEDS_ACTIVITY_FEEDBACK = "feeds.activity.feedback" +EVENT_TYPE_FEEDS_ACTIVITY_MARKED = "feeds.activity.marked" +EVENT_TYPE_FEEDS_ACTIVITY_PINNED = "feeds.activity.pinned" +EVENT_TYPE_FEEDS_ACTIVITY_REACTION_ADDED = "feeds.activity.reaction.added" +EVENT_TYPE_FEEDS_ACTIVITY_REACTION_DELETED = "feeds.activity.reaction.deleted" +EVENT_TYPE_FEEDS_ACTIVITY_REACTION_UPDATED = "feeds.activity.reaction.updated" +EVENT_TYPE_FEEDS_ACTIVITY_REMOVED_FROM_FEED = "feeds.activity.removed_from_feed" +EVENT_TYPE_FEEDS_ACTIVITY_RESTORED = "feeds.activity.restored" +EVENT_TYPE_FEEDS_ACTIVITY_UNPINNED = "feeds.activity.unpinned" +EVENT_TYPE_FEEDS_ACTIVITY_UPDATED = "feeds.activity.updated" +EVENT_TYPE_FEEDS_BOOKMARK_ADDED = "feeds.bookmark.added" +EVENT_TYPE_FEEDS_BOOKMARK_DELETED = "feeds.bookmark.deleted" +EVENT_TYPE_FEEDS_BOOKMARK_UPDATED = "feeds.bookmark.updated" +EVENT_TYPE_FEEDS_BOOKMARK_FOLDER_DELETED = "feeds.bookmark_folder.deleted" +EVENT_TYPE_FEEDS_BOOKMARK_FOLDER_UPDATED = "feeds.bookmark_folder.updated" +EVENT_TYPE_FEEDS_COMMENT_ADDED = "feeds.comment.added" +EVENT_TYPE_FEEDS_COMMENT_DELETED = "feeds.comment.deleted" +EVENT_TYPE_FEEDS_COMMENT_REACTION_ADDED = "feeds.comment.reaction.added" +EVENT_TYPE_FEEDS_COMMENT_REACTION_DELETED = "feeds.comment.reaction.deleted" +EVENT_TYPE_FEEDS_COMMENT_REACTION_UPDATED = "feeds.comment.reaction.updated" +EVENT_TYPE_FEEDS_COMMENT_UPDATED = "feeds.comment.updated" +EVENT_TYPE_FEEDS_FEED_CREATED = "feeds.feed.created" +EVENT_TYPE_FEEDS_FEED_DELETED = "feeds.feed.deleted" +EVENT_TYPE_FEEDS_FEED_UPDATED = "feeds.feed.updated" +EVENT_TYPE_FEEDS_FEED_GROUP_CHANGED = "feeds.feed_group.changed" +EVENT_TYPE_FEEDS_FEED_GROUP_DELETED = "feeds.feed_group.deleted" +EVENT_TYPE_FEEDS_FEED_MEMBER_ADDED = "feeds.feed_member.added" +EVENT_TYPE_FEEDS_FEED_MEMBER_REMOVED = "feeds.feed_member.removed" +EVENT_TYPE_FEEDS_FEED_MEMBER_UPDATED = "feeds.feed_member.updated" +EVENT_TYPE_FEEDS_FOLLOW_CREATED = "feeds.follow.created" +EVENT_TYPE_FEEDS_FOLLOW_DELETED = "feeds.follow.deleted" +EVENT_TYPE_FEEDS_FOLLOW_UPDATED = "feeds.follow.updated" +EVENT_TYPE_FEEDS_NOTIFICATION_FEED_UPDATED = "feeds.notification_feed.updated" +EVENT_TYPE_FEEDS_STORIES_FEED_UPDATED = "feeds.stories_feed.updated" +EVENT_TYPE_FLAG_UPDATED = "flag.updated" +EVENT_TYPE_INGRESS_ERROR = "ingress.error" +EVENT_TYPE_INGRESS_STARTED = "ingress.started" +EVENT_TYPE_INGRESS_STOPPED = "ingress.stopped" +EVENT_TYPE_MEMBER_ADDED = "member.added" +EVENT_TYPE_MEMBER_REMOVED = "member.removed" +EVENT_TYPE_MEMBER_UPDATED = "member.updated" +EVENT_TYPE_MESSAGE_DELETED = "message.deleted" +EVENT_TYPE_MESSAGE_FLAGGED = "message.flagged" +EVENT_TYPE_MESSAGE_NEW = "message.new" +EVENT_TYPE_MESSAGE_PENDING = "message.pending" +EVENT_TYPE_MESSAGE_READ = "message.read" +EVENT_TYPE_MESSAGE_UNBLOCKED = "message.unblocked" +EVENT_TYPE_MESSAGE_UNDELETED = "message.undeleted" +EVENT_TYPE_MESSAGE_UPDATED = "message.updated" +EVENT_TYPE_MODERATION_CUSTOM_ACTION = "moderation.custom_action" +EVENT_TYPE_MODERATION_FLAGGED = "moderation.flagged" +EVENT_TYPE_MODERATION_MARK_REVIEWED = "moderation.mark_reviewed" +EVENT_TYPE_MODERATION_CHECK_COMPLETED = "moderation_check.completed" +EVENT_TYPE_MODERATION_RULE_TRIGGERED = "moderation_rule.triggered" +EVENT_TYPE_NOTIFICATION_MARK_UNREAD = "notification.mark_unread" +EVENT_TYPE_NOTIFICATION_REMINDER_DUE = "notification.reminder_due" +EVENT_TYPE_NOTIFICATION_THREAD_MESSAGE_NEW = "notification.thread_message_new" +EVENT_TYPE_REACTION_DELETED = "reaction.deleted" +EVENT_TYPE_REACTION_NEW = "reaction.new" +EVENT_TYPE_REACTION_UPDATED = "reaction.updated" +EVENT_TYPE_REMINDER_CREATED = "reminder.created" +EVENT_TYPE_REMINDER_DELETED = "reminder.deleted" +EVENT_TYPE_REMINDER_UPDATED = "reminder.updated" +EVENT_TYPE_REVIEW_QUEUE_ITEM_NEW = "review_queue_item.new" +EVENT_TYPE_REVIEW_QUEUE_ITEM_UPDATED = "review_queue_item.updated" +EVENT_TYPE_THREAD_UPDATED = "thread.updated" +EVENT_TYPE_USER_BANNED = "user.banned" +EVENT_TYPE_USER_DEACTIVATED = "user.deactivated" +EVENT_TYPE_USER_DELETED = "user.deleted" +EVENT_TYPE_USER_FLAGGED = "user.flagged" +EVENT_TYPE_USER_MESSAGES_DELETED = "user.messages.deleted" +EVENT_TYPE_USER_MUTED = "user.muted" +EVENT_TYPE_USER_REACTIVATED = "user.reactivated" +EVENT_TYPE_USER_UNBANNED = "user.unbanned" +EVENT_TYPE_USER_UNMUTED = "user.unmuted" +EVENT_TYPE_USER_UNREAD_MESSAGE_REMINDER = "user.unread_message_reminder" +EVENT_TYPE_USER_UPDATED = "user.updated" + + +def get_event_type(raw_event: Union[bytes, str, Dict[str, Any]]) -> str: + """ + Extract the event type from a raw webhook payload. + + Args: + raw_event: The raw webhook payload + + Returns: + The event type string (e.g., "message.new"), or empty string if parsing fails + """ + if isinstance(raw_event, dict): + return raw_event.get("type", "") + + try: + if isinstance(raw_event, bytes): + raw_event = raw_event.decode("utf-8") + data = json.loads(raw_event) + return data.get("type", "") + except (json.JSONDecodeError, UnicodeDecodeError, AttributeError): + return "" + + +def parse_webhook_event(raw_event: Union[bytes, str, Dict[str, Any]]) -> Any: + """ + Deserialize a raw webhook payload into a typed event object. + + Args: + raw_event: The raw webhook payload + + Returns: + A typed event object corresponding to the event type + + Raises: + ValueError: If the event type is unknown or deserialization fails + """ + try: + if isinstance(raw_event, dict): + data = raw_event + elif isinstance(raw_event, bytes): + data = json.loads(raw_event.decode("utf-8")) + else: + data = json.loads(raw_event) + except (json.JSONDecodeError, UnicodeDecodeError) as e: + raise ValueError(f"Failed to parse webhook payload: {e}") + + event_type = data.get("type") + if not event_type: + raise ValueError("Webhook payload missing 'type' field") + + event_class = _get_event_class(event_type) + if event_class is None: + raise ValueError(f"Unknown webhook event type: {event_type}") + + try: + return event_class.from_dict(data, infer_missing=True) + except Exception as e: + raise ValueError(f"Failed to deserialize webhook event: {e}") + + +def _get_event_class(event_type: str): + """Map event type to event class.""" + event_map = { + "*": CustomEvent, + "appeal.accepted": AppealAcceptedEvent, + "appeal.created": AppealCreatedEvent, + "appeal.rejected": AppealRejectedEvent, + "call.accepted": CallAcceptedEvent, + "call.blocked_user": BlockedUserEvent, + "call.closed_caption": ClosedCaptionEvent, + "call.closed_captions_failed": CallClosedCaptionsFailedEvent, + "call.closed_captions_started": CallClosedCaptionsStartedEvent, + "call.closed_captions_stopped": CallClosedCaptionsStoppedEvent, + "call.created": CallCreatedEvent, + "call.deleted": CallDeletedEvent, + "call.dtmf": CallDTMFEvent, + "call.ended": CallEndedEvent, + "call.frame_recording_failed": CallFrameRecordingFailedEvent, + "call.frame_recording_ready": CallFrameRecordingFrameReadyEvent, + "call.frame_recording_started": CallFrameRecordingStartedEvent, + "call.frame_recording_stopped": CallFrameRecordingStoppedEvent, + "call.hls_broadcasting_failed": CallHLSBroadcastingFailedEvent, + "call.hls_broadcasting_started": CallHLSBroadcastingStartedEvent, + "call.hls_broadcasting_stopped": CallHLSBroadcastingStoppedEvent, + "call.kicked_user": KickedUserEvent, + "call.live_started": CallLiveStartedEvent, + "call.member_added": CallMemberAddedEvent, + "call.member_removed": CallMemberRemovedEvent, + "call.member_updated": CallMemberUpdatedEvent, + "call.member_updated_permission": CallMemberUpdatedPermissionEvent, + "call.missed": CallMissedEvent, + "call.moderation_blur": CallModerationBlurEvent, + "call.moderation_warning": CallModerationWarningEvent, + "call.notification": CallNotificationEvent, + "call.permission_request": PermissionRequestEvent, + "call.permissions_updated": UpdatedCallPermissionsEvent, + "call.reaction_new": CallReactionEvent, + "call.recording_failed": CallRecordingFailedEvent, + "call.recording_ready": CallRecordingReadyEvent, + "call.recording_started": CallRecordingStartedEvent, + "call.recording_stopped": CallRecordingStoppedEvent, + "call.rejected": CallRejectedEvent, + "call.ring": CallRingEvent, + "call.rtmp_broadcast_failed": CallRtmpBroadcastFailedEvent, + "call.rtmp_broadcast_started": CallRtmpBroadcastStartedEvent, + "call.rtmp_broadcast_stopped": CallRtmpBroadcastStoppedEvent, + "call.session_ended": CallSessionEndedEvent, + "call.session_participant_count_updated": CallSessionParticipantCountsUpdatedEvent, + "call.session_participant_joined": CallSessionParticipantJoinedEvent, + "call.session_participant_left": CallSessionParticipantLeftEvent, + "call.session_started": CallSessionStartedEvent, + "call.stats_report_ready": CallStatsReportReadyEvent, + "call.transcription_failed": CallTranscriptionFailedEvent, + "call.transcription_ready": CallTranscriptionReadyEvent, + "call.transcription_started": CallTranscriptionStartedEvent, + "call.transcription_stopped": CallTranscriptionStoppedEvent, + "call.unblocked_user": UnblockedUserEvent, + "call.updated": CallUpdatedEvent, + "call.user_feedback_submitted": CallUserFeedbackSubmittedEvent, + "call.user_muted": CallUserMutedEvent, + "campaign.completed": CampaignCompletedEvent, + "campaign.started": CampaignStartedEvent, + "channel.created": ChannelCreatedEvent, + "channel.deleted": ChannelDeletedEvent, + "channel.frozen": ChannelFrozenEvent, + "channel.hidden": ChannelHiddenEvent, + "channel.max_streak_changed": MaxStreakChangedEvent, + "channel.muted": ChannelMutedEvent, + "channel.truncated": ChannelTruncatedEvent, + "channel.unfrozen": ChannelUnFrozenEvent, + "channel.unmuted": ChannelUnmutedEvent, + "channel.updated": ChannelUpdatedEvent, + "channel.visible": ChannelVisibleEvent, + "channel_batch_update.completed": ChannelBatchCompletedEvent, + "channel_batch_update.started": ChannelBatchStartedEvent, + "custom": CustomVideoEvent, + "export.bulk_image_moderation.error": AsyncExportErrorEvent, + "export.bulk_image_moderation.success": AsyncBulkImageModerationEvent, + "export.channels.error": AsyncExportErrorEvent, + "export.channels.success": AsyncExportChannelsEvent, + "export.moderation_logs.error": AsyncExportErrorEvent, + "export.moderation_logs.success": AsyncExportModerationLogsEvent, + "export.users.error": AsyncExportErrorEvent, + "export.users.success": AsyncExportUsersEvent, + "feeds.activity.added": ActivityAddedEvent, + "feeds.activity.deleted": ActivityDeletedEvent, + "feeds.activity.feedback": ActivityFeedbackEvent, + "feeds.activity.marked": ActivityMarkEvent, + "feeds.activity.pinned": ActivityPinnedEvent, + "feeds.activity.reaction.added": ActivityReactionAddedEvent, + "feeds.activity.reaction.deleted": ActivityReactionDeletedEvent, + "feeds.activity.reaction.updated": ActivityReactionUpdatedEvent, + "feeds.activity.removed_from_feed": ActivityRemovedFromFeedEvent, + "feeds.activity.restored": ActivityRestoredEvent, + "feeds.activity.unpinned": ActivityUnpinnedEvent, + "feeds.activity.updated": ActivityUpdatedEvent, + "feeds.bookmark.added": BookmarkAddedEvent, + "feeds.bookmark.deleted": BookmarkDeletedEvent, + "feeds.bookmark.updated": BookmarkUpdatedEvent, + "feeds.bookmark_folder.deleted": BookmarkFolderDeletedEvent, + "feeds.bookmark_folder.updated": BookmarkFolderUpdatedEvent, + "feeds.comment.added": CommentAddedEvent, + "feeds.comment.deleted": CommentDeletedEvent, + "feeds.comment.reaction.added": CommentReactionAddedEvent, + "feeds.comment.reaction.deleted": CommentReactionDeletedEvent, + "feeds.comment.reaction.updated": CommentReactionUpdatedEvent, + "feeds.comment.updated": CommentUpdatedEvent, + "feeds.feed.created": FeedCreatedEvent, + "feeds.feed.deleted": FeedDeletedEvent, + "feeds.feed.updated": FeedUpdatedEvent, + "feeds.feed_group.changed": FeedGroupChangedEvent, + "feeds.feed_group.deleted": FeedGroupDeletedEvent, + "feeds.feed_member.added": FeedMemberAddedEvent, + "feeds.feed_member.removed": FeedMemberRemovedEvent, + "feeds.feed_member.updated": FeedMemberUpdatedEvent, + "feeds.follow.created": FollowCreatedEvent, + "feeds.follow.deleted": FollowDeletedEvent, + "feeds.follow.updated": FollowUpdatedEvent, + "feeds.notification_feed.updated": NotificationFeedUpdatedEvent, + "feeds.stories_feed.updated": StoriesFeedUpdatedEvent, + "flag.updated": FlagUpdatedEvent, + "ingress.error": IngressErrorEvent, + "ingress.started": IngressStartedEvent, + "ingress.stopped": IngressStoppedEvent, + "member.added": MemberAddedEvent, + "member.removed": MemberRemovedEvent, + "member.updated": MemberUpdatedEvent, + "message.deleted": MessageDeletedEvent, + "message.flagged": MessageFlaggedEvent, + "message.new": MessageNewEvent, + "message.pending": PendingMessageEvent, + "message.read": MessageReadEvent, + "message.unblocked": MessageUnblockedEvent, + "message.undeleted": MessageUndeletedEvent, + "message.updated": MessageUpdatedEvent, + "moderation.custom_action": ModerationCustomActionEvent, + "moderation.flagged": ModerationFlaggedEvent, + "moderation.mark_reviewed": ModerationMarkReviewedEvent, + "moderation_check.completed": ModerationCheckCompletedEvent, + "moderation_rule.triggered": ModerationRulesTriggeredEvent, + "notification.mark_unread": NotificationMarkUnreadEvent, + "notification.reminder_due": ReminderNotificationEvent, + "notification.thread_message_new": NotificationThreadMessageNewEvent, + "reaction.deleted": ReactionDeletedEvent, + "reaction.new": ReactionNewEvent, + "reaction.updated": ReactionUpdatedEvent, + "reminder.created": ReminderCreatedEvent, + "reminder.deleted": ReminderDeletedEvent, + "reminder.updated": ReminderUpdatedEvent, + "review_queue_item.new": ReviewQueueItemNewEvent, + "review_queue_item.updated": ReviewQueueItemUpdatedEvent, + "thread.updated": ThreadUpdatedEvent, + "user.banned": UserBannedEvent, + "user.deactivated": UserDeactivatedEvent, + "user.deleted": UserDeletedEvent, + "user.flagged": UserFlaggedEvent, + "user.messages.deleted": UserMessagesDeletedEvent, + "user.muted": UserMutedEvent, + "user.reactivated": UserReactivatedEvent, + "user.unbanned": UserUnbannedEvent, + "user.unmuted": UserUnmutedEvent, + "user.unread_message_reminder": UserUnreadReminderEvent, + "user.updated": UserUpdatedEvent, + } + return event_map.get(event_type) + + +def verify_webhook_signature( + body: Union[bytes, str], signature: str, secret: str +) -> bool: + """ + Verify the HMAC-SHA256 signature of a webhook payload. + + Args: + body: The raw request body (bytes or UTF-8 string) + signature: The signature from the X-Signature header + secret: Your webhook secret (found in the Stream Dashboard) + + Returns: + True if the signature is valid, False otherwise + """ + if isinstance(body, str): + body = body.encode("utf-8") + + h = hmac.new(secret.encode("utf-8"), body, hashlib.sha256) + expected = h.hexdigest() + return hmac.compare_digest(signature, expected) diff --git a/tests/test_video_examples.py b/tests/test_video_examples.py index 8527f8f2..0812e07c 100644 --- a/tests/test_video_examples.py +++ b/tests/test_video_examples.py @@ -329,7 +329,7 @@ def test_start_stop_frame_recording(client: Stream): call.get_or_create(data=CallRequest(created_by_id=user_id)) with pytest.raises(StreamAPIException) as e_info: - call.start_recording() + call.start_recording(recording_type="composite") assert e_info.value.status_code == 400 assert ( @@ -338,7 +338,7 @@ def test_start_stop_frame_recording(client: Stream): ) with pytest.raises(StreamAPIException) as e_info: - call.stop_recording() + call.stop_recording(recording_type="composite") assert e_info.value.status_code == 400 assert (