X-Git-Url: http://git.squeep.com/?a=blobdiff_plain;f=lib%2Fpleroma%2Fweb%2Ftwitter_api%2Ftwitter_api.ex;h=58f8bc1d3b7a14a715c9d67fc16535f85d7f350c;hb=60c60de330fe8fe03594da89831351099c8c9037;hp=e1b6f248713c5fadbaeff35200d48d2f65dd4e6c;hpb=8075badafe60d396c236d8d6d911cbb60ae9c5b6;p=akkoma diff --git a/lib/pleroma/web/twitter_api/twitter_api.ex b/lib/pleroma/web/twitter_api/twitter_api.ex index e1b6f2487..58f8bc1d3 100644 --- a/lib/pleroma/web/twitter_api/twitter_api.ex +++ b/lib/pleroma/web/twitter_api/twitter_api.ex @@ -6,8 +6,6 @@ defmodule Pleroma.Web.TwitterAPI.TwitterAPI do import Ecto.Query def create_status(user = %User{}, data = %{}) do - date = DateTime.utc_now() |> DateTime.to_iso8601 - attachments = Enum.map(data["media_ids"] || [], fn (media_id) -> Repo.get(Object, media_id).data end) @@ -27,6 +25,8 @@ defmodule Pleroma.Web.TwitterAPI.TwitterAPI do content_html = add_user_links(content, mentions) + date = make_date() + activity = %{ "type" => "Create", "to" => to, @@ -37,7 +37,8 @@ defmodule Pleroma.Web.TwitterAPI.TwitterAPI do "content" => content_html, "published" => date, "context" => context, - "attachment" => attachments + "attachment" => attachments, + "actor" => user.ap_id }, "published" => date, "context" => context @@ -69,7 +70,7 @@ defmodule Pleroma.Web.TwitterAPI.TwitterAPI do end def fetch_friend_statuses(user, opts \\ %{}) do - ActivityPub.fetch_activities(user.following, opts) + ActivityPub.fetch_activities([user.ap_id | user.following], opts) |> activities_to_statuses(%{for: user}) end @@ -107,7 +108,8 @@ defmodule Pleroma.Web.TwitterAPI.TwitterAPI do { :ok, activity } <- ActivityPub.insert(%{ "type" => "Follow", "actor" => follower.ap_id, - "object" => followed.ap_id + "object" => followed.ap_id, + "published" => make_date() }) do { :ok, follower, followed, activity } @@ -122,25 +124,74 @@ defmodule Pleroma.Web.TwitterAPI.TwitterAPI do end end - def upload(%Plug.Upload{} = file) do + def favorite(%User{} = user, %Activity{data: %{"object" => object}} = activity) do + object = Object.get_by_ap_id(object["id"]) + + {:ok, _like_activity, object} = ActivityPub.like(user, object) + new_data = activity.data + |> Map.put("object", object.data) + + status = %{activity | data: new_data} + |> activity_to_status(%{for: user}) + + {:ok, status} + end + + def unfavorite(%User{} = user, %Activity{data: %{"object" => object}} = activity) do + object = Object.get_by_ap_id(object["id"]) + + {:ok, object} = ActivityPub.unlike(user, object) + new_data = activity.data + |> Map.put("object", object.data) + + status = %{activity | data: new_data} + |> activity_to_status(%{for: user}) + + {:ok, status} + end + + def retweet(%User{} = user, %Activity{data: %{"object" => object}} = activity) do + object = Object.get_by_ap_id(object["id"]) + + {:ok, _announce_activity, object} = ActivityPub.announce(user, object) + new_data = activity.data + |> Map.put("object", object.data) + + status = %{activity | data: new_data} + |> activity_to_status(%{for: user}) + + {:ok, status} + end + + def upload(%Plug.Upload{} = file, format \\ "xml") do {:ok, object} = ActivityPub.upload(file) url = List.first(object.data["url"]) href = url["href"] type = url["mediaType"] - # Fake this as good as possible... - """ - - - #{object.id} - #{object.id} - #{object.id} - #{href} - #{href} - - - """ + case format do + "xml" -> + # Fake this as good as possible... + """ + + + #{object.id} + #{object.id} + #{object.id} + #{href} + #{href} + + + """ + "json" -> + %{ + media_id: object.id, + media_id_string: "#{object.id}}", + media_url: href, + size: 0 + } |> Poison.encode! + end end def parse_mentions(text) do @@ -150,7 +201,7 @@ defmodule Pleroma.Web.TwitterAPI.TwitterAPI do Regex.scan(regex, text) |> List.flatten |> Enum.uniq - |> Enum.map(fn ("@" <> match = full_match) -> {full_match, Repo.get_by(User, nickname: match)} end) + |> Enum.map(fn ("@" <> match = full_match) -> {full_match, User.get_cached_by_nickname(match)} end) |> Enum.filter(fn ({_match, user}) -> user end) end @@ -166,6 +217,11 @@ defmodule Pleroma.Web.TwitterAPI.TwitterAPI do |> put_in(["object", "statusnetConversationId"], activity.id) |> put_in(["statusnetConversationId"], activity.id) + object = Object.get_by_ap_id(activity.data["object"]["id"]) + + changeset = Ecto.Changeset.change(object, data: data["object"]) + Repo.update(changeset) + changeset = Ecto.Changeset.change(activity, data: data) Repo.update(changeset) end @@ -177,10 +233,38 @@ defmodule Pleroma.Web.TwitterAPI.TwitterAPI do end) end + # For likes, fetch the liked activity, too. + defp activity_to_status(%Activity{data: %{"type" => "Like"}} = activity, opts) do + actor = get_in(activity.data, ["actor"]) + user = User.get_cached_by_ap_id(actor) + [liked_activity] = Activity.all_by_object_ap_id(activity.data["object"]) + + ActivityRepresenter.to_map(activity, Map.merge(opts, %{user: user, liked_activity: liked_activity})) + end + + # For announces, fetch the announced activity and the user. + defp activity_to_status(%Activity{data: %{"type" => "Announce"}} = activity, opts) do + actor = get_in(activity.data, ["actor"]) + user = User.get_cached_by_ap_id(actor) + [announced_activity] = Activity.all_by_object_ap_id(activity.data["object"]) + announced_actor = User.get_cached_by_ap_id(announced_activity.data["actor"]) + + ActivityRepresenter.to_map(activity, Map.merge(opts, %{users: [user, announced_actor], announced_activity: announced_activity})) + end + defp activity_to_status(activity, opts) do actor = get_in(activity.data, ["actor"]) - user = Repo.get_by!(User, ap_id: actor) - mentioned_users = Repo.all(from user in User, where: user.ap_id in ^activity.data["to"]) + user = User.get_cached_by_ap_id(actor) + # mentioned_users = Repo.all(from user in User, where: user.ap_id in ^activity.data["to"]) + mentioned_users = Enum.map(activity.data["to"], fn (ap_id) -> + User.get_cached_by_ap_id(ap_id) + end) + |> Enum.filter(&(&1)) + ActivityRepresenter.to_map(activity, Map.merge(opts, %{user: user, mentioned: mentioned_users})) end + + defp make_date do + DateTime.utc_now() |> DateTime.to_iso8601 + end end