2 activities::{generate_activity_id, send_lemmy_activity, verify_activity, verify_is_public},
3 activity_lists::AnnouncableActivities,
4 http::{is_activity_already_known, ActivityCommonFields},
6 objects::community::ApubCommunity,
7 protocol::activities::community::announce::AnnounceActivity,
9 use activitystreams::{activity::kind::AnnounceType, public};
13 traits::{ActivityHandler, ActorType},
15 use lemmy_utils::LemmyError;
16 use lemmy_websocket::LemmyContext;
19 #[async_trait::async_trait(?Send)]
20 pub(crate) trait GetCommunity {
21 async fn get_community(
23 context: &LemmyContext,
24 request_counter: &mut i32,
25 ) -> Result<ApubCommunity, LemmyError>;
28 impl AnnounceActivity {
30 object: AnnouncableActivities,
31 community: &ApubCommunity,
32 additional_inboxes: Vec<Url>,
33 context: &LemmyContext,
34 ) -> Result<(), LemmyError> {
35 let announce = AnnounceActivity {
36 actor: ObjectId::new(community.actor_id()),
39 cc: vec![community.followers_url.clone().into()],
40 kind: AnnounceType::Announce,
41 id: generate_activity_id(
42 &AnnounceType::Announce,
43 &context.settings().get_protocol_and_hostname(),
45 unparsed: Default::default(),
47 let inboxes = community
48 .get_follower_inboxes(additional_inboxes, context)
50 send_lemmy_activity(context, &announce, &announce.id, community, inboxes, false).await
54 #[async_trait::async_trait(?Send)]
55 impl ActivityHandler for AnnounceActivity {
56 type DataType = LemmyContext;
59 context: &Data<LemmyContext>,
60 request_counter: &mut i32,
61 ) -> Result<(), LemmyError> {
62 verify_is_public(&self.to, &self.cc)?;
63 verify_activity(&self.id, self.actor.inner(), &context.settings())?;
64 self.object.verify(context, request_counter).await?;
70 context: &Data<LemmyContext>,
71 request_counter: &mut i32,
72 ) -> Result<(), LemmyError> {
73 // TODO: this is pretty ugly, but i cant think of a much better way
74 let object = serde_json::to_string(&self.object)?;
75 let object_data: ActivityCommonFields = serde_json::from_str(&object)?;
77 if is_activity_already_known(context.pool(), &object_data.id).await? {
88 self.object.receive(context, request_counter).await