summaryrefslogblamecommitdiff
path: root/lib/nola_plugins/bourosama_plugin.ex
blob: dd05144cf7a68d6c7986d0ad35e30ffe72b219ce (plain) (tree)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
                                      













                                                                                 
                                                          




                                                                                                                                                                                                                               


                                                                       

































                                                                                                                                        
defmodule Nola.IRC.BoursoramaPlugin 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