Improve retry handling

This commit is contained in:
Thomas Sileo 2019-04-16 22:54:08 +02:00
parent a25a8fb1e1
commit 16e0775717
2 changed files with 15 additions and 13 deletions

View file

@ -367,14 +367,14 @@ class MicroblogPubBackend(Backend):
) )
logger.info(f"inbox_delete handle_replies obj={obj!r}") logger.info(f"inbox_delete handle_replies obj={obj!r}")
in_reply_to = obj.inReplyTo in_reply_to = obj.get_in_reply_to()
if delete.get_object().ACTIVITY_TYPE != ap.ActivityType.NOTE: if delete.get_object().ACTIVITY_TYPE != ap.ActivityType.NOTE:
in_reply_to = DB.activities.find_one( in_reply_to = ap._get_id(DB.activities.find_one(
{ {
"activity.object.id": delete.get_object().id, "activity.object.id": delete.get_object().id,
"type": ap.ActivityType.CREATE.value, "type": ap.ActivityType.CREATE.value,
} }
)["activity"]["object"].get("inReplyTo") )["activity"]["object"].get("inReplyTo"))
# Fake a Undo so any related Like/Announce doesn't appear on the web UI # Fake a Undo so any related Like/Announce doesn't appear on the web UI
DB.activities.update( DB.activities.update(
@ -406,7 +406,7 @@ class MicroblogPubBackend(Backend):
{"$set": {"meta.undo": True, "meta.exta": "object deleted"}}, {"$set": {"meta.undo": True, "meta.exta": "object deleted"}},
) )
self._handle_replies_delete(as_actor, obj.inReplyTo) self._handle_replies_delete(as_actor, obj.get_in_reply_to())
@ensure_it_is_me @ensure_it_is_me
def inbox_update(self, as_actor: ap.Person, update: ap.Update) -> None: def inbox_update(self, as_actor: ap.Person, update: ap.Update) -> None:
@ -524,7 +524,7 @@ class MicroblogPubBackend(Backend):
def _handle_replies(self, as_actor: ap.Person, create: ap.Create) -> None: def _handle_replies(self, as_actor: ap.Person, create: ap.Create) -> None:
"""Go up to the root reply, store unknown replies in the `threads` DB and set the "meta.thread_root_parent" """Go up to the root reply, store unknown replies in the `threads` DB and set the "meta.thread_root_parent"
key to make it easy to query a whole thread.""" key to make it easy to query a whole thread."""
in_reply_to = create.get_object().inReplyTo in_reply_to = create.get_object().get_in_reply_to()
if not in_reply_to: if not in_reply_to:
return return
@ -563,7 +563,7 @@ class MicroblogPubBackend(Backend):
# TODO(tsileo): parses the replies collection and import the replies? # TODO(tsileo): parses the replies collection and import the replies?
while reply is not None: while reply is not None:
in_reply_to = reply.inReplyTo in_reply_to = reply.get_in_reply_to()
if not in_reply_to: if not in_reply_to:
break break
root_reply = in_reply_to root_reply = in_reply_to

16
app.py
View file

@ -901,7 +901,7 @@ def _build_thread(data, include_children=True): # noqa: C901
rep_id = rep["activity"]["object"]["id"] rep_id = rep["activity"]["object"]["id"]
if rep_id == root_id: if rep_id == root_id:
continue continue
reply_of = rep["activity"]["object"]["inReplyTo"] reply_of = ap._get_id(rep["activity"]["object"]["inReplyTo"])
try: try:
idx[reply_of]["_nodes"].append(rep) idx[reply_of]["_nodes"].append(rep)
except KeyError: except KeyError:
@ -2544,7 +2544,8 @@ def invalidate_cache(activity):
DB.cache2.remove() DB.cache2.remove()
elif activity.has_type(ap.ActivityType.CREATE): elif activity.has_type(ap.ActivityType.CREATE):
note = activity.get_object() note = activity.get_object()
if not note.inReplyTo or note.inReplyTo.startswith(ID): in_reply_to = note.get_in_reply_to()
if not in_reply_to or in_reply_to.startswith(ID):
DB.cache2.remove() DB.cache2.remove()
# FIXME(tsileo): check if it's a reply of a reply # FIXME(tsileo): check if it's a reply of a reply
@ -2696,19 +2697,20 @@ def task_process_new_activity():
elif activity.has_type(ap.ActivityType.CREATE): elif activity.has_type(ap.ActivityType.CREATE):
note = activity.get_object() note = activity.get_object()
in_reply_to = note.get_in_reply_to()
# Make the note part of the stream if it's not a reply, or if it's a local reply # 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): if not in_reply_to or in_reply_to.startswith(ID):
tag_stream = True tag_stream = True
# FIXME(tsileo): check for direct addressing in the to, cc, bcc... fields # FIXME(tsileo): check for direct addressing in the to, cc, bcc... fields
if (note.inReplyTo and note.inReplyTo.startswith(ID)) or note.has_mention( if (in_reply_to and in_reply_to.startswith(ID)) or note.has_mention(
ID ID
): ):
should_keep = True should_keep = True
if note.inReplyTo: if in_reply_to:
try: try:
reply = ap.fetch_remote_activity(note.inReplyTo) reply = ap.fetch_remote_activity(note.get_in_reply_to())
if ( if (
reply.id.startswith(ID) or reply.has_mention(ID) reply.id.startswith(ID) or reply.has_mention(ID)
) and activity.is_public(): ) and activity.is_public():
@ -2731,7 +2733,7 @@ def task_process_new_activity():
should_forward = True should_forward = True
# [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)): if not (in_reply_to and in_reply_to.startswith(ID)):
should_forward = False should_forward = False
elif activity.has_type(ap.ActivityType.DELETE): elif activity.has_type(ap.ActivityType.DELETE):