summaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--lib/lsg_irc/buffer_plugin.ex42
1 files changed, 42 insertions, 0 deletions
diff --git a/lib/lsg_irc/buffer_plugin.ex b/lib/lsg_irc/buffer_plugin.ex
new file mode 100644
index 0000000..8d3cacd
--- /dev/null
+++ b/lib/lsg_irc/buffer_plugin.ex
@@ -0,0 +1,42 @@
+defmodule LSG.IRC.BufferPlugin do
+ @table __MODULE__.ETS
+ def irc_doc, do: nil
+
+ def table(), do: @table
+
+ def select_buffer(network, channel, limit \\ 50) do
+ import Ex2ms
+ spec = fun do {{n, c, _}, m} when n == ^network and (c == ^channel or is_nil(c)) -> m end
+ :ets.select(@table, spec, limit)
+ end
+
+ def start_link() do
+ GenServer.start_link(__MODULE__, [], name: __MODULE__)
+ end
+
+ def init(_) do
+ for e <- ~w(messages triggers events outputs) do
+ {:ok, _} = Registry.register(IRC.PubSub, e, plugin: __MODULE__)
+ end
+ {:ok, :ets.new(@table, [:named_table, :ordered_set, :protected])}
+ end
+
+ def handle_info({:irc, :trigger, _, message}, ets), do: handle_message(message, ets)
+ def handle_info({:irc, :text, message}, ets), do: handle_message(message, ets)
+ def handle_info({:irc, :event, event}, ets), do: handle_message(event, ets)
+
+ defp handle_message(message = %{network: network}, ets) do
+ key = {network, Map.get(message, :channel), ts(message.at)}
+ :ets.insert(ets, {key, message})
+ {:noreply, ets}
+ end
+
+ defp ts(naive = %NaiveDateTime{}) do
+ ts = naive
+ |> DateTime.from_naive!("Etc/UTC")
+ |> DateTime.to_unix()
+
+ -ts
+ end
+
+end