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,
15 undo_remove::UndoRemovePostCommentOrCommunity,
18 voting::{undo_vote::UndoVote, vote::Vote},
20 activity_queue::send_activity_new,
21 extensions::context::lemmy_context,
22 fetcher::object_id::ObjectId,
23 http::is_activity_already_known,
28 use activitystreams::{
29 activity::kind::AnnounceType,
31 primitives::OneOrMany,
34 use lemmy_apub_lib::{values::PublicUrl, ActivityFields, ActivityHandler};
35 use lemmy_db_schema::source::community::Community;
36 use lemmy_utils::LemmyError;
37 use lemmy_websocket::LemmyContext;
38 use serde::{Deserialize, Serialize};
41 #[derive(Clone, Debug, Deserialize, Serialize, ActivityHandler, ActivityFields)]
43 pub enum AnnouncableActivities {
44 CreateOrUpdateComment(CreateOrUpdateComment),
45 CreateOrUpdatePost(Box<CreateOrUpdatePost>),
49 UndoDelete(UndoDelete),
50 UndoRemovePostCommentOrCommunity(UndoRemovePostCommentOrCommunity),
51 UpdateCommunity(Box<UpdateCommunity>),
52 BlockUserFromCommunity(BlockUserFromCommunity),
53 UndoBlockUserFromCommunity(UndoBlockUserFromCommunity),
58 #[derive(Clone, Debug, Deserialize, Serialize, ActivityFields)]
59 #[serde(rename_all = "camelCase")]
60 pub struct AnnounceActivity {
61 actor: ObjectId<Community>,
63 object: AnnouncableActivities,
65 #[serde(rename = "type")]
68 #[serde(rename = "@context")]
69 context: OneOrMany<AnyBase>,
74 impl AnnounceActivity {
76 object: AnnouncableActivities,
77 community: &Community,
78 additional_inboxes: Vec<Url>,
79 context: &LemmyContext,
80 ) -> Result<(), LemmyError> {
81 let announce = AnnounceActivity {
82 actor: ObjectId::new(community.actor_id()),
83 to: [PublicUrl::Public],
85 cc: vec![community.followers_url()],
86 kind: AnnounceType::Announce,
87 id: generate_activity_id(&AnnounceType::Announce)?,
88 context: lemmy_context(),
89 unparsed: Default::default(),
91 let inboxes = list_community_follower_inboxes(community, additional_inboxes, context).await?;
92 send_activity_new(context, &announce, &announce.id, community, inboxes, false).await
96 #[async_trait::async_trait(?Send)]
97 impl ActivityHandler for AnnounceActivity {
100 context: &LemmyContext,
101 request_counter: &mut i32,
102 ) -> Result<(), LemmyError> {
103 verify_activity(self)?;
104 verify_community(&self.actor, context, request_counter).await?;
105 self.object.verify(context, request_counter).await?;
111 context: &LemmyContext,
112 request_counter: &mut i32,
113 ) -> Result<(), LemmyError> {
114 if is_activity_already_known(context.pool(), self.object.id_unchecked()).await? {
118 self.object.id_unchecked(),
125 self.object.receive(context, request_counter).await