diff --git a/lib/plugins/link/quirks.ex b/lib/plugins/link/quirks.ex index af259a2..5acfdac 100644 --- a/lib/plugins/link/quirks.ex +++ b/lib/plugins/link/quirks.ex @@ -1,26 +1,32 @@ defmodule Nola.Plugins.Link.Quirks do # def uri(%URI{host: "x.com"} = uri) do # %URI{uri | host: "vxtwitter.com"} # end + # reddit: new reddit don't have titles for pages we don't handle in the reddit module + # fallback to old. which has nice titles + def uri(%URI{host: reddit} = uri) when reddit in ["www.reddit.com", "reddit.com"] do + %URI{uri | host: "old.reddit.com"} + end + def uri(url) do url end def user_agent(host) when host in [ "x.com", "vxtwitter.com", "fxtwitter.com", "instagram.com", "facebook.com", "xnstagram.com", "ddinstagram.com" ] do "TelegramBot (like TwitterBot)" end def user_agent(_host) do "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/137.0.0.0 Safari/537.36" end end diff --git a/lib/plugins/link/reddit.ex b/lib/plugins/link/reddit.ex index bd38084..2a6527d 100644 --- a/lib/plugins/link/reddit.ex +++ b/lib/plugins/link/reddit.ex @@ -1,152 +1,156 @@ defmodule Nola.Plugins.Link.Reddit do @behaviour Nola.Plugins.Link @impl true def match(uri = %URI{host: "reddit.com", path: path}, _) 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}} _ -> false end end def match(uri = %URI{host: host, path: path}, opts) do if String.ends_with?(host, ".reddit.com") do match(%URI{uri | host: "reddit.com"}, opts) else false end end @impl true def post_match(_, _, _, _), do: false @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" 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) 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_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 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, #{comments} comments - #{self_str}" {:ok, [title, content]} err -> :error end end end