Fix lookup for remote activities

This commit is contained in:
Thomas Sileo 2019-10-16 00:01:38 +02:00
parent 83b683ecf2
commit 2836959d92
5 changed files with 38 additions and 41 deletions

View file

@ -24,6 +24,7 @@ from config import DB
from config import ID from config import ID
from config import PASS from config import PASS
from core.activitypub import Box from core.activitypub import Box
from core.activitypub import _meta
from core.activitypub import post_to_outbox from core.activitypub import post_to_outbox
from core.db import find_one_activity from core.db import find_one_activity
from core.meta import by_object_id from core.meta import by_object_id
@ -193,14 +194,8 @@ def admin_lookup() -> _Response:
if request.args.get("url"): if request.args.get("url"):
data = lookup(request.args.get("url")) # type: ignore data = lookup(request.args.get("url")) # type: ignore
if data: if data:
if data.has_type(ap.ActivityType.ANNOUNCE): meta = _meta(data)
meta = dict( if data.has_type(ap.ActivityType.QUESTION):
object=data.get_object().to_dict(),
object_actor=data.get_object().get_actor().to_dict(),
actor=data.get_actor().to_dict(),
)
elif data.has_type(ap.ActivityType.QUESTION):
p.push(data.id, "/task/fetch_remote_question") p.push(data.id, "/task/fetch_remote_question")
print(data) print(data)
@ -302,12 +297,10 @@ def admin_new() -> _Response:
if data: if data:
reply = ap.parse_activity(data["activity"]) reply = ap.parse_activity(data["activity"])
else: else:
data = dict( obj = ap.get_backend().fetch_iri(request.args.get("reply"))
meta={}, data = dict(meta=_meta(ap.parse_activity(obj)), activity=dict(object=obj))
activity=dict( data["_id"] = obj["id"]
object=ap.get_backend().fetch_iri(request.args.get("reply")) data["remote_id"] = obj["id"]
),
)
reply = ap.parse_activity(data["activity"]["object"]) reply = ap.parse_activity(data["activity"]["object"])
# Fetch the post visibility, in case it's follower only # Fetch the post visibility, in case it's follower only
default_visibility = ap.get_visibility(reply) default_visibility = ap.get_visibility(reply)

View file

@ -113,8 +113,7 @@ def _is_local_reply(create: ap.Create) -> bool:
return False return False
def save(box: Box, activity: ap.BaseActivity) -> None: def _meta(activity: ap.BaseActivity) -> _NewMeta:
"""Custom helper for saving an activity to the DB."""
visibility = ap.get_visibility(activity) visibility = ap.get_visibility(activity)
is_public = False is_public = False
if visibility in [ap.Visibility.PUBLIC, ap.Visibility.UNLISTED]: if visibility in [ap.Visibility.PUBLIC, ap.Visibility.UNLISTED]:
@ -134,29 +133,7 @@ def save(box: Box, activity: ap.BaseActivity) -> None:
actor_id = activity.get_actor().id actor_id = activity.get_actor().id
# Set some "type"-related neta return {
extra: Dict[str, Any] = {}
if box == Box.OUTBOX and activity.has_type(ap.ActivityType.FOLLOW):
extra[MetaKey.FOLLOW_STATUS.value] = FollowStatus.WAITING.value
elif activity.has_type(ap.ActivityType.CREATE):
mentions = []
obj = activity.get_object()
for m in obj.get_mentions():
mentions.append(m.href)
hashtags = []
for h in obj.get_hashtags():
hashtags.append(h.name[1:]) # Strip the #
extra.update(
{MetaKey.MENTIONS.value: mentions, MetaKey.HASHTAGS.value: hashtags}
)
DB.activities.insert_one(
{
"box": box.value,
"activity": activity.to_dict(),
"type": _to_list(activity.type),
"remote_id": activity.id,
"meta": {
MetaKey.UNDO.value: False, MetaKey.UNDO.value: False,
MetaKey.DELETED.value: False, MetaKey.DELETED.value: False,
MetaKey.PUBLIC.value: is_public, MetaKey.PUBLIC.value: is_public,
@ -166,11 +143,35 @@ def save(box: Box, activity: ap.BaseActivity) -> None:
MetaKey.OBJECT_ID.value: object_id, MetaKey.OBJECT_ID.value: object_id,
MetaKey.OBJECT_VISIBILITY.value: object_visibility, MetaKey.OBJECT_VISIBILITY.value: object_visibility,
MetaKey.POLL_ANSWER.value: False, MetaKey.POLL_ANSWER.value: False,
MetaKey.PUBLISHED.value: activity.published MetaKey.PUBLISHED.value: activity.published if activity.published else now(),
if activity.published }
else now(),
**extra,
}, def save(box: Box, activity: ap.BaseActivity) -> None:
"""Custom helper for saving an activity to the DB."""
# Set some "type"-related neta
meta = _meta(activity)
if box == Box.OUTBOX and activity.has_type(ap.ActivityType.FOLLOW):
meta[MetaKey.FOLLOW_STATUS.value] = FollowStatus.WAITING.value
elif activity.has_type(ap.ActivityType.CREATE):
mentions = []
obj = activity.get_object()
for m in obj.get_mentions():
mentions.append(m.href)
hashtags = []
for h in obj.get_hashtags():
hashtags.append(h.name[1:]) # Strip the #
meta.update(
{MetaKey.MENTIONS.value: mentions, MetaKey.HASHTAGS.value: hashtags}
)
DB.activities.insert_one(
{
"box": box.value,
"activity": activity.to_dict(),
"type": _to_list(activity.type),
"remote_id": activity.id,
"meta": meta,
} }
) )

