Refactor posting and make character limit configurable.

This commit is contained in:
Roger Braun 2017-09-15 14:17:36 +02:00
parent ac2893a945
commit 50409326a8
12 changed files with 87 additions and 78 deletions

View File

@ -43,7 +43,8 @@
config :pleroma, :instance, config :pleroma, :instance,
version: version, version: version,
name: "Pleroma", name: "Pleroma",
email: "example@example.com" email: "example@example.com",
limit: 5000
# Import environment specific config. This must remain at the bottom # Import environment specific config. This must remain at the bottom
# of this file so it overrides the configuration defined above. # of this file so it overrides the configuration defined above.

View File

@ -1,6 +1,9 @@
defmodule Pleroma.Web.CommonAPI do defmodule Pleroma.Web.CommonAPI do
alias Pleroma.{Repo, Activity, Object} alias Pleroma.{Repo, Activity, Object, User}
alias Pleroma.Web.ActivityPub.ActivityPub alias Pleroma.Web.ActivityPub.ActivityPub
alias Pleroma.Formatter
import Pleroma.Web.CommonAPI.Utils
def delete(activity_id, user) do def delete(activity_id, user) do
with %Activity{data: %{"object" => %{"id" => object_id}}} <- Repo.get(Activity, activity_id), with %Activity{data: %{"object" => %{"id" => object_id}}} <- Repo.get(Activity, activity_id),
@ -44,13 +47,22 @@ def unfavorite(id_or_ap_id, user) do
end end
end end
# This is a hack for twidere. @instance Application.get_env(:pleroma, :instance)
def get_by_id_or_ap_id(id) do @limit Keyword.get(@instance, :limit)
activity = Repo.get(Activity, id) || Activity.get_create_activity_by_object_ap_id(id) def post(user, %{"status" => status} = data) do
if activity.data["type"] == "Create" do with status <- String.trim(status),
activity length when length in 1..@limit <- String.length(status),
else attachments <- attachments_from_ids(data["media_ids"]),
Activity.get_create_activity_by_object_ap_id(activity.data["object"]) mentions <- Formatter.parse_mentions(status),
inReplyTo <- get_replied_to_activity(data["in_reply_to_status_id"]),
to <- to_for_user_and_mentions(user, mentions, inReplyTo),
content_html <- make_content_html(status, mentions, attachments),
context <- make_context(inReplyTo),
tags <- Formatter.parse_tags(status),
object <- make_note_data(user.ap_id, to, context, content_html, attachments, inReplyTo, tags) do
res = ActivityPub.create(to, user, context, object)
User.update_note_count(user)
res
end end
end end
end end

View File

@ -1,22 +1,52 @@
defmodule Pleroma.Web.TwitterAPI.Utils do defmodule Pleroma.Web.CommonAPI.Utils do
alias Pleroma.{Repo, Object, Formatter, User, Activity} alias Pleroma.{Repo, Object, Formatter, User, Activity}
alias Pleroma.Web.ActivityPub.Utils alias Pleroma.Web.ActivityPub.Utils
alias Calendar.Strftime alias Calendar.Strftime
# This is a hack for twidere.
def get_by_id_or_ap_id(id) do
activity = Repo.get(Activity, id) || Activity.get_create_activity_by_object_ap_id(id)
if activity.data["type"] == "Create" do
activity
else
Activity.get_create_activity_by_object_ap_id(activity.data["object"])
end
end
def get_replied_to_activity(id) when not is_nil(id) do
Repo.get(Activity, id)
end
def get_replied_to_activity(_), do: nil
def attachments_from_ids(ids) do def attachments_from_ids(ids) do
Enum.map(ids || [], fn (media_id) -> Enum.map(ids || [], fn (media_id) ->
Repo.get(Object, media_id).data Repo.get(Object, media_id).data
end) end)
end end
defp shortname(name) do def to_for_user_and_mentions(user, mentions, inReplyTo) do
if String.length(name) < 30 do default_to = [
name user.follower_address,
"https://www.w3.org/ns/activitystreams#Public"
]
to = default_to ++ Enum.map(mentions, fn ({_, %{ap_id: ap_id}}) -> ap_id end)
if inReplyTo do
Enum.uniq([inReplyTo.data["actor"] | to])
else else
String.slice(name, 0..30) <> "" to
end end
end end
def make_content_html(status, mentions, attachments) do
status
|> format_input(mentions)
|> add_attachments(attachments)
end
def make_context(%Activity{data: %{"context" => context}}), do: context
def make_context(_), do: Utils.generate_context_id
def add_attachments(text, attachments) do def add_attachments(text, attachments) do
attachment_text = Enum.map(attachments, fn attachment_text = Enum.map(attachments, fn
(%{"url" => [%{"href" => href} | _]}) -> (%{"url" => [%{"href" => href} | _]}) ->
@ -53,16 +83,6 @@ def add_user_links(text, mentions) do
end) end)
end end
def make_content_html(status, mentions, attachments) do
status
|> format_input(mentions)
|> add_attachments(attachments)
end
def make_context(%Activity{data: %{"context" => context}}), do: context
def make_context(_), do: Utils.generate_context_id
# TODO: Move this to a more fitting space
def make_note_data(actor, to, context, content_html, attachments, inReplyTo, tags) do def make_note_data(actor, to, context, content_html, attachments, inReplyTo, tags) do
object = %{ object = %{
"type" => "Note", "type" => "Note",
@ -98,4 +118,12 @@ def date_to_asctime(date) do
"" ""
end end
end end
defp shortname(name) do
if String.length(name) < 30 do
name
else
String.slice(name, 0..30) <> ""
end
end
end end

View File

@ -133,16 +133,12 @@ def get_context(%{assigns: %{user: user}} = conn, %{"id" => id}) do
end end
def post_status(%{assigns: %{user: user}} = conn, %{"status" => status} = params) do def post_status(%{assigns: %{user: user}} = conn, %{"status" => status} = params) do
l = status |> String.trim |> String.length
params = params params = params
|> Map.put("in_reply_to_status_id", params["in_reply_to_id"]) |> Map.put("in_reply_to_status_id", params["in_reply_to_id"])
if l > 0 && l < 5000 do {:ok, activity} = CommonAPI.post(user, params)
{:ok, activity} = TwitterAPI.create_status(user, params)
render conn, StatusView, "status.json", %{activity: activity, for: user, as: :activity} render conn, StatusView, "status.json", %{activity: activity, for: user, as: :activity}
end end
end
def delete_status(%{assigns: %{user: user}} = conn, %{"id" => id}) do def delete_status(%{assigns: %{user: user}} = conn, %{"id" => id}) do
with {:ok, %Activity{}} <- CommonAPI.delete(id, user) do with {:ok, %Activity{}} <- CommonAPI.delete(id, user) do

View File

@ -4,7 +4,7 @@ defmodule Pleroma.Web.OStatus.NoteHandler do
alias Pleroma.{Object, User, Activity} alias Pleroma.{Object, User, Activity}
alias Pleroma.Web.ActivityPub.ActivityPub alias Pleroma.Web.ActivityPub.ActivityPub
alias Pleroma.Web.ActivityPub.Utils alias Pleroma.Web.ActivityPub.Utils
alias Pleroma.Web.TwitterAPI alias Pleroma.Web.CommonAPI
@doc """ @doc """
Get the context for this note. Uses this: Get the context for this note. Uses this:
@ -92,7 +92,7 @@ def handle_note(entry, doc \\ nil) do
mentions <- get_mentions(entry), mentions <- get_mentions(entry),
to <- make_to_list(actor, mentions), to <- make_to_list(actor, mentions),
date <- XML.string_from_xpath("//published", entry), date <- XML.string_from_xpath("//published", entry),
note <- TwitterAPI.Utils.make_note_data(actor.ap_id, to, context, content_html, attachments, inReplyToActivity, []), note <- CommonAPI.Utils.make_note_data(actor.ap_id, to, context, content_html, attachments, inReplyToActivity, []),
note <- note |> Map.put("id", id) |> Map.put("tag", tags), note <- note |> Map.put("id", id) |> Map.put("tag", tags),
note <- note |> Map.put("published", date), note <- note |> Map.put("published", date),
note <- add_external_url(note, entry), note <- add_external_url(note, entry),

View File

@ -6,15 +6,16 @@ def help_test(conn, _params) do
json(conn, "ok") json(conn, "ok")
end end
@instance Application.get_env(:pleroma, :instance)
def config(conn, _params) do def config(conn, _params) do
case get_format(conn) do case get_format(conn) do
"xml" -> "xml" ->
response = """ response = """
<config> <config>
<site> <site>
<name>#{Web.base_url}</name> <name>#{Keyword.get(@instance, :name)}</name>
<site>#{Web.base_url}</site> <site>#{Web.base_url}</site>
<textlimit>5000</textlimit> <textlimit>#{Keyword.get(@instance, :limit)}</textlimit>
</site> </site>
</config> </config>
""" """
@ -24,22 +25,23 @@ def config(conn, _params) do
_ -> _ ->
json(conn, %{ json(conn, %{
site: %{ site: %{
name: Web.base_url, name: Keyword.get(@instance, :name),
server: Web.base_url, server: Web.base_url,
textlimit: 5000 textlimit: Keyword.get(@instance, :limit)
} }
}) })
end end
end end
def version(conn, _params) do def version(conn, _params) do
version = Keyword.get(@instance, :version)
case get_format(conn) do case get_format(conn) do
"xml" -> "xml" ->
response = "<version>Pleroma Dev</version>" response = "<version>#{version}</version>"
conn conn
|> put_resp_content_type("application/xml") |> put_resp_content_type("application/xml")
|> send_resp(200, response) |> send_resp(200, response)
_ -> json(conn, "Pleroma Dev") _ -> json(conn, version)
end end
end end
end end

View File

@ -2,7 +2,8 @@ defmodule Pleroma.Web.TwitterAPI.Representers.ActivityRepresenter do
use Pleroma.Web.TwitterAPI.Representers.BaseRepresenter use Pleroma.Web.TwitterAPI.Representers.BaseRepresenter
alias Pleroma.Web.TwitterAPI.Representers.ObjectRepresenter alias Pleroma.Web.TwitterAPI.Representers.ObjectRepresenter
alias Pleroma.{Activity, User} alias Pleroma.{Activity, User}
alias Pleroma.Web.TwitterAPI.{TwitterAPI, UserView, Utils} alias Pleroma.Web.TwitterAPI.{TwitterAPI, UserView}
alias Pleroma.Web.CommonAPI.Utils
alias Pleroma.Formatter alias Pleroma.Formatter
defp user_by_ap_id(user_list, ap_id) do defp user_by_ap_id(user_list, ap_id) do

View File

@ -6,43 +6,10 @@ defmodule Pleroma.Web.TwitterAPI.TwitterAPI do
alias Pleroma.Web.{OStatus, CommonAPI} alias Pleroma.Web.{OStatus, CommonAPI}
alias Pleroma.Formatter alias Pleroma.Formatter
import Pleroma.Web.TwitterAPI.Utils
@httpoison Application.get_env(:pleroma, :httpoison) @httpoison Application.get_env(:pleroma, :httpoison)
def to_for_user_and_mentions(user, mentions, inReplyTo) do
default_to = [
user.follower_address,
"https://www.w3.org/ns/activitystreams#Public"
]
to = default_to ++ Enum.map(mentions, fn ({_, %{ap_id: ap_id}}) -> ap_id end)
if inReplyTo do
Enum.uniq([inReplyTo.data["actor"] | to])
else
to
end
end
def get_replied_to_activity(id) when not is_nil(id) do
Repo.get(Activity, id)
end
def get_replied_to_activity(_), do: nil
def create_status(%User{} = user, %{"status" => status} = data) do def create_status(%User{} = user, %{"status" => status} = data) do
with attachments <- attachments_from_ids(data["media_ids"]), CommonAPI.post(user, data)
mentions <- Formatter.parse_mentions(status),
inReplyTo <- get_replied_to_activity(data["in_reply_to_status_id"]),
to <- to_for_user_and_mentions(user, mentions, inReplyTo),
content_html <- make_content_html(status, mentions, attachments),
context <- make_context(inReplyTo),
tags <- Formatter.parse_tags(status),
object <- make_note_data(user.ap_id, to, context, content_html, attachments, inReplyTo, tags) do
res = ActivityPub.create(to, user, context, object)
User.update_note_count(user)
res
end
end end
def fetch_friend_statuses(user, opts \\ %{}) do def fetch_friend_statuses(user, opts \\ %{}) do

View File

@ -1,7 +1,7 @@
defmodule Pleroma.Web.TwitterAPI.UserView do defmodule Pleroma.Web.TwitterAPI.UserView do
use Pleroma.Web, :view use Pleroma.Web, :view
alias Pleroma.User alias Pleroma.User
alias Pleroma.Web.TwitterAPI.Utils alias Pleroma.Web.CommonAPI.Utils
def render("show.json", %{user: user = %User{}} = assigns) do def render("show.json", %{user: user = %User{}} = assigns) do
render_one(user, Pleroma.Web.TwitterAPI.UserView, "user.json", assigns) render_one(user, Pleroma.Web.TwitterAPI.UserView, "user.json", assigns)

View File

@ -1,5 +1,5 @@
defmodule Pleroma.Web.TwitterAPI.UtilsTest do defmodule Pleroma.Web.CommonAPI.UtilsTest do
alias Pleroma.Web.TwitterAPI.Utils alias Pleroma.Web.CommonAPI.Utils
use Pleroma.DataCase use Pleroma.DataCase
test "it adds attachment links to a given text and attachment set" do test "it adds attachment links to a given text and attachment set" do

View File

@ -1,7 +1,8 @@
defmodule Pleroma.Web.TwitterAPI.TwitterAPITest do defmodule Pleroma.Web.TwitterAPI.TwitterAPITest do
use Pleroma.DataCase use Pleroma.DataCase
alias Pleroma.Builders.{UserBuilder, ActivityBuilder} alias Pleroma.Builders.{UserBuilder, ActivityBuilder}
alias Pleroma.Web.TwitterAPI.{TwitterAPI,UserView,Utils} alias Pleroma.Web.TwitterAPI.{TwitterAPI, UserView}
alias Pleroma.Web.CommonAPI.Utils
alias Pleroma.{Activity, User, Object, Repo} alias Pleroma.{Activity, User, Object, Repo}
alias Pleroma.Web.TwitterAPI.Representers.ActivityRepresenter alias Pleroma.Web.TwitterAPI.Representers.ActivityRepresenter
alias Pleroma.Web.ActivityPub.ActivityPub alias Pleroma.Web.ActivityPub.ActivityPub

View File

@ -2,7 +2,8 @@ defmodule Pleroma.Web.TwitterAPI.UserViewTest do
use Pleroma.DataCase use Pleroma.DataCase
alias Pleroma.User alias Pleroma.User
alias Pleroma.Web.TwitterAPI.{UserView, Utils} alias Pleroma.Web.TwitterAPI.UserView
alias Pleroma.Web.CommonAPI.Utils
alias Pleroma.Builders.UserBuilder alias Pleroma.Builders.UserBuilder
import Pleroma.Factory import Pleroma.Factory