diff options
author | Jordan Bracco <href@random.sh> | 2022-12-20 00:21:54 +0000 |
---|---|---|
committer | Jordan Bracco <href@random.sh> | 2022-12-20 19:29:41 +0100 |
commit | 2d83df8b32bff7f0028923bb5b64dc0b55f20d03 (patch) | |
tree | 1207e67b5b15f540963db05e7be89f3ca950e724 /lib/nola_plugins/radio_france_plugin.ex | |
parent | Nola rename, the end. pt 6. Refs T77. (diff) |
Nola rename: The Big Move, Refs T77
Diffstat (limited to 'lib/nola_plugins/radio_france_plugin.ex')
-rw-r--r-- | lib/nola_plugins/radio_france_plugin.ex | 133 |
1 files changed, 133 insertions, 0 deletions
diff --git a/lib/nola_plugins/radio_france_plugin.ex b/lib/nola_plugins/radio_france_plugin.ex new file mode 100644 index 0000000..c2e966f --- /dev/null +++ b/lib/nola_plugins/radio_france_plugin.ex @@ -0,0 +1,133 @@ +defmodule Nola.IRC.RadioFrancePlugin do + require Logger + + def irc_doc() do + """ + # radio france + + Qu'est ce qu'on écoute sur radio france ? + + * **!radiofrance `[station]`, !rf `[station]`** + * **!fip, !inter, !info, !bleu, !culture, !musique, !fip `[sous-station]`, !bleu `[région]`** + """ + end + + def start_link() do + GenServer.start_link(__MODULE__, [], name: __MODULE__) + end + + @trigger "radiofrance" + @shortcuts ~w(fip inter info bleu culture musique) + + def init(_) do + regopts = [plugin: __MODULE__] + {:ok, _} = Registry.register(IRC.PubSub, "trigger:radiofrance", regopts) + {:ok, _} = Registry.register(IRC.PubSub, "trigger:rf", regopts) + for s <- @shortcuts do + {:ok, _} = Registry.register(IRC.PubSub, "trigger:#{s}", regopts) + end + {:ok, nil} + end + + def handle_info({:irc, :trigger, "rf", m = %IRC.Message{trigger: %IRC.Trigger{type: :bang}}}, state) do + handle_info({:irc, :trigger, "radiofrance", m}, state) + end + + def handle_info({:irc, :trigger, @trigger, m = %IRC.Message{trigger: %IRC.Trigger{type: :bang, args: []}}}, state) do + m.replyfun.("radiofrance: précisez la station!") + {:noreply, state} + end + + def handle_info({:irc, :trigger, @trigger, m = %IRC.Message{trigger: %IRC.Trigger{type: :bang, args: args}}}, state) do + now(args_to_station(args), m) + {:noreply, state} + end + + def handle_info({:irc, :trigger, trigger, m = %IRC.Message{trigger: %IRC.Trigger{type: :bang, args: args}}}, state) when trigger in @shortcuts do + now(args_to_station([trigger | args]), m) + {:noreply, state} + end + + defp args_to_station(args) do + args + |> Enum.map(&unalias/1) + |> Enum.map(&String.downcase/1) + |> Enum.join("_") + end + + def handle_info(info, state) do + Logger.debug("unhandled info: #{inspect info}") + {:noreply, state} + end + + defp now(station, m) when is_binary(station) do + case HTTPoison.get(np_url(station), [], []) do + {:ok, %HTTPoison.Response{status_code: 200, body: body}} -> + json = Poison.decode!(body) + song? = !!get_in(json, ["now", "song"]) + station = reformat_station_name(get_in(json, ["now", "stationName"])) + now_title = get_in(json, ["now", "firstLine", "title"]) + now_subtitle = get_in(json, ["now", "secondLine", "title"]) + next_title = get_in(json, ["next", "firstLine", "title"]) + next_subtitle = get_in(json, ["next", "secondLine", "title"]) + next_song? = !!get_in(json, ["next", "song"]) + next_at = get_in(json, ["next", "startTime"]) + + now = format_title(song?, now_title, now_subtitle) + prefix = if song?, do: "🎶", else: "🎤" + m.replyfun.("#{prefix} #{station}: #{now}") + + next = format_title(song?, next_title, next_subtitle) + if next do + next_prefix = if next_at do + next_date = DateTime.from_unix!(next_at) + in_seconds = DateTime.diff(next_date, DateTime.utc_now()) + in_minutes = ceil(in_seconds / 60) + if in_minutes >= 5 do + if next_song?, do: "#{in_minutes}m 🔜", else: "dans #{in_minutes} minutes:" + else + if next_song?, do: "🔜", else: "suivi de:" + end + else + if next_song?, do: "🔜", else: "à suivre:" + end + m.replyfun.("#{next_prefix} #{next}") + end + + {:error, %HTTPoison.Response{status_code: 404}} -> + m.replyfun.("radiofrance: la radio \"#{station}\" n'existe pas") + + {:error, %HTTPoison.Response{status_code: code}} -> + m.replyfun.("radiofrance: erreur http #{code}") + + _ -> + m.replyfun.("radiofrance: ça n'a pas marché, rip") + end + end + + defp np_url(station), do: "https://www.radiofrance.fr/api/v2.0/stations/#{station}/live" + + defp unalias("inter"), do: "franceinter" + defp unalias("info"), do: "franceinfo" + defp unalias("bleu"), do: "francebleu" + defp unalias("culture"), do: "franceculture" + defp unalias("musique"), do: "francemusique" + defp unalias(station), do: station + + defp format_title(_, nil, nil) do + nil + end + defp format_title(true, title, artist) do + [artist, title] |> Enum.filter(& &1) |> Enum.join(" - ") + end + defp format_title(false, show, section) do + [show, section] |> Enum.filter(& &1) |> Enum.join(": ") + end + + defp reformat_station_name(station) do + station + |> String.replace("france", "france ") + |> String.replace("_", " ") + end + +end |