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 http::is_activity_already_known,
27 use activitystreams::{
28 activity::kind::AnnounceType,
30 primitives::OneOrMany,
33 use lemmy_apub_lib::{values::PublicUrl, ActivityFields, ActivityHandler};
34 use lemmy_db_schema::source::community::Community;
35 use lemmy_utils::LemmyError;
36 use lemmy_websocket::LemmyContext;
37 use serde::{Deserialize, Serialize};
40 #[derive(Clone, Debug, Deserialize, Serialize, ActivityHandler, ActivityFields)]
42 pub enum AnnouncableActivities {
43 CreateOrUpdateComment(CreateOrUpdateComment),
44 CreateOrUpdatePost(Box<CreateOrUpdatePost>),
48 UndoDelete(UndoDelete),
49 UndoRemovePostCommentOrCommunity(UndoRemovePostCommentOrCommunity),
50 UpdateCommunity(Box<UpdateCommunity>),
51 BlockUserFromCommunity(BlockUserFromCommunity),
52 UndoBlockUserFromCommunity(UndoBlockUserFromCommunity),
57 #[derive(Clone, Debug, Deserialize, Serialize, ActivityFields)]
58 #[serde(rename_all = "camelCase")]
59 pub struct AnnounceActivity {
62 object: AnnouncableActivities,
64 #[serde(rename = "type")]
67 #[serde(rename = "@context")]
68 context: OneOrMany<AnyBase>,
73 impl AnnounceActivity {
75 object: AnnouncableActivities,
76 community: &Community,
77 additional_inboxes: Vec<Url>,
78 context: &LemmyContext,
79 ) -> Result<(), LemmyError> {
80 let announce = AnnounceActivity {
81 actor: community.actor_id(),
82 to: PublicUrl::Public,
84 cc: vec![community.followers_url()],
85 kind: AnnounceType::Announce,
86 id: generate_activity_id(&AnnounceType::Announce)?,
87 context: lemmy_context(),
88 unparsed: Default::default(),
90 let inboxes = list_community_follower_inboxes(community, additional_inboxes, context).await?;
91 send_activity_new(context, &announce, &announce.id, community, inboxes, false).await
95 #[async_trait::async_trait(?Send)]
96 impl ActivityHandler for AnnounceActivity {
99 context: &LemmyContext,
100 request_counter: &mut i32,
101 ) -> Result<(), LemmyError> {
102 verify_activity(self)?;
103 verify_community(&self.actor, context, request_counter).await?;
104 self.object.verify(context, request_counter).await?;
110 context: &LemmyContext,
111 request_counter: &mut i32,
112 ) -> Result<(), LemmyError> {
113 if is_activity_already_known(context.pool(), self.object.id_unchecked()).await? {
117 self.object.id_unchecked(),
124 self.object.receive(context, request_counter).await