summaryrefslogtreecommitdiff
path: root/lib/plugins/wolfram_alpha.ex
blob: f9d5a5ec7101324392a3e64cf1ae49335c57f8f6 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
defmodule Nola.Plugins.WolframAlpha 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__, [], name: __MODULE__)
  end

  def init(_) do
    {:ok, _} = Registry.register(Nola.PubSub, "trigger:wa", plugin: __MODULE__)
    {:ok, nil}
  end

  def handle_info(
        {:irc, :trigger, _, m = %Nola.Message{trigger: %Nola.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