diff options
Diffstat (limited to 'lib/plugins/link/reddit.ex')
-rw-r--r-- | lib/plugins/link/reddit.ex | 157 |
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 |