Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Fix Discord integration #531

Merged
merged 3 commits into from Nov 16, 2021
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
6 changes: 3 additions & 3 deletions lib/ret/discord_client.ex
Expand Up @@ -31,15 +31,15 @@ defmodule Ret.DiscordClient do
}

"#{@discord_api_base}/oauth2/token"
|> Ret.HttpUtils.retry_post_until_success(body, [{"content-type", "application/x-www-form-urlencoded"}])
|> Ret.HttpUtils.retry_post_until_success(body, headers: [{"content-type", "application/x-www-form-urlencoded"}])
|> Map.get(:body)
|> Poison.decode!()
|> Map.get("access_token")
end

def fetch_user_info(access_token) do
"#{@discord_api_base}/users/@me"
|> Ret.HttpUtils.retry_get_until_success([{"authorization", "Bearer #{access_token}"}])
|> Ret.HttpUtils.retry_get_until_success(headers: [{"authorization", "Bearer #{access_token}"}])
|> Map.get(:body)
|> Poison.decode!()
end
Expand Down Expand Up @@ -84,7 +84,7 @@ defmodule Ret.DiscordClient do

def api_request(path) do
"#{@discord_api_base}#{path}"
|> Ret.HttpUtils.retry_get_until_success([{"authorization", "Bot #{module_config(:bot_token)}"}])
|> Ret.HttpUtils.retry_get_until_success(headers: [{"authorization", "Bot #{module_config(:bot_token)}"}])
|> Map.get(:body)
|> Poison.decode!()
end
Expand Down
49 changes: 32 additions & 17 deletions lib/ret/http_utils.ex
@@ -1,31 +1,46 @@
defmodule Ret.HttpUtils do
use Retry

def retry_head_until_success(url, headers \\ [], cap_ms \\ 5_000, expiry_ms \\ 10_000),
do: retry_until_success(:head, url, "", headers, cap_ms, expiry_ms)
def retry_head_until_success(url, options \\ []),
do: retry_until_success(:head, url, options)

def retry_get_until_success(url, headers \\ [], cap_ms \\ 5_000, expiry_ms \\ 10_000),
do: retry_until_success(:get, url, "", headers, cap_ms, expiry_ms)
def retry_get_until_success(url, options \\ []),
do: retry_until_success(:get, url, options)

def retry_post_until_success(url, body, headers \\ [], cap_ms \\ 5_000, expiry_ms \\ 10_000),
do: retry_until_success(:post, url, body, headers, cap_ms, expiry_ms)
def retry_post_until_success(url, body, options \\ []),
do: retry_until_success(:post, url, Keyword.merge(options, body: body))

def retry_put_until_success(url, body, headers \\ [], cap_ms \\ 5_000, expiry_ms \\ 10_000),
do: retry_until_success(:put, url, body, headers, cap_ms, expiry_ms)
def retry_put_until_success(url, body, options \\ []),
do: retry_until_success(:put, url, Keyword.merge(options, body: body))
brianpeiris marked this conversation as resolved.
Show resolved Hide resolved

def retry_head_then_get_until_success(url, headers \\ [], cap_ms \\ 5_000, expiry_ms \\ 10_000) do
case url |> retry_head_until_success(headers, cap_ms, expiry_ms) do
def retry_head_then_get_until_success(url, options \\ []) do
case url |> retry_head_until_success(options) do
:error ->
url |> retry_get_until_success(headers, cap_ms, expiry_ms)
url |> retry_get_until_success(options)

res ->
res
end
end

def retry_until_success(verb, url, body \\ "", headers \\ [], cap_ms \\ 5_000, expiry_ms \\ 10_000) do
defp retry_until_success(verb, url, options) do
default_options = [
body: "",
headers: [],
cap_ms: 5_000,
expiry_ms: 10_000,
append_browser_ua: false
brianpeiris marked this conversation as resolved.
Show resolved Hide resolved
]

options = Keyword.merge(default_options, options)

headers =
headers ++ [{"User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:84.0) Gecko/20100101 Firefox/84.0"}]
if options[:append_browser_ua] do
options[:headers] ++
[{"User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:84.0) Gecko/20100101 Firefox/84.0"}]
else
options[:headers]
end

hackney_options =
if module_config(:insecure_ssl) == true do
Expand All @@ -34,11 +49,11 @@ defmodule Ret.HttpUtils do
[]
end

