diff --git a/atrium-api/README.md b/atrium-api/README.md index c3ef835a..5406b5e6 100644 --- a/atrium-api/README.md +++ b/atrium-api/README.md @@ -26,6 +26,7 @@ async fn main() -> Result<(), Box> { .atproto .server .create_session(Input { + auth_factor_token: None, identifier: "alice@mail.com".into(), password: "hunter2".into(), }) diff --git a/atrium-api/src/agent.rs b/atrium-api/src/agent.rs index 29509869..99e403f2 100644 --- a/atrium-api/src/agent.rs +++ b/atrium-api/src/agent.rs @@ -45,6 +45,7 @@ where .atproto .server .create_session(crate::com::atproto::server::create_session::Input { + auth_factor_token: None, identifier: identifier.as_ref().into(), password: password.as_ref().into(), }) @@ -194,6 +195,7 @@ mod tests { did: "did:web:example.com".parse().expect("valid"), did_doc: None, email: None, + email_auth_factor: None, email_confirmed: None, handle: "example.com".parse().expect("valid"), refresh_jwt: String::from("refresh"), @@ -256,6 +258,7 @@ mod tests { did: session.did.clone(), did_doc: session.did_doc.clone(), email: session.email.clone(), + email_auth_factor: session.email_auth_factor, email_confirmed: session.email_confirmed, handle: session.handle.clone(), }), @@ -287,6 +290,7 @@ mod tests { did: session.did.clone(), did_doc: session.did_doc.clone(), email: session.email.clone(), + email_auth_factor: session.email_auth_factor, email_confirmed: session.email_confirmed, handle: session.handle.clone(), }), @@ -326,6 +330,7 @@ mod tests { did: session.did.clone(), did_doc: session.did_doc.clone(), email: session.email.clone(), + email_auth_factor: session.email_auth_factor, email_confirmed: session.email_confirmed, handle: session.handle.clone(), }), @@ -378,6 +383,7 @@ mod tests { did: session.did.clone(), did_doc: session.did_doc.clone(), email: session.email.clone(), + email_auth_factor: session.email_auth_factor, email_confirmed: session.email_confirmed, handle: session.handle.clone(), }), @@ -424,6 +430,7 @@ mod tests { did: session.did.clone(), did_doc: session.did_doc.clone(), email: session.email.clone(), + email_auth_factor: session.email_auth_factor, email_confirmed: session.email_confirmed, handle: session.handle.clone(), }), diff --git a/atrium-api/src/app/bsky/actor/defs.rs b/atrium-api/src/app/bsky/actor/defs.rs index b0437c3d..749fc332 100644 --- a/atrium-api/src/app/bsky/actor/defs.rs +++ b/atrium-api/src/app/bsky/actor/defs.rs @@ -157,6 +157,14 @@ pub struct ProfileViewDetailed { } #[derive(serde::Serialize, serde::Deserialize, Debug, Clone, PartialEq, Eq)] #[serde(rename_all = "camelCase")] +pub struct SavedFeed { + pub id: String, + pub pinned: bool, + pub r#type: String, + pub value: String, +} +#[derive(serde::Serialize, serde::Deserialize, Debug, Clone, PartialEq, Eq)] +#[serde(rename_all = "camelCase")] pub struct SavedFeedsPref { pub pinned: Vec, pub saved: Vec, @@ -165,6 +173,11 @@ pub struct SavedFeedsPref { } #[derive(serde::Serialize, serde::Deserialize, Debug, Clone, PartialEq, Eq)] #[serde(rename_all = "camelCase")] +pub struct SavedFeedsPrefV2 { + pub items: Vec, +} +#[derive(serde::Serialize, serde::Deserialize, Debug, Clone, PartialEq, Eq)] +#[serde(rename_all = "camelCase")] pub struct ThreadViewPref { ///Show followed users at the top of all replies. #[serde(skip_serializing_if = "Option::is_none")] @@ -201,6 +214,8 @@ pub enum PreferencesItem { ContentLabelPref(Box), #[serde(rename = "app.bsky.actor.defs#savedFeedsPref")] SavedFeedsPref(Box), + #[serde(rename = "app.bsky.actor.defs#savedFeedsPrefV2")] + SavedFeedsPrefV2(Box), #[serde(rename = "app.bsky.actor.defs#personalDetailsPref")] PersonalDetailsPref(Box), #[serde(rename = "app.bsky.actor.defs#feedViewPref")] diff --git a/atrium-api/src/com/atproto/server/create_session.rs b/atrium-api/src/com/atproto/server/create_session.rs index 88edb765..c41fdba9 100644 --- a/atrium-api/src/com/atproto/server/create_session.rs +++ b/atrium-api/src/com/atproto/server/create_session.rs @@ -3,6 +3,8 @@ #[derive(serde::Serialize, serde::Deserialize, Debug, Clone, PartialEq, Eq)] #[serde(rename_all = "camelCase")] pub struct Input { + #[serde(skip_serializing_if = "Option::is_none")] + pub auth_factor_token: Option, ///Handle or other identifier supported by the server for the authenticating user. pub identifier: String, pub password: String, @@ -17,6 +19,8 @@ pub struct Output { #[serde(skip_serializing_if = "Option::is_none")] pub email: Option, #[serde(skip_serializing_if = "Option::is_none")] + pub email_auth_factor: Option, + #[serde(skip_serializing_if = "Option::is_none")] pub email_confirmed: Option, pub handle: crate::types::string::Handle, pub refresh_jwt: String, @@ -25,6 +29,7 @@ pub struct Output { #[serde(tag = "error", content = "message")] pub enum Error { AccountTakedown(Option), + AuthFactorTokenRequired(Option), } impl std::fmt::Display for Error { fn fmt(&self, _f: &mut std::fmt::Formatter) -> std::fmt::Result { @@ -35,6 +40,12 @@ impl std::fmt::Display for Error { write!(_f, ": {msg}")?; } } + Error::AuthFactorTokenRequired(msg) => { + write!(_f, "AuthFactorTokenRequired")?; + if let Some(msg) = msg { + write!(_f, ": {msg}")?; + } + } } Ok(()) } diff --git a/atrium-api/src/com/atproto/server/get_session.rs b/atrium-api/src/com/atproto/server/get_session.rs index 48c77066..d5bc76ba 100644 --- a/atrium-api/src/com/atproto/server/get_session.rs +++ b/atrium-api/src/com/atproto/server/get_session.rs @@ -9,6 +9,8 @@ pub struct Output { #[serde(skip_serializing_if = "Option::is_none")] pub email: Option, #[serde(skip_serializing_if = "Option::is_none")] + pub email_auth_factor: Option, + #[serde(skip_serializing_if = "Option::is_none")] pub email_confirmed: Option, pub handle: crate::types::string::Handle, } diff --git a/atrium-api/src/com/atproto/server/update_email.rs b/atrium-api/src/com/atproto/server/update_email.rs index 53503cec..a95edf80 100644 --- a/atrium-api/src/com/atproto/server/update_email.rs +++ b/atrium-api/src/com/atproto/server/update_email.rs @@ -4,6 +4,8 @@ #[serde(rename_all = "camelCase")] pub struct Input { pub email: String, + #[serde(skip_serializing_if = "Option::is_none")] + pub email_auth_factor: Option, ///Requires a token from com.atproto.sever.requestEmailUpdate if the account's email has been confirmed. #[serde(skip_serializing_if = "Option::is_none")] pub token: Option, diff --git a/atrium-api/src/tools/ozone/moderation/defs.rs b/atrium-api/src/tools/ozone/moderation/defs.rs index 0de0640f..cda4ac84 100644 --- a/atrium-api/src/tools/ozone/moderation/defs.rs +++ b/atrium-api/src/tools/ozone/moderation/defs.rs @@ -77,12 +77,24 @@ pub struct ModEventMute { ///Indicates how long the subject should remain muted. pub duration_in_hours: i64, } +///Mute incoming reports from an account +#[derive(serde::Serialize, serde::Deserialize, Debug, Clone, PartialEq, Eq)] +#[serde(rename_all = "camelCase")] +pub struct ModEventMuteReporter { + #[serde(skip_serializing_if = "Option::is_none")] + pub comment: Option, + ///Indicates how long the account should remain muted. + pub duration_in_hours: i64, +} ///Report a subject #[derive(serde::Serialize, serde::Deserialize, Debug, Clone, PartialEq, Eq)] #[serde(rename_all = "camelCase")] pub struct ModEventReport { #[serde(skip_serializing_if = "Option::is_none")] pub comment: Option, + ///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. + #[serde(skip_serializing_if = "Option::is_none")] + pub is_reporter_muted: Option, pub report_type: crate::com::atproto::moderation::defs::ReasonType, } ///Resolve appeal on a subject @@ -131,6 +143,14 @@ pub struct ModEventUnmute { #[serde(skip_serializing_if = "Option::is_none")] pub comment: Option, } +///Unmute incoming reports from an account +#[derive(serde::Serialize, serde::Deserialize, Debug, Clone, PartialEq, Eq)] +#[serde(rename_all = "camelCase")] +pub struct ModEventUnmuteReporter { + ///Describe reasoning behind the reversal. + #[serde(skip_serializing_if = "Option::is_none")] + pub comment: Option, +} #[derive(serde::Serialize, serde::Deserialize, Debug, Clone, PartialEq, Eq)] #[serde(rename_all = "camelCase")] pub struct ModEventView { @@ -272,6 +292,8 @@ pub struct SubjectStatusView { #[serde(skip_serializing_if = "Option::is_none")] pub last_reviewed_by: Option, #[serde(skip_serializing_if = "Option::is_none")] + pub mute_reporting_until: Option, + #[serde(skip_serializing_if = "Option::is_none")] pub mute_until: Option, pub review_state: SubjectReviewState, pub subject: crate::types::Union, @@ -322,6 +344,12 @@ pub enum ModEventViewDetailEventRefs { ModEventEscalate(Box), #[serde(rename = "tools.ozone.moderation.defs#modEventMute")] ModEventMute(Box), + #[serde(rename = "tools.ozone.moderation.defs#modEventUnmute")] + ModEventUnmute(Box), + #[serde(rename = "tools.ozone.moderation.defs#modEventMuteReporter")] + ModEventMuteReporter(Box), + #[serde(rename = "tools.ozone.moderation.defs#modEventUnmuteReporter")] + ModEventUnmuteReporter(Box), #[serde(rename = "tools.ozone.moderation.defs#modEventEmail")] ModEventEmail(Box), #[serde(rename = "tools.ozone.moderation.defs#modEventResolveAppeal")] @@ -360,6 +388,12 @@ pub enum ModEventViewEventRefs { ModEventEscalate(Box), #[serde(rename = "tools.ozone.moderation.defs#modEventMute")] ModEventMute(Box), + #[serde(rename = "tools.ozone.moderation.defs#modEventUnmute")] + ModEventUnmute(Box), + #[serde(rename = "tools.ozone.moderation.defs#modEventMuteReporter")] + ModEventMuteReporter(Box), + #[serde(rename = "tools.ozone.moderation.defs#modEventUnmuteReporter")] + ModEventUnmuteReporter(Box), #[serde(rename = "tools.ozone.moderation.defs#modEventEmail")] ModEventEmail(Box), #[serde(rename = "tools.ozone.moderation.defs#modEventResolveAppeal")] diff --git a/atrium-api/src/tools/ozone/moderation/emit_event.rs b/atrium-api/src/tools/ozone/moderation/emit_event.rs index 3597e80b..78b9faf9 100644 --- a/atrium-api/src/tools/ozone/moderation/emit_event.rs +++ b/atrium-api/src/tools/ozone/moderation/emit_event.rs @@ -59,14 +59,22 @@ pub enum InputEventRefs { ToolsOzoneModerationDefsModEventMute( Box, ), - #[serde(rename = "tools.ozone.moderation.defs#modEventReverseTakedown")] - ToolsOzoneModerationDefsModEventReverseTakedown( - Box, - ), #[serde(rename = "tools.ozone.moderation.defs#modEventUnmute")] ToolsOzoneModerationDefsModEventUnmute( Box, ), + #[serde(rename = "tools.ozone.moderation.defs#modEventMuteReporter")] + ToolsOzoneModerationDefsModEventMuteReporter( + Box, + ), + #[serde(rename = "tools.ozone.moderation.defs#modEventUnmuteReporter")] + ToolsOzoneModerationDefsModEventUnmuteReporter( + Box, + ), + #[serde(rename = "tools.ozone.moderation.defs#modEventReverseTakedown")] + ToolsOzoneModerationDefsModEventReverseTakedown( + Box, + ), #[serde(rename = "tools.ozone.moderation.defs#modEventEmail")] ToolsOzoneModerationDefsModEventEmail( Box, diff --git a/atrium-api/src/tools/ozone/moderation/query_statuses.rs b/atrium-api/src/tools/ozone/moderation/query_statuses.rs index 752dfab6..54232315 100644 --- a/atrium-api/src/tools/ozone/moderation/query_statuses.rs +++ b/atrium-api/src/tools/ozone/moderation/query_statuses.rs @@ -23,6 +23,9 @@ pub struct Parameters { pub last_reviewed_by: Option, #[serde(skip_serializing_if = "Option::is_none")] pub limit: Option>, + ///When set to true, only muted subjects and reporters will be returned. + #[serde(skip_serializing_if = "Option::is_none")] + pub only_muted: Option, ///Search subjects reported after a given timestamp #[serde(skip_serializing_if = "Option::is_none")] pub reported_after: Option,