aboutsummaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
authorrinpatch <rinpatch@sdf.org>2019-05-18 13:29:28 +0300
committerrinpatch <rinpatch@sdf.org>2019-05-18 13:29:28 +0300
commitfd920c897339b9cedea042dd6698d14380cedae7 (patch)
treeda77fda315d2a8ae4bff3358aec60f776cf63253 /lib
parent642a67dd4492f31b5b9fe457e34c1589c9d70c3f (diff)
downloadpleroma-fd920c897339b9cedea042dd6698d14380cedae7.tar.gz
Mastodon API: Add support for posting polls
Diffstat (limited to 'lib')
-rw-r--r--lib/pleroma/web/common_api/common_api.ex4
-rw-r--r--lib/pleroma/web/common_api/utils.ex64
2 files changed, 59 insertions, 9 deletions
diff --git a/lib/pleroma/web/common_api/common_api.ex b/lib/pleroma/web/common_api/common_api.ex
index b53869c75..335ae70b0 100644
--- a/lib/pleroma/web/common_api/common_api.ex
+++ b/lib/pleroma/web/common_api/common_api.ex
@@ -149,6 +149,7 @@ defmodule Pleroma.Web.CommonAPI do
data,
visibility
),
+ {poll, mentions, tags} <- make_poll_data(data, mentions, tags),
{to, cc} <- to_for_user_and_mentions(user, mentions, in_reply_to, visibility),
context <- make_context(in_reply_to),
cw <- data["spoiler_text"] || "",
@@ -164,7 +165,8 @@ defmodule Pleroma.Web.CommonAPI do
in_reply_to,
tags,
cw,
- cc
+ cc,
+ poll
),
object <-
Map.put(
diff --git a/lib/pleroma/web/common_api/utils.ex b/lib/pleroma/web/common_api/utils.ex
index 1dfe50b40..13cdffbbd 100644
--- a/lib/pleroma/web/common_api/utils.ex
+++ b/lib/pleroma/web/common_api/utils.ex
@@ -102,6 +102,48 @@ defmodule Pleroma.Web.CommonAPI.Utils do
end
end
+ def make_poll_data(
+ %{"poll" => %{"options" => options, "expires_in" => expires_in}} = data,
+ mentions,
+ tags
+ )
+ when is_list(options) and is_integer(expires_in) do
+ content_type = get_content_type(data["content_type"])
+ # XXX: There is probably a more performant/cleaner way to do this
+ {poll, {mentions, tags}} =
+ Enum.map_reduce(options, {mentions, tags}, fn option, {mentions, tags} ->
+ # TODO: Custom emoji
+ {option, mentions_merge, tags_merge} = format_input(option, content_type)
+ mentions = mentions ++ mentions_merge
+ tags = tags ++ tags_merge
+
+ {%{
+ "name" => option,
+ "type" => "Note",
+ "replies" => %{"type" => "Collection", "totalItems" => 0}
+ }, {mentions, tags}}
+ end)
+
+ end_time =
+ NaiveDateTime.utc_now()
+ |> NaiveDateTime.add(expires_in)
+ |> NaiveDateTime.to_iso8601()
+
+ poll =
+ if Pleroma.Web.ControllerHelper.truthy_param?(data["poll"]["multiple"]) do
+ %{"type" => "Question", "anyOf" => poll, "closed" => end_time}
+ else
+ %{"type" => "Question", "oneOf" => poll, "closed" => end_time}
+ end
+
+ {poll, mentions, tags}
+ end
+
+ def make_poll_data(data, mentions, tags) do
+ IO.inspect(data, label: "data")
+ {%{}, mentions, tags}
+ end
+
def make_content_html(
status,
attachments,
@@ -223,8 +265,11 @@ defmodule Pleroma.Web.CommonAPI.Utils do
in_reply_to,
tags,
cw \\ nil,
- cc \\ []
+ cc \\ [],
+ merge \\ %{}
) do
+ IO.inspect(merge, label: "merge")
+
object = %{
"type" => "Note",
"to" => to,
@@ -237,14 +282,17 @@ defmodule Pleroma.Web.CommonAPI.Utils do
"tag" => tags |> Enum.map(fn {_, tag} -> tag end) |> Enum.uniq()
}
- if in_reply_to do
- in_reply_to_object = Object.normalize(in_reply_to)
+ object =
+ if in_reply_to do
+ in_reply_to_object = Object.normalize(in_reply_to)
- object
- |> Map.put("inReplyTo", in_reply_to_object.data["id"])
- else
- object
- end
+ object
+ |> Map.put("inReplyTo", in_reply_to_object.data["id"])
+ else
+ object
+ end
+
+ Map.merge(object, merge)
end
def format_naive_asctime(date) do