{:ok, activities}
end
- # TODO
- # wire up replies
def handle_note(entry, doc \\ nil) do
content_html = string_from_xpath("/entry/content[1]", entry)
- uri = string_from_xpath("/entry/author/uri[1]", entry) || string_from_xpath("/feed/author/uri[1]", doc)
- {:ok, actor} = find_or_make_user(uri)
+ [author] = :xmerl_xpath.string('//author[1]', doc)
+ {:ok, actor} = find_make_or_update_user(author)
+ inReplyTo = string_from_xpath("/entry/thr:in-reply-to[1]/@ref", entry)
- context = string_from_xpath("/entry/ostatus:conversation[1]", entry) |> String.trim
- context = if String.length(context) > 0 do
- context
- else
- ActivityPub.generate_context_id
- end
+ context = (string_from_xpath("/entry/ostatus:conversation[1]", entry) || "") |> String.trim
+
+ context = with %{data: %{"context" => context}} <- Object.get_cached_by_ap_id(inReplyTo) do
+ context
+ else _e ->
+ if String.length(context) > 0 do
+ context
+ else
+ ActivityPub.generate_context_id
+ end
+ end
to = [
"https://www.w3.org/ns/activitystreams#Public"
"actor" => actor.ap_id
}
- inReplyTo = string_from_xpath("/entry/thr:in-reply-to[1]/@ref", entry)
-
object = if inReplyTo do
Map.put(object, "inReplyTo", inReplyTo)
else
if Object.get_by_ap_id(id) do
{:error, "duplicate activity"}
else
- ActivityPub.create(to, actor, context, object, %{}, date)
+ ActivityPub.create(to, actor, context, object, %{}, date, false)
+ end
+ end
+
+ def find_make_or_update_user(doc) do
+ uri = string_from_xpath("//author/uri[1]", doc)
+ with {:ok, user} <- find_or_make_user(uri) do
+ avatar = make_avatar_object(doc)
+ if user.avatar != avatar do
+ change = Ecto.Changeset.change(user, %{avatar: avatar})
+ Repo.update(change)
+ else
+ {:ok, user}
+ end
end
end
name: info.name,
nickname: info.nickname <> "@" <> info.host,
ap_id: info.uri,
- info: info
+ info: info,
+ avatar: info.avatar
}
# TODO: Make remote user changeset
# SHould enforce fqn nickname
end
# TODO: Just takes the first one for now.
- defp make_avatar_object(author_doc) do
- href = string_from_xpath("/author[1]/link[@rel=\"avatar\"]/@href", author_doc)
- type = string_from_xpath("/author[1]/link[@rel=\"avatar\"]/@type", author_doc)
+ def make_avatar_object(author_doc) do
+ href = string_from_xpath("//author[1]/link[@rel=\"avatar\"]/@href", author_doc)
+ type = string_from_xpath("//author[1]/link[@rel=\"avatar\"]/@type", author_doc)
if href do
%{