retry with: exponential_backoff() |> randomize |> cap(cap_ms) |> expiry(expiry_ms) do
case HTTPoison.request(verb, url, body, headers,
retry with: exponential_backoff() |> randomize |> cap(options[:cap_ms]) |> expiry(options[:expiry_ms]) do
case HTTPoison.request(verb, url, options[:body], headers,
follow_redirect: true,
timeout: cap_ms,
recv_timeout: cap_ms,
timeout: options[:cap_ms],
recv_timeout: options[:cap_ms],
hackney: hackney_options
) do
{:ok, %HTTPoison.Response{status_code: status_code} = resp}
Expand Down
12 changes: 8 additions & 4 deletions lib/ret/media_resolver.ex
Expand Up @@ -317,7 +317,9 @@ defmodule Ret.MediaResolver do
# Crawl og tags for hubs rooms + scenes
is_local_url = host === RetWeb.Endpoint.host()

case uri |> URI.to_string() |> retry_head_then_get_until_success([{"Range", "bytes=0-32768"}]) do
case uri
|> URI.to_string()
|> retry_head_then_get_until_success(headers: [{"Range", "bytes=0-32768"}], append_browser_ua: true) do
:error ->
:error

Expand Down Expand Up @@ -372,7 +374,9 @@ defmodule Ret.MediaResolver do
end

defp opengraph_result_for_uri(uri) do
case uri |> URI.to_string() |> retry_get_until_success([{"Range", "bytes=0-32768"}]) do
case uri
|> URI.to_string()
|> retry_get_until_success(headers: [{"Range", "bytes=0-32768"}], append_browser_ua: true) do
:error ->
:error

Expand Down Expand Up @@ -414,7 +418,7 @@ defmodule Ret.MediaResolver do

defp get_sketchfab_model_zip_url(%{model_id: model_id, api_key: api_key}) do
case "https://api.sketchfab.com/v3/models/#{model_id}/download"
|> retry_get_until_success([{"Authorization", "Token #{api_key}"}], 15_000, 15_000) do
|> retry_get_until_success(headers: [{"Authorization", "Token #{api_key}"}], cap_ms: 15_000, expiry_ms: 15_000) do
:error ->
{:error, "Failed to get sketchfab metadata"}

Expand Down Expand Up @@ -493,7 +497,7 @@ defmodule Ret.MediaResolver do
with headers when is_list(headers) <- get_imgur_headers() do
image_data =
imgur_api_url
|> retry_get_until_success(headers)
|> retry_get_until_success(headers: headers)
|> Map.get(:body)
|> Poison.decode!()
|> Kernel.get_in(["data", "images"])
Expand Down
13 changes: 7 additions & 6 deletions lib/ret/media_search.ex
Expand Up @@ -272,7 +272,8 @@ defmodule Ret.MediaSearch do
offset: cursor || 0
)

res = "https://api.twitch.tv/helix/streams?#{query}" |> retry_get_until_success([{"Client-ID", client_id}])
res =
"https://api.twitch.tv/helix/streams?#{query}" |> retry_get_until_success(headers: [{"Client-ID", client_id}])

case res do
:error ->
Expand Down Expand Up @@ -308,9 +309,9 @@ defmodule Ret.MediaSearch do
res =
retry_get_until_success(
"https://api.sketchfab.com/v3/search?#{query}",
[{"Authorization", "Token #{api_key}"}],
15_000,
15_000
headers: [{"Authorization", "Token #{api_key}"}],
cap_ms: 15_000,
expiry_ms: 15_000
)

case res do
Expand Down Expand Up @@ -343,7 +344,7 @@ defmodule Ret.MediaSearch do

res =
"https://westus.api.cognitive.microsoft.com/bing/v7.0/videos/trending?#{query}"
|> retry_get_until_success([{"Ocp-Apim-Subscription-Key", api_key}])
|> retry_get_until_success(headers: [{"Ocp-Apim-Subscription-Key", api_key}])

case res do
:error ->
Expand Down Expand Up @@ -390,7 +391,7 @@ defmodule Ret.MediaSearch do

res =
"https://westus.api.cognitive.microsoft.com/bing/v7.0/#{type}/search?#{query}"
|> retry_get_until_success([{"Ocp-Apim-Subscription-Key", api_key}])
|> retry_get_until_success(headers: [{"Ocp-Apim-Subscription-Key", api_key}])

case res do
:error ->
Expand Down
4 changes: 2 additions & 2 deletions lib/ret/slack_client.ex
Expand Up @@ -27,7 +27,7 @@ defmodule Ret.SlackClient do

%{"authed_user" => authed_user} =
"#{@slack_api_base}/api/oauth.v2.access"
|> Ret.HttpUtils.retry_post_until_success(body, [{"content-type", "application/x-www-form-urlencoded"}])
|> Ret.HttpUtils.retry_post_until_success(body, headers: [{"content-type", "application/x-www-form-urlencoded"}])
|> Map.get(:body)
|> Poison.decode!()

Expand Down Expand Up @@ -114,7 +114,7 @@ defmodule Ret.SlackClient do

def api_request(path) do
"#{@slack_api_base}#{path}"
|> Ret.HttpUtils.retry_get_until_success([{"authorization", "Bearer #{module_config(:bot_token)}"}])
|> Ret.HttpUtils.retry_get_until_success(headers: [{"authorization", "Bearer #{module_config(:bot_token)}"}])
|> Map.get(:body)
|> Poison.decode!()
end
Expand Down
7 changes: 3 additions & 4 deletions lib/ret/speelycaptor.ex
Expand Up @@ -21,7 +21,7 @@ defmodule Ret.Speelycaptor do
def convert(_path, _content_type), do: nil

defp upload_and_convert_mp4(endpoint, upload_url, path, key) do
case retry_put_until_success(upload_url, {:file, path}, [], 30_000, 120_000) do
case retry_put_until_success(upload_url, {:file, path}, cap_ms: 30_000, expiry_ms: 120_000) do
%HTTPoison.Response{} ->
query = %{
key: key,
Expand All @@ -30,9 +30,8 @@ defmodule Ret.Speelycaptor do

case retry_get_until_success(
"#{endpoint}/convert?#{URI.encode_query(query)}",
[],
30_000,
120_000
cap_ms: 30_000,
expiry_ms: 120_000
) do
%HTTPoison.Response{body: body} ->
url = body |> Poison.decode!() |> Map.get("url")
Expand Down
6 changes: 3 additions & 3 deletions lib/ret/twitter_client.ex
Expand Up @@ -133,9 +133,9 @@ defmodule Ret.TwitterClient do
retry_post_until_success(
url,
encoded_params,
[{"content-type", "application/x-www-form-urlencoded"}],
cap_ms,
expiry_ms
headers: [{"content-type", "application/x-www-form-urlencoded"}],
cap_ms: cap_ms,
expiry_ms: expiry_ms
)
|> Map.get(:body)
|> to_string
Expand Down