diff options
Diffstat (limited to '')
-rw-r--r-- | lib/lsg_irc/wolfram_alpha_plugin.ex | 47 |
1 files changed, 47 insertions, 0 deletions
diff --git a/lib/lsg_irc/wolfram_alpha_plugin.ex b/lib/lsg_irc/wolfram_alpha_plugin.ex new file mode 100644 index 0000000..b34db56 --- /dev/null +++ b/lib/lsg_irc/wolfram_alpha_plugin.ex @@ -0,0 +1,47 @@ +defmodule LSG.IRC.WolframAlphaPlugin do + use GenServer + require Logger + + @moduledoc """ + # wolfram alpha + + * **`!wa <requête>`** lance `<requête>` sur WolframAlpha + """ + + def irc_doc, do: @moduledoc + + def start_link() do + GenServer.start_link(__MODULE__, []) + end + + def init(_) do + {:ok, _} = Registry.register(IRC.PubSub, "trigger:wa", []) + {: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(:lsg, :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 |