Skip to main content

proto_blue_api/generated/tools/ozone/moderation/
defs.rs

1// Generated by atproto-codegen. Do not edit.
2//! Lexicon: tools.ozone.moderation.defs
3#![allow(clippy::pedantic, clippy::nursery, clippy::all)]
4
5use serde::{Deserialize, Serialize};
6
7/// Logs account status related events on a repo subject. Normally captured by automod from the firehose and emitted to ozone for historical tracking.
8#[derive(Debug, Clone, Serialize, Deserialize)]
9#[serde(rename_all = "camelCase")]
10pub struct AccountEvent {
11    pub active: bool,
12    #[serde(skip_serializing_if = "Option::is_none")]
13    pub comment: Option<String>,
14    #[serde(skip_serializing_if = "Option::is_none")]
15    pub status: Option<String>,
16    pub timestamp: proto_blue_syntax::Datetime,
17}
18
19#[derive(Debug, Clone, Serialize, Deserialize)]
20#[serde(rename_all = "camelCase")]
21pub struct AccountHosting {
22    #[serde(skip_serializing_if = "Option::is_none")]
23    pub created_at: Option<proto_blue_syntax::Datetime>,
24    #[serde(skip_serializing_if = "Option::is_none")]
25    pub deactivated_at: Option<proto_blue_syntax::Datetime>,
26    #[serde(skip_serializing_if = "Option::is_none")]
27    pub deleted_at: Option<proto_blue_syntax::Datetime>,
28    #[serde(skip_serializing_if = "Option::is_none")]
29    pub reactivated_at: Option<proto_blue_syntax::Datetime>,
30    pub status: String,
31    #[serde(skip_serializing_if = "Option::is_none")]
32    pub updated_at: Option<proto_blue_syntax::Datetime>,
33}
34
35/// Statistics about a particular account subject
36#[derive(Debug, Clone, Serialize, Deserialize)]
37#[serde(rename_all = "camelCase")]
38pub struct AccountStats {
39    #[serde(skip_serializing_if = "Option::is_none")]
40    pub appeal_count: Option<i64>,
41    #[serde(skip_serializing_if = "Option::is_none")]
42    pub escalate_count: Option<i64>,
43    #[serde(skip_serializing_if = "Option::is_none")]
44    pub report_count: Option<i64>,
45    #[serde(skip_serializing_if = "Option::is_none")]
46    pub suspend_count: Option<i64>,
47    #[serde(skip_serializing_if = "Option::is_none")]
48    pub takedown_count: Option<i64>,
49}
50
51/// Strike information for an account
52#[derive(Debug, Clone, Serialize, Deserialize)]
53#[serde(rename_all = "camelCase")]
54pub struct AccountStrike {
55    #[serde(skip_serializing_if = "Option::is_none")]
56    pub active_strike_count: Option<i64>,
57    #[serde(skip_serializing_if = "Option::is_none")]
58    pub first_strike_at: Option<proto_blue_syntax::Datetime>,
59    #[serde(skip_serializing_if = "Option::is_none")]
60    pub last_strike_at: Option<proto_blue_syntax::Datetime>,
61    #[serde(skip_serializing_if = "Option::is_none")]
62    pub total_strike_count: Option<i64>,
63}
64
65/// Age assurance info coming directly from users. Only works on DID subjects.
66#[derive(Debug, Clone, Serialize, Deserialize)]
67#[serde(rename_all = "camelCase")]
68pub struct AgeAssuranceEvent {
69    #[serde(skip_serializing_if = "Option::is_none")]
70    pub access: Option<crate::app::bsky::ageassurance::defs::Access>,
71    pub attempt_id: String,
72    #[serde(skip_serializing_if = "Option::is_none")]
73    pub complete_ip: Option<String>,
74    #[serde(skip_serializing_if = "Option::is_none")]
75    pub complete_ua: Option<String>,
76    #[serde(skip_serializing_if = "Option::is_none")]
77    pub country_code: Option<String>,
78    pub created_at: proto_blue_syntax::Datetime,
79    #[serde(skip_serializing_if = "Option::is_none")]
80    pub init_ip: Option<String>,
81    #[serde(skip_serializing_if = "Option::is_none")]
82    pub init_ua: Option<String>,
83    #[serde(skip_serializing_if = "Option::is_none")]
84    pub region_code: Option<String>,
85    pub status: String,
86}
87
88/// Age assurance status override by moderators. Only works on DID subjects.
89#[derive(Debug, Clone, Serialize, Deserialize)]
90#[serde(rename_all = "camelCase")]
91pub struct AgeAssuranceOverrideEvent {
92    #[serde(skip_serializing_if = "Option::is_none")]
93    pub access: Option<crate::app::bsky::ageassurance::defs::Access>,
94    pub comment: String,
95    pub status: String,
96}
97
98#[derive(Debug, Clone, Serialize, Deserialize)]
99#[serde(tag = "$type")]
100pub enum BlobViewDetailsRefs {
101    #[serde(rename = "tools.ozone.moderation.defs#imageDetails")]
102    OzoneModerationDefsImageDetails(Box<ImageDetails>),
103    #[serde(rename = "tools.ozone.moderation.defs#videoDetails")]
104    OzoneModerationDefsVideoDetails(Box<VideoDetails>),
105    #[serde(other)]
106    Other,
107}
108
109#[derive(Debug, Clone, Serialize, Deserialize)]
110#[serde(rename_all = "camelCase")]
111pub struct BlobView {
112    pub cid: String,
113    pub created_at: proto_blue_syntax::Datetime,
114    #[serde(skip_serializing_if = "Option::is_none")]
115    pub details: Option<BlobViewDetailsRefs>,
116    pub mime_type: String,
117    #[serde(skip_serializing_if = "Option::is_none")]
118    pub moderation: Option<Moderation>,
119    pub size: i64,
120}
121
122/// Logs cancellation of a scheduled takedown action for an account.
123#[derive(Debug, Clone, Serialize, Deserialize)]
124#[serde(rename_all = "camelCase")]
125pub struct CancelScheduledTakedownEvent {
126    #[serde(skip_serializing_if = "Option::is_none")]
127    pub comment: Option<String>,
128}
129
130/// Logs identity related events on a repo subject. Normally captured by automod from the firehose and emitted to ozone for historical tracking.
131#[derive(Debug, Clone, Serialize, Deserialize)]
132#[serde(rename_all = "camelCase")]
133pub struct IdentityEvent {
134    #[serde(skip_serializing_if = "Option::is_none")]
135    pub comment: Option<String>,
136    #[serde(skip_serializing_if = "Option::is_none")]
137    pub handle: Option<proto_blue_syntax::Handle>,
138    #[serde(skip_serializing_if = "Option::is_none")]
139    pub pds_host: Option<String>,
140    pub timestamp: proto_blue_syntax::Datetime,
141    #[serde(skip_serializing_if = "Option::is_none")]
142    pub tombstone: Option<bool>,
143}
144
145#[derive(Debug, Clone, Serialize, Deserialize)]
146#[serde(rename_all = "camelCase")]
147pub struct ImageDetails {
148    pub height: i64,
149    pub width: i64,
150}
151
152#[derive(Debug, Clone, Serialize, Deserialize)]
153#[serde(rename_all = "camelCase")]
154pub struct ModEventAcknowledge {
155    #[serde(skip_serializing_if = "Option::is_none")]
156    pub acknowledge_account_subjects: Option<bool>,
157    #[serde(skip_serializing_if = "Option::is_none")]
158    pub comment: Option<String>,
159}
160
161/// Add a comment to a subject. An empty comment will clear any previously set sticky comment.
162#[derive(Debug, Clone, Serialize, Deserialize)]
163#[serde(rename_all = "camelCase")]
164pub struct ModEventComment {
165    #[serde(skip_serializing_if = "Option::is_none")]
166    pub comment: Option<String>,
167    #[serde(skip_serializing_if = "Option::is_none")]
168    pub sticky: Option<bool>,
169}
170
171/// Divert a record's blobs to a 3rd party service for further scanning/tagging
172#[derive(Debug, Clone, Serialize, Deserialize)]
173#[serde(rename_all = "camelCase")]
174pub struct ModEventDivert {
175    #[serde(skip_serializing_if = "Option::is_none")]
176    pub comment: Option<String>,
177}
178
179/// Keep a log of outgoing email to a user
180#[derive(Debug, Clone, Serialize, Deserialize)]
181#[serde(rename_all = "camelCase")]
182pub struct ModEventEmail {
183    #[serde(skip_serializing_if = "Option::is_none")]
184    pub comment: Option<String>,
185    #[serde(skip_serializing_if = "Option::is_none")]
186    pub content: Option<String>,
187    #[serde(skip_serializing_if = "Option::is_none")]
188    pub is_delivered: Option<bool>,
189    #[serde(skip_serializing_if = "Option::is_none")]
190    pub policies: Option<Vec<String>>,
191    #[serde(skip_serializing_if = "Option::is_none")]
192    pub severity_level: Option<String>,
193    #[serde(skip_serializing_if = "Option::is_none")]
194    pub strike_count: Option<i64>,
195    #[serde(skip_serializing_if = "Option::is_none")]
196    pub strike_expires_at: Option<proto_blue_syntax::Datetime>,
197    pub subject_line: String,
198}
199
200#[derive(Debug, Clone, Serialize, Deserialize)]
201#[serde(rename_all = "camelCase")]
202pub struct ModEventEscalate {
203    #[serde(skip_serializing_if = "Option::is_none")]
204    pub comment: Option<String>,
205}
206
207/// Apply/Negate labels on a subject
208#[derive(Debug, Clone, Serialize, Deserialize)]
209#[serde(rename_all = "camelCase")]
210pub struct ModEventLabel {
211    #[serde(skip_serializing_if = "Option::is_none")]
212    pub comment: Option<String>,
213    pub create_label_vals: Vec<String>,
214    #[serde(skip_serializing_if = "Option::is_none")]
215    pub duration_in_hours: Option<i64>,
216    pub negate_label_vals: Vec<String>,
217}
218
219/// Mute incoming reports on a subject
220#[derive(Debug, Clone, Serialize, Deserialize)]
221#[serde(rename_all = "camelCase")]
222pub struct ModEventMute {
223    #[serde(skip_serializing_if = "Option::is_none")]
224    pub comment: Option<String>,
225    pub duration_in_hours: i64,
226}
227
228/// Mute incoming reports from an account
229#[derive(Debug, Clone, Serialize, Deserialize)]
230#[serde(rename_all = "camelCase")]
231pub struct ModEventMuteReporter {
232    #[serde(skip_serializing_if = "Option::is_none")]
233    pub comment: Option<String>,
234    #[serde(skip_serializing_if = "Option::is_none")]
235    pub duration_in_hours: Option<i64>,
236}
237
238/// Set priority score of the subject. Higher score means higher priority.
239#[derive(Debug, Clone, Serialize, Deserialize)]
240#[serde(rename_all = "camelCase")]
241pub struct ModEventPriorityScore {
242    #[serde(skip_serializing_if = "Option::is_none")]
243    pub comment: Option<String>,
244    pub score: i64,
245}
246
247/// Report a subject
248#[derive(Debug, Clone, Serialize, Deserialize)]
249#[serde(rename_all = "camelCase")]
250pub struct ModEventReport {
251    #[serde(skip_serializing_if = "Option::is_none")]
252    pub comment: Option<String>,
253    #[serde(skip_serializing_if = "Option::is_none")]
254    pub is_reporter_muted: Option<bool>,
255    pub report_type: crate::com::atproto::moderation::defs::ReasonType,
256}
257
258/// Resolve appeal on a subject
259#[derive(Debug, Clone, Serialize, Deserialize)]
260#[serde(rename_all = "camelCase")]
261pub struct ModEventResolveAppeal {
262    #[serde(skip_serializing_if = "Option::is_none")]
263    pub comment: Option<String>,
264}
265
266/// Revert take down action on a subject
267#[derive(Debug, Clone, Serialize, Deserialize)]
268#[serde(rename_all = "camelCase")]
269pub struct ModEventReverseTakedown {
270    #[serde(skip_serializing_if = "Option::is_none")]
271    pub comment: Option<String>,
272    #[serde(skip_serializing_if = "Option::is_none")]
273    pub policies: Option<Vec<String>>,
274    #[serde(skip_serializing_if = "Option::is_none")]
275    pub severity_level: Option<String>,
276    #[serde(skip_serializing_if = "Option::is_none")]
277    pub strike_count: Option<i64>,
278}
279
280/// Add/Remove a tag on a subject
281#[derive(Debug, Clone, Serialize, Deserialize)]
282#[serde(rename_all = "camelCase")]
283pub struct ModEventTag {
284    pub add: Vec<String>,
285    #[serde(skip_serializing_if = "Option::is_none")]
286    pub comment: Option<String>,
287    pub remove: Vec<String>,
288}
289
290/// Take down a subject permanently or temporarily
291#[derive(Debug, Clone, Serialize, Deserialize)]
292#[serde(rename_all = "camelCase")]
293pub struct ModEventTakedown {
294    #[serde(skip_serializing_if = "Option::is_none")]
295    pub acknowledge_account_subjects: Option<bool>,
296    #[serde(skip_serializing_if = "Option::is_none")]
297    pub comment: Option<String>,
298    #[serde(skip_serializing_if = "Option::is_none")]
299    pub duration_in_hours: Option<i64>,
300    #[serde(skip_serializing_if = "Option::is_none")]
301    pub policies: Option<Vec<String>>,
302    #[serde(skip_serializing_if = "Option::is_none")]
303    pub severity_level: Option<String>,
304    #[serde(skip_serializing_if = "Option::is_none")]
305    pub strike_count: Option<i64>,
306    #[serde(skip_serializing_if = "Option::is_none")]
307    pub strike_expires_at: Option<proto_blue_syntax::Datetime>,
308    #[serde(skip_serializing_if = "Option::is_none")]
309    pub target_services: Option<Vec<String>>,
310}
311
312/// Unmute action on a subject
313#[derive(Debug, Clone, Serialize, Deserialize)]
314#[serde(rename_all = "camelCase")]
315pub struct ModEventUnmute {
316    #[serde(skip_serializing_if = "Option::is_none")]
317    pub comment: Option<String>,
318}
319
320/// Unmute incoming reports from an account
321#[derive(Debug, Clone, Serialize, Deserialize)]
322#[serde(rename_all = "camelCase")]
323pub struct ModEventUnmuteReporter {
324    #[serde(skip_serializing_if = "Option::is_none")]
325    pub comment: Option<String>,
326}
327
328#[derive(Debug, Clone, Serialize, Deserialize)]
329#[serde(tag = "$type")]
330pub enum ModEventViewEventRefs {
331    #[serde(rename = "tools.ozone.moderation.defs#modEventTakedown")]
332    OzoneModerationDefsModEventTakedown(Box<ModEventTakedown>),
333    #[serde(rename = "tools.ozone.moderation.defs#modEventReverseTakedown")]
334    OzoneModerationDefsModEventReverseTakedown(Box<ModEventReverseTakedown>),
335    #[serde(rename = "tools.ozone.moderation.defs#modEventComment")]
336    OzoneModerationDefsModEventComment(Box<ModEventComment>),
337    #[serde(rename = "tools.ozone.moderation.defs#modEventReport")]
338    OzoneModerationDefsModEventReport(Box<ModEventReport>),
339    #[serde(rename = "tools.ozone.moderation.defs#modEventLabel")]
340    OzoneModerationDefsModEventLabel(Box<ModEventLabel>),
341    #[serde(rename = "tools.ozone.moderation.defs#modEventAcknowledge")]
342    OzoneModerationDefsModEventAcknowledge(Box<ModEventAcknowledge>),
343    #[serde(rename = "tools.ozone.moderation.defs#modEventEscalate")]
344    OzoneModerationDefsModEventEscalate(Box<ModEventEscalate>),
345    #[serde(rename = "tools.ozone.moderation.defs#modEventMute")]
346    OzoneModerationDefsModEventMute(Box<ModEventMute>),
347    #[serde(rename = "tools.ozone.moderation.defs#modEventUnmute")]
348    OzoneModerationDefsModEventUnmute(Box<ModEventUnmute>),
349    #[serde(rename = "tools.ozone.moderation.defs#modEventMuteReporter")]
350    OzoneModerationDefsModEventMuteReporter(Box<ModEventMuteReporter>),
351    #[serde(rename = "tools.ozone.moderation.defs#modEventUnmuteReporter")]
352    OzoneModerationDefsModEventUnmuteReporter(Box<ModEventUnmuteReporter>),
353    #[serde(rename = "tools.ozone.moderation.defs#modEventEmail")]
354    OzoneModerationDefsModEventEmail(Box<ModEventEmail>),
355    #[serde(rename = "tools.ozone.moderation.defs#modEventResolveAppeal")]
356    OzoneModerationDefsModEventResolveAppeal(Box<ModEventResolveAppeal>),
357    #[serde(rename = "tools.ozone.moderation.defs#modEventDivert")]
358    OzoneModerationDefsModEventDivert(Box<ModEventDivert>),
359    #[serde(rename = "tools.ozone.moderation.defs#modEventTag")]
360    OzoneModerationDefsModEventTag(Box<ModEventTag>),
361    #[serde(rename = "tools.ozone.moderation.defs#accountEvent")]
362    OzoneModerationDefsAccountEvent(Box<AccountEvent>),
363    #[serde(rename = "tools.ozone.moderation.defs#identityEvent")]
364    OzoneModerationDefsIdentityEvent(Box<IdentityEvent>),
365    #[serde(rename = "tools.ozone.moderation.defs#recordEvent")]
366    OzoneModerationDefsRecordEvent(Box<RecordEvent>),
367    #[serde(rename = "tools.ozone.moderation.defs#modEventPriorityScore")]
368    OzoneModerationDefsModEventPriorityScore(Box<ModEventPriorityScore>),
369    #[serde(rename = "tools.ozone.moderation.defs#ageAssuranceEvent")]
370    OzoneModerationDefsAgeAssuranceEvent(Box<AgeAssuranceEvent>),
371    #[serde(rename = "tools.ozone.moderation.defs#ageAssuranceOverrideEvent")]
372    OzoneModerationDefsAgeAssuranceOverrideEvent(Box<AgeAssuranceOverrideEvent>),
373    #[serde(rename = "tools.ozone.moderation.defs#revokeAccountCredentialsEvent")]
374    OzoneModerationDefsRevokeAccountCredentialsEvent(Box<RevokeAccountCredentialsEvent>),
375    #[serde(rename = "tools.ozone.moderation.defs#scheduleTakedownEvent")]
376    OzoneModerationDefsScheduleTakedownEvent(Box<ScheduleTakedownEvent>),
377    #[serde(rename = "tools.ozone.moderation.defs#cancelScheduledTakedownEvent")]
378    OzoneModerationDefsCancelScheduledTakedownEvent(Box<CancelScheduledTakedownEvent>),
379    #[serde(other)]
380    Other,
381}
382
383#[derive(Debug, Clone, Serialize, Deserialize)]
384#[serde(tag = "$type")]
385pub enum ModEventViewSubjectRefs {
386    #[serde(rename = "com.atproto.admin.defs#repoRef")]
387    AtprotoAdminDefsRepoRef(Box<crate::com::atproto::admin::defs::RepoRef>),
388    #[serde(rename = "com.atproto.repo.strongRef")]
389    AtprotoRepoStrongRef(Box<crate::com::atproto::repo::strong_ref::Main>),
390    #[serde(rename = "chat.bsky.convo.defs#messageRef")]
391    BskyConvoDefsMessageRef(Box<crate::chat::bsky::convo::defs::MessageRef>),
392    #[serde(other)]
393    Other,
394}
395
396#[derive(Debug, Clone, Serialize, Deserialize)]
397#[serde(rename_all = "camelCase")]
398pub struct ModEventView {
399    pub created_at: proto_blue_syntax::Datetime,
400    pub created_by: proto_blue_syntax::Did,
401    #[serde(skip_serializing_if = "Option::is_none")]
402    pub creator_handle: Option<String>,
403    pub event: ModEventViewEventRefs,
404    pub id: i64,
405    #[serde(skip_serializing_if = "Option::is_none")]
406    pub mod_tool: Option<ModTool>,
407    pub subject: ModEventViewSubjectRefs,
408    pub subject_blob_cids: Vec<String>,
409    #[serde(skip_serializing_if = "Option::is_none")]
410    pub subject_handle: Option<String>,
411}
412
413#[derive(Debug, Clone, Serialize, Deserialize)]
414#[serde(tag = "$type")]
415pub enum ModEventViewDetailEventRefs {
416    #[serde(rename = "tools.ozone.moderation.defs#modEventTakedown")]
417    OzoneModerationDefsModEventTakedown(Box<ModEventTakedown>),
418    #[serde(rename = "tools.ozone.moderation.defs#modEventReverseTakedown")]
419    OzoneModerationDefsModEventReverseTakedown(Box<ModEventReverseTakedown>),
420    #[serde(rename = "tools.ozone.moderation.defs#modEventComment")]
421    OzoneModerationDefsModEventComment(Box<ModEventComment>),
422    #[serde(rename = "tools.ozone.moderation.defs#modEventReport")]
423    OzoneModerationDefsModEventReport(Box<ModEventReport>),
424    #[serde(rename = "tools.ozone.moderation.defs#modEventLabel")]
425    OzoneModerationDefsModEventLabel(Box<ModEventLabel>),
426    #[serde(rename = "tools.ozone.moderation.defs#modEventAcknowledge")]
427    OzoneModerationDefsModEventAcknowledge(Box<ModEventAcknowledge>),
428    #[serde(rename = "tools.ozone.moderation.defs#modEventEscalate")]
429    OzoneModerationDefsModEventEscalate(Box<ModEventEscalate>),
430    #[serde(rename = "tools.ozone.moderation.defs#modEventMute")]
431    OzoneModerationDefsModEventMute(Box<ModEventMute>),
432    #[serde(rename = "tools.ozone.moderation.defs#modEventUnmute")]
433    OzoneModerationDefsModEventUnmute(Box<ModEventUnmute>),
434    #[serde(rename = "tools.ozone.moderation.defs#modEventMuteReporter")]
435    OzoneModerationDefsModEventMuteReporter(Box<ModEventMuteReporter>),
436    #[serde(rename = "tools.ozone.moderation.defs#modEventUnmuteReporter")]
437    OzoneModerationDefsModEventUnmuteReporter(Box<ModEventUnmuteReporter>),
438    #[serde(rename = "tools.ozone.moderation.defs#modEventEmail")]
439    OzoneModerationDefsModEventEmail(Box<ModEventEmail>),
440    #[serde(rename = "tools.ozone.moderation.defs#modEventResolveAppeal")]
441    OzoneModerationDefsModEventResolveAppeal(Box<ModEventResolveAppeal>),
442    #[serde(rename = "tools.ozone.moderation.defs#modEventDivert")]
443    OzoneModerationDefsModEventDivert(Box<ModEventDivert>),
444    #[serde(rename = "tools.ozone.moderation.defs#modEventTag")]
445    OzoneModerationDefsModEventTag(Box<ModEventTag>),
446    #[serde(rename = "tools.ozone.moderation.defs#accountEvent")]
447    OzoneModerationDefsAccountEvent(Box<AccountEvent>),
448    #[serde(rename = "tools.ozone.moderation.defs#identityEvent")]
449    OzoneModerationDefsIdentityEvent(Box<IdentityEvent>),
450    #[serde(rename = "tools.ozone.moderation.defs#recordEvent")]
451    OzoneModerationDefsRecordEvent(Box<RecordEvent>),
452    #[serde(rename = "tools.ozone.moderation.defs#modEventPriorityScore")]
453    OzoneModerationDefsModEventPriorityScore(Box<ModEventPriorityScore>),
454    #[serde(rename = "tools.ozone.moderation.defs#ageAssuranceEvent")]
455    OzoneModerationDefsAgeAssuranceEvent(Box<AgeAssuranceEvent>),
456    #[serde(rename = "tools.ozone.moderation.defs#ageAssuranceOverrideEvent")]
457    OzoneModerationDefsAgeAssuranceOverrideEvent(Box<AgeAssuranceOverrideEvent>),
458    #[serde(rename = "tools.ozone.moderation.defs#revokeAccountCredentialsEvent")]
459    OzoneModerationDefsRevokeAccountCredentialsEvent(Box<RevokeAccountCredentialsEvent>),
460    #[serde(rename = "tools.ozone.moderation.defs#scheduleTakedownEvent")]
461    OzoneModerationDefsScheduleTakedownEvent(Box<ScheduleTakedownEvent>),
462    #[serde(rename = "tools.ozone.moderation.defs#cancelScheduledTakedownEvent")]
463    OzoneModerationDefsCancelScheduledTakedownEvent(Box<CancelScheduledTakedownEvent>),
464    #[serde(other)]
465    Other,
466}
467
468#[derive(Debug, Clone, Serialize, Deserialize)]
469#[serde(tag = "$type")]
470pub enum ModEventViewDetailSubjectRefs {
471    #[serde(rename = "tools.ozone.moderation.defs#repoView")]
472    OzoneModerationDefsRepoView(Box<RepoView>),
473    #[serde(rename = "tools.ozone.moderation.defs#repoViewNotFound")]
474    OzoneModerationDefsRepoViewNotFound(Box<RepoViewNotFound>),
475    #[serde(rename = "tools.ozone.moderation.defs#recordView")]
476    OzoneModerationDefsRecordView(Box<RecordView>),
477    #[serde(rename = "tools.ozone.moderation.defs#recordViewNotFound")]
478    OzoneModerationDefsRecordViewNotFound(Box<RecordViewNotFound>),
479    #[serde(other)]
480    Other,
481}
482
483#[derive(Debug, Clone, Serialize, Deserialize)]
484#[serde(rename_all = "camelCase")]
485pub struct ModEventViewDetail {
486    pub created_at: proto_blue_syntax::Datetime,
487    pub created_by: proto_blue_syntax::Did,
488    pub event: ModEventViewDetailEventRefs,
489    pub id: i64,
490    #[serde(skip_serializing_if = "Option::is_none")]
491    pub mod_tool: Option<ModTool>,
492    pub subject: ModEventViewDetailSubjectRefs,
493    pub subject_blobs: Vec<BlobView>,
494}
495
496/// Moderation tool information for tracing the source of the action
497#[derive(Debug, Clone, Serialize, Deserialize)]
498#[serde(rename_all = "camelCase")]
499pub struct ModTool {
500    #[serde(skip_serializing_if = "Option::is_none")]
501    pub meta: Option<serde_json::Value>,
502    pub name: String,
503}
504
505#[derive(Debug, Clone, Serialize, Deserialize)]
506#[serde(rename_all = "camelCase")]
507pub struct Moderation {
508    #[serde(skip_serializing_if = "Option::is_none")]
509    pub subject_status: Option<SubjectStatusView>,
510}
511
512#[derive(Debug, Clone, Serialize, Deserialize)]
513#[serde(rename_all = "camelCase")]
514pub struct ModerationDetail {
515    #[serde(skip_serializing_if = "Option::is_none")]
516    pub subject_status: Option<SubjectStatusView>,
517}
518
519/// Logs lifecycle event on a record subject. Normally captured by automod from the firehose and emitted to ozone for historical tracking.
520#[derive(Debug, Clone, Serialize, Deserialize)]
521#[serde(rename_all = "camelCase")]
522pub struct RecordEvent {
523    #[serde(skip_serializing_if = "Option::is_none")]
524    pub cid: Option<String>,
525    #[serde(skip_serializing_if = "Option::is_none")]
526    pub comment: Option<String>,
527    pub op: String,
528    pub timestamp: proto_blue_syntax::Datetime,
529}
530
531#[derive(Debug, Clone, Serialize, Deserialize)]
532#[serde(rename_all = "camelCase")]
533pub struct RecordHosting {
534    #[serde(skip_serializing_if = "Option::is_none")]
535    pub created_at: Option<proto_blue_syntax::Datetime>,
536    #[serde(skip_serializing_if = "Option::is_none")]
537    pub deleted_at: Option<proto_blue_syntax::Datetime>,
538    pub status: String,
539    #[serde(skip_serializing_if = "Option::is_none")]
540    pub updated_at: Option<proto_blue_syntax::Datetime>,
541}
542
543#[derive(Debug, Clone, Serialize, Deserialize)]
544#[serde(rename_all = "camelCase")]
545pub struct RecordView {
546    pub blob_cids: Vec<String>,
547    pub cid: String,
548    pub indexed_at: proto_blue_syntax::Datetime,
549    pub moderation: Moderation,
550    pub repo: RepoView,
551    pub uri: proto_blue_syntax::AtUri,
552    pub value: serde_json::Value,
553}
554
555#[derive(Debug, Clone, Serialize, Deserialize)]
556#[serde(rename_all = "camelCase")]
557pub struct RecordViewDetail {
558    pub blobs: Vec<BlobView>,
559    pub cid: String,
560    pub indexed_at: proto_blue_syntax::Datetime,
561    #[serde(skip_serializing_if = "Option::is_none")]
562    pub labels: Option<Vec<crate::com::atproto::label::defs::Label>>,
563    pub moderation: ModerationDetail,
564    pub repo: RepoView,
565    pub uri: proto_blue_syntax::AtUri,
566    pub value: serde_json::Value,
567}
568
569#[derive(Debug, Clone, Serialize, Deserialize)]
570#[serde(rename_all = "camelCase")]
571pub struct RecordViewNotFound {
572    pub uri: proto_blue_syntax::AtUri,
573}
574
575/// Statistics about a set of record subject items
576#[derive(Debug, Clone, Serialize, Deserialize)]
577#[serde(rename_all = "camelCase")]
578pub struct RecordsStats {
579    #[serde(skip_serializing_if = "Option::is_none")]
580    pub appealed_count: Option<i64>,
581    #[serde(skip_serializing_if = "Option::is_none")]
582    pub escalated_count: Option<i64>,
583    #[serde(skip_serializing_if = "Option::is_none")]
584    pub pending_count: Option<i64>,
585    #[serde(skip_serializing_if = "Option::is_none")]
586    pub processed_count: Option<i64>,
587    #[serde(skip_serializing_if = "Option::is_none")]
588    pub reported_count: Option<i64>,
589    #[serde(skip_serializing_if = "Option::is_none")]
590    pub subject_count: Option<i64>,
591    #[serde(skip_serializing_if = "Option::is_none")]
592    pub takendown_count: Option<i64>,
593    #[serde(skip_serializing_if = "Option::is_none")]
594    pub total_reports: Option<i64>,
595}
596
597#[derive(Debug, Clone, Serialize, Deserialize)]
598#[serde(rename_all = "camelCase")]
599pub struct RepoView {
600    #[serde(skip_serializing_if = "Option::is_none")]
601    pub deactivated_at: Option<proto_blue_syntax::Datetime>,
602    pub did: proto_blue_syntax::Did,
603    #[serde(skip_serializing_if = "Option::is_none")]
604    pub email: Option<String>,
605    pub handle: proto_blue_syntax::Handle,
606    pub indexed_at: proto_blue_syntax::Datetime,
607    #[serde(skip_serializing_if = "Option::is_none")]
608    pub invite_note: Option<String>,
609    #[serde(skip_serializing_if = "Option::is_none")]
610    pub invited_by: Option<crate::com::atproto::server::defs::InviteCode>,
611    #[serde(skip_serializing_if = "Option::is_none")]
612    pub invites_disabled: Option<bool>,
613    pub moderation: Moderation,
614    pub related_records: Vec<serde_json::Value>,
615    #[serde(skip_serializing_if = "Option::is_none")]
616    pub threat_signatures: Option<Vec<crate::com::atproto::admin::defs::ThreatSignature>>,
617}
618
619#[derive(Debug, Clone, Serialize, Deserialize)]
620#[serde(rename_all = "camelCase")]
621pub struct RepoViewDetail {
622    #[serde(skip_serializing_if = "Option::is_none")]
623    pub deactivated_at: Option<proto_blue_syntax::Datetime>,
624    pub did: proto_blue_syntax::Did,
625    #[serde(skip_serializing_if = "Option::is_none")]
626    pub email: Option<String>,
627    #[serde(skip_serializing_if = "Option::is_none")]
628    pub email_confirmed_at: Option<proto_blue_syntax::Datetime>,
629    pub handle: proto_blue_syntax::Handle,
630    pub indexed_at: proto_blue_syntax::Datetime,
631    #[serde(skip_serializing_if = "Option::is_none")]
632    pub invite_note: Option<String>,
633    #[serde(skip_serializing_if = "Option::is_none")]
634    pub invited_by: Option<crate::com::atproto::server::defs::InviteCode>,
635    #[serde(skip_serializing_if = "Option::is_none")]
636    pub invites: Option<Vec<crate::com::atproto::server::defs::InviteCode>>,
637    #[serde(skip_serializing_if = "Option::is_none")]
638    pub invites_disabled: Option<bool>,
639    #[serde(skip_serializing_if = "Option::is_none")]
640    pub labels: Option<Vec<crate::com::atproto::label::defs::Label>>,
641    pub moderation: ModerationDetail,
642    pub related_records: Vec<serde_json::Value>,
643    #[serde(skip_serializing_if = "Option::is_none")]
644    pub threat_signatures: Option<Vec<crate::com::atproto::admin::defs::ThreatSignature>>,
645}
646
647#[derive(Debug, Clone, Serialize, Deserialize)]
648#[serde(rename_all = "camelCase")]
649pub struct RepoViewNotFound {
650    pub did: proto_blue_syntax::Did,
651}
652
653#[derive(Debug, Clone, Serialize, Deserialize)]
654#[serde(rename_all = "camelCase")]
655pub struct ReporterStats {
656    pub account_report_count: i64,
657    pub did: proto_blue_syntax::Did,
658    pub labeled_account_count: i64,
659    pub labeled_record_count: i64,
660    pub record_report_count: i64,
661    pub reported_account_count: i64,
662    pub reported_record_count: i64,
663    pub takendown_account_count: i64,
664    pub takendown_record_count: i64,
665}
666
667/// Moderator review status of a subject: Closed. Indicates that the subject was already reviewed and resolved by a moderator
668pub const REVIEW_CLOSED: &str = "tools.ozone.moderation.defs#reviewClosed";
669
670/// Moderator review status of a subject: Escalated. Indicates that the subject was escalated for review by a moderator
671pub const REVIEW_ESCALATED: &str = "tools.ozone.moderation.defs#reviewEscalated";
672
673/// Moderator review status of a subject: Unnecessary. Indicates that the subject does not need a review at the moment but there is probably some moderation related metadata available for it
674pub const REVIEW_NONE: &str = "tools.ozone.moderation.defs#reviewNone";
675
676/// Moderator review status of a subject: Open. Indicates that the subject needs to be reviewed by a moderator
677pub const REVIEW_OPEN: &str = "tools.ozone.moderation.defs#reviewOpen";
678
679/// Account credentials revocation by moderators. Only works on DID subjects.
680#[derive(Debug, Clone, Serialize, Deserialize)]
681#[serde(rename_all = "camelCase")]
682pub struct RevokeAccountCredentialsEvent {
683    pub comment: String,
684}
685
686/// Logs a scheduled takedown action for an account.
687#[derive(Debug, Clone, Serialize, Deserialize)]
688#[serde(rename_all = "camelCase")]
689pub struct ScheduleTakedownEvent {
690    #[serde(skip_serializing_if = "Option::is_none")]
691    pub comment: Option<String>,
692    #[serde(skip_serializing_if = "Option::is_none")]
693    pub execute_after: Option<proto_blue_syntax::Datetime>,
694    #[serde(skip_serializing_if = "Option::is_none")]
695    pub execute_at: Option<proto_blue_syntax::Datetime>,
696    #[serde(skip_serializing_if = "Option::is_none")]
697    pub execute_until: Option<proto_blue_syntax::Datetime>,
698}
699
700/// View of a scheduled moderation action
701#[derive(Debug, Clone, Serialize, Deserialize)]
702#[serde(rename_all = "camelCase")]
703pub struct ScheduledActionView {
704    pub action: String,
705    pub created_at: proto_blue_syntax::Datetime,
706    pub created_by: proto_blue_syntax::Did,
707    pub did: proto_blue_syntax::Did,
708    #[serde(skip_serializing_if = "Option::is_none")]
709    pub event_data: Option<serde_json::Value>,
710    #[serde(skip_serializing_if = "Option::is_none")]
711    pub execute_after: Option<proto_blue_syntax::Datetime>,
712    #[serde(skip_serializing_if = "Option::is_none")]
713    pub execute_at: Option<proto_blue_syntax::Datetime>,
714    #[serde(skip_serializing_if = "Option::is_none")]
715    pub execute_until: Option<proto_blue_syntax::Datetime>,
716    #[serde(skip_serializing_if = "Option::is_none")]
717    pub execution_event_id: Option<i64>,
718    pub id: i64,
719    #[serde(skip_serializing_if = "Option::is_none")]
720    pub last_executed_at: Option<proto_blue_syntax::Datetime>,
721    #[serde(skip_serializing_if = "Option::is_none")]
722    pub last_failure_reason: Option<String>,
723    #[serde(skip_serializing_if = "Option::is_none")]
724    pub randomize_execution: Option<bool>,
725    pub status: String,
726    #[serde(skip_serializing_if = "Option::is_none")]
727    pub updated_at: Option<proto_blue_syntax::Datetime>,
728}
729
730pub type SubjectReviewState = String;
731pub const SUBJECT_REVIEW_STATE_REVIEW_OPEN: &str = "tools.ozone.moderation.defs#reviewOpen";
732pub const SUBJECT_REVIEW_STATE_REVIEW_ESCALATED: &str =
733    "tools.ozone.moderation.defs#reviewEscalated";
734pub const SUBJECT_REVIEW_STATE_REVIEW_CLOSED: &str = "tools.ozone.moderation.defs#reviewClosed";
735pub const SUBJECT_REVIEW_STATE_REVIEW_NONE: &str = "tools.ozone.moderation.defs#reviewNone";
736
737#[derive(Debug, Clone, Serialize, Deserialize)]
738#[serde(tag = "$type")]
739pub enum SubjectStatusViewHostingRefs {
740    #[serde(rename = "tools.ozone.moderation.defs#accountHosting")]
741    OzoneModerationDefsAccountHosting(Box<AccountHosting>),
742    #[serde(rename = "tools.ozone.moderation.defs#recordHosting")]
743    OzoneModerationDefsRecordHosting(Box<RecordHosting>),
744    #[serde(other)]
745    Other,
746}
747
748#[derive(Debug, Clone, Serialize, Deserialize)]
749#[serde(tag = "$type")]
750pub enum SubjectStatusViewSubjectRefs {
751    #[serde(rename = "com.atproto.admin.defs#repoRef")]
752    AtprotoAdminDefsRepoRef(Box<crate::com::atproto::admin::defs::RepoRef>),
753    #[serde(rename = "com.atproto.repo.strongRef")]
754    AtprotoRepoStrongRef(Box<crate::com::atproto::repo::strong_ref::Main>),
755    #[serde(rename = "chat.bsky.convo.defs#messageRef")]
756    BskyConvoDefsMessageRef(Box<crate::chat::bsky::convo::defs::MessageRef>),
757    #[serde(other)]
758    Other,
759}
760
761#[derive(Debug, Clone, Serialize, Deserialize)]
762#[serde(rename_all = "camelCase")]
763pub struct SubjectStatusView {
764    #[serde(skip_serializing_if = "Option::is_none")]
765    pub account_stats: Option<AccountStats>,
766    #[serde(skip_serializing_if = "Option::is_none")]
767    pub account_strike: Option<AccountStrike>,
768    #[serde(skip_serializing_if = "Option::is_none")]
769    pub age_assurance_state: Option<String>,
770    #[serde(skip_serializing_if = "Option::is_none")]
771    pub age_assurance_updated_by: Option<String>,
772    #[serde(skip_serializing_if = "Option::is_none")]
773    pub appealed: Option<bool>,
774    #[serde(skip_serializing_if = "Option::is_none")]
775    pub comment: Option<String>,
776    pub created_at: proto_blue_syntax::Datetime,
777    #[serde(skip_serializing_if = "Option::is_none")]
778    pub hosting: Option<SubjectStatusViewHostingRefs>,
779    pub id: i64,
780    #[serde(skip_serializing_if = "Option::is_none")]
781    pub last_appealed_at: Option<proto_blue_syntax::Datetime>,
782    #[serde(skip_serializing_if = "Option::is_none")]
783    pub last_reported_at: Option<proto_blue_syntax::Datetime>,
784    #[serde(skip_serializing_if = "Option::is_none")]
785    pub last_reviewed_at: Option<proto_blue_syntax::Datetime>,
786    #[serde(skip_serializing_if = "Option::is_none")]
787    pub last_reviewed_by: Option<proto_blue_syntax::Did>,
788    #[serde(skip_serializing_if = "Option::is_none")]
789    pub mute_reporting_until: Option<proto_blue_syntax::Datetime>,
790    #[serde(skip_serializing_if = "Option::is_none")]
791    pub mute_until: Option<proto_blue_syntax::Datetime>,
792    #[serde(skip_serializing_if = "Option::is_none")]
793    pub priority_score: Option<i64>,
794    #[serde(skip_serializing_if = "Option::is_none")]
795    pub records_stats: Option<RecordsStats>,
796    pub review_state: SubjectReviewState,
797    pub subject: SubjectStatusViewSubjectRefs,
798    #[serde(skip_serializing_if = "Option::is_none")]
799    pub subject_blob_cids: Option<Vec<String>>,
800    #[serde(skip_serializing_if = "Option::is_none")]
801    pub subject_repo_handle: Option<String>,
802    #[serde(skip_serializing_if = "Option::is_none")]
803    pub suspend_until: Option<proto_blue_syntax::Datetime>,
804    #[serde(skip_serializing_if = "Option::is_none")]
805    pub tags: Option<Vec<String>>,
806    #[serde(skip_serializing_if = "Option::is_none")]
807    pub takendown: Option<bool>,
808    pub updated_at: proto_blue_syntax::Datetime,
809}
810
811#[derive(Debug, Clone, Serialize, Deserialize)]
812#[serde(tag = "$type")]
813pub enum SubjectViewProfileRefs {
814    #[serde(other)]
815    Other,
816}
817
818/// Detailed view of a subject. For record subjects, the author's repo and profile will be returned.
819#[derive(Debug, Clone, Serialize, Deserialize)]
820#[serde(rename_all = "camelCase")]
821pub struct SubjectView {
822    #[serde(skip_serializing_if = "Option::is_none")]
823    pub profile: Option<SubjectViewProfileRefs>,
824    #[serde(skip_serializing_if = "Option::is_none")]
825    pub record: Option<RecordViewDetail>,
826    #[serde(skip_serializing_if = "Option::is_none")]
827    pub repo: Option<RepoViewDetail>,
828    #[serde(skip_serializing_if = "Option::is_none")]
829    pub status: Option<SubjectStatusView>,
830    pub subject: String,
831    #[serde(rename = "type")]
832    pub r#type: crate::com::atproto::moderation::defs::SubjectType,
833}
834
835/// Moderation event timeline event for a PLC create operation
836pub const TIMELINE_EVENT_PLC_CREATE: &str = "tools.ozone.moderation.defs#timelineEventPlcCreate";
837
838/// Moderation event timeline event for generic PLC operation
839pub const TIMELINE_EVENT_PLC_OPERATION: &str =
840    "tools.ozone.moderation.defs#timelineEventPlcOperation";
841
842/// Moderation event timeline event for a PLC tombstone operation
843pub const TIMELINE_EVENT_PLC_TOMBSTONE: &str =
844    "tools.ozone.moderation.defs#timelineEventPlcTombstone";
845
846#[derive(Debug, Clone, Serialize, Deserialize)]
847#[serde(rename_all = "camelCase")]
848pub struct VideoDetails {
849    pub height: i64,
850    pub length: i64,
851    pub width: i64,
852}