diff options
author | Jordan Bracco <href@random.sh> | 2022-12-20 02:13:47 +0000 |
---|---|---|
committer | Jordan Bracco <href@random.sh> | 2022-12-20 19:29:41 +0100 |
commit | 70b9bba56f5319361ce5a7df5c489b9c0d6905ce (patch) | |
tree | f9b4438965f4c5e3e1f3a6129904cbb9a37047f2 /lib/nola_plugins/finance_plugin.ex | |
parent | Update repo URL, refs T77. (diff) |
Rename to Nola
Summary:
Nola rename cont. pt. 2. Refs T77.
`find lib -name "*.ex" -type f | xargs sed -i '' 's/LSG/Nola/g'`
Nola rename, cont. pt. 3. Refs T77.
`s/:lsg/:nola/g`
Nola rename, cont. pt. 4. Refs T77.
Nola rename, cont. pt. 5. Refs T77. Configs.
find config -type f | xargs sed -i '' 's/LSG/Nola/g'
find config -type f | xargs sed -i '' 's/lsg/nola/g'
BREAKING CHANGE: Config keys switch from `:lsg` to `:nola`
Nola rename, the end. pt 6. Refs T77.
Nola rename: The Big Move, Refs T77
Update repo URL, refs T77.
Nola rename: Nola.Plugins, refs T77
Maniphest Tasks: T77
Differential Revision: https://phab.random.sh/D3
Diffstat (limited to 'lib/nola_plugins/finance_plugin.ex')
-rw-r--r-- | lib/nola_plugins/finance_plugin.ex | 190 |
1 files changed, 0 insertions, 190 deletions
diff --git a/lib/nola_plugins/finance_plugin.ex b/lib/nola_plugins/finance_plugin.ex deleted file mode 100644 index 16d06ee..0000000 --- a/lib/nola_plugins/finance_plugin.ex +++ /dev/null @@ -1,190 +0,0 @@ -defmodule Nola.IRC.FinancePlugin do - require Logger - - @moduledoc """ - # finance - - Données de [alphavantage.co](https://alphavantage.co). - - ## forex / monnaies / crypto-monnaies - - * **`!forex <MONNAIE1> [MONNAIE2]`**: taux de change entre deux monnaies. - * **`!forex <MONTANT> <MONNAIE1> <MONNAIE2>`**: converti `montant` entre deux monnaies - * **`?currency <recherche>`**: recherche une monnaie - - Utiliser le symbole des monnaies (EUR, USD, ...). - - ## bourses - - * **`!stocks <SYMBOLE>`** - * **`?stocks <recherche>`** cherche un symbole - - Pour les symboles non-US, ajouter le suffixe (RNO Paris: RNO.PAR). - - """ - - @currency_list "http://www.alphavantage.co/physical_currency_list/" - @crypto_list "http://www.alphavantage.co/digital_currency_list/" - - HTTPoison.start() - load_currency = fn(url) -> - resp = HTTPoison.get!(url) - resp.body - |> String.strip() - |> String.split("\n") - |> Enum.drop(1) - |> Enum.map(fn(line) -> - [symbol, name] = line - |> String.strip() - |> String.split(",", parts: 2) - {symbol, name} - end) - |> Enum.into(Map.new) - end - fiat = load_currency.(@currency_list) - crypto = load_currency.(@crypto_list) - @currencies Map.merge(fiat, crypto) - - def irc_doc, do: @moduledoc - def start_link() do - GenServer.start_link(__MODULE__, [], name: __MODULE__) - end - - def init([]) do - regopts = [plugin: __MODULE__] - {:ok, _} = Registry.register(IRC.PubSub, "trigger:forex", regopts) - {:ok, _} = Registry.register(IRC.PubSub, "trigger:currency", regopts) - {:ok, _} = Registry.register(IRC.PubSub, "trigger:stocks", regopts) - {:ok, nil} - end - - - def handle_info({:irc, :trigger, "stocks", message = %{trigger: %{type: :query, args: args = search}}}, state) do - search = Enum.join(search, "%20") - url = "https://www.alphavantage.co/query?function=SYMBOL_SEARCH&keywords=#{search}&apikey=#{api_key()}" - case HTTPoison.get(url) do - {:ok, %HTTPoison.Response{status_code: 200, body: data}} -> - data = Poison.decode!(data) - if error = Map.get(data, "Error Message") do - Logger.error("AlphaVantage API invalid request #{url} - #{inspect error}") - message.replyfun.("stocks: requête invalide") - else - items = for item <- Map.get(data, "bestMatches") do - symbol = Map.get(item, "1. symbol") - name = Map.get(item, "2. name") - type = Map.get(item, "3. type") - region = Map.get(item, "4. region") - currency = Map.get(item, "8. currency") - "#{symbol}: #{name} (#{region}; #{currency}; #{type})" - end - |> Enum.join(", ") - items = if items == "" do - "no results!" - else - items - end - message.replyfun.(items) - end - {:ok, resp = %HTTPoison.Response{status_code: code}} -> - Logger.error "AlphaVantage API error: #{code} #{url} - #{inspect resp}" - message.replyfun.("forex: erreur (api #{code})") - {:error, %HTTPoison.Error{reason: error}} -> - Logger.error "AlphaVantage HTTP error: #{inspect error}" - message.replyfun.("forex: erreur (http #{inspect error})") - end - {:noreply, state} - end - - def handle_info({:irc, :trigger, "stocks", message = %{trigger: %{type: :bang, args: args = [symbol]}}}, state) do - url = "https://www.alphavantage.co/query?function=GLOBAL_QUOTE&symbol=#{symbol}&apikey=#{api_key()}" - case HTTPoison.get(url) do - {:ok, %HTTPoison.Response{status_code: 200, body: data}} -> - data = Poison.decode!(data) - if error = Map.get(data, "Error Message") do - Logger.error("AlphaVantage API invalid request #{url} - #{inspect error}") - message.replyfun.("stocks: requête invalide") - else - data = Map.get(data, "Global Quote") - open = Map.get(data, "02. open") - high = Map.get(data, "03. high") - low = Map.get(data, "04. low") - price = Map.get(data, "05. price") - volume = Map.get(data, "06. volume") - prev_close = Map.get(data, "08. previous close") - change = Map.get(data, "09. change") - change_pct = Map.get(data, "10. change percent") - - msg = "#{symbol}: #{price} #{change} [#{change_pct}] (high: #{high}, low: #{low}, open: #{open}, prev close: #{prev_close}) (volume: #{volume})" - message.replyfun.(msg) - end - {:ok, resp = %HTTPoison.Response{status_code: code}} -> - Logger.error "AlphaVantage API error: #{code} #{url} - #{inspect resp}" - message.replyfun.("stocks: erreur (api #{code})") - {:error, %HTTPoison.Error{reason: error}} -> - Logger.error "AlphaVantage HTTP error: #{inspect error}" - message.replyfun.("stocks: erreur (http #{inspect error})") - end - {:noreply, state} - end - - - def handle_info({:irc, :trigger, "forex", message = %{trigger: %{type: :bang, args: args = [_ | _]}}}, state) do - {amount, from, to} = case args do - [amount, from, to] -> - {amount, _} = Float.parse(amount) - {amount, from, to} - [from, to] -> - {1, from, to} - [from] -> - {1, from, "EUR"} - end - url = "https://www.alphavantage.co/query?function=CURRENCY_EXCHANGE_RATE&from_currency=#{from}&to_currency=#{to}&apikey=#{api_key()}" - case HTTPoison.get(url) do - {:ok, %HTTPoison.Response{status_code: 200, body: data}} -> - data = Poison.decode!(data) - if error = Map.get(data, "Error Message") do - Logger.error("AlphaVantage API invalid request #{url} - #{inspect error}") - message.replyfun.("forex: requête invalide") - else - data = Map.get(data, "Realtime Currency Exchange Rate") - from_name = Map.get(data, "2. From_Currency Name") - to_name = Map.get(data, "4. To_Currency Name") - rate = Map.get(data, "5. Exchange Rate") - {rate, _} = Float.parse(rate) - value = amount*rate - message.replyfun.("#{amount} #{from} (#{from_name}) -> #{value} #{to} (#{to_name}) (#{rate})") - end - {:ok, resp = %HTTPoison.Response{status_code: code}} -> - Logger.error "AlphaVantage API error: #{code} #{url} - #{inspect resp}" - message.replyfun.("forex: erreur (api #{code})") - {:error, %HTTPoison.Error{reason: error}} -> - Logger.error "AlphaVantage HTTP error: #{inspect error}" - message.replyfun.("forex: erreur (http #{inspect error})") - end - {:noreply, state} - end - - def handle_info({:irc, :trigger, "currency", message = %{trigger: %{type: :query, args: args = search}}}, state) do - search = Enum.join(search, " ") - results = Enum.filter(@currencies, fn({symbol, name}) -> - String.contains?(String.downcase(name), String.downcase(search)) || String.contains?(String.downcase(symbol), String.downcase(search)) - end) - |> Enum.map(fn({symbol, name}) -> - "#{symbol}: #{name}" - end) - |> Enum.join(", ") - - if results == "" do - message.replyfun.("no results!") - else - message.replyfun.(results) - end - {:noreply, state} - end - - defp api_key() do - Application.get_env(:nola, :alphavantage, []) - |> Keyword.get(:api_key, "demo") - end - -end |