diff options
author | Jordan Bracco <href@random.sh> | 2022-12-20 02:19:42 +0000 |
---|---|---|
committer | Jordan Bracco <href@random.sh> | 2022-12-20 19:29:41 +0100 |
commit | 9958e90eb5eb5a2cc171c40860745e95a96bd429 (patch) | |
tree | b49cdb1d0041b9c0a81a14950d38c0203896f527 /lib/plugins/correction.ex | |
parent | Rename to Nola (diff) |
Actually do not prefix folders with nola_ refs T77
Diffstat (limited to 'lib/plugins/correction.ex')
-rw-r--r-- | lib/plugins/correction.ex | 59 |
1 files changed, 59 insertions, 0 deletions
diff --git a/lib/plugins/correction.ex b/lib/plugins/correction.ex new file mode 100644 index 0000000..03968c8 --- /dev/null +++ b/lib/plugins/correction.ex @@ -0,0 +1,59 @@ +defmodule Nola.Plugins.Correction do + @moduledoc """ + # correction + + * `s/pattern/replace` replace `pattern` by `replace` in the last matching message + """ + + def irc_doc, do: @moduledoc + def start_link() do + GenServer.start_link(__MODULE__, [], name: __MODULE__) + end + + def init(_) do + {:ok, _} = Registry.register(IRC.PubSub, "messages", [plugin: __MODULE__]) + {:ok, _} = Registry.register(IRC.PubSub, "triggers", [plugin: __MODULE__]) + {:ok, %{}} + end + + # Trigger fallback + def handle_info({:irc, :trigger, _, m = %IRC.Message{}}, state) do + {:noreply, correction(m, state)} + end + + def handle_info({:irc, :text, m = %IRC.Message{}}, state) do + {:noreply, correction(m, state)} + end + + def correction(m, state) do + history = Map.get(state, key(m), []) + if String.starts_with?(m.text, "s/") do + case String.split(m.text, "/") do + ["s", match, replace | _] -> + case Regex.compile(match) do + {:ok, reg} -> + repl = Enum.find(history, fn(m) -> Regex.match?(reg, m.text) end) + if repl do + new_text = String.replace(repl.text, reg, replace) + m.replyfun.("correction: <#{repl.sender.nick}> #{new_text}") + end + _ -> + m.replyfun.("correction: invalid regex") + end + _ -> m.replyfun.("correction: invalid regex format") + end + state + else + history = if length(history) > 100 do + {_, history} = List.pop_at(history, 99) + [m | history] + else + [m | history] + end + Map.put(state, key(m), history) + end + end + + defp key(%{network: net, channel: chan}), do: "#{net}/#{chan}" + +end |