Skip to content

Commit

Permalink
Update atproto
Browse files Browse the repository at this point in the history
  • Loading branch information
mnogu committed Apr 29, 2024
1 parent 5c31754 commit c04b256
Show file tree
Hide file tree
Showing 6 changed files with 73 additions and 15 deletions.
2 changes: 1 addition & 1 deletion atproto
Submodule atproto updated 60 files
+33 −0 lexicons/app/bsky/actor/defs.json
+36 −0 lexicons/tools/ozone/moderation/defs.json
+3 −0 lexicons/tools/ozone/moderation/emitEvent.json
+4 −0 lexicons/tools/ozone/moderation/queryStatuses.json
+14 −0 packages/api/CHANGELOG.md
+1 −1 packages/api/package.json
+222 −1 packages/api/src/bsky-agent.ts
+80 −0 packages/api/src/client/lexicons.ts
+38 −0 packages/api/src/client/types/app/bsky/actor/defs.ts
+56 −0 packages/api/src/client/types/tools/ozone/moderation/defs.ts
+3 −0 packages/api/src/client/types/tools/ozone/moderation/emitEvent.ts
+2 −0 packages/api/src/client/types/tools/ozone/moderation/queryStatuses.ts
+4 −0 packages/api/src/types.ts
+72 −0 packages/api/src/util.ts
+1,021 −2 packages/api/tests/bsky-agent.test.ts
+4 −0 packages/api/tests/moderation-prefs.test.ts
+14 −0 packages/bsky/CHANGELOG.md
+1 −1 packages/bsky/package.json
+3 −0 packages/bsky/src/api/app/bsky/actor/getSuggestions.ts
+19 −17 packages/bsky/src/api/app/bsky/feed/getFeed.ts
+33 −0 packages/bsky/src/lexicon/lexicons.ts
+38 −0 packages/bsky/src/lexicon/types/app/bsky/actor/defs.ts
+11 −0 packages/bsky/tests/__snapshots__/feed-generation.test.ts.snap
+1 −1 packages/bsky/tests/feed-generation.test.ts
+20 −0 packages/dev-env/CHANGELOG.md
+1 −1 packages/dev-env/package.json
+16 −0 packages/ozone/CHANGELOG.md
+1 −1 packages/ozone/package.json
+9 −0 packages/ozone/src/api/moderation/emitEvent.ts
+2 −0 packages/ozone/src/api/moderation/queryStatuses.ts
+2 −0 packages/ozone/src/api/util.ts
+15 −0 packages/ozone/src/db/migrations/20240408T192432676Z-mute-reporting.ts
+1 −0 packages/ozone/src/db/migrations/index.ts
+3 −0 packages/ozone/src/db/schema/moderation_event.ts
+1 −0 packages/ozone/src/db/schema/moderation_subject_status.ts
+80 −0 packages/ozone/src/lexicon/lexicons.ts
+38 −0 packages/ozone/src/lexicon/types/app/bsky/actor/defs.ts
+56 −0 packages/ozone/src/lexicon/types/tools/ozone/moderation/defs.ts
+3 −0 packages/ozone/src/lexicon/types/tools/ozone/moderation/emitEvent.ts
+2 −0 packages/ozone/src/lexicon/types/tools/ozone/moderation/queryStatuses.ts
+33 −0 packages/ozone/src/mod-service/index.ts
+8 −7 packages/ozone/src/mod-service/lang.ts
+26 −0 packages/ozone/src/mod-service/status.ts
+3 −0 packages/ozone/src/mod-service/views.ts
+5 −0 packages/ozone/tests/__snapshots__/moderation-events.test.ts.snap
+100 −0 packages/ozone/tests/report-muting.test.ts
+16 −0 packages/pds/CHANGELOG.md
+1 −1 packages/pds/package.json
+3 −1 packages/pds/src/api/app/bsky/actor/getSuggestions.ts
+3 −1 packages/pds/src/api/app/bsky/feed/getFeed.ts
+2 −0 packages/pds/src/api/app/bsky/feed/index.ts
+13 −0 packages/pds/src/api/app/bsky/feed/sendInteractions.ts
+6 −0 packages/pds/src/db/tables/moderation.ts
+80 −0 packages/pds/src/lexicon/lexicons.ts
+38 −0 packages/pds/src/lexicon/types/app/bsky/actor/defs.ts
+56 −0 packages/pds/src/lexicon/types/tools/ozone/moderation/defs.ts
+3 −0 packages/pds/src/lexicon/types/tools/ozone/moderation/emitEvent.ts
+2 −0 packages/pds/src/lexicon/types/tools/ozone/moderation/queryStatuses.ts
+15 −1 packages/pds/src/pipethrough.ts
+2 −0 packages/pds/tests/proxied/__snapshots__/admin.test.ts.snap
23 changes: 22 additions & 1 deletion chitose/app/bsky/actor/defs.py
Original file line number Diff line number Diff line change
Expand Up @@ -85,7 +85,7 @@ def __init__(self, muted: typing.Optional[bool]=None, muted_by_list: typing.Opti

def to_dict(self) -> dict[str, typing.Any]:
return {'muted': self.muted, 'mutedByList': self.muted_by_list, 'blockedBy': self.blocked_by, 'blocking': self.blocking, 'blockingByList': self.blocking_by_list, 'following': self.following, 'followedBy': self.followed_by, '$type': 'app.bsky.actor.defs#viewerState'}
Preferences = list[typing.Union['chitose.app.bsky.actor.defs.AdultContentPref', 'chitose.app.bsky.actor.defs.ContentLabelPref', 'chitose.app.bsky.actor.defs.SavedFeedsPref', 'chitose.app.bsky.actor.defs.PersonalDetailsPref', 'chitose.app.bsky.actor.defs.FeedViewPref', 'chitose.app.bsky.actor.defs.ThreadViewPref', 'chitose.app.bsky.actor.defs.InterestsPref', 'chitose.app.bsky.actor.defs.MutedWordsPref', 'chitose.app.bsky.actor.defs.HiddenPostsPref']]
Preferences = list[typing.Union['chitose.app.bsky.actor.defs.AdultContentPref', 'chitose.app.bsky.actor.defs.ContentLabelPref', 'chitose.app.bsky.actor.defs.SavedFeedsPref', 'chitose.app.bsky.actor.defs.SavedFeedsPrefV2', 'chitose.app.bsky.actor.defs.PersonalDetailsPref', 'chitose.app.bsky.actor.defs.FeedViewPref', 'chitose.app.bsky.actor.defs.ThreadViewPref', 'chitose.app.bsky.actor.defs.InterestsPref', 'chitose.app.bsky.actor.defs.MutedWordsPref', 'chitose.app.bsky.actor.defs.HiddenPostsPref']]

class AdultContentPref(chitose.Object):
""""""
Expand All @@ -111,6 +111,27 @@ def __init__(self, label: str, visibility: typing.Literal['ignore', 'show', 'war
def to_dict(self) -> dict[str, typing.Any]:
return {'label': self.label, 'visibility': self.visibility, 'labelerDid': self.labeler_did, '$type': 'app.bsky.actor.defs#contentLabelPref'}

class SavedFeed(chitose.Object):
""""""

def __init__(self, id: str, type: typing.Literal['feed', 'list', 'timeline'], value: str, pinned: bool) -> None:
self.id = id
self.type = type
self.value = value
self.pinned = pinned

def to_dict(self) -> dict[str, typing.Any]:
return {'id': self.id, 'type': self.type, 'value': self.value, 'pinned': self.pinned, '$type': 'app.bsky.actor.defs#savedFeed'}

class SavedFeedsPrefV2(chitose.Object):
""""""

def __init__(self, items: list[chitose.app.bsky.actor.defs.SavedFeed]) -> None:
self.items = items

def to_dict(self) -> dict[str, typing.Any]:
return {'items': self.items, '$type': 'app.bsky.actor.defs#savedFeedsPrefV2'}

class SavedFeedsPref(chitose.Object):
""""""

Expand Down
8 changes: 5 additions & 3 deletions chitose/tools/ozone/moderation/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@ def __init__(self, call: XrpcCall, subscribe: XrpcSubscribe) -> None:
self.call = call
self.subscribe = subscribe

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, 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, 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).
Expand All @@ -37,6 +37,8 @@ def query_statuses(self, subject: typing.Optional[str]=None, comment: typing.Opt
:param include_muted: By default, we don't include muted subjects in the results. Set this to true to include them.
:param only_muted: When set to true, only muted subjects and reporters will be returned.
:param review_state: Specify when fetching subjects in a certain state
:param last_reviewed_by: Get all subject statuses that were reviewed by a specific moderator
Expand All @@ -45,7 +47,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, review_state, ignore_subjects, last_reviewed_by, sort_field, sort_direction, takendown, appealed, limit, tags, exclude_tags, cursor)
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)

def get_repo(self, did: str) -> bytes:
"""Get details about a repository."""
Expand Down Expand Up @@ -87,7 +89,7 @@ def get_record(self, uri: str, cid: typing.Optional[str]=None) -> bytes:
"""Get details about a record."""
return _get_record(self.call, uri, cid)

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.ModEventReverseTakedown, chitose.tools.ozone.moderation.defs.ModEventUnmute, 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.ModEventUnmute, 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)

