summaryrefslogtreecommitdiff
path: root/lib/untappd.ex
diff options
context:
space:
mode:
Diffstat (limited to 'lib/untappd.ex')
-rw-r--r--lib/untappd.ex94
1 files changed, 94 insertions, 0 deletions
diff --git a/lib/untappd.ex b/lib/untappd.ex
new file mode 100644
index 0000000..1f78376
--- /dev/null
+++ b/lib/untappd.ex
@@ -0,0 +1,94 @@
+defmodule Untappd do
+
+ @env Mix.env
+ @version Mix.Project.config[:version]
+ require Logger
+
+ def auth_url() do
+ client_id = Keyword.get(env(), :client_id)
+ url = LSGWeb.Router.Helpers.untappd_callback_url(LSGWeb.Endpoint, :callback)
+ "https://untappd.com/oauth/authenticate/?client_id=#{client_id}&response_type=code&redirect_url=#{URI.encode(url)}"
+ end
+
+ def auth_callback(code) do
+ client_id = Keyword.get(env(), :client_id)
+ client_secret = Keyword.get(env(), :client_secret)
+ url = LSGWeb.Router.Helpers.untappd_callback_url(LSGWeb.Endpoint, :callback)
+ params = %{
+ "client_id" => client_id,
+ "client_secret" => client_secret,
+ "response_type" => code,
+ "redirect_url" => url,
+ "code" => code
+ }
+ case HTTPoison.get("https://untappd.com/oauth/authorize", headers(), params: params) do
+ {:ok, %HTTPoison.Response{status_code: 200, body: body}} ->
+ json = Poison.decode!(body)
+ {:ok, get_in(json, ["response", "access_token"])}
+ error ->
+ Logger.error("Untappd auth callback failed: #{inspect error}")
+ :error
+ end
+ end
+
+ def maybe_checkin(account, beer_id) do
+ if token = IRC.Account.get_meta(account, "untappd-token") do
+ checkin(token, beer_id)
+ else
+ {:error, :no_token}
+ end
+ end
+
+ def checkin(token, beer_id) do
+ params = get_params(token: token)
+ |> Map.put("timezone", "CEST")
+ |> Map.put("bid", beer_id)
+ form_params = params
+ |> Enum.into([])
+ case HTTPoison.post("https://api.untappd.com/v4/checkin/add", {:form, form_params}, headers(), params: params) do
+ {:ok, %HTTPoison.Response{status_code: 200, body: body}} ->
+ body = Jason.decode!(body)
+ |> Map.get("response")
+ {:ok, body}
+ {:ok, resp = %HTTPoison.Response{status_code: code, body: body}} ->
+ Logger.warn "Untappd checkin error: #{inspect resp}"
+ {:error, {:http_error, code}}
+ {:error, error} -> {:error, {:http_error, error}}
+ end
+ end
+
+ def search_beer(query, params \\ []) do
+ params = get_params(params)
+ |> Map.put("q", query)
+ |> Map.put("limit", 10)
+ #|> Map.put("sort", "name")
+ case HTTPoison.get("https://api.untappd.com/v4/search/beer", headers(), params: params) do
+ {:ok, %HTTPoison.Response{status_code: 200, body: body}} ->
+ {:ok, Jason.decode!(body)}
+ error ->
+ Logger.error("Untappd search error: #{inspect error}")
+ end
+ end
+
+ def get_params(params) do
+ auth = %{"client_id" => Keyword.get(env(), :client_id), "client_secret" => Keyword.get(env(), :client_secret)}
+ if token = Keyword.get(params, :token) do
+ Map.put(auth, "access_token", token)
+ else
+ auth
+ end
+ end
+
+ def headers(extra \\ []) do
+ client_id = Keyword.get(env(), :client_id)
+ extra
+ ++ [
+ {"user-agent", "dmzbot (#{client_id}; #{@version}-#{@env})"}
+ ]
+ end
+
+ def env() do
+ Application.get_env(:lsg, :untappd)
+ end
+
+end