diff --git a/Cargo.lock b/Cargo.lock index da608e1..1c4b74b 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -409,6 +409,17 @@ dependencies = [ "pin-project-lite", ] +[[package]] +name = "async-recursion" +version = "1.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3b43422f69d8ff38f95f1b2bb76517c91589a924d1559a0e935d7c8ce0274c11" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.58", +] + [[package]] name = "async-stream" version = "0.3.5" @@ -1910,6 +1921,7 @@ dependencies = [ "actix-web", "actix-web-prom", "anyhow", + "async-recursion", "async-trait", "async_once", "chrono", diff --git a/Cargo.toml b/Cargo.toml index 4b47ca8..d99743c 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -33,6 +33,7 @@ reqwest = { version = "0.12.4", features = ["blocking", "json", "multipart"] } time = { version = "0.3.36", features = ["serde"] } serde_derive = "1.0.201" dotenv = "0.15.0" +async-recursion = "1.1.1" [dependencies.sea-orm] version = "0.12.0" diff --git a/src/lysand/conversion.rs b/src/lysand/conversion.rs index e236cd1..8b3ef37 100644 --- a/src/lysand/conversion.rs +++ b/src/lysand/conversion.rs @@ -4,6 +4,7 @@ use chrono::{DateTime, TimeZone, Utc}; use sea_orm::{ActiveModelTrait, ColumnTrait, EntityTrait, QueryFilter, Set}; use anyhow::{anyhow, Ok}; use url::Url; +use async_recursion::async_recursion; use crate::{database::State, entities::{self, post, prelude, user}, objects::post::Mention, utils::{generate_object_id, generate_user_id}, API_DOMAIN, DB, FEDERATION_CONFIG, LYSAND_DOMAIN}; @@ -22,7 +23,7 @@ pub async fn option_content_format_text(opt: Option) -> Option anyhow::Result { if !url.domain().eq(&Some(LYSAND_DOMAIN.as_str())) { return Err(anyhow!("not lysands domain")); @@ -80,7 +81,7 @@ pub async fn fetch_note_from_url(url: Url) -> anyhow::Result().await?) } - +#[async_recursion] pub async fn receive_lysand_note(note: Note, db_id: String) -> anyhow::Result { let lysand_author: entities::user::Model = db_user_from_url(note.author.clone()).await?; let user_res = prelude::User::find_by_id(db_id).one(DB.get().unwrap()).await; @@ -131,7 +132,7 @@ pub async fn receive_lysand_note(note: Note, db_id: String) -> anyhow::Result = if let Some(rep) = note.replies_to { + let reply_string: Option = if let Some(rep) = note.replies_to.clone() { let note = fetch_note_from_url(rep).await?; let fake_rep_url = Url::parse(&format!( "https://{}/apbridge/object/{}",