outgoing federation: improve inter-op with microblog apps for posts

This commit is contained in:
freamon 2025-01-17 22:23:08 +00:00
parent 33dcbd45b0
commit 6df39c02f3

View file

@ -23,6 +23,7 @@ import re
'content': 'content':
'mediaType': 'mediaType':
'source': {} 'source': {}
'inReplyTo': (only added for Mentions and user followers, as Note with inReplyTo: None)
'published': 'published':
'updated': (inner oject of Update only) 'updated': (inner oject of Update only)
'language': {} 'language': {}
@ -48,7 +49,6 @@ import re
'cc': [] 'cc': []
'@context': (outer object only) '@context': (outer object only)
'audience': (not in Announce) 'audience': (not in Announce)
'tag': [] (not in Announce)
} }
""" """
@ -118,7 +118,7 @@ def send_post(user_id, post_id, edit=False):
# local_only communities can also be used to send activity to User Followers # local_only communities can also be used to send activity to User Followers
# return now though, if there aren't any # return now though, if there aren't any
followers = UserFollower.query.filter_by(local_user_id=post.user_id).first() followers = UserFollower.query.filter_by(local_user_id=post.user_id).all()
if not followers and community.local_only: if not followers and community.local_only:
return return
@ -197,8 +197,7 @@ def send_post(user_id, post_id, edit=False):
'to': to, 'to': to,
'cc': cc, 'cc': cc,
'@context': default_context(), '@context': default_context(),
'audience': community.public_url(), 'audience': community.public_url()
'tag': tag
} }
domains_sent_to = [current_app.config['SERVER_NAME']] domains_sent_to = [current_app.config['SERVER_NAME']]
@ -247,15 +246,9 @@ def send_post(user_id, post_id, edit=False):
post_request(community.ap_inbox_url, create, user.private_key, user.public_url() + '#main-key') post_request(community.ap_inbox_url, create, user.private_key, user.public_url() + '#main-key')
domains_sent_to.append(community.instance.domain) domains_sent_to.append(community.instance.domain)
# send copy of the Create to anyone else Mentioned in post, but not on an instance that's already sent to. # amend copy of the Create, for anyone Mentioned in post body or who is following the user, to a format more likely to be understood
if '@context' not in create: if '@context' not in create:
create['@context'] = default_context() create['@context'] = default_context()
for recipient in recipients:
if recipient.instance.domain not in domains_sent_to:
post_request(recipient.instance.inbox, create, user.private_key, user.public_url() + '#main-key')
domains_sent_to.append(recipient.instance.domain)
# send amended copy of the Create to anyone who is following the User, but hasn't already received something
if 'name' in page: if 'name' in page:
del page['name'] del page['name']
note = page note = page
@ -263,13 +256,26 @@ def send_post(user_id, post_id, edit=False):
note['type'] = 'Note' note['type'] = 'Note'
if post.type == POST_TYPE_LINK or post.type == POST_TYPE_VIDEO: if post.type == POST_TYPE_LINK or post.type == POST_TYPE_VIDEO:
note['content'] = '<p><a href=' + post.url + '>' + post.title + '</a></p>' note['content'] = '<p><a href=' + post.url + '>' + post.title + '</a></p>'
else: elif post.type != POST_TYPE_POLL:
note['content'] = '<p>' + post.title + '</p>' note['content'] = '<p>' + post.title + '</p>'
if post.body_html: if post.body_html:
note['content'] = note['content'] + post.body_html note['content'] = note['content'] + post.body_html
note['inReplyTo'] = None note['inReplyTo'] = None
create['object'] = note create['object'] = note
if not community.local_only:
for recipient in recipients:
if recipient.instance.domain not in domains_sent_to:
post_request(recipient.instance.inbox, create, user.private_key, user.public_url() + '#main-key')
domains_sent_to.append(recipient.instance.domain)
if not followers:
return
# send the amended copy of the Create to anyone who is following the User, but hasn't already received something
for follower in followers:
user_details = User.query.get(follower.remote_user_id)
if user_details:
create['cc'].append(user_details.public_url())
instances = Instance.query.join(User, User.instance_id == Instance.id).join(UserFollower, UserFollower.remote_user_id == User.id) instances = Instance.query.join(User, User.instance_id == Instance.id).join(UserFollower, UserFollower.remote_user_id == User.id)
instances = instances.filter(UserFollower.local_user_id == post.user_id).filter(Instance.gone_forever == False) instances = instances.filter(UserFollower.local_user_id == post.user_id).filter(Instance.gone_forever == False)
for instance in instances: for instance in instances: