3 comment::create_or_update::CreateOrUpdateComment,
6 block_user::BlockUserFromCommunity,
7 list_community_follower_inboxes,
8 undo_block_user::UndoBlockUserFromCommunity,
10 deletion::{delete::Delete, undo_delete::UndoDelete},
12 post::create_or_update::CreateOrUpdatePost,
13 removal::{remove::RemoveMod, undo_remove::UndoRemovePostCommentOrCommunity},
16 voting::{undo_vote::UndoVote, vote::Vote},
18 activity_queue::send_activity_new,
19 extensions::context::lemmy_context,
20 http::is_activity_already_known,
25 use activitystreams::activity::kind::AnnounceType;
26 use lemmy_apub_lib::{values::PublicUrl, ActivityCommonFields, ActivityHandler};
27 use lemmy_db_schema::source::community::Community;
28 use lemmy_utils::LemmyError;
29 use lemmy_websocket::LemmyContext;
30 use serde::{Deserialize, Serialize};
33 #[derive(Clone, Debug, Deserialize, Serialize, ActivityHandler)]
35 pub enum AnnouncableActivities {
36 CreateOrUpdateComment(CreateOrUpdateComment),
37 CreateOrUpdatePost(Box<CreateOrUpdatePost>),
41 UndoDelete(UndoDelete),
42 UndoRemovePostCommentOrCommunity(UndoRemovePostCommentOrCommunity),
43 BlockUserFromCommunity(BlockUserFromCommunity),
44 UndoBlockUserFromCommunity(UndoBlockUserFromCommunity),
49 #[derive(Clone, Debug, serde::Deserialize, serde::Serialize)]
50 #[serde(rename_all = "camelCase")]
51 pub struct AnnounceActivity {
53 object: AnnouncableActivities,
55 #[serde(rename = "type")]
58 common: ActivityCommonFields,
61 impl AnnounceActivity {
63 object: AnnouncableActivities,
64 community: &Community,
65 additional_inboxes: Vec<Url>,
66 context: &LemmyContext,
67 ) -> Result<(), LemmyError> {
68 let announce = AnnounceActivity {
69 to: PublicUrl::Public,
71 cc: vec![community.followers_url()],
72 kind: AnnounceType::Announce,
73 common: ActivityCommonFields {
74 context: lemmy_context(),
75 id: generate_activity_id(&AnnounceType::Announce)?,
76 actor: community.actor_id(),
77 unparsed: Default::default(),
80 let inboxes = list_community_follower_inboxes(community, additional_inboxes, context).await?;
93 #[async_trait::async_trait(?Send)]
94 impl ActivityHandler for AnnounceActivity {
97 context: &LemmyContext,
98 request_counter: &mut i32,
99 ) -> Result<(), LemmyError> {
100 verify_activity(self.common())?;
101 verify_community(&self.common.actor, context, request_counter).await?;
102 self.object.verify(context, request_counter).await?;
108 context: &LemmyContext,
109 request_counter: &mut i32,
110 ) -> Result<(), LemmyError> {
111 if is_activity_already_known(context.pool(), self.object.common().id_unchecked()).await? {
115 self.object.common().id_unchecked(),
122 self.object.receive(context, request_counter).await
125 fn common(&self) -> &ActivityCommonFields {