summaryrefslogblamecommitdiff
path: root/lib/untappd.ex
blob: 1f78376d017bbf6a3fbf06e2392f0a72ca093442 (plain) (tree)





























































































                                                                                                                       
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