Expand Down
47 changes: 40 additions & 7 deletions chitose/tools/ozone/moderation/defs.py
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@
class ModEventView(chitose.Object):
""""""

def __init__(self, id: int, event: typing.Union[chitose.tools.ozone.moderation.defs.ModEventTakedown, chitose.tools.ozone.moderation.defs.ModEventReverseTakedown, chitose.tools.ozone.moderation.defs.ModEventComment, chitose.tools.ozone.moderation.defs.ModEventReport, chitose.tools.ozone.moderation.defs.ModEventLabel, chitose.tools.ozone.moderation.defs.ModEventAcknowledge, chitose.tools.ozone.moderation.defs.ModEventEscalate, chitose.tools.ozone.moderation.defs.ModEventMute, chitose.tools.ozone.moderation.defs.ModEventEmail, chitose.tools.ozone.moderation.defs.ModEventResolveAppeal, chitose.tools.ozone.moderation.defs.ModEventDivert], subject: typing.Union[chitose.com.atproto.admin.defs.RepoRef, chitose.com.atproto.repo.strong_ref.StrongRef], subject_blob_cids: list[str], created_by: str, created_at: str, creator_handle: typing.Optional[str]=None, subject_handle: typing.Optional[str]=None) -> None:
def __init__(self, id: int, event: typing.Union[chitose.tools.ozone.moderation.defs.ModEventTakedown, chitose.tools.ozone.moderation.defs.ModEventReverseTakedown, chitose.tools.ozone.moderation.defs.ModEventComment, chitose.tools.ozone.moderation.defs.ModEventReport, chitose.tools.ozone.moderation.defs.ModEventLabel, chitose.tools.ozone.moderation.defs.ModEventAcknowledge, chitose.tools.ozone.moderation.defs.ModEventEscalate, 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.ModEventEmail, chitose.tools.ozone.moderation.defs.ModEventResolveAppeal, chitose.tools.ozone.moderation.defs.ModEventDivert], subject: typing.Union[chitose.com.atproto.admin.defs.RepoRef, chitose.com.atproto.repo.strong_ref.StrongRef], subject_blob_cids: list[str], created_by: str, created_at: str, creator_handle: typing.Optional[str]=None, subject_handle: typing.Optional[str]=None) -> None:
self.id = id
self.event = event
self.subject = subject
Expand All @@ -29,7 +29,7 @@ def to_dict(self) -> dict[str, typing.Any]:
class ModEventViewDetail(chitose.Object):
""""""

def __init__(self, id: int, event: typing.Union[chitose.tools.ozone.moderation.defs.ModEventTakedown, chitose.tools.ozone.moderation.defs.ModEventReverseTakedown, chitose.tools.ozone.moderation.defs.ModEventComment, chitose.tools.ozone.moderation.defs.ModEventReport, chitose.tools.ozone.moderation.defs.ModEventLabel, chitose.tools.ozone.moderation.defs.ModEventAcknowledge, chitose.tools.ozone.moderation.defs.ModEventEscalate, chitose.tools.ozone.moderation.defs.ModEventMute, chitose.tools.ozone.moderation.defs.ModEventEmail, chitose.tools.ozone.moderation.defs.ModEventResolveAppeal, chitose.tools.ozone.moderation.defs.ModEventDivert], subject: typing.Union[chitose.tools.ozone.moderation.defs.RepoView, chitose.tools.ozone.moderation.defs.RepoViewNotFound, chitose.tools.ozone.moderation.defs.RecordView, chitose.tools.ozone.moderation.defs.RecordViewNotFound], subject_blobs: list[chitose.tools.ozone.moderation.defs.BlobView], created_by: str, created_at: str) -> None:
def __init__(self, id: int, event: typing.Union[chitose.tools.ozone.moderation.defs.ModEventTakedown, chitose.tools.ozone.moderation.defs.ModEventReverseTakedown, chitose.tools.ozone.moderation.defs.ModEventComment, chitose.tools.ozone.moderation.defs.ModEventReport, chitose.tools.ozone.moderation.defs.ModEventLabel, chitose.tools.ozone.moderation.defs.ModEventAcknowledge, chitose.tools.ozone.moderation.defs.ModEventEscalate, 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.ModEventEmail, chitose.tools.ozone.moderation.defs.ModEventResolveAppeal, chitose.tools.ozone.moderation.defs.ModEventDivert], subject: typing.Union[chitose.tools.ozone.moderation.defs.RepoView, chitose.tools.ozone.moderation.defs.RepoViewNotFound, chitose.tools.ozone.moderation.defs.RecordView, chitose.tools.ozone.moderation.defs.RecordViewNotFound], subject_blobs: list[chitose.tools.ozone.moderation.defs.BlobView], created_by: str, created_at: str) -> None:
self.id = id
self.event = event
self.subject = subject
Expand All @@ -55,7 +55,7 @@ class SubjectStatusView(chitose.Object):
:param appealed: True indicates that the a previously taken moderator action was appealed against, by the author of the content. False indicates last appeal was resolved by moderators.
"""

def __init__(self, id: int, subject: typing.Union[chitose.com.atproto.admin.defs.RepoRef, chitose.com.atproto.repo.strong_ref.StrongRef], updated_at: str, created_at: str, review_state: chitose.tools.ozone.moderation.defs.SubjectReviewState, subject_blob_cids: typing.Optional[list[str]]=None, subject_repo_handle: typing.Optional[str]=None, comment: typing.Optional[str]=None, mute_until: typing.Optional[str]=None, last_reviewed_by: typing.Optional[str]=None, last_reviewed_at: typing.Optional[str]=None, last_reported_at: typing.Optional[str]=None, last_appealed_at: typing.Optional[str]=None, takendown: typing.Optional[bool]=None, appealed: typing.Optional[bool]=None, suspend_until: typing.Optional[str]=None, tags: typing.Optional[list[str]]=None) -> None:
def __init__(self, id: int, subject: typing.Union[chitose.com.atproto.admin.defs.RepoRef, chitose.com.atproto.repo.strong_ref.StrongRef], updated_at: str, created_at: str, review_state: chitose.tools.ozone.moderation.defs.SubjectReviewState, subject_blob_cids: typing.Optional[list[str]]=None, subject_repo_handle: typing.Optional[str]=None, comment: typing.Optional[str]=None, mute_until: typing.Optional[str]=None, mute_reporting_until: typing.Optional[str]=None, last_reviewed_by: typing.Optional[str]=None, last_reviewed_at: typing.Optional[str]=None, last_reported_at: typing.Optional[str]=None, last_appealed_at: typing.Optional[str]=None, takendown: typing.Optional[bool]=None, appealed: typing.Optional[bool]=None, suspend_until: typing.Optional[str]=None, tags: typing.Optional[list[str]]=None) -> None:
self.id = id
self.subject = subject
self.updated_at = updated_at
Expand All @@ -65,6 +65,7 @@ def __init__(self, id: int, subject: typing.Union[chitose.com.atproto.admin.defs
self.subject_repo_handle = subject_repo_handle
self.comment = comment
self.mute_until = mute_until
self.mute_reporting_until = mute_reporting_until
self.last_reviewed_by = last_reviewed_by
self.last_reviewed_at = last_reviewed_at
self.last_reported_at = last_reported_at
Expand All @@ -75,7 +76,7 @@ def __init__(self, id: int, subject: typing.Union[chitose.com.atproto.admin.defs
self.tags = tags

def to_dict(self) -> dict[str, typing.Any]:
return {'id': self.id, 'subject': self.subject, 'updatedAt': self.updated_at, 'createdAt': self.created_at, 'reviewState': self.review_state, 'subjectBlobCids': self.subject_blob_cids, 'subjectRepoHandle': self.subject_repo_handle, 'comment': self.comment, 'muteUntil': self.mute_until, 'lastReviewedBy': self.last_reviewed_by, 'lastReviewedAt': self.last_reviewed_at, 'lastReportedAt': self.last_reported_at, 'lastAppealedAt': self.last_appealed_at, 'takendown': self.takendown, 'appealed': self.appealed, 'suspendUntil': self.suspend_until, 'tags': self.tags, '$type': 'tools.ozone.moderation.defs#subjectStatusView'}
return {'id': self.id, 'subject': self.subject, 'updatedAt': self.updated_at, 'createdAt': self.created_at, 'reviewState': self.review_state, 'subjectBlobCids': self.subject_blob_cids, 'subjectRepoHandle': self.subject_repo_handle, 'comment': self.comment, 'muteUntil': self.mute_until, 'muteReportingUntil': self.mute_reporting_until, 'lastReviewedBy': self.last_reviewed_by, 'lastReviewedAt': self.last_reviewed_at, 'lastReportedAt': self.last_reported_at, 'lastAppealedAt': self.last_appealed_at, 'takendown': self.takendown, 'appealed': self.appealed, 'suspendUntil': self.suspend_until, 'tags': self.tags, '$type': 'tools.ozone.moderation.defs#subjectStatusView'}
SubjectReviewState = typing.Literal['#reviewOpen', '#reviewEscalated', '#reviewClosed', '#reviewNone']
REVIEW_OPEN = 'tools.ozone.moderation.defs#reviewOpen'
REVIEW_ESCALATED = 'tools.ozone.moderation.defs#reviewEscalated'
Expand Down Expand Up @@ -137,14 +138,19 @@ def to_dict(self) -> dict[str, typing.Any]:
return {'comment': self.comment, 'sticky': self.sticky, '$type': 'tools.ozone.moderation.defs#modEventComment'}

class ModEventReport(chitose.Object):
"""Report a subject"""
"""Report a subject
def __init__(self, report_type: chitose.com.atproto.moderation.defs.ReasonType, comment: typing.Optional[str]=None) -> None:
:param is_reporter_muted: Set to true if the reporter was muted from reporting at the time of the event. These reports won't impact the reviewState of the subject.
"""

def __init__(self, report_type: chitose.com.atproto.moderation.defs.ReasonType, comment: typing.Optional[str]=None, is_reporter_muted: typing.Optional[bool]=None) -> None:
self.report_type = report_type
self.comment = comment
self.is_reporter_muted = is_reporter_muted

def to_dict(self) -> dict[str, typing.Any]:
return {'reportType': self.report_type, 'comment': self.comment, '$type': 'tools.ozone.moderation.defs#modEventReport'}
return {'reportType': self.report_type, 'comment': self.comment, 'isReporterMuted': self.is_reporter_muted, '$type': 'tools.ozone.moderation.defs#modEventReport'}

class ModEventLabel(chitose.Object):
"""Apply/Negate labels on a subject"""
Expand Down Expand Up @@ -202,6 +208,33 @@ def __init__(self, comment: typing.Optional[str]=None) -> None:
def to_dict(self) -> dict[str, typing.Any]:
return {'comment': self.comment, '$type': 'tools.ozone.moderation.defs#modEventUnmute'}

class ModEventMuteReporter(chitose.Object):
"""Mute incoming reports from an account
:param duration_in_hours: Indicates how long the account should remain muted.
"""

def __init__(self, duration_in_hours: int, comment: typing.Optional[str]=None) -> None:
self.duration_in_hours = duration_in_hours
self.comment = comment

def to_dict(self) -> dict[str, typing.Any]:
return {'durationInHours': self.duration_in_hours, 'comment': self.comment, '$type': 'tools.ozone.moderation.defs#modEventMuteReporter'}

class ModEventUnmuteReporter(chitose.Object):
"""Unmute incoming reports from an account
:param comment: Describe reasoning behind the reversal.
"""

def __init__(self, comment: typing.Optional[str]=None) -> None:
self.comment = comment

def to_dict(self) -> dict[str, typing.Any]:
return {'comment': self.comment, '$type': 'tools.ozone.moderation.defs#modEventUnmuteReporter'}

class ModEventEmail(chitose.Object):
"""Keep a log of outgoing email to a user
Expand Down
Loading

0 comments on commit c04b256

Please sign in to comment.