summaryrefslogtreecommitdiff
path: root/lib/nola_plugins/boursorama.ex
blob: f872584b5be66f31937ef9d02dbfecdfc80619ab (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.Boursorama do

  def irc_doc() do
    """
    # bourses

    Un peu comme [finance](#finance), mais en un peu mieux, et un peu moins bien.

    Source: [boursorama.com](https://boursorama.com)

    * **!caca40** affiche l'état du cac40
    """
  end

  def start_link() do
    GenServer.start_link(__MODULE__, [], name: __MODULE__)
  end

  @cac40_url "https://www.boursorama.com/bourse/actions/palmares/france/?france_filter%5Bmarket%5D=1rPCAC&france_filter%5Bsector%5D=&france_filter%5Bvariation%5D=50002&france_filter%5Bperiod%5D=1&france_filter%5Bfilter%5D="

  def init(_) do
    regopts = [plugin: __MODULE__]
    {:ok, _} = Registry.register(IRC.PubSub, "trigger:cac40", regopts)
    {:ok, _} = Registry.register(IRC.PubSub, "trigger:caca40", regopts)
    {:ok, nil}
  end

  def handle_info({:irc, :trigger, cac, m = %IRC.Message{trigger: %IRC.Trigger{type: :bang}}}, state) when cac in ["cac40", "caca40"] do
    case HTTPoison.get(@cac40_url, [], []) do
      {:ok, %HTTPoison.Response{status_code: 200, body: body}} ->
        html = Floki.parse(body)
        board = Floki.find(body, "div.c-tradingboard")

        cac40 = Floki.find(board, ".c-tradingboard__main > .c-tradingboard__infos")
        instrument = Floki.find(cac40, ".c-instrument")
        last = Floki.find(instrument, "span[data-ist-last]")
               |> Floki.text()
               |> String.replace(" ", "")
        variation = Floki.find(instrument, "span[data-ist-variation]")
                    |> Floki.text()

        sign = case variation do
          "-"<>_ -> "▼"
          "+" -> "▲"
          _ -> ""
        end

        m.replyfun.("caca40: #{sign} #{variation} #{last}")

      {:error, %HTTPoison.Response{status_code: code}} ->
        m.replyfun.("caca40: erreur http #{code}")

      _ ->
        m.replyfun.("caca40: erreur http")
    end
  end

end