2020-06-01 14:17:20 +00:00
|
|
|
use crate::{
|
2020-08-31 13:48:02 +00:00
|
|
|
apub::{activity_queue::send_activity, community::do_announce, insert_activity},
|
2020-08-18 13:43:50 +00:00
|
|
|
LemmyContext,
|
2020-06-01 14:17:20 +00:00
|
|
|
};
|
2020-08-31 13:48:02 +00:00
|
|
|
use activitystreams::{
|
|
|
|
base::{Extends, ExtendsExt},
|
|
|
|
object::AsObject,
|
|
|
|
};
|
2020-07-10 18:15:41 +00:00
|
|
|
use lemmy_db::{community::Community, user::User_};
|
2020-09-14 15:29:50 +00:00
|
|
|
use lemmy_utils::{apub::get_apub_protocol_string, settings::Settings, LemmyError};
|
2020-08-31 13:48:02 +00:00
|
|
|
use serde::{export::fmt::Debug, Serialize};
|
2020-07-28 16:47:26 +00:00
|
|
|
use url::{ParseError, Url};
|
|
|
|
use uuid::Uuid;
|
2020-04-09 19:04:31 +00:00
|
|
|
|
2020-08-31 13:48:02 +00:00
|
|
|
pub async fn send_activity_to_community<T, Kind>(
|
2020-06-01 14:17:20 +00:00
|
|
|
creator: &User_,
|
|
|
|
community: &Community,
|
2020-08-11 14:31:05 +00:00
|
|
|
to: Vec<Url>,
|
2020-08-31 13:48:02 +00:00
|
|
|
activity: T,
|
2020-08-18 13:43:50 +00:00
|
|
|
context: &LemmyContext,
|
2020-08-31 13:48:02 +00:00
|
|
|
) -> Result<(), LemmyError>
|
|
|
|
where
|
|
|
|
T: AsObject<Kind> + Extends<Kind> + Serialize + Debug + Send + Clone + 'static,
|
|
|
|
Kind: Serialize,
|
|
|
|
<T as Extends<Kind>>::Error: From<serde_json::Error> + Send + Sync + 'static,
|
|
|
|
{
|
|
|
|
// TODO: looks like call this sometimes with activity, and sometimes with any_base
|
2020-08-18 13:43:50 +00:00
|
|
|
insert_activity(creator.id, activity.clone(), true, context.pool()).await?;
|
2020-06-01 14:17:20 +00:00
|
|
|
|
|
|
|
// if this is a local community, we need to do an announce from the community instead
|
|
|
|
if community.local {
|
2020-08-31 13:48:02 +00:00
|
|
|
do_announce(activity.into_any_base()?, &community, creator, context).await?;
|
2020-06-01 14:17:20 +00:00
|
|
|
} else {
|
2020-08-31 13:48:02 +00:00
|
|
|
send_activity(context.activity_queue(), activity, creator, to)?;
|
2020-04-09 19:04:31 +00:00
|
|
|
}
|
2020-07-01 12:54:29 +00:00
|
|
|
|
2020-04-09 19:04:31 +00:00
|
|
|
Ok(())
|
|
|
|
}
|
2020-07-28 16:47:26 +00:00
|
|
|
|
|
|
|
pub(in crate::apub) fn generate_activity_id<T>(kind: T) -> Result<Url, ParseError>
|
|
|
|
where
|
|
|
|
T: ToString,
|
|
|
|
{
|
|
|
|
let id = format!(
|
|
|
|
"{}://{}/activities/{}/{}",
|
|
|
|
get_apub_protocol_string(),
|
|
|
|
Settings::get().hostname,
|
|
|
|
kind.to_string().to_lowercase(),
|
|
|
|
Uuid::new_v4()
|
|
|
|
);
|
|
|
|
Url::parse(&id)
|
|
|
|
}
|