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 context::lemmy_context,
21 fetcher::object_id::ObjectId,
22 http::is_activity_already_known,
24 migrations::PublicUrlMigration,
25 objects::community::ApubCommunity,
29 use activitystreams::{
30 activity::kind::AnnounceType,
32 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 UndoRemovePostCommentOrCommunity(UndoRemovePostCommentOrCommunity),
55 UpdateCommunity(Box<UpdateCommunity>),
56 BlockUserFromCommunity(BlockUserFromCommunity),
57 UndoBlockUserFromCommunity(UndoBlockUserFromCommunity),
62 #[derive(Clone, Debug, Deserialize, Serialize, ActivityFields)]
63 #[serde(rename_all = "camelCase")]
64 pub struct AnnounceActivity {
65 actor: ObjectId<ApubCommunity>,
66 to: PublicUrlMigration,
67 object: AnnouncableActivities,
69 #[serde(rename = "type")]
72 #[serde(rename = "@context")]
73 context: OneOrMany<AnyBase>,
78 impl AnnounceActivity {
80 object: AnnouncableActivities,
81 community: &ApubCommunity,
82 additional_inboxes: Vec<Url>,
83 context: &LemmyContext,
84 ) -> Result<(), LemmyError> {
85 let announce = AnnounceActivity {
86 actor: ObjectId::new(community.actor_id()),
87 to: PublicUrlMigration::create(),
89 cc: vec![community.followers_url()],
90 kind: AnnounceType::Announce,
91 id: generate_activity_id(
92 &AnnounceType::Announce,
93 &context.settings().get_protocol_and_hostname(),
95 context: lemmy_context(),
96 unparsed: Default::default(),
98 let inboxes = list_community_follower_inboxes(community, additional_inboxes, context).await?;
99 send_lemmy_activity(context, &announce, &announce.id, community, inboxes, false).await
103 #[async_trait::async_trait(?Send)]
104 impl ActivityHandler for AnnounceActivity {
105 type DataType = LemmyContext;
108 context: &Data<LemmyContext>,
109 request_counter: &mut i32,
110 ) -> Result<(), LemmyError> {
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