3 community::list_community_follower_inboxes,
9 activity_lists::AnnouncableActivities,
10 fetcher::object_id::ObjectId,
11 http::is_activity_already_known,
13 objects::community::ApubCommunity,
14 protocol::activities::community::announce::AnnounceActivity,
16 use activitystreams::{activity::kind::AnnounceType, public};
19 traits::{ActivityFields, ActivityHandler, ActorType},
21 use lemmy_utils::LemmyError;
22 use lemmy_websocket::LemmyContext;
25 #[async_trait::async_trait(?Send)]
26 pub(crate) trait GetCommunity {
27 async fn get_community(
29 context: &LemmyContext,
30 request_counter: &mut i32,
31 ) -> Result<ApubCommunity, LemmyError>;
34 impl AnnounceActivity {
36 object: AnnouncableActivities,
37 community: &ApubCommunity,
38 additional_inboxes: Vec<Url>,
39 context: &LemmyContext,
40 ) -> Result<(), LemmyError> {
41 let announce = AnnounceActivity {
42 actor: ObjectId::new(community.actor_id()),
45 cc: vec![community.followers_url.clone().into_inner()],
46 kind: AnnounceType::Announce,
47 id: generate_activity_id(
48 &AnnounceType::Announce,
49 &context.settings().get_protocol_and_hostname(),
51 unparsed: Default::default(),
53 let inboxes = list_community_follower_inboxes(community, additional_inboxes, context).await?;
54 send_lemmy_activity(context, &announce, &announce.id, community, inboxes, false).await
58 #[async_trait::async_trait(?Send)]
59 impl ActivityHandler for AnnounceActivity {
60 type DataType = LemmyContext;
63 context: &Data<LemmyContext>,
64 request_counter: &mut i32,
65 ) -> Result<(), LemmyError> {
66 verify_is_public(&self.to)?;
67 verify_activity(self, &context.settings())?;
68 self.object.verify(context, request_counter).await?;
74 context: &Data<LemmyContext>,
75 request_counter: &mut i32,
76 ) -> Result<(), LemmyError> {
77 if is_activity_already_known(context.pool(), self.object.id_unchecked()).await? {
81 self.object.id_unchecked(),
88 self.object.receive(context, request_counter).await