defmodule Nola.IRC.UntappdPlugin do def irc_doc() do """ # [Untappd](https://untappd.com) * `!beer ` Information about the first beer matching `` * `?beer ` List the 10 firsts beer matching `` _Note_: The best way to search is always "Brewery Name + Beer Name", such as "Dogfish 60 Minute". Link your Untappd account to the bot (for automated checkins on [alcoolog](#alcoolog), ...) with the `enable-untappd` command, in private. """ end def start_link() do GenServer.start_link(__MODULE__, [], name: __MODULE__) end def init(_) do {:ok, _} = Registry.register(IRC.PubSub, "trigger:beer", [plugin: __MODULE__]) {:ok, %{}} end def handle_info({:irc, :trigger, _, m = %IRC.Message{trigger: %{type: :bang, args: args}}}, state) do case Untappd.search_beer(Enum.join(args, " "), limit: 1) do {:ok, %{"response" => %{"beers" => %{"count" => count, "items" => [result | _]}}}} -> %{"beer" => beer, "brewery" => brewery} = result description = Map.get(beer, "beer_description") |> String.replace("\n", " ") |> String.replace("\r", " ") |> String.trim() beer_s = "#{Map.get(brewery, "brewery_name")}: #{Map.get(beer, "beer_name")} - #{Map.get(beer, "beer_abv")}°" city = get_in(brewery, ["location", "brewery_city"]) location = [Map.get(brewery, "brewery_type"), city, Map.get(brewery, "country_name")] |> Enum.filter(fn(x) -> x end) |> Enum.join(", ") extra = "#{Map.get(beer, "beer_style")} - IBU: #{Map.get(beer, "beer_ibu")} - #{location}" m.replyfun.([beer_s, extra, description]) err -> m.replyfun.("Error") end {:noreply, state} end def handle_info({:irc, :trigger, _, m = %IRC.Message{trigger: %{type: :query, args: args}}}, state) do case Untappd.search_beer(Enum.join(args, " ")) do {:ok, %{"response" => %{"beers" => %{"count" => count, "items" => results}}}} -> beers = for %{"beer" => beer, "brewery" => brewery} <- results do "#{Map.get(brewery, "brewery_name")}: #{Map.get(beer, "beer_name")} - #{Map.get(beer, "beer_abv")}°" end |> Enum.intersperse(", ") |> Enum.join("") m.replyfun.("#{count}. #{beers}") err -> m.replyfun.("Error") end {:noreply, state} end def handle_info(info, state) do {:noreply, state} end end