2 activities::send::generate_activity_id,
3 activity_queue::send_activity_single_dest,
8 kind::{FollowType, UndoType},
12 base::{AnyBase, BaseExt, ExtendsExt},
15 use lemmy_db::{community::Community, user::User_, DbPool};
16 use lemmy_structs::blocking;
17 use lemmy_utils::LemmyError;
18 use lemmy_websocket::LemmyContext;
21 #[async_trait::async_trait(?Send)]
22 impl ActorType for User_ {
23 fn actor_id_str(&self) -> String {
24 self.actor_id.to_owned()
27 fn public_key(&self) -> Option<String> {
28 self.public_key.to_owned()
31 fn private_key(&self) -> Option<String> {
32 self.private_key.to_owned()
35 fn user_id(&self) -> i32 {
39 /// As a given local user, send out a follow request to a remote community.
42 follow_actor_id: &Url,
43 context: &LemmyContext,
44 ) -> Result<(), LemmyError> {
45 let follow_actor_id = follow_actor_id.to_string();
46 let community = blocking(context.pool(), move |conn| {
47 Community::read_from_actor_id(conn, &follow_actor_id)
51 let mut follow = Follow::new(self.actor_id.to_owned(), community.actor_id()?);
53 .set_context(activitystreams::context())
54 .set_id(generate_activity_id(FollowType::Follow)?)
55 .set_to(community.actor_id()?);
57 send_activity_single_dest(follow, self, community.get_inbox_url()?, context).await?;
61 async fn send_unfollow(
63 follow_actor_id: &Url,
64 context: &LemmyContext,
65 ) -> Result<(), LemmyError> {
66 let follow_actor_id = follow_actor_id.to_string();
67 let community = blocking(context.pool(), move |conn| {
68 Community::read_from_actor_id(conn, &follow_actor_id)
72 let mut follow = Follow::new(self.actor_id.to_owned(), community.actor_id()?);
74 .set_context(activitystreams::context())
75 .set_id(generate_activity_id(FollowType::Follow)?)
76 .set_to(community.actor_id()?);
78 // Undo that fake activity
79 let mut undo = Undo::new(Url::parse(&self.actor_id)?, follow.into_any_base()?);
81 .set_context(activitystreams::context())
82 .set_id(generate_activity_id(UndoType::Undo)?)
83 .set_to(community.actor_id()?);
85 send_activity_single_dest(undo, self, community.get_inbox_url()?, context).await?;
89 async fn send_accept_follow(
92 _context: &LemmyContext,
93 ) -> Result<(), LemmyError> {
97 async fn send_delete(&self, _context: &LemmyContext) -> Result<(), LemmyError> {
101 async fn send_undo_delete(&self, _context: &LemmyContext) -> Result<(), LemmyError> {
105 async fn send_remove(&self, _context: &LemmyContext) -> Result<(), LemmyError> {
109 async fn send_undo_remove(&self, _context: &LemmyContext) -> Result<(), LemmyError> {
113 async fn send_announce(
116 _context: &LemmyContext,
117 ) -> Result<(), LemmyError> {
121 async fn get_follower_inboxes(&self, _pool: &DbPool) -> Result<Vec<Url>, LemmyError> {