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,
18 voting::{undo_vote::UndoVote, vote::Vote},
20 context::lemmy_context,
21 fetcher::object_id::ObjectId,
22 http::is_activity_already_known,
24 objects::community::ApubCommunity,
28 use activitystreams::{
29 activity::kind::AnnounceType,
31 primitives::OneOrMany,
37 traits::{ActivityFields, ActivityHandler, ActorType},
39 use lemmy_utils::LemmyError;
40 use lemmy_websocket::LemmyContext;
41 use serde::{Deserialize, Serialize};
44 #[derive(Clone, Debug, Deserialize, Serialize, ActivityHandler, ActivityFields)]
46 #[activity_handler(LemmyContext)]
47 pub enum AnnouncableActivities {
48 CreateOrUpdateComment(CreateOrUpdateComment),
49 CreateOrUpdatePost(Box<CreateOrUpdatePost>),
53 UndoDelete(UndoDelete),
54 UpdateCommunity(Box<UpdateCommunity>),
55 BlockUserFromCommunity(BlockUserFromCommunity),
56 UndoBlockUserFromCommunity(UndoBlockUserFromCommunity),
61 #[derive(Clone, Debug, Deserialize, Serialize, ActivityFields)]
62 #[serde(rename_all = "camelCase")]
63 pub struct AnnounceActivity {
64 actor: ObjectId<ApubCommunity>,
66 object: AnnouncableActivities,
68 #[serde(rename = "type")]
71 #[serde(rename = "@context")]
72 context: OneOrMany<AnyBase>,
77 impl AnnounceActivity {
79 object: AnnouncableActivities,
80 community: &ApubCommunity,
81 additional_inboxes: Vec<Url>,
82 context: &LemmyContext,
83 ) -> Result<(), LemmyError> {
84 let announce = AnnounceActivity {
85 actor: ObjectId::new(community.actor_id()),
88 cc: vec![community.followers_url()],
89 kind: AnnounceType::Announce,
90 id: generate_activity_id(
91 &AnnounceType::Announce,
92 &context.settings().get_protocol_and_hostname(),
94 context: lemmy_context(),
95 unparsed: Default::default(),
97 let inboxes = list_community_follower_inboxes(community, additional_inboxes, context).await?;
98 send_lemmy_activity(context, &announce, &announce.id, community, inboxes, false).await
102 #[async_trait::async_trait(?Send)]
103 impl ActivityHandler for AnnounceActivity {
104 type DataType = LemmyContext;
107 context: &Data<LemmyContext>,
108 request_counter: &mut i32,
109 ) -> Result<(), LemmyError> {
110 verify_is_public(&self.to)?;
111 verify_activity(self, &context.settings())?;
112 verify_community(&self.actor, context, request_counter).await?;
113 self.object.verify(context, request_counter).await?;
119 context: &Data<LemmyContext>,
120 request_counter: &mut i32,
121 ) -> Result<(), LemmyError> {
122 if is_activity_already_known(context.pool(), self.object.id_unchecked()).await? {
126 self.object.id_unchecked(),
133 self.object.receive(context, request_counter).await