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