3 comment::create_or_update::CreateOrUpdateComment,
6 block_user::BlockUserFromCommunity,
7 list_community_follower_inboxes,
8 undo_block_user::UndoBlockUserFromCommunity,
11 delete::DeletePostCommentOrCommunity,
12 undo_delete::UndoDeletePostCommentOrCommunity,
15 post::create_or_update::CreateOrUpdatePost,
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::{values::PublicUrl, ActivityCommonFields, ActivityHandler};
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 CreateOrUpdateComment(CreateOrUpdateComment),
48 CreateOrUpdatePost(Box<CreateOrUpdatePost>),
49 LikePostOrComment(LikePostOrComment),
50 DislikePostOrComment(DislikePostOrComment),
51 UndoLikePostOrComment(UndoLikePostOrComment),
52 UndoDislikePostOrComment(UndoDislikePostOrComment),
53 DeletePostCommentOrCommunity(DeletePostCommentOrCommunity),
54 UndoDeletePostCommentOrCommunity(UndoDeletePostCommentOrCommunity),
55 RemovePostCommentCommunityOrMod(RemovePostCommentCommunityOrMod),
56 UndoRemovePostCommentOrCommunity(UndoRemovePostCommentOrCommunity),
57 BlockUserFromCommunity(BlockUserFromCommunity),
58 UndoBlockUserFromCommunity(UndoBlockUserFromCommunity),
62 #[derive(Clone, Debug, serde::Deserialize, serde::Serialize)]
63 #[serde(rename_all = "camelCase")]
64 pub struct AnnounceActivity {
66 object: AnnouncableActivities,
68 #[serde(rename = "type")]
71 common: ActivityCommonFields,
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 to: PublicUrl::Public,
84 cc: vec![community.followers_url()],
85 kind: AnnounceType::Announce,
86 common: ActivityCommonFields {
87 context: lemmy_context(),
88 id: generate_activity_id(&AnnounceType::Announce)?,
89 actor: community.actor_id(),
90 unparsed: Default::default(),
93 let inboxes = list_community_follower_inboxes(community, additional_inboxes, context).await?;
106 #[async_trait::async_trait(?Send)]
107 impl ActivityHandler for AnnounceActivity {
110 context: &LemmyContext,
111 request_counter: &mut i32,
112 ) -> Result<(), LemmyError> {
113 verify_activity(self.common())?;
114 verify_community(&self.common.actor, context, request_counter).await?;
115 self.object.verify(context, request_counter).await?;
121 context: &LemmyContext,
122 request_counter: &mut i32,
123 ) -> Result<(), LemmyError> {
124 if is_activity_already_known(context.pool(), self.object.common().id_unchecked()).await? {
128 self.object.common().id_unchecked(),
135 self.object.receive(context, request_counter).await
138 fn common(&self) -> &ActivityCommonFields {