diff --git a/lib/zoeyscomputer_web/plugs/discord_handler.ex b/lib/zoeyscomputer_web/plugs/discord_handler.ex index 4aed511..f6a0b64 100644 --- a/lib/zoeyscomputer_web/plugs/discord_handler.ex +++ b/lib/zoeyscomputer_web/plugs/discord_handler.ex @@ -6,23 +6,44 @@ defmodule ZoeyscomputerWeb.DiscordHandler do def init(opts), do: opts - def call(%{path_info: ["images", _id]} = conn, _opts) do - user_agent = get_req_header(conn, "user-agent") - Logger.info("user-agent: #{user_agent}") + @discord_patterns [ + ~r/^Mozilla\/5\.0 \(compatible; Discordbot\//, + # Pattern for common Discord web client + ~r/^Mozilla\/5\.0.*Firefox\/.*$/ + ] - case user_agent do - ["Mozilla/5.0 (compatible; Discordbot/" <> _rest] -> handle_discord(conn) - _ -> conn + def call(%{path_info: ["images", _id | _]} = conn, _opts) do + user_agent = List.first(get_req_header(conn, "user-agent")) + request_id = Logger.metadata()[:request_id] + + Logger.info("Processing image request", + user_agent: user_agent, + request_id: request_id + ) + + cond do + is_discord_request?(user_agent) -> handle_discord(conn) + true -> conn end end def call(conn, _opts), do: conn + defp is_discord_request?(nil), do: false + + defp is_discord_request?(user_agent) do + Enum.any?(@discord_patterns, fn pattern -> + Regex.match?(pattern, user_agent) + end) + end + defp handle_discord(%{path_info: ["images", id]} = conn) do case download_from_s3("imgs", id) do {:ok, image_binary, content_type} -> conn |> put_resp_content_type(content_type) + # Optional: Add caching + |> put_resp_header("cache-control", "public, max-age=86400") |> send_resp(200, image_binary) |> halt()