3 comment::{create::CreateComment, update::UpdateComment},
6 block_user::BlockUserFromCommunity,
7 list_community_follower_inboxes,
8 undo_block_user::UndoBlockUserFromCommunity,
11 delete::DeletePostCommentOrCommunity,
12 undo_delete::UndoDeletePostCommentOrCommunity,
15 post::{create::CreatePost, update::UpdatePost},
17 remove::RemovePostCommentCommunityOrMod,
18 undo_remove::UndoRemovePostCommentOrCommunity,
23 dislike::DislikePostOrComment,
24 like::LikePostOrComment,
25 undo_dislike::UndoDislikePostOrComment,
26 undo_like::UndoLikePostOrComment,
29 activity_queue::send_activity_new,
30 extensions::context::lemmy_context,
31 http::is_activity_already_known,
36 use activitystreams::activity::kind::AnnounceType;
37 use lemmy_apub_lib::{ActivityCommonFields, ActivityHandler, PublicUrl};
38 use lemmy_db_schema::source::community::Community;
39 use lemmy_utils::LemmyError;
40 use lemmy_websocket::LemmyContext;
41 use serde::{Deserialize, Serialize};
44 #[derive(Clone, Debug, Deserialize, Serialize, ActivityHandler)]
46 pub enum AnnouncableActivities {
47 CreateComment(CreateComment),
48 UpdateComment(UpdateComment),
49 CreatePost(CreatePost),
50 UpdatePost(UpdatePost),
51 LikePostOrComment(LikePostOrComment),
52 DislikePostOrComment(DislikePostOrComment),
53 UndoLikePostOrComment(UndoLikePostOrComment),
54 UndoDislikePostOrComment(UndoDislikePostOrComment),
55 DeletePostCommentOrCommunity(DeletePostCommentOrCommunity),
56 UndoDeletePostCommentOrCommunity(UndoDeletePostCommentOrCommunity),
57 RemovePostCommentCommunityOrMod(RemovePostCommentCommunityOrMod),
58 UndoRemovePostCommentOrCommunity(UndoRemovePostCommentOrCommunity),
59 BlockUserFromCommunity(BlockUserFromCommunity),
60 UndoBlockUserFromCommunity(UndoBlockUserFromCommunity),
64 #[derive(Clone, Debug, serde::Deserialize, serde::Serialize)]
65 #[serde(rename_all = "camelCase")]
66 pub struct AnnounceActivity {
68 object: AnnouncableActivities,
70 #[serde(rename = "type")]
73 common: ActivityCommonFields,
76 impl AnnounceActivity {
78 object: AnnouncableActivities,
79 community: &Community,
80 additional_inboxes: Vec<Url>,
81 context: &LemmyContext,
82 ) -> Result<(), LemmyError> {
83 let announce = AnnounceActivity {
84 to: PublicUrl::Public,
86 cc: vec![community.followers_url()],
87 kind: AnnounceType::Announce,
88 common: ActivityCommonFields {
89 context: lemmy_context()?.into(),
90 id: generate_activity_id(AnnounceType::Announce)?,
91 actor: community.actor_id(),
92 unparsed: Default::default(),
95 let inboxes = list_community_follower_inboxes(community, additional_inboxes, context).await?;
108 #[async_trait::async_trait(?Send)]
109 impl ActivityHandler for AnnounceActivity {
112 context: &LemmyContext,
113 request_counter: &mut i32,
114 ) -> Result<(), LemmyError> {
115 verify_activity(self.common())?;
116 verify_community(&self.common.actor, context, request_counter).await?;
117 self.object.verify(context, request_counter).await?;
123 context: &LemmyContext,
124 request_counter: &mut i32,
125 ) -> Result<(), LemmyError> {
126 if is_activity_already_known(context.pool(), self.object.common().id_unchecked()).await? {
130 self.object.common().id_unchecked(),
137 self.object.receive(context, request_counter).await
140 fn common(&self) -> &ActivityCommonFields {