mirror of
https://github.com/LemmyNet/lemmy.git
synced 2024-11-16 09:24:00 +00:00
Activities in community should also be sent to actors in cc
This commit is contained in:
parent
dc416bf255
commit
c1f1b8aa0f
15 changed files with 44 additions and 47 deletions
|
@ -2,7 +2,7 @@ use crate::{
|
||||||
activities::{
|
activities::{
|
||||||
check_community_deleted_or_removed,
|
check_community_deleted_or_removed,
|
||||||
comment::{collect_non_local_mentions, get_notif_recipients},
|
comment::{collect_non_local_mentions, get_notif_recipients},
|
||||||
community::{announce::GetCommunity, send_to_community},
|
community::{announce::GetCommunity, send_activity_in_community},
|
||||||
generate_activity_id,
|
generate_activity_id,
|
||||||
verify_activity,
|
verify_activity,
|
||||||
verify_is_public,
|
verify_is_public,
|
||||||
|
@ -62,7 +62,7 @@ impl CreateOrUpdateComment {
|
||||||
};
|
};
|
||||||
|
|
||||||
let activity = AnnouncableActivities::CreateOrUpdateComment(create_or_update);
|
let activity = AnnouncableActivities::CreateOrUpdateComment(create_or_update);
|
||||||
send_to_community(activity, &id, actor, &community, maa.inboxes, context).await
|
send_activity_in_community(activity, &id, actor, &community, maa.inboxes, context).await
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -1,6 +1,10 @@
|
||||||
use crate::{
|
use crate::{
|
||||||
activities::{
|
activities::{
|
||||||
community::{announce::GetCommunity, get_community_from_moderators_url, send_to_community},
|
community::{
|
||||||
|
announce::GetCommunity,
|
||||||
|
get_community_from_moderators_url,
|
||||||
|
send_activity_in_community,
|
||||||
|
},
|
||||||
generate_activity_id,
|
generate_activity_id,
|
||||||
verify_activity,
|
verify_activity,
|
||||||
verify_add_remove_moderator_target,
|
verify_add_remove_moderator_target,
|
||||||
|
@ -51,7 +55,7 @@ impl AddMod {
|
||||||
|
|
||||||
let activity = AnnouncableActivities::AddMod(add);
|
let activity = AnnouncableActivities::AddMod(add);
|
||||||
let inboxes = vec![added_mod.shared_inbox_or_inbox_url()];
|
let inboxes = vec![added_mod.shared_inbox_or_inbox_url()];
|
||||||
send_to_community(activity, &id, actor, community, inboxes, context).await
|
send_activity_in_community(activity, &id, actor, community, inboxes, context).await
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -14,7 +14,6 @@ use lemmy_apub_lib::{
|
||||||
};
|
};
|
||||||
use lemmy_utils::LemmyError;
|
use lemmy_utils::LemmyError;
|
||||||
use lemmy_websocket::LemmyContext;
|
use lemmy_websocket::LemmyContext;
|
||||||
use url::Url;
|
|
||||||
|
|
||||||
#[async_trait::async_trait(?Send)]
|
#[async_trait::async_trait(?Send)]
|
||||||
pub(crate) trait GetCommunity {
|
pub(crate) trait GetCommunity {
|
||||||
|
@ -48,13 +47,10 @@ impl AnnounceActivity {
|
||||||
pub async fn send(
|
pub async fn send(
|
||||||
object: AnnouncableActivities,
|
object: AnnouncableActivities,
|
||||||
community: &ApubCommunity,
|
community: &ApubCommunity,
|
||||||
additional_inboxes: Vec<Url>,
|
|
||||||
context: &LemmyContext,
|
context: &LemmyContext,
|
||||||
) -> Result<(), LemmyError> {
|
) -> Result<(), LemmyError> {
|
||||||
let announce = AnnounceActivity::new(object.clone(), community, context)?;
|
let announce = AnnounceActivity::new(object.clone(), community, context)?;
|
||||||
let inboxes = community
|
let inboxes = community.get_follower_inboxes(context).await?;
|
||||||
.get_follower_inboxes(additional_inboxes.clone(), context)
|
|
||||||
.await?;
|
|
||||||
send_lemmy_activity(
|
send_lemmy_activity(
|
||||||
context,
|
context,
|
||||||
&announce,
|
&announce,
|
||||||
|
@ -65,9 +61,9 @@ impl AnnounceActivity {
|
||||||
)
|
)
|
||||||
.await?;
|
.await?;
|
||||||
|
|
||||||
// Pleroma (and likely Mastodon) can't handle activities like Announce/Create/Page, so for
|
// Pleroma (and likely Mastodon) can't handle activities like Announce/Create/Page. So for
|
||||||
// compatibility, we also send Announce/Page and Announce/Note (for new and updated
|
// compatibility to allow them to follow Lemmy communities, we also send Announce/Page and
|
||||||
// posts/comments).
|
// Announce/Note (for new and updated posts/comments).
|
||||||
use AnnouncableActivities::*;
|
use AnnouncableActivities::*;
|
||||||
let object = match object {
|
let object = match object {
|
||||||
CreateOrUpdatePost(c) => Page(c.object),
|
CreateOrUpdatePost(c) => Page(c.object),
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
use crate::{
|
use crate::{
|
||||||
activities::{
|
activities::{
|
||||||
community::{announce::GetCommunity, send_to_community},
|
community::{announce::GetCommunity, send_activity_in_community},
|
||||||
generate_activity_id,
|
generate_activity_id,
|
||||||
verify_activity,
|
verify_activity,
|
||||||
verify_is_public,
|
verify_is_public,
|
||||||
|
@ -63,7 +63,7 @@ impl BlockUserFromCommunity {
|
||||||
|
|
||||||
let activity = AnnouncableActivities::BlockUserFromCommunity(block);
|
let activity = AnnouncableActivities::BlockUserFromCommunity(block);
|
||||||
let inboxes = vec![target.shared_inbox_or_inbox_url()];
|
let inboxes = vec![target.shared_inbox_or_inbox_url()];
|
||||||
send_to_community(activity, &block_id, actor, community, inboxes, context).await
|
send_activity_in_community(activity, &block_id, actor, community, inboxes, context).await
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -18,23 +18,21 @@ pub mod report;
|
||||||
pub mod undo_block_user;
|
pub mod undo_block_user;
|
||||||
pub mod update;
|
pub mod update;
|
||||||
|
|
||||||
pub(crate) async fn send_to_community<T: ActorType>(
|
pub(crate) async fn send_activity_in_community<T: ActorType>(
|
||||||
activity: AnnouncableActivities,
|
activity: AnnouncableActivities,
|
||||||
activity_id: &Url,
|
activity_id: &Url,
|
||||||
actor: &T,
|
actor: &T,
|
||||||
community: &ApubCommunity,
|
community: &ApubCommunity,
|
||||||
additional_inboxes: Vec<Url>,
|
mut inboxes: Vec<Url>,
|
||||||
context: &LemmyContext,
|
context: &LemmyContext,
|
||||||
) -> Result<(), LemmyError> {
|
) -> Result<(), LemmyError> {
|
||||||
// if this is a local community, we need to do an announce from the community instead
|
|
||||||
let object_value = serde_json::to_value(&activity)?;
|
|
||||||
if community.local {
|
|
||||||
insert_activity(activity_id, object_value, true, false, context.pool()).await?;
|
|
||||||
AnnounceActivity::send(activity, community, additional_inboxes, context).await?;
|
|
||||||
} else {
|
|
||||||
let mut inboxes = additional_inboxes;
|
|
||||||
inboxes.push(community.shared_inbox_or_inbox_url());
|
inboxes.push(community.shared_inbox_or_inbox_url());
|
||||||
send_lemmy_activity(context, &activity, activity_id, actor, inboxes, false).await?;
|
send_lemmy_activity(context, &activity, activity_id, actor, inboxes, false).await?;
|
||||||
|
|
||||||
|
if community.local {
|
||||||
|
let object_value = serde_json::to_value(&activity)?;
|
||||||
|
insert_activity(activity_id, object_value, true, false, context.pool()).await?;
|
||||||
|
AnnounceActivity::send(activity, community, context).await?;
|
||||||
}
|
}
|
||||||
|
|
||||||
Ok(())
|
Ok(())
|
||||||
|
|
|
@ -1,6 +1,10 @@
|
||||||
use crate::{
|
use crate::{
|
||||||
activities::{
|
activities::{
|
||||||
community::{announce::GetCommunity, get_community_from_moderators_url, send_to_community},
|
community::{
|
||||||
|
announce::GetCommunity,
|
||||||
|
get_community_from_moderators_url,
|
||||||
|
send_activity_in_community,
|
||||||
|
},
|
||||||
generate_activity_id,
|
generate_activity_id,
|
||||||
verify_activity,
|
verify_activity,
|
||||||
verify_add_remove_moderator_target,
|
verify_add_remove_moderator_target,
|
||||||
|
@ -51,7 +55,7 @@ impl RemoveMod {
|
||||||
|
|
||||||
let activity = AnnouncableActivities::RemoveMod(remove);
|
let activity = AnnouncableActivities::RemoveMod(remove);
|
||||||
let inboxes = vec![removed_mod.shared_inbox_or_inbox_url()];
|
let inboxes = vec![removed_mod.shared_inbox_or_inbox_url()];
|
||||||
send_to_community(activity, &id, actor, community, inboxes, context).await
|
send_activity_in_community(activity, &id, actor, community, inboxes, context).await
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
use crate::{
|
use crate::{
|
||||||
activities::{
|
activities::{
|
||||||
community::{announce::GetCommunity, send_to_community},
|
community::{announce::GetCommunity, send_activity_in_community},
|
||||||
generate_activity_id,
|
generate_activity_id,
|
||||||
verify_activity,
|
verify_activity,
|
||||||
verify_is_public,
|
verify_is_public,
|
||||||
|
@ -53,7 +53,7 @@ impl UndoBlockUserFromCommunity {
|
||||||
|
|
||||||
let activity = AnnouncableActivities::UndoBlockUserFromCommunity(undo);
|
let activity = AnnouncableActivities::UndoBlockUserFromCommunity(undo);
|
||||||
let inboxes = vec![target.shared_inbox_or_inbox_url()];
|
let inboxes = vec![target.shared_inbox_or_inbox_url()];
|
||||||
send_to_community(activity, &id, actor, community, inboxes, context).await
|
send_activity_in_community(activity, &id, actor, community, inboxes, context).await
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
use crate::{
|
use crate::{
|
||||||
activities::{
|
activities::{
|
||||||
community::{announce::GetCommunity, send_to_community},
|
community::{announce::GetCommunity, send_activity_in_community},
|
||||||
generate_activity_id,
|
generate_activity_id,
|
||||||
verify_activity,
|
verify_activity,
|
||||||
verify_is_public,
|
verify_is_public,
|
||||||
|
@ -46,7 +46,7 @@ impl UpdateCommunity {
|
||||||
};
|
};
|
||||||
|
|
||||||
let activity = AnnouncableActivities::UpdateCommunity(update);
|
let activity = AnnouncableActivities::UpdateCommunity(update);
|
||||||
send_to_community(activity, &id, actor, &community, vec![], context).await
|
send_activity_in_community(activity, &id, actor, &community, vec![], context).await
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
use crate::{
|
use crate::{
|
||||||
activities::{
|
activities::{
|
||||||
community::{announce::GetCommunity, send_to_community},
|
community::{announce::GetCommunity, send_activity_in_community},
|
||||||
deletion::{receive_delete_action, verify_delete_activity, DeletableObjects},
|
deletion::{receive_delete_action, verify_delete_activity, DeletableObjects},
|
||||||
generate_activity_id,
|
generate_activity_id,
|
||||||
verify_activity,
|
verify_activity,
|
||||||
|
@ -118,7 +118,7 @@ impl Delete {
|
||||||
let delete_id = delete.id.clone();
|
let delete_id = delete.id.clone();
|
||||||
|
|
||||||
let activity = AnnouncableActivities::Delete(delete);
|
let activity = AnnouncableActivities::Delete(delete);
|
||||||
send_to_community(activity, &delete_id, actor, community, vec![], context).await
|
send_activity_in_community(activity, &delete_id, actor, community, vec![], context).await
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
use crate::{
|
use crate::{
|
||||||
activities::{
|
activities::{
|
||||||
community::{announce::GetCommunity, send_to_community},
|
community::{announce::GetCommunity, send_activity_in_community},
|
||||||
deletion::{receive_delete_action, verify_delete_activity, DeletableObjects},
|
deletion::{receive_delete_action, verify_delete_activity, DeletableObjects},
|
||||||
generate_activity_id,
|
generate_activity_id,
|
||||||
verify_activity,
|
verify_activity,
|
||||||
|
@ -96,7 +96,7 @@ impl UndoDelete {
|
||||||
};
|
};
|
||||||
|
|
||||||
let activity = AnnouncableActivities::UndoDelete(undo);
|
let activity = AnnouncableActivities::UndoDelete(undo);
|
||||||
send_to_community(activity, &id, actor, community, vec![], context).await
|
send_activity_in_community(activity, &id, actor, community, vec![], context).await
|
||||||
}
|
}
|
||||||
|
|
||||||
pub(in crate::activities) async fn receive_undo_remove_action(
|
pub(in crate::activities) async fn receive_undo_remove_action(
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
use crate::{
|
use crate::{
|
||||||
activities::{
|
activities::{
|
||||||
check_community_deleted_or_removed,
|
check_community_deleted_or_removed,
|
||||||
community::{announce::GetCommunity, send_to_community},
|
community::{announce::GetCommunity, send_activity_in_community},
|
||||||
generate_activity_id,
|
generate_activity_id,
|
||||||
verify_activity,
|
verify_activity,
|
||||||
verify_is_public,
|
verify_is_public,
|
||||||
|
@ -63,7 +63,7 @@ impl CreateOrUpdatePost {
|
||||||
let create_or_update = CreateOrUpdatePost::new(post, actor, &community, kind, context).await?;
|
let create_or_update = CreateOrUpdatePost::new(post, actor, &community, kind, context).await?;
|
||||||
let id = create_or_update.id.clone();
|
let id = create_or_update.id.clone();
|
||||||
let activity = AnnouncableActivities::CreateOrUpdatePost(create_or_update);
|
let activity = AnnouncableActivities::CreateOrUpdatePost(create_or_update);
|
||||||
send_to_community(activity, &id, actor, &community, vec![], context).await
|
send_activity_in_community(activity, &id, actor, &community, vec![], context).await
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
use crate::{
|
use crate::{
|
||||||
activities::{
|
activities::{
|
||||||
community::{announce::GetCommunity, send_to_community},
|
community::{announce::GetCommunity, send_activity_in_community},
|
||||||
generate_activity_id,
|
generate_activity_id,
|
||||||
verify_activity,
|
verify_activity,
|
||||||
verify_is_public,
|
verify_is_public,
|
||||||
|
@ -56,7 +56,7 @@ impl UndoVote {
|
||||||
unparsed: Default::default(),
|
unparsed: Default::default(),
|
||||||
};
|
};
|
||||||
let activity = AnnouncableActivities::UndoVote(undo_vote);
|
let activity = AnnouncableActivities::UndoVote(undo_vote);
|
||||||
send_to_community(activity, &id, actor, &community, vec![], context).await
|
send_activity_in_community(activity, &id, actor, &community, vec![], context).await
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
use crate::{
|
use crate::{
|
||||||
activities::{
|
activities::{
|
||||||
community::{announce::GetCommunity, send_to_community},
|
community::{announce::GetCommunity, send_activity_in_community},
|
||||||
generate_activity_id,
|
generate_activity_id,
|
||||||
verify_activity,
|
verify_activity,
|
||||||
verify_is_public,
|
verify_is_public,
|
||||||
|
@ -62,7 +62,7 @@ impl Vote {
|
||||||
let vote_id = vote.id.clone();
|
let vote_id = vote.id.clone();
|
||||||
|
|
||||||
let activity = AnnouncableActivities::Vote(vote);
|
let activity = AnnouncableActivities::Vote(vote);
|
||||||
send_to_community(activity, &vote_id, actor, &community, vec![], context).await
|
send_activity_in_community(activity, &vote_id, actor, &community, vec![], context).await
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -85,7 +85,7 @@ pub(in crate::http) async fn receive_group_inbox(
|
||||||
let community = announcable.get_community(context, &mut 0).await?;
|
let community = announcable.get_community(context, &mut 0).await?;
|
||||||
verify_person_in_community(&actor_id, &community, context, &mut 0).await?;
|
verify_person_in_community(&actor_id, &community, context, &mut 0).await?;
|
||||||
if community.local {
|
if community.local {
|
||||||
AnnounceActivity::send(*announcable, &community, vec![], context).await?;
|
AnnounceActivity::send(*announcable, &community, context).await?;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -192,7 +192,6 @@ impl ApubCommunity {
|
||||||
/// For a given community, returns the inboxes of all followers.
|
/// For a given community, returns the inboxes of all followers.
|
||||||
pub(crate) async fn get_follower_inboxes(
|
pub(crate) async fn get_follower_inboxes(
|
||||||
&self,
|
&self,
|
||||||
additional_inboxes: Vec<Url>,
|
|
||||||
context: &LemmyContext,
|
context: &LemmyContext,
|
||||||
) -> Result<Vec<Url>, LemmyError> {
|
) -> Result<Vec<Url>, LemmyError> {
|
||||||
let id = self.id;
|
let id = self.id;
|
||||||
|
@ -201,7 +200,7 @@ impl ApubCommunity {
|
||||||
CommunityFollowerView::for_community(conn, id)
|
CommunityFollowerView::for_community(conn, id)
|
||||||
})
|
})
|
||||||
.await??;
|
.await??;
|
||||||
let follower_inboxes: Vec<Url> = follows
|
let inboxes: Vec<Url> = follows
|
||||||
.into_iter()
|
.into_iter()
|
||||||
.filter(|f| !f.follower.local)
|
.filter(|f| !f.follower.local)
|
||||||
.map(|f| {
|
.map(|f| {
|
||||||
|
@ -210,12 +209,8 @@ impl ApubCommunity {
|
||||||
.unwrap_or(f.follower.inbox_url)
|
.unwrap_or(f.follower.inbox_url)
|
||||||
.into()
|
.into()
|
||||||
})
|
})
|
||||||
.collect();
|
|
||||||
let inboxes = vec![follower_inboxes, additional_inboxes]
|
|
||||||
.into_iter()
|
|
||||||
.flatten()
|
|
||||||
.unique()
|
.unique()
|
||||||
.filter(|inbox| inbox.host_str() != Some(&context.settings().hostname))
|
.filter(|inbox: &Url| inbox.host_str() != Some(&context.settings().hostname))
|
||||||
// Don't send to blocked instances
|
// Don't send to blocked instances
|
||||||
.filter(|inbox| check_is_apub_id_valid(inbox, false, &context.settings()).is_ok())
|
.filter(|inbox| check_is_apub_id_valid(inbox, false, &context.settings()).is_ok())
|
||||||
.collect();
|
.collect();
|
||||||
|
|
Loading…
Reference in a new issue