summaryrefslogtreecommitdiff
path: root/lib/nola_plugins/buffer.ex
diff options
context:
space:
mode:
authorJordan Bracco <href@random.sh>2022-12-20 02:13:47 +0000
committerJordan Bracco <href@random.sh>2022-12-20 19:29:41 +0100
commit70b9bba56f5319361ce5a7df5c489b9c0d6905ce (patch)
treef9b4438965f4c5e3e1f3a6129904cbb9a37047f2 /lib/nola_plugins/buffer.ex
parentUpdate 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/buffer.ex')
-rw-r--r--lib/nola_plugins/buffer.ex44
1 files changed, 44 insertions, 0 deletions
diff --git a/lib/nola_plugins/buffer.ex b/lib/nola_plugins/buffer.ex
new file mode 100644
index 0000000..67aea35
--- /dev/null
+++ b/lib/nola_plugins/buffer.ex
@@ -0,0 +1,44 @@
+defmodule Nola.Plugins.Buffer 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(nil), do: ts(NaiveDateTime.utc_now())
+
+ defp ts(naive = %NaiveDateTime{}) do
+ ts = naive
+ |> DateTime.from_naive!("Etc/UTC")
+ |> DateTime.to_unix()
+
+ -ts
+ end
+
+end