3 comment::create_or_update::CreateOrUpdateComment,
6 block_user::BlockUserFromCommunity,
7 list_community_follower_inboxes,
9 undo_block_user::UndoBlockUserFromCommunity,
10 update::UpdateCommunity,
12 deletion::{delete::Delete, undo_delete::UndoDelete},
14 post::create_or_update::CreateOrUpdatePost,
17 voting::{undo_vote::UndoVote, vote::Vote},
19 context::lemmy_context,
20 fetcher::object_id::ObjectId,
21 http::is_activity_already_known,
23 objects::community::ApubCommunity,
26 use activitystreams::{
27 activity::kind::AnnounceType,
29 primitives::OneOrMany,
35 traits::{ActivityFields, ActivityHandler, ActorType},
36 verify::verify_urls_match,
38 use lemmy_utils::LemmyError;
39 use lemmy_websocket::LemmyContext;
40 use serde::{Deserialize, Serialize};
43 #[derive(Clone, Debug, Deserialize, Serialize, ActivityHandler, ActivityFields)]
45 #[activity_handler(LemmyContext)]
46 pub enum AnnouncableActivities {
47 CreateOrUpdateComment(CreateOrUpdateComment),
48 CreateOrUpdatePost(Box<CreateOrUpdatePost>),
52 UndoDelete(UndoDelete),
53 UpdateCommunity(Box<UpdateCommunity>),
54 BlockUserFromCommunity(BlockUserFromCommunity),
55 UndoBlockUserFromCommunity(UndoBlockUserFromCommunity),
60 #[async_trait::async_trait(?Send)]
61 pub(crate) trait GetCommunity {
62 async fn get_community(
64 context: &LemmyContext,
65 request_counter: &mut i32,
66 ) -> Result<ApubCommunity, LemmyError>;
69 #[async_trait::async_trait(?Send)]
70 impl GetCommunity for AnnouncableActivities {
71 async fn get_community(
73 context: &LemmyContext,
74 request_counter: &mut i32,
75 ) -> Result<ApubCommunity, LemmyError> {
76 use AnnouncableActivities::*;
77 let community = match self {
78 CreateOrUpdateComment(a) => a.get_community(context, request_counter).await?,
79 CreateOrUpdatePost(a) => a.get_community(context, request_counter).await?,
80 Vote(a) => a.get_community(context, request_counter).await?,
81 UndoVote(a) => a.get_community(context, request_counter).await?,
82 Delete(a) => a.get_community(context, request_counter).await?,
83 UndoDelete(a) => a.get_community(context, request_counter).await?,
84 UpdateCommunity(a) => a.get_community(context, request_counter).await?,
85 BlockUserFromCommunity(a) => a.get_community(context, request_counter).await?,
86 UndoBlockUserFromCommunity(a) => a.get_community(context, request_counter).await?,
87 AddMod(a) => a.get_community(context, request_counter).await?,
88 RemoveMod(a) => a.get_community(context, request_counter).await?,
90 verify_urls_match(self.actor(), &community.actor_id())?;
95 #[derive(Clone, Debug, Deserialize, Serialize, ActivityFields)]
96 #[serde(rename_all = "camelCase")]
97 pub struct AnnounceActivity {
98 actor: ObjectId<ApubCommunity>,
100 object: AnnouncableActivities,
102 #[serde(rename = "type")]
105 #[serde(rename = "@context")]
106 context: OneOrMany<AnyBase>,
111 impl AnnounceActivity {
113 object: AnnouncableActivities,
114 community: &ApubCommunity,
115 additional_inboxes: Vec<Url>,
116 context: &LemmyContext,
117 ) -> Result<(), LemmyError> {
118 let announce = AnnounceActivity {
119 actor: ObjectId::new(community.actor_id()),
122 cc: vec![community.followers_url.clone().into_inner()],
123 kind: AnnounceType::Announce,
124 id: generate_activity_id(
125 &AnnounceType::Announce,
126 &context.settings().get_protocol_and_hostname(),
128 context: lemmy_context(),
129 unparsed: Default::default(),
131 let inboxes = list_community_follower_inboxes(community, additional_inboxes, context).await?;
132 send_lemmy_activity(context, &announce, &announce.id, community, inboxes, false).await
136 #[async_trait::async_trait(?Send)]
137 impl ActivityHandler for AnnounceActivity {
138 type DataType = LemmyContext;
141 context: &Data<LemmyContext>,
142 request_counter: &mut i32,
143 ) -> Result<(), LemmyError> {
144 verify_is_public(&self.to)?;
145 verify_activity(self, &context.settings())?;
146 self.object.verify(context, request_counter).await?;
152 context: &Data<LemmyContext>,
153 request_counter: &mut i32,
154 ) -> Result<(), LemmyError> {
155 if is_activity_already_known(context.pool(), self.object.id_unchecked()).await? {
159 self.object.id_unchecked(),
166 self.object.receive(context, request_counter).await