summaryrefslogtreecommitdiff
path: root/lib/lsg_irc/untappd_plugin.ex
diff options
context:
space:
mode:
Diffstat (limited to 'lib/lsg_irc/untappd_plugin.ex')
-rw-r--r--lib/lsg_irc/untappd_plugin.ex66
1 files changed, 66 insertions, 0 deletions
diff --git a/lib/lsg_irc/untappd_plugin.ex b/lib/lsg_irc/untappd_plugin.ex
new file mode 100644
index 0000000..02b22e3
--- /dev/null
+++ b/lib/lsg_irc/untappd_plugin.ex
@@ -0,0 +1,66 @@
+defmodule LSG.IRC.UntappdPlugin do
+
+ def irc_doc() do
+ """
+ # [Untappd](https://untappd.com)
+
+ * `!beer <beer name>` Information about the first beer matching `<beer name>`
+ * `?beer <beer name>` List the 10 firsts beer matching `<beer name>`
+
+ _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", [])
+ {: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