defmodule Nola.IRC.WolframAlphaPlugin do use GenServer require Logger @moduledoc """ # wolfram alpha * **`!wa `** lance `` sur WolframAlpha """ def irc_doc, do: @moduledoc def start_link() do GenServer.start_link(__MODULE__, [], name: __MODULE__) end def init(_) do {:ok, _} = Registry.register(IRC.PubSub, "trigger:wa", [plugin: __MODULE__]) {:ok, nil} end def handle_info({:irc, :trigger, _, m = %IRC.Message{trigger: %IRC.Trigger{type: :bang, args: query}}}, state) do query = Enum.join(query, " ") params = %{ "appid" => Keyword.get(Application.get_env(:nola, :wolframalpha, []), :app_id, "NO_APP_ID"), "units" => "metric", "i" => query } url = "https://www.wolframalpha.com/input/?i=" <> URI.encode(query) case HTTPoison.get("http://api.wolframalpha.com/v1/result", [], [params: params]) do {:ok, %HTTPoison.Response{status_code: 200, body: body}} -> m.replyfun.(["#{query} -> #{body}", url]) {:ok, %HTTPoison.Response{status_code: code, body: body}} -> error = case {code, body} do {501, b} -> "input invalide: #{body}" {code, error} -> "erreur #{code}: #{body || ""}" end m.replyfun.("wa: #{error}") {:error, %HTTPoison.Error{reason: reason}} -> m.replyfun.("wa: erreur http: #{to_string(reason)}") _ -> m.replyfun.("wa: erreur http") end {:noreply, state} end end