Refactor posting and make character limit configurable.
This commit is contained in:
parent
ac2893a945
commit
50409326a8
|
@ -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.
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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
|
|
@ -133,15 +133,11 @@ 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
|
||||||
|
|
|
@ -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),
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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)
|
||||||
|
|
|
@ -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
|
|
@ -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
|
||||||
|
|
|
@ -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
|
||||||
|
|
Loading…
Reference in New Issue