diff options
author | href <href@random.sh> | 2021-09-03 14:32:35 +0200 |
---|---|---|
committer | href <href@random.sh> | 2021-09-03 14:32:35 +0200 |
commit | 0f2e858b8a91d7a272710631644fea02f2e23bb3 (patch) | |
tree | f3ce8431b6fa2aa045454a6542997a6cf0003120 /lib | |
parent | various fixes, web client wip, pubsub events (diff) |
buffer plugin
Diffstat (limited to '')
-rw-r--r-- | lib/lsg_irc/buffer_plugin.ex | 42 |
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 |