From c8edaf3c7eb52d01caf1e2b41849437494c878e8 Mon Sep 17 00:00:00 2001 From: Muneyuki Noguchi Date: Sat, 28 Sep 2024 22:17:39 +0900 Subject: [PATCH] Update atproto --- atproto | 2 +- chitose/app/bsky/actor/defs.py | 33 ++++++++++++++++--- chitose/app/bsky/actor/profile.py | 5 +-- chitose/app/bsky/feed/__init__.py | 4 +-- chitose/app/bsky/feed/defs.py | 21 +++++++++--- chitose/app/bsky/feed/get_author_feed.py | 4 +-- chitose/tools/ozone/communication/__init__.py | 12 ++++--- .../ozone/communication/create_template.py | 6 ++-- chitose/tools/ozone/communication/defs.py | 7 ++-- .../ozone/communication/update_template.py | 6 ++-- chitose/tools/ozone/moderation/__init__.py | 10 ++++-- chitose/tools/ozone/moderation/defs.py | 7 ++-- chitose/tools/ozone/moderation/emit_event.py | 2 +- .../tools/ozone/moderation/query_statuses.py | 8 +++-- 14 files changed, 93 insertions(+), 34 deletions(-) diff --git a/atproto b/atproto index bfbac24..6593fdc 160000 --- a/atproto +++ b/atproto @@ -1 +1 @@ -Subproject commit bfbac2431214a0c96dad104e7310ea10c863ac08 +Subproject commit 6593fdc3f4d3e1d64dcc941f3d624e16369fd9b6 diff --git a/chitose/app/bsky/actor/defs.py b/chitose/app/bsky/actor/defs.py index e5637d0..c7e3287 100644 --- a/chitose/app/bsky/actor/defs.py +++ b/chitose/app/bsky/actor/defs.py @@ -5,6 +5,7 @@ import chitose.app.bsky.actor.defs import chitose.app.bsky.graph.defs import chitose.com.atproto.label.defs +import chitose.com.atproto.repo.strong_ref import typing class ProfileViewBasic(chitose.Object): @@ -44,7 +45,7 @@ def to_dict(self) -> dict[str, typing.Any]: class ProfileViewDetailed(chitose.Object): """""" - def __init__(self, did: str, handle: str, display_name: typing.Optional[str]=None, description: typing.Optional[str]=None, avatar: typing.Optional[str]=None, banner: typing.Optional[str]=None, followers_count: typing.Optional[int]=None, follows_count: typing.Optional[int]=None, posts_count: typing.Optional[int]=None, associated: typing.Optional[chitose.app.bsky.actor.defs.ProfileAssociated]=None, joined_via_starter_pack: typing.Optional[chitose.app.bsky.graph.defs.StarterPackViewBasic]=None, indexed_at: typing.Optional[str]=None, created_at: typing.Optional[str]=None, viewer: typing.Optional[chitose.app.bsky.actor.defs.ViewerState]=None, labels: typing.Optional[list[chitose.com.atproto.label.defs.Label]]=None) -> None: + def __init__(self, did: str, handle: str, display_name: typing.Optional[str]=None, description: typing.Optional[str]=None, avatar: typing.Optional[str]=None, banner: typing.Optional[str]=None, followers_count: typing.Optional[int]=None, follows_count: typing.Optional[int]=None, posts_count: typing.Optional[int]=None, associated: typing.Optional[chitose.app.bsky.actor.defs.ProfileAssociated]=None, joined_via_starter_pack: typing.Optional[chitose.app.bsky.graph.defs.StarterPackViewBasic]=None, indexed_at: typing.Optional[str]=None, created_at: typing.Optional[str]=None, viewer: typing.Optional[chitose.app.bsky.actor.defs.ViewerState]=None, labels: typing.Optional[list[chitose.com.atproto.label.defs.Label]]=None, pinned_post: typing.Optional[chitose.com.atproto.repo.strong_ref.StrongRef]=None) -> None: self.did = did self.handle = handle self.display_name = display_name @@ -60,9 +61,10 @@ def __init__(self, did: str, handle: str, display_name: typing.Optional[str]=Non self.created_at = created_at self.viewer = viewer self.labels = labels + self.pinned_post = pinned_post def to_dict(self) -> dict[str, typing.Any]: - return {'did': self.did, 'handle': self.handle, 'displayName': self.display_name, 'description': self.description, 'avatar': self.avatar, 'banner': self.banner, 'followersCount': self.followers_count, 'followsCount': self.follows_count, 'postsCount': self.posts_count, 'associated': self.associated, 'joinedViaStarterPack': self.joined_via_starter_pack, 'indexedAt': self.indexed_at, 'createdAt': self.created_at, 'viewer': self.viewer, 'labels': self.labels, '$type': 'app.bsky.actor.defs#profileViewDetailed'} + return {'did': self.did, 'handle': self.handle, 'displayName': self.display_name, 'description': self.description, 'avatar': self.avatar, 'banner': self.banner, 'followersCount': self.followers_count, 'followsCount': self.follows_count, 'postsCount': self.posts_count, 'associated': self.associated, 'joinedViaStarterPack': self.joined_via_starter_pack, 'indexedAt': self.indexed_at, 'createdAt': self.created_at, 'viewer': self.viewer, 'labels': self.labels, 'pinnedPost': self.pinned_post, '$type': 'app.bsky.actor.defs#profileViewDetailed'} class ProfileAssociated(chitose.Object): """""" @@ -312,14 +314,17 @@ class BskyAppStatePref(chitose.Object): :param queued_nudges: An array of tokens which identify nudges (modals, popups, tours, highlight dots) that should be shown to the user. + + :param nuxs: Storage for NUXs the user has encountered. """ - def __init__(self, active_progress_guide: typing.Optional[chitose.app.bsky.actor.defs.BskyAppProgressGuide]=None, queued_nudges: typing.Optional[list[str]]=None) -> None: + def __init__(self, active_progress_guide: typing.Optional[chitose.app.bsky.actor.defs.BskyAppProgressGuide]=None, queued_nudges: typing.Optional[list[str]]=None, nuxs: typing.Optional[list[chitose.app.bsky.actor.defs.Nux]]=None) -> None: self.active_progress_guide = active_progress_guide self.queued_nudges = queued_nudges + self.nuxs = nuxs def to_dict(self) -> dict[str, typing.Any]: - return {'activeProgressGuide': self.active_progress_guide, 'queuedNudges': self.queued_nudges, '$type': 'app.bsky.actor.defs#bskyAppStatePref'} + return {'activeProgressGuide': self.active_progress_guide, 'queuedNudges': self.queued_nudges, 'nuxs': self.nuxs, '$type': 'app.bsky.actor.defs#bskyAppStatePref'} class BskyAppProgressGuide(chitose.Object): """If set, an active progress guide. Once completed, can be set to undefined. Should have unspecced fields tracking progress.""" @@ -328,4 +333,22 @@ def __init__(self, guide: str) -> None: self.guide = guide def to_dict(self) -> dict[str, typing.Any]: - return {'guide': self.guide, '$type': 'app.bsky.actor.defs#bskyAppProgressGuide'} \ No newline at end of file + return {'guide': self.guide, '$type': 'app.bsky.actor.defs#bskyAppProgressGuide'} + +class Nux(chitose.Object): + """A new user experiences (NUX) storage object + + + :param data: Arbitrary data for the NUX. The structure is defined by the NUX itself. Limited to 300 characters. + + :param expires_at: The date and time at which the NUX will expire and should be considered completed. + """ + + def __init__(self, id: str, completed: bool, data: typing.Optional[str]=None, expires_at: typing.Optional[str]=None) -> None: + self.id = id + self.completed = completed + self.data = data + self.expires_at = expires_at + + def to_dict(self) -> dict[str, typing.Any]: + return {'id': self.id, 'completed': self.completed, 'data': self.data, 'expiresAt': self.expires_at, '$type': 'app.bsky.actor.defs#nux'} \ No newline at end of file diff --git a/chitose/app/bsky/actor/profile.py b/chitose/app/bsky/actor/profile.py index cc9949a..c6e5276 100644 --- a/chitose/app/bsky/actor/profile.py +++ b/chitose/app/bsky/actor/profile.py @@ -19,14 +19,15 @@ class Profile(chitose.Record): :param labels: Self-label values, specific to the Bluesky application, on the overall account. """ - def __init__(self, display_name: typing.Optional[str]=None, description: typing.Optional[str]=None, avatar: typing.Optional[chitose.Blob]=None, banner: typing.Optional[chitose.Blob]=None, labels: typing.Optional[chitose.com.atproto.label.defs.SelfLabels]=None, joined_via_starter_pack: typing.Optional[chitose.com.atproto.repo.strong_ref.StrongRef]=None, created_at: typing.Optional[str]=None) -> None: + def __init__(self, display_name: typing.Optional[str]=None, description: typing.Optional[str]=None, avatar: typing.Optional[chitose.Blob]=None, banner: typing.Optional[chitose.Blob]=None, labels: typing.Optional[chitose.com.atproto.label.defs.SelfLabels]=None, joined_via_starter_pack: typing.Optional[chitose.com.atproto.repo.strong_ref.StrongRef]=None, pinned_post: typing.Optional[chitose.com.atproto.repo.strong_ref.StrongRef]=None, created_at: typing.Optional[str]=None) -> None: self.display_name = display_name self.description = description self.avatar = avatar self.banner = banner self.labels = labels self.joined_via_starter_pack = joined_via_starter_pack + self.pinned_post = pinned_post self.created_at = created_at def to_dict(self) -> dict[str, typing.Any]: - return {'displayName': self.display_name, 'description': self.description, 'avatar': self.avatar, 'banner': self.banner, 'labels': self.labels, 'joinedViaStarterPack': self.joined_via_starter_pack, 'createdAt': self.created_at, '$type': 'app.bsky.actor.profile'} \ No newline at end of file + return {'displayName': self.display_name, 'description': self.description, 'avatar': self.avatar, 'banner': self.banner, 'labels': self.labels, 'joinedViaStarterPack': self.joined_via_starter_pack, 'pinnedPost': self.pinned_post, 'createdAt': self.created_at, '$type': 'app.bsky.actor.profile'} \ No newline at end of file diff --git a/chitose/app/bsky/feed/__init__.py b/chitose/app/bsky/feed/__init__.py index 170e7a6..59ec408 100644 --- a/chitose/app/bsky/feed/__init__.py +++ b/chitose/app/bsky/feed/__init__.py @@ -42,13 +42,13 @@ def get_actor_likes(self, actor: str, limit: typing.Optional[int]=None, cursor: """Get a list of posts liked by an actor. Requires auth, actor must be the requesting account.""" return _get_actor_likes(self.call, actor, limit, cursor) - def get_author_feed(self, actor: str, limit: typing.Optional[int]=None, cursor: typing.Optional[str]=None, filter: typing.Optional[typing.Literal['posts_with_replies', 'posts_no_replies', 'posts_with_media', 'posts_and_author_threads']]=None) -> bytes: + def get_author_feed(self, actor: str, limit: typing.Optional[int]=None, cursor: typing.Optional[str]=None, filter: typing.Optional[typing.Literal['posts_with_replies', 'posts_no_replies', 'posts_with_media', 'posts_and_author_threads']]=None, include_pins: typing.Optional[bool]=None) -> bytes: """Get a view of an actor's 'author feed' (post and reposts by the author). Does not require auth. :param filter: Combinations of post/repost types to include in response. """ - return _get_author_feed(self.call, actor, limit, cursor, filter) + return _get_author_feed(self.call, actor, limit, cursor, filter, include_pins) def get_feed(self, feed: str, limit: typing.Optional[int]=None, cursor: typing.Optional[str]=None) -> bytes: """Get a hydrated feed from an actor's selected feed generator. Implemented by App View.""" diff --git a/chitose/app/bsky/feed/defs.py b/chitose/app/bsky/feed/defs.py index 411586f..3f0cdcc 100644 --- a/chitose/app/bsky/feed/defs.py +++ b/chitose/app/bsky/feed/defs.py @@ -38,15 +38,16 @@ def to_dict(self) -> dict[str, typing.Any]: class ViewerState(chitose.Object): """Metadata about the requesting account's relationship with the subject content. Only has meaningful content for authed requests.""" - def __init__(self, repost: typing.Optional[str]=None, like: typing.Optional[str]=None, thread_muted: typing.Optional[bool]=None, reply_disabled: typing.Optional[bool]=None, embedding_disabled: typing.Optional[bool]=None) -> None: + def __init__(self, repost: typing.Optional[str]=None, like: typing.Optional[str]=None, thread_muted: typing.Optional[bool]=None, reply_disabled: typing.Optional[bool]=None, embedding_disabled: typing.Optional[bool]=None, pinned: typing.Optional[bool]=None) -> None: self.repost = repost self.like = like self.thread_muted = thread_muted self.reply_disabled = reply_disabled self.embedding_disabled = embedding_disabled + self.pinned = pinned def to_dict(self) -> dict[str, typing.Any]: - return {'repost': self.repost, 'like': self.like, 'threadMuted': self.thread_muted, 'replyDisabled': self.reply_disabled, 'embeddingDisabled': self.embedding_disabled, '$type': 'app.bsky.feed.defs#viewerState'} + return {'repost': self.repost, 'like': self.like, 'threadMuted': self.thread_muted, 'replyDisabled': self.reply_disabled, 'embeddingDisabled': self.embedding_disabled, 'pinned': self.pinned, '$type': 'app.bsky.feed.defs#viewerState'} class FeedViewPost(chitose.Object): """ @@ -55,7 +56,7 @@ class FeedViewPost(chitose.Object): :param feed_context: Context provided by feed generator that may be passed back alongside interactions. """ - def __init__(self, post: chitose.app.bsky.feed.defs.PostView, reply: typing.Optional[chitose.app.bsky.feed.defs.ReplyRef]=None, reason: typing.Optional[chitose.app.bsky.feed.defs.ReasonRepost]=None, feed_context: typing.Optional[str]=None) -> None: + def __init__(self, post: chitose.app.bsky.feed.defs.PostView, reply: typing.Optional[chitose.app.bsky.feed.defs.ReplyRef]=None, reason: typing.Optional[typing.Union[chitose.app.bsky.feed.defs.ReasonRepost, chitose.app.bsky.feed.defs.ReasonPin]]=None, feed_context: typing.Optional[str]=None) -> None: self.post = post self.reply = reply self.reason = reason @@ -89,6 +90,12 @@ def __init__(self, by: chitose.app.bsky.actor.defs.ProfileViewBasic, indexed_at: def to_dict(self) -> dict[str, typing.Any]: return {'by': self.by, 'indexedAt': self.indexed_at, '$type': 'app.bsky.feed.defs#reasonRepost'} +class ReasonPin(chitose.Object): + """""" + + def to_dict(self) -> dict[str, typing.Any]: + return {'$type': 'app.bsky.feed.defs#reasonPin'} + class ThreadViewPost(chitose.Object): """""" @@ -168,7 +175,7 @@ class SkeletonFeedPost(chitose.Object): :param feed_context: Context that will be passed through to client and may be passed to feed generator back alongside interactions. """ - def __init__(self, post: str, reason: typing.Optional[chitose.app.bsky.feed.defs.SkeletonReasonRepost]=None, feed_context: typing.Optional[str]=None) -> None: + def __init__(self, post: str, reason: typing.Optional[typing.Union[chitose.app.bsky.feed.defs.SkeletonReasonRepost, chitose.app.bsky.feed.defs.SkeletonReasonPin]]=None, feed_context: typing.Optional[str]=None) -> None: self.post = post self.reason = reason self.feed_context = feed_context @@ -185,6 +192,12 @@ def __init__(self, repost: str) -> None: def to_dict(self) -> dict[str, typing.Any]: return {'repost': self.repost, '$type': 'app.bsky.feed.defs#skeletonReasonRepost'} +class SkeletonReasonPin(chitose.Object): + """""" + + def to_dict(self) -> dict[str, typing.Any]: + return {'$type': 'app.bsky.feed.defs#skeletonReasonPin'} + class ThreadgateView(chitose.Object): """""" diff --git a/chitose/app/bsky/feed/get_author_feed.py b/chitose/app/bsky/feed/get_author_feed.py index baf5f56..16c6d02 100644 --- a/chitose/app/bsky/feed/get_author_feed.py +++ b/chitose/app/bsky/feed/get_author_feed.py @@ -4,10 +4,10 @@ import chitose import typing -def _get_author_feed(call: chitose.xrpc.XrpcCall, actor: str, limit: typing.Optional[int]=None, cursor: typing.Optional[str]=None, filter: typing.Optional[typing.Literal['posts_with_replies', 'posts_no_replies', 'posts_with_media', 'posts_and_author_threads']]=None) -> bytes: +def _get_author_feed(call: chitose.xrpc.XrpcCall, actor: str, limit: typing.Optional[int]=None, cursor: typing.Optional[str]=None, filter: typing.Optional[typing.Literal['posts_with_replies', 'posts_no_replies', 'posts_with_media', 'posts_and_author_threads']]=None, include_pins: typing.Optional[bool]=None) -> bytes: """Get a view of an actor's 'author feed' (post and reposts by the author). Does not require auth. :param filter: Combinations of post/repost types to include in response. """ - return call('app.bsky.feed.getAuthorFeed', [('actor', actor), ('limit', limit), ('cursor', cursor), ('filter', filter)], None, {}) \ No newline at end of file + return call('app.bsky.feed.getAuthorFeed', [('actor', actor), ('limit', limit), ('cursor', cursor), ('filter', filter), ('includePins', include_pins)], None, {}) \ No newline at end of file diff --git a/chitose/tools/ozone/communication/__init__.py b/chitose/tools/ozone/communication/__init__.py index 74be978..0971db1 100644 --- a/chitose/tools/ozone/communication/__init__.py +++ b/chitose/tools/ozone/communication/__init__.py @@ -15,7 +15,7 @@ def __init__(self, call: XrpcCall, subscribe: XrpcSubscribe) -> None: self.call = call self.subscribe = subscribe - def create_template(self, name: str, content_markdown: str, subject: str, created_by: typing.Optional[str]=None) -> bytes: + def create_template(self, name: str, content_markdown: str, subject: str, lang: typing.Optional[str]=None, created_by: typing.Optional[str]=None) -> bytes: """Administrative action to create a new, re-usable communication (email for now) template. @@ -25,9 +25,11 @@ def create_template(self, name: str, content_markdown: str, subject: str, create :param subject: Subject of the message, used in emails. + :param lang: Message language. + :param created_by: DID of the user who is creating the template. """ - return _create_template(self.call, name, content_markdown, subject, created_by) + return _create_template(self.call, name, content_markdown, subject, lang, created_by) def delete_template(self, id: str) -> bytes: """Delete a communication template.""" @@ -37,7 +39,7 @@ def list_templates(self) -> bytes: """Get list of all communication templates.""" return _list_templates(self.call) - def update_template(self, id: str, name: typing.Optional[str]=None, content_markdown: typing.Optional[str]=None, subject: typing.Optional[str]=None, updated_by: typing.Optional[str]=None, disabled: typing.Optional[bool]=None) -> bytes: + def update_template(self, id: str, name: typing.Optional[str]=None, lang: typing.Optional[str]=None, content_markdown: typing.Optional[str]=None, subject: typing.Optional[str]=None, updated_by: typing.Optional[str]=None, disabled: typing.Optional[bool]=None) -> bytes: """Administrative action to update an existing communication template. Allows passing partial fields to patch specific fields only. @@ -45,10 +47,12 @@ def update_template(self, id: str, name: typing.Optional[str]=None, content_mark :param name: Name of the template. + :param lang: Message language. + :param content_markdown: Content of the template, markdown supported, can contain variable placeholders. :param subject: Subject of the message, used in emails. :param updated_by: DID of the user who is updating the template. """ - return _update_template(self.call, id, name, content_markdown, subject, updated_by, disabled) \ No newline at end of file + return _update_template(self.call, id, name, lang, content_markdown, subject, updated_by, disabled) \ No newline at end of file diff --git a/chitose/tools/ozone/communication/create_template.py b/chitose/tools/ozone/communication/create_template.py index 06e7443..252192d 100644 --- a/chitose/tools/ozone/communication/create_template.py +++ b/chitose/tools/ozone/communication/create_template.py @@ -4,7 +4,7 @@ import chitose import typing -def _create_template(call: chitose.xrpc.XrpcCall, name: str, content_markdown: str, subject: str, created_by: typing.Optional[str]=None) -> bytes: +def _create_template(call: chitose.xrpc.XrpcCall, name: str, content_markdown: str, subject: str, lang: typing.Optional[str]=None, created_by: typing.Optional[str]=None) -> bytes: """Administrative action to create a new, re-usable communication (email for now) template. @@ -14,6 +14,8 @@ def _create_template(call: chitose.xrpc.XrpcCall, name: str, content_markdown: s :param subject: Subject of the message, used in emails. + :param lang: Message language. + :param created_by: DID of the user who is creating the template. """ - return call('tools.ozone.communication.createTemplate', [], {'name': name, 'contentMarkdown': content_markdown, 'subject': subject, 'createdBy': created_by}, {'Content-Type': 'application/json'}) \ No newline at end of file + return call('tools.ozone.communication.createTemplate', [], {'name': name, 'contentMarkdown': content_markdown, 'subject': subject, 'lang': lang, 'createdBy': created_by}, {'Content-Type': 'application/json'}) \ No newline at end of file diff --git a/chitose/tools/ozone/communication/defs.py b/chitose/tools/ozone/communication/defs.py index 33242d7..a31e7c2 100644 --- a/chitose/tools/ozone/communication/defs.py +++ b/chitose/tools/ozone/communication/defs.py @@ -15,9 +15,11 @@ class TemplateView(chitose.Object): :param last_updated_by: DID of the user who last updated the template. :param subject: Content of the template, can contain markdown and variable placeholders. + + :param lang: Message language. """ - def __init__(self, id: str, name: str, content_markdown: str, disabled: bool, last_updated_by: str, created_at: str, updated_at: str, subject: typing.Optional[str]=None) -> None: + def __init__(self, id: str, name: str, content_markdown: str, disabled: bool, last_updated_by: str, created_at: str, updated_at: str, subject: typing.Optional[str]=None, lang: typing.Optional[str]=None) -> None: self.id = id self.name = name self.content_markdown = content_markdown @@ -26,6 +28,7 @@ def __init__(self, id: str, name: str, content_markdown: str, disabled: bool, la self.created_at = created_at self.updated_at = updated_at self.subject = subject + self.lang = lang def to_dict(self) -> dict[str, typing.Any]: - return {'id': self.id, 'name': self.name, 'contentMarkdown': self.content_markdown, 'disabled': self.disabled, 'lastUpdatedBy': self.last_updated_by, 'createdAt': self.created_at, 'updatedAt': self.updated_at, 'subject': self.subject, '$type': 'tools.ozone.communication.defs#templateView'} \ No newline at end of file + return {'id': self.id, 'name': self.name, 'contentMarkdown': self.content_markdown, 'disabled': self.disabled, 'lastUpdatedBy': self.last_updated_by, 'createdAt': self.created_at, 'updatedAt': self.updated_at, 'subject': self.subject, 'lang': self.lang, '$type': 'tools.ozone.communication.defs#templateView'} \ No newline at end of file diff --git a/chitose/tools/ozone/communication/update_template.py b/chitose/tools/ozone/communication/update_template.py index f206216..f245b16 100644 --- a/chitose/tools/ozone/communication/update_template.py +++ b/chitose/tools/ozone/communication/update_template.py @@ -4,7 +4,7 @@ import chitose import typing -def _update_template(call: chitose.xrpc.XrpcCall, id: str, name: typing.Optional[str]=None, content_markdown: typing.Optional[str]=None, subject: typing.Optional[str]=None, updated_by: typing.Optional[str]=None, disabled: typing.Optional[bool]=None) -> bytes: +def _update_template(call: chitose.xrpc.XrpcCall, id: str, name: typing.Optional[str]=None, lang: typing.Optional[str]=None, content_markdown: typing.Optional[str]=None, subject: typing.Optional[str]=None, updated_by: typing.Optional[str]=None, disabled: typing.Optional[bool]=None) -> bytes: """Administrative action to update an existing communication template. Allows passing partial fields to patch specific fields only. @@ -12,10 +12,12 @@ def _update_template(call: chitose.xrpc.XrpcCall, id: str, name: typing.Optional :param name: Name of the template. + :param lang: Message language. + :param content_markdown: Content of the template, markdown supported, can contain variable placeholders. :param subject: Subject of the message, used in emails. :param updated_by: DID of the user who is updating the template. """ - return call('tools.ozone.communication.updateTemplate', [], {'id': id, 'name': name, 'contentMarkdown': content_markdown, 'subject': subject, 'updatedBy': updated_by, 'disabled': disabled}, {'Content-Type': 'application/json'}) \ No newline at end of file + return call('tools.ozone.communication.updateTemplate', [], {'id': id, 'name': name, 'lang': lang, 'contentMarkdown': content_markdown, 'subject': subject, 'updatedBy': updated_by, 'disabled': disabled}, {'Content-Type': 'application/json'}) \ No newline at end of file diff --git a/chitose/tools/ozone/moderation/__init__.py b/chitose/tools/ozone/moderation/__init__.py index 146a70a..9193f53 100644 --- a/chitose/tools/ozone/moderation/__init__.py +++ b/chitose/tools/ozone/moderation/__init__.py @@ -21,7 +21,7 @@ def __init__(self, call: XrpcCall, subscribe: XrpcSubscribe) -> None: self.call = call self.subscribe = subscribe - def emit_event(self, event: typing.Union[chitose.tools.ozone.moderation.defs.ModEventTakedown, chitose.tools.ozone.moderation.defs.ModEventAcknowledge, chitose.tools.ozone.moderation.defs.ModEventEscalate, chitose.tools.ozone.moderation.defs.ModEventComment, chitose.tools.ozone.moderation.defs.ModEventLabel, chitose.tools.ozone.moderation.defs.ModEventReport, chitose.tools.ozone.moderation.defs.ModEventMute, chitose.tools.ozone.moderation.defs.ModEventUnmute, chitose.tools.ozone.moderation.defs.ModEventMuteReporter, chitose.tools.ozone.moderation.defs.ModEventUnmuteReporter, chitose.tools.ozone.moderation.defs.ModEventReverseTakedown, chitose.tools.ozone.moderation.defs.ModEventEmail, chitose.tools.ozone.moderation.defs.ModEventTag], subject: typing.Union[chitose.com.atproto.admin.defs.RepoRef, chitose.com.atproto.repo.strong_ref.StrongRef], created_by: str, subject_blob_cids: typing.Optional[list[str]]=None) -> bytes: + def emit_event(self, event: typing.Union[chitose.tools.ozone.moderation.defs.ModEventTakedown, chitose.tools.ozone.moderation.defs.ModEventAcknowledge, chitose.tools.ozone.moderation.defs.ModEventEscalate, chitose.tools.ozone.moderation.defs.ModEventComment, chitose.tools.ozone.moderation.defs.ModEventLabel, chitose.tools.ozone.moderation.defs.ModEventReport, chitose.tools.ozone.moderation.defs.ModEventMute, chitose.tools.ozone.moderation.defs.ModEventUnmute, chitose.tools.ozone.moderation.defs.ModEventMuteReporter, chitose.tools.ozone.moderation.defs.ModEventUnmuteReporter, chitose.tools.ozone.moderation.defs.ModEventReverseTakedown, chitose.tools.ozone.moderation.defs.ModEventResolveAppeal, chitose.tools.ozone.moderation.defs.ModEventEmail, chitose.tools.ozone.moderation.defs.ModEventTag], subject: typing.Union[chitose.com.atproto.admin.defs.RepoRef, chitose.com.atproto.repo.strong_ref.StrongRef], created_by: str, subject_blob_cids: typing.Optional[list[str]]=None) -> bytes: """Take a moderation action on an actor.""" return _emit_event(self.call, event, subject, created_by, subject_blob_cids) @@ -65,10 +65,14 @@ def query_events(self, types: typing.Optional[list[str]]=None, created_by: typin """ return _query_events(self.call, types, created_by, sort_direction, created_after, created_before, subject, include_all_user_records, limit, has_comment, comment, added_labels, removed_labels, added_tags, removed_tags, report_types, cursor) - def query_statuses(self, subject: typing.Optional[str]=None, comment: typing.Optional[str]=None, reported_after: typing.Optional[str]=None, reported_before: typing.Optional[str]=None, reviewed_after: typing.Optional[str]=None, reviewed_before: typing.Optional[str]=None, include_muted: typing.Optional[bool]=None, only_muted: typing.Optional[bool]=None, review_state: typing.Optional[str]=None, ignore_subjects: typing.Optional[list[str]]=None, last_reviewed_by: typing.Optional[str]=None, sort_field: typing.Optional[str]=None, sort_direction: typing.Optional[str]=None, takendown: typing.Optional[bool]=None, appealed: typing.Optional[bool]=None, limit: typing.Optional[int]=None, tags: typing.Optional[list[str]]=None, exclude_tags: typing.Optional[list[str]]=None, cursor: typing.Optional[str]=None) -> bytes: + def query_statuses(self, include_all_user_records: typing.Optional[bool]=None, subject: typing.Optional[str]=None, comment: typing.Optional[str]=None, reported_after: typing.Optional[str]=None, reported_before: typing.Optional[str]=None, reviewed_after: typing.Optional[str]=None, reviewed_before: typing.Optional[str]=None, include_muted: typing.Optional[bool]=None, only_muted: typing.Optional[bool]=None, review_state: typing.Optional[str]=None, ignore_subjects: typing.Optional[list[str]]=None, last_reviewed_by: typing.Optional[str]=None, sort_field: typing.Optional[str]=None, sort_direction: typing.Optional[str]=None, takendown: typing.Optional[bool]=None, appealed: typing.Optional[bool]=None, limit: typing.Optional[int]=None, tags: typing.Optional[list[str]]=None, exclude_tags: typing.Optional[list[str]]=None, cursor: typing.Optional[str]=None) -> bytes: """View moderation statuses of subjects (record or repo). + :param include_all_user_records: All subjects belonging to the account specified in the 'subject' param will be returned. + + :param subject: The subject to get the status for. + :param comment: Search subjects by keyword from comments :param reported_after: Search subjects reported after a given timestamp @@ -91,7 +95,7 @@ def query_statuses(self, subject: typing.Optional[str]=None, comment: typing.Opt :param appealed: Get subjects in unresolved appealed status """ - return _query_statuses(self.call, subject, comment, reported_after, reported_before, reviewed_after, reviewed_before, include_muted, only_muted, review_state, ignore_subjects, last_reviewed_by, sort_field, sort_direction, takendown, appealed, limit, tags, exclude_tags, cursor) + return _query_statuses(self.call, include_all_user_records, subject, comment, reported_after, reported_before, reviewed_after, reviewed_before, include_muted, only_muted, review_state, ignore_subjects, last_reviewed_by, sort_field, sort_direction, takendown, appealed, limit, tags, exclude_tags, cursor) def search_repos(self, term: typing.Optional[str]=None, q: typing.Optional[str]=None, limit: typing.Optional[int]=None, cursor: typing.Optional[str]=None) -> bytes: """Find repositories based on a search term. diff --git a/chitose/tools/ozone/moderation/defs.py b/chitose/tools/ozone/moderation/defs.py index e340f31..bc6e3fa 100644 --- a/chitose/tools/ozone/moderation/defs.py +++ b/chitose/tools/ozone/moderation/defs.py @@ -89,14 +89,17 @@ class ModEventTakedown(chitose.Object): :param duration_in_hours: Indicates how long the takedown should be in effect before automatically expiring. + + :param acknowledge_account_subjects: If true, all other reports on content authored by this account will be resolved (acknowledged). """ - def __init__(self, comment: typing.Optional[str]=None, duration_in_hours: typing.Optional[int]=None) -> None: + def __init__(self, comment: typing.Optional[str]=None, duration_in_hours: typing.Optional[int]=None, acknowledge_account_subjects: typing.Optional[bool]=None) -> None: self.comment = comment self.duration_in_hours = duration_in_hours + self.acknowledge_account_subjects = acknowledge_account_subjects def to_dict(self) -> dict[str, typing.Any]: - return {'comment': self.comment, 'durationInHours': self.duration_in_hours, '$type': 'tools.ozone.moderation.defs#modEventTakedown'} + return {'comment': self.comment, 'durationInHours': self.duration_in_hours, 'acknowledgeAccountSubjects': self.acknowledge_account_subjects, '$type': 'tools.ozone.moderation.defs#modEventTakedown'} class ModEventReverseTakedown(chitose.Object): """Revert take down action on a subject diff --git a/chitose/tools/ozone/moderation/emit_event.py b/chitose/tools/ozone/moderation/emit_event.py index fb1e32d..7b92d41 100644 --- a/chitose/tools/ozone/moderation/emit_event.py +++ b/chitose/tools/ozone/moderation/emit_event.py @@ -7,6 +7,6 @@ import chitose.tools.ozone.moderation.defs import typing -def _emit_event(call: chitose.xrpc.XrpcCall, event: typing.Union[chitose.tools.ozone.moderation.defs.ModEventTakedown, chitose.tools.ozone.moderation.defs.ModEventAcknowledge, chitose.tools.ozone.moderation.defs.ModEventEscalate, chitose.tools.ozone.moderation.defs.ModEventComment, chitose.tools.ozone.moderation.defs.ModEventLabel, chitose.tools.ozone.moderation.defs.ModEventReport, chitose.tools.ozone.moderation.defs.ModEventMute, chitose.tools.ozone.moderation.defs.ModEventUnmute, chitose.tools.ozone.moderation.defs.ModEventMuteReporter, chitose.tools.ozone.moderation.defs.ModEventUnmuteReporter, chitose.tools.ozone.moderation.defs.ModEventReverseTakedown, chitose.tools.ozone.moderation.defs.ModEventEmail, chitose.tools.ozone.moderation.defs.ModEventTag], subject: typing.Union[chitose.com.atproto.admin.defs.RepoRef, chitose.com.atproto.repo.strong_ref.StrongRef], created_by: str, subject_blob_cids: typing.Optional[list[str]]=None) -> bytes: +def _emit_event(call: chitose.xrpc.XrpcCall, event: typing.Union[chitose.tools.ozone.moderation.defs.ModEventTakedown, chitose.tools.ozone.moderation.defs.ModEventAcknowledge, chitose.tools.ozone.moderation.defs.ModEventEscalate, chitose.tools.ozone.moderation.defs.ModEventComment, chitose.tools.ozone.moderation.defs.ModEventLabel, chitose.tools.ozone.moderation.defs.ModEventReport, chitose.tools.ozone.moderation.defs.ModEventMute, chitose.tools.ozone.moderation.defs.ModEventUnmute, chitose.tools.ozone.moderation.defs.ModEventMuteReporter, chitose.tools.ozone.moderation.defs.ModEventUnmuteReporter, chitose.tools.ozone.moderation.defs.ModEventReverseTakedown, chitose.tools.ozone.moderation.defs.ModEventResolveAppeal, chitose.tools.ozone.moderation.defs.ModEventEmail, chitose.tools.ozone.moderation.defs.ModEventTag], subject: typing.Union[chitose.com.atproto.admin.defs.RepoRef, chitose.com.atproto.repo.strong_ref.StrongRef], created_by: str, subject_blob_cids: typing.Optional[list[str]]=None) -> bytes: """Take a moderation action on an actor.""" return call('tools.ozone.moderation.emitEvent', [], {'event': event, 'subject': subject, 'subjectBlobCids': subject_blob_cids, 'createdBy': created_by}, {'Content-Type': 'application/json'}) \ No newline at end of file diff --git a/chitose/tools/ozone/moderation/query_statuses.py b/chitose/tools/ozone/moderation/query_statuses.py index d533808..3c79846 100644 --- a/chitose/tools/ozone/moderation/query_statuses.py +++ b/chitose/tools/ozone/moderation/query_statuses.py @@ -4,10 +4,14 @@ import chitose import typing -def _query_statuses(call: chitose.xrpc.XrpcCall, subject: typing.Optional[str]=None, comment: typing.Optional[str]=None, reported_after: typing.Optional[str]=None, reported_before: typing.Optional[str]=None, reviewed_after: typing.Optional[str]=None, reviewed_before: typing.Optional[str]=None, include_muted: typing.Optional[bool]=None, only_muted: typing.Optional[bool]=None, review_state: typing.Optional[str]=None, ignore_subjects: typing.Optional[list[str]]=None, last_reviewed_by: typing.Optional[str]=None, sort_field: typing.Optional[str]=None, sort_direction: typing.Optional[str]=None, takendown: typing.Optional[bool]=None, appealed: typing.Optional[bool]=None, limit: typing.Optional[int]=None, tags: typing.Optional[list[str]]=None, exclude_tags: typing.Optional[list[str]]=None, cursor: typing.Optional[str]=None) -> bytes: +def _query_statuses(call: chitose.xrpc.XrpcCall, include_all_user_records: typing.Optional[bool]=None, subject: typing.Optional[str]=None, comment: typing.Optional[str]=None, reported_after: typing.Optional[str]=None, reported_before: typing.Optional[str]=None, reviewed_after: typing.Optional[str]=None, reviewed_before: typing.Optional[str]=None, include_muted: typing.Optional[bool]=None, only_muted: typing.Optional[bool]=None, review_state: typing.Optional[str]=None, ignore_subjects: typing.Optional[list[str]]=None, last_reviewed_by: typing.Optional[str]=None, sort_field: typing.Optional[str]=None, sort_direction: typing.Optional[str]=None, takendown: typing.Optional[bool]=None, appealed: typing.Optional[bool]=None, limit: typing.Optional[int]=None, tags: typing.Optional[list[str]]=None, exclude_tags: typing.Optional[list[str]]=None, cursor: typing.Optional[str]=None) -> bytes: """View moderation statuses of subjects (record or repo). + :param include_all_user_records: All subjects belonging to the account specified in the 'subject' param will be returned. + + :param subject: The subject to get the status for. + :param comment: Search subjects by keyword from comments :param reported_after: Search subjects reported after a given timestamp @@ -30,4 +34,4 @@ def _query_statuses(call: chitose.xrpc.XrpcCall, subject: typing.Optional[str]=N :param appealed: Get subjects in unresolved appealed status """ - return call('tools.ozone.moderation.queryStatuses', [('subject', subject), ('comment', comment), ('reportedAfter', reported_after), ('reportedBefore', reported_before), ('reviewedAfter', reviewed_after), ('reviewedBefore', reviewed_before), ('includeMuted', include_muted), ('onlyMuted', only_muted), ('reviewState', review_state), ('ignoreSubjects', ignore_subjects), ('lastReviewedBy', last_reviewed_by), ('sortField', sort_field), ('sortDirection', sort_direction), ('takendown', takendown), ('appealed', appealed), ('limit', limit), ('tags', tags), ('excludeTags', exclude_tags), ('cursor', cursor)], None, {}) \ No newline at end of file + return call('tools.ozone.moderation.queryStatuses', [('includeAllUserRecords', include_all_user_records), ('subject', subject), ('comment', comment), ('reportedAfter', reported_after), ('reportedBefore', reported_before), ('reviewedAfter', reviewed_after), ('reviewedBefore', reviewed_before), ('includeMuted', include_muted), ('onlyMuted', only_muted), ('reviewState', review_state), ('ignoreSubjects', ignore_subjects), ('lastReviewedBy', last_reviewed_by), ('sortField', sort_field), ('sortDirection', sort_direction), ('takendown', takendown), ('appealed', appealed), ('limit', limit), ('tags', tags), ('excludeTags', exclude_tags), ('cursor', cursor)], None, {}) \ No newline at end of file