View file

@ -9,6 +9,7 @@ from typing import Union
from little_boxes import activitypub as ap from little_boxes import activitypub as ap
_SubQuery = Dict[str, Any] _SubQuery = Dict[str, Any]
_Meta = Dict["MetaKey", Any]
@unique @unique

View file

@ -21,6 +21,7 @@ import config
from config import DB from config import DB
from config import ME from config import ME
from core import activitypub from core import activitypub
from core.activitypub import _meta
from core.db import find_activities from core.db import find_activities
from core.meta import MetaKey from core.meta import MetaKey
from core.meta import by_object_id from core.meta import by_object_id
@ -145,10 +146,11 @@ def _build_thread(data, include_children=True, query=None): # noqa: C901
query = {} query = {}
data["_requested"] = True data["_requested"] = True
app.logger.info(f"_build_thread({data!r})") app.logger.info(f"_build_thread({data!r})")
root_id = data["meta"].get( root_id = data["meta"].get(MetaKey.THREAD_ROOT_PARENT.value)
MetaKey.THREAD_ROOT_PARENT.value, if not root_id:
data["meta"].get(MetaKey.OBJECT_ID.value, data["meta"].get("remote_id")), root_id = data["meta"].get(MetaKey.OBJECT_ID.value)
) if not root_id:
root_id = data["remote_id"]
replies = [data] replies = [data]
for dat in find_activities( for dat in find_activities(

View file

@ -28,15 +28,15 @@
{{ utils.display_actor_inline(data, size=80) }} {{ utils.display_actor_inline(data, size=80) }}
{% elif data | has_type('Create') %} {% elif data | has_type('Create') %}
{{ utils.display_note(data.object) }} {{ utils.display_note(data.object, meta=meta) }}
{% elif data | has_type(['Note', 'Article', 'Video', 'Audio', 'Page', 'Question']) %} {% elif data | has_type(['Note', 'Article', 'Video', 'Audio', 'Page', 'Question']) %}
{{ utils.display_note(data) }} {{ utils.display_note(data, meta=meta) }}
{% elif data | has_type('Announce') %} {% elif data | has_type('Announce') %}
{% set boost_actor = meta.actor %} {% set boost_actor = meta.actor %}
<p style="margin-left:65px;padding-bottom:5px;"> <p style="margin-left:65px;padding-bottom:5px;">
<span class="bar-item-no-hover"><a style="color:#808080;" href="{{ boost_actor.url | get_url }}">{{ boost_actor.name }}</a> boosted</span> <span class="bar-item-no-hover"><a style="color:#808080;" href="{{ boost_actor.url | get_url }}">{{ boost_actor.name }}</a> boosted</span>
</p> </p>
{{ utils.display_note(meta.object) }} {{ utils.display_note(meta.object, meta=meta) }}
{% endif %} {% endif %}
</div> </div>