defmodule LSG.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