summaryrefslogtreecommitdiff
path: root/lib/plugins/link/reddit.ex
diff options
context:
space:
mode:
Diffstat (limited to 'lib/plugins/link/reddit.ex')
-rw-r--r--lib/plugins/link/reddit.ex157
1 files changed, 97 insertions, 60 deletions
diff --git a/lib/plugins/link/reddit.ex b/lib/plugins/link/reddit.ex
index 016e025..2a6527d 100644
--- a/lib/plugins/link/reddit.ex
+++ b/lib/plugins/link/reddit.ex
@@ -6,14 +6,18 @@ defmodule Nola.Plugins.Link.Reddit do
case String.split(path, "/") do
["", "r", sub, "comments", post_id, _slug] ->
{true, %{mode: :post, path: path, sub: sub, post_id: post_id}}
+
["", "r", sub, "comments", post_id, _slug, ""] ->
{true, %{mode: :post, path: path, sub: sub, post_id: post_id}}
+
["", "r", sub, ""] ->
{true, %{mode: :sub, path: path, sub: sub}}
+
["", "r", sub] ->
{true, %{mode: :sub, path: path, sub: sub}}
-# ["", "u", user] ->
-# {true, %{mode: :user, path: path, user: user}}
+
+ # ["", "u", user] ->
+ # {true, %{mode: :user, path: path, user: user}}
_ ->
false
end
@@ -33,87 +37,120 @@ defmodule Nola.Plugins.Link.Reddit do
@impl true
def expand(_, %{mode: :sub, sub: sub}, _opts) do
url = "https://api.reddit.com/r/#{sub}/about"
- case HTTPoison.get(url) do
+
+ case HTTPoison.get(url, [],
+ proxy: Keyword.get(Application.get_env(:nola, __MODULE__, []), :proxy, nil)
+ ) do
{:ok, %HTTPoison.Response{status_code: 200, body: body}} ->
- sr = Jason.decode!(body)
- |> Map.get("data")
- |> IO.inspect(limit: :infinity)
- description = Map.get(sr, "public_description")||Map.get(sr, "description", "")
- |> String.split("\n")
- |> List.first()
- name = if title = Map.get(sr, "title") do
- Map.get(sr, "display_name_prefixed") <> ": " <> title
- else
- Map.get(sr, "display_name_prefixed")
- end
- nsfw = if Map.get(sr, "over18") do
- "[NSFW] "
- else
- ""
- end
- quarantine = if Map.get(sr, "quarantine") do
- "[Quarantined] "
- else
- ""
- end
- count = "#{Map.get(sr, "subscribers")} subscribers, #{Map.get(sr, "active_user_count")} active"
+ sr =
+ Jason.decode!(body)
+ |> Map.get("data")
+ |> IO.inspect(limit: :infinity)
+
+ description =
+ Map.get(sr, "public_description") ||
+ Map.get(sr, "description", "")
+ |> String.split("\n")
+ |> List.first()
+
+ name =
+ if title = Map.get(sr, "title") do
+ Map.get(sr, "display_name_prefixed") <> ": " <> title
+ else
+ Map.get(sr, "display_name_prefixed")
+ end
+
+ nsfw =
+ if Map.get(sr, "over18") do
+ "[NSFW] "
+ else
+ ""
+ end
+
+ quarantine =
+ if Map.get(sr, "quarantine") do
+ "[Quarantined] "
+ else
+ ""
+ end
+
+ count =
+ "#{Map.get(sr, "subscribers")} subscribers, #{Map.get(sr, "active_user_count")} active"
+
preview = "#{quarantine}#{nsfw}#{name} — #{description} (#{count})"
{:ok, preview}
+
_ ->
:error
end
end
def expand(_uri, %{mode: :post, path: path, sub: sub, post_id: post_id}, _opts) do
- case HTTPoison.get("https://api.reddit.com#{path}?sr_detail=true") do
+ case HTTPoison.get("https://api.reddit.com#{path}?sr_detail=true", [],
+ proxy: Keyword.get(Application.get_env(:nola, __MODULE__, []), :proxy, nil)
+ ) do
{:ok, %HTTPoison.Response{status_code: 200, body: body}} ->
json = Jason.decode!(body)
- op = List.first(json)
- |> Map.get("data")
- |> Map.get("children")
- |> List.first()
- |> Map.get("data")
- |> IO.inspect(limit: :infinity)
+
+ op =
+ List.first(json)
+ |> Map.get("data")
+ |> Map.get("children")
+ |> List.first()
+ |> Map.get("data")
+ |> IO.inspect(limit: :infinity)
+
sr = get_in(op, ["sr_detail", "display_name_prefixed"])
- {self?, url} = if Map.get(op, "selftext") == "" do
- {false, Map.get(op, "url")}
- else
- {true, nil}
- end
+
+ {self?, url} =
+ if Map.get(op, "selftext") == "" do
+ {false, Map.get(op, "url")}
+ else
+ {true, nil}
+ end
self_str = if(self?, do: "text", else: url)
up = Map.get(op, "ups")
down = Map.get(op, "downs")
comments = Map.get(op, "num_comments")
- nsfw = if Map.get(op, "over_18") do
- "[NSFW] "
- else
- ""
- end
- state = cond do
- Map.get(op, "hidden") -> "hidden"
- Map.get(op, "archived") -> "archived"
- Map.get(op, "locked") -> "locked"
- Map.get(op, "quarantine") -> "quarantined"
- Map.get(op, "removed_by") || Map.get(op, "removed_by_category") -> "removed"
- Map.get(op, "banned_by") -> "banned"
- Map.get(op, "pinned") -> "pinned"
- Map.get(op, "stickied") -> "stickied"
- true -> nil
- end
- flair = if flair = Map.get(op, "link_flair_text") do
- "[#{flair}] "
- else
- ""
- end
+
+ nsfw =
+ if Map.get(op, "over_18") do
+ "[NSFW] "
+ else
+ ""
+ end
+
+ state =
+ cond do
+ Map.get(op, "hidden") -> "hidden"
+ Map.get(op, "archived") -> "archived"
+ Map.get(op, "locked") -> "locked"
+ Map.get(op, "quarantine") -> "quarantined"
+ Map.get(op, "removed_by") || Map.get(op, "removed_by_category") -> "removed"
+ Map.get(op, "banned_by") -> "banned"
+ Map.get(op, "pinned") -> "pinned"
+ Map.get(op, "stickied") -> "stickied"
+ true -> nil
+ end
+
+ flair =
+ if flair = Map.get(op, "link_flair_text") do
+ "[#{flair}] "
+ else
+ ""
+ end
+
title = "#{nsfw}#{sr}: #{flair}#{Map.get(op, "title")}"
state_str = if(state, do: "#{state}, ")
- content = "by u/#{Map.get(op, "author")} - #{state_str}#{up} up, #{down} down, #{comments} comments - #{self_str}"
+
+ content =
+ "by u/#{Map.get(op, "author")} - #{state_str}#{up} up, #{comments} comments - #{self_str}"
{:ok, [title, content]}
+
err ->
:error
end
end
-
end