2 activities::{generate_activity_id, send_lemmy_activity, verify_activity, verify_is_public},
3 activity_lists::AnnouncableActivities,
4 fetcher::object_id::ObjectId,
5 http::is_activity_already_known,
7 objects::community::ApubCommunity,
8 protocol::activities::community::announce::AnnounceActivity,
10 use activitystreams::{activity::kind::AnnounceType, public};
13 traits::{ActivityFields, 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_inner()],
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)?;
63 verify_activity(self, &context.settings())?;
64 self.object.verify(context, request_counter).await?;
70 context: &Data<LemmyContext>,
71 request_counter: &mut i32,
72 ) -> Result<(), LemmyError> {
73 if is_activity_already_known(context.pool(), self.object.id_unchecked()).await? {
77 self.object.id_unchecked(),
84 self.object.receive(context, request_counter).await