Fix activity forwarding and the stream

This commit is contained in:
Thomas Sileo 2018-07-21 21:05:35 +02:00
parent 3ba14d938f
commit 23faef985b

View file

@ -41,12 +41,18 @@ def process_new_activity(self, iri: str) -> None:
# Is the activity expected? # Is the activity expected?
# following = ap.get_backend().following() # following = ap.get_backend().following()
should_forward = False
tag_stream = False tag_stream = False
if activity.has_type(ap.ActivityType.ANNOUNCE): if activity.has_type(ap.ActivityType.ANNOUNCE):
tag_stream = True tag_stream = True
elif activity.has_type(ap.ActivityType.CREATE): elif activity.has_type(ap.ActivityType.CREATE):
note = activity.get_object() note = activity.get_object()
# Make the note part of the stream if it's not a reply, or if it's a local reply
if not note.inReplyTo or note.inReplyTo.startswith(ID):
tag_stream = True
if note.inReplyTo: if note.inReplyTo:
reply = ap.fetch_remote_activity(note.inReplyTo) reply = ap.fetch_remote_activity(note.inReplyTo)
if ( if (
@ -54,7 +60,7 @@ def process_new_activity(self, iri: str) -> None:
) and activity.is_public(): ) and activity.is_public():
# The reply is public "local reply", forward the reply (i.e. the original activity) to the original # The reply is public "local reply", forward the reply (i.e. the original activity) to the original
# recipients # recipients
activity.forward(back.followers_as_recipients()) should_forward = True
# (partial) Ghost replies handling # (partial) Ghost replies handling
# [X] This is the first time the server has seen this Activity. # [X] This is the first time the server has seen this Activity.
@ -65,18 +71,27 @@ def process_new_activity(self, iri: str) -> None:
if local_followers in activity._data[field]: if local_followers in activity._data[field]:
# [X] The values of to, cc, and/or audience contain a Collection owned by the server. # [X] The values of to, cc, and/or audience contain a Collection owned by the server.
should_forward = True should_forward = True
if not (note.inReplyTo and note.inReplyTo.startswith(ID)):
# [X] The values of inReplyTo, object, target and/or tag are objects owned by the server # [X] The values of inReplyTo, object, target and/or tag are objects owned by the server
if not (note.inReplyTo and note.inReplyTo.startswith(ID)):
should_forward = False should_forward = False
elif activity.has_type(ap.ActivityType.DELETE):
note = DB.activities.find_one(
{"activity.object.id": activity.get_object().id}
)
if note["meta"].get("forwarded", False):
# If the activity was originally forwarded, forward the delete too
should_forward = True
if should_forward: if should_forward:
log.info(f"will forward {activity!r} to followers")
activity.forward(back.followers_as_recipients()) activity.forward(back.followers_as_recipients())
else:
tag_stream = True
log.info(f"{iri} tag_stream={tag_stream}") log.info(f"{iri} tag_stream={tag_stream}")
DB.activities.update_one( DB.activities.update_one(
{"remote_id": activity.id}, {"$set": {"meta.stream": tag_stream}} {"remote_id": activity.id},
{"$set": {"meta.stream": tag_stream, "meta.forwarded": should_forward}},
) )
log.info(f"new activity {iri} processed") log.info(f"new activity {iri} processed")