Refactor posting and make character limit configurable.
This commit is contained in:
parent
ac2893a945
commit
50409326a8
12 changed files with 87 additions and 78 deletions
|
|
@ -6,15 +6,16 @@ defmodule Pleroma.Web.TwitterAPI.UtilController do
|
|||
json(conn, "ok")
|
||||
end
|
||||
|
||||
@instance Application.get_env(:pleroma, :instance)
|
||||
def config(conn, _params) do
|
||||
case get_format(conn) do
|
||||
"xml" ->
|
||||
response = """
|
||||
<config>
|
||||
<site>
|
||||
<name>#{Web.base_url}</name>
|
||||
<name>#{Keyword.get(@instance, :name)}</name>
|
||||
<site>#{Web.base_url}</site>
|
||||
<textlimit>5000</textlimit>
|
||||
<textlimit>#{Keyword.get(@instance, :limit)}</textlimit>
|
||||
</site>
|
||||
</config>
|
||||
"""
|
||||
|
|
@ -24,22 +25,23 @@ defmodule Pleroma.Web.TwitterAPI.UtilController do
|
|||
_ ->
|
||||
json(conn, %{
|
||||
site: %{
|
||||
name: Web.base_url,
|
||||
name: Keyword.get(@instance, :name),
|
||||
server: Web.base_url,
|
||||
textlimit: 5000
|
||||
textlimit: Keyword.get(@instance, :limit)
|
||||
}
|
||||
})
|
||||
end
|
||||
end
|
||||
|
||||
def version(conn, _params) do
|
||||
version = Keyword.get(@instance, :version)
|
||||
case get_format(conn) do
|
||||
"xml" ->
|
||||
response = "<version>Pleroma Dev</version>"
|
||||
response = "<version>#{version}</version>"
|
||||
conn
|
||||
|> put_resp_content_type("application/xml")
|
||||
|> send_resp(200, response)
|
||||
_ -> json(conn, "Pleroma Dev")
|
||||
_ -> json(conn, version)
|
||||
end
|
||||
end
|
||||
end
|
||||
|
|
|
|||
|
|
@ -2,7 +2,8 @@ defmodule Pleroma.Web.TwitterAPI.Representers.ActivityRepresenter do
|
|||
use Pleroma.Web.TwitterAPI.Representers.BaseRepresenter
|
||||
alias Pleroma.Web.TwitterAPI.Representers.ObjectRepresenter
|
||||
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
|
||||
|
||||
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.Formatter
|
||||
|
||||
import Pleroma.Web.TwitterAPI.Utils
|
||||
|
||||
@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
|
||||
with attachments <- attachments_from_ids(data["media_ids"]),
|
||||
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
|
||||
CommonAPI.post(user, data)
|
||||
end
|
||||
|
||||
def fetch_friend_statuses(user, opts \\ %{}) do
|
||||
|
|
|
|||
|
|
@ -1,101 +0,0 @@
|
|||
defmodule Pleroma.Web.TwitterAPI.Utils do
|
||||
alias Pleroma.{Repo, Object, Formatter, User, Activity}
|
||||
alias Pleroma.Web.ActivityPub.Utils
|
||||
alias Calendar.Strftime
|
||||
|
||||
def attachments_from_ids(ids) do
|
||||
Enum.map(ids || [], fn (media_id) ->
|
||||
Repo.get(Object, media_id).data
|
||||
end)
|
||||
end
|
||||
|
||||
defp shortname(name) do
|
||||
if String.length(name) < 30 do
|
||||
name
|
||||
else
|
||||
String.slice(name, 0..30) <> "…"
|
||||
end
|
||||
end
|
||||
|
||||
def add_attachments(text, attachments) do
|
||||
attachment_text = Enum.map(attachments, fn
|
||||
(%{"url" => [%{"href" => href} | _]}) ->
|
||||
name = URI.decode(Path.basename(href))
|
||||
"<a href=\"#{href}\" class='attachment'>#{shortname(name)}</a>"
|
||||
_ -> ""
|
||||
end)
|
||||
Enum.join([text | attachment_text], "<br>\n")
|
||||
end
|
||||
|
||||
def format_input(text, mentions) do
|
||||
HtmlSanitizeEx.strip_tags(text)
|
||||
|> Formatter.linkify
|
||||
|> String.replace("\n", "<br>\n")
|
||||
|> add_user_links(mentions)
|
||||
end
|
||||
|
||||
def add_user_links(text, mentions) do
|
||||
mentions = mentions
|
||||
|> Enum.sort_by(fn ({name, _}) -> -String.length(name) end)
|
||||
|> Enum.map(fn({name, user}) -> {name, user, Ecto.UUID.generate} end)
|
||||
|
||||
# This replaces the mention with a unique reference first so it doesn't
|
||||
# contain parts of other replaced mentions. There probably is a better
|
||||
# solution for this...
|
||||
step_one = mentions
|
||||
|> Enum.reduce(text, fn ({match, _user, uuid}, text) ->
|
||||
String.replace(text, match, uuid)
|
||||
end)
|
||||
|
||||
Enum.reduce(mentions, step_one, fn ({match, %User{ap_id: ap_id}, uuid}, text) ->
|
||||
short_match = String.split(match, "@") |> tl() |> hd()
|
||||
String.replace(text, uuid, "<a href='#{ap_id}'>@#{short_match}</a>")
|
||||
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
|
||||
object = %{
|
||||
"type" => "Note",
|
||||
"to" => to,
|
||||
"content" => content_html,
|
||||
"context" => context,
|
||||
"attachment" => attachments,
|
||||
"actor" => actor,
|
||||
"tag" => tags |> Enum.map(fn ({_, tag}) -> tag end)
|
||||
}
|
||||
|
||||
if inReplyTo do
|
||||
object
|
||||
|> Map.put("inReplyTo", inReplyTo.data["object"]["id"])
|
||||
|> Map.put("inReplyToStatusId", inReplyTo.id)
|
||||
else
|
||||
object
|
||||
end
|
||||
end
|
||||
|
||||
def format_naive_asctime(date) do
|
||||
date |> DateTime.from_naive!("Etc/UTC") |> format_asctime
|
||||
end
|
||||
|
||||
def format_asctime(date) do
|
||||
Strftime.strftime!(date, "%a %b %d %H:%M:%S %z %Y")
|
||||
end
|
||||
|
||||
def date_to_asctime(date) do
|
||||
with {:ok, date, _offset} <- date |> DateTime.from_iso8601 do
|
||||
format_asctime(date)
|
||||
else _e ->
|
||||
""
|
||||
end
|
||||
end
|
||||
end
|
||||
|
|
@ -1,7 +1,7 @@
|
|||
defmodule Pleroma.Web.TwitterAPI.UserView do
|
||||
use Pleroma.Web, :view
|
||||
alias Pleroma.User
|
||||
alias Pleroma.Web.TwitterAPI.Utils
|
||||
alias Pleroma.Web.CommonAPI.Utils
|
||||
|
||||
def render("show.json", %{user: user = %User{}} = assigns) do
|
||||
render_one(user, Pleroma.Web.TwitterAPI.UserView, "user.json", assigns)
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue