summaryrefslogtreecommitdiff
path: root/lib/nola_plugins/wikipedia_plugin.ex
diff options
context:
space:
mode:
Diffstat (limited to 'lib/nola_plugins/wikipedia_plugin.ex')
-rw-r--r--lib/nola_plugins/wikipedia_plugin.ex90
1 files changed, 90 insertions, 0 deletions
diff --git a/lib/nola_plugins/wikipedia_plugin.ex b/lib/nola_plugins/wikipedia_plugin.ex
new file mode 100644
index 0000000..3202e13
--- /dev/null
+++ b/lib/nola_plugins/wikipedia_plugin.ex
@@ -0,0 +1,90 @@
+defmodule Nola.IRC.WikipediaPlugin do
+ require Logger
+
+ @moduledoc """
+ # wikipédia
+
+ * **!wp `<recherche>`**: retourne le premier résultat de la `<recherche>` Wikipedia
+ * **!wp**: un article Wikipédia au hasard
+ """
+
+ 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:wp", [plugin: __MODULE__])
+ {:ok, nil}
+ end
+
+ def handle_info({:irc, :trigger, _, message = %IRC.Message{trigger: %IRC.Trigger{type: :bang, args: []}}}, state) do
+ irc_random(message)
+ {:noreply, state}
+ end
+ def handle_info({:irc, :trigger, _, message = %IRC.Message{trigger: %IRC.Trigger{type: :bang, args: args}}}, state) do
+ irc_search(Enum.join(args, " "), message)
+ {:noreply, state}
+ end
+
+ def handle_info(info, state) do
+ {:noreply, state}
+ end
+
+ defp irc_search("", message), do: irc_random(message)
+ defp irc_search(query, message) do
+ params = %{
+ "action" => "query",
+ "list" => "search",
+ "srsearch" => String.strip(query),
+ "srlimit" => 1,
+ }
+ case query_wikipedia(params) do
+ {:ok, %{"query" => %{"search" => [item | _]}}} ->
+ title = item["title"]
+ url = "https://fr.wikipedia.org/wiki/" <> String.replace(title, " ", "_")
+ msg = "Wikipédia: #{title} — #{url}"
+ message.replyfun.(msg)
+ _ ->
+ nil
+ end
+ end
+
+ defp irc_random(message) do
+ params = %{
+ "action" => "query",
+ "generator" => "random",
+ "grnnamespace" => 0,
+ "prop" => "info"
+ }
+ case query_wikipedia(params) do
+ {:ok, %{"query" => %{"pages" => map = %{}}}} ->
+ [{_, item}] = Map.to_list(map)
+ title = item["title"]
+ url = "https://fr.wikipedia.org/wiki/" <> String.replace(title, " ", "_")
+ msg = "Wikipédia: #{title} — #{url}"
+ message.replyfun.(msg)
+ _ ->
+ nil
+ end
+ end
+
+ defp query_wikipedia(params) do
+ url = "https://fr.wikipedia.org/w/api.php"
+ params = params
+ |> Map.put("format", "json")
+ |> Map.put("utf8", "")
+
+ case HTTPoison.get(url, [], params: params) do
+ {:ok, %HTTPoison.Response{status_code: 200, body: body}} -> Jason.decode(body)
+ {:ok, %HTTPoison.Response{status_code: 400, body: body}} ->
+ Logger.error "Wikipedia HTTP 400: #{inspect body}"
+ {:error, "http 400"}
+ error ->
+ Logger.error "Wikipedia http error: #{inspect error}"
+ {:error, "http client error"}
+ end
+ end
+
+end