diff --git a/lib/clip/application.ex b/lib/clip/application.ex index f56e199..2f8020d 100644 --- a/lib/clip/application.ex +++ b/lib/clip/application.ex @@ -14,9 +14,10 @@ defmodule Clip.Application do # Start the PubSub system {Phoenix.PubSub, name: Clip.PubSub}, # Start the Endpoint (http/https) - ClipWeb.Endpoint + ClipWeb.Endpoint, # Start a worker by calling: Clip.Worker.start_link(arg) # {Clip.Worker, arg} + Clip.Currents ] # See https://hexdocs.pm/elixir/Supervisor.html diff --git a/lib/clip/board.ex b/lib/clip/board.ex new file mode 100644 index 0000000..3b13136 --- /dev/null +++ b/lib/clip/board.ex @@ -0,0 +1,23 @@ +defmodule Clip.Board do + + alias Clip.Currents + + def init(user) do + Phoenix.PubSub.subscribe(Clip.PubSub, user.email) + Currents.get(user.email) + end + + def paste(user, snippet) do + Phoenix.PubSub.broadcast(Clip.PubSub, user.email, {:snippet_pasted, %{snippet: snippet}}) + Currents.set(user.email, snippet) + end + + def normalize(pnumber, local_pref \\ "0351", country_pref \\ "0049") do + pnumber + |> String.replace(~r/^\s*\+/, "00") + |> String.replace(~r/\D/, "") + |> String.replace(~r/^00+/, "00") + |> String.replace(~r/^(?=[1-9])/, local_pref) + |> String.replace(~r/^0(?=[1-9])/, country_pref) + end +end \ No newline at end of file diff --git a/lib/clip/currents.ex b/lib/clip/currents.ex new file mode 100644 index 0000000..85d3ed9 --- /dev/null +++ b/lib/clip/currents.ex @@ -0,0 +1,41 @@ +defmodule Clip.Currents do + use GenServer + require Logger + + @purge_interval :timer.minutes(60) + + def start_link(_) do + GenServer.start_link(__MODULE__, %{}, name: ClipCurrents) + end + + def init(opts) do + :ets.new(:users_clips, [:set, :named_table, :public]) + state = %{ + interval: opts[:purge_interval] || @purge_interval, + timer: nil + } + {:ok, schedule_purge(state)} + end + + def set(email_addr, value) do + :ets.insert(:users_clips, {email_addr, value}) + :ok + end + + def get(email_addr) do + cur_val = case :ets.lookup(:users_clips, email_addr) do + [{^email_addr, value}] -> value + [] -> "" + end + {:ok, cur_val} + end + + def handle_info(:purge, state) do + Logger.info("should purge old entries but doesn't, yet") + {:noreply, schedule_purge(state)} + end + + defp schedule_purge(state) do + %{state | timer: Process.send_after(self(), :purge, state.interval)} + end +end \ No newline at end of file diff --git a/lib/clip_web/live/board_live.ex b/lib/clip_web/live/board_live.ex index 0eb43da..0486b34 100644 --- a/lib/clip_web/live/board_live.ex +++ b/lib/clip_web/live/board_live.ex @@ -2,6 +2,7 @@ defmodule ClipWeb.BoardLive do use ClipWeb, :live_view alias Clip.Accounts + alias Clip.Board @impl true def render(assigns) do @@ -17,29 +18,20 @@ defmodule ClipWeb.BoardLive do @impl true def mount(_params, session, socket) do user = Accounts.get_user_by_session_token(session |> Map.get("user_token")) - Phoenix.PubSub.subscribe(Clip.PubSub, user.email) - {:ok, assign(socket, snippet: "", current_user: user)} - end - - defp normalize(pnumber, local_pref \\ "0351", country_pref \\ "0049") do - pnumber - |> String.replace(~r/^\s*\+/, "00") - |> String.replace(~r/\D/, "") - |> String.replace(~r/^00+/, "00") - |> String.replace(~r/^(?=[1-9])/, local_pref) - |> String.replace(~r/^0(?=[1-9])/, country_pref) + {:ok, snippet} = Board.init(user) + {:ok, assign(socket, snippet: snippet, current_user: user)} end @impl true def handle_event("normalize", _, %{assigns: %{snippet: snippet, current_user: user}} = socket) do - norm_snipp = normalize(snippet) - Phoenix.PubSub.broadcast(Clip.PubSub, user.email, {:snippet_pasted, %{snippet: norm_snipp}}) + norm_snipp = Board.normalize(snippet) + Board.paste(user, norm_snipp) {:noreply, assign(socket, snippet: snippet)} end @impl true def handle_event("paste", %{"snippet" => snippet}, %{assigns: %{current_user: user}} = socket) do - Phoenix.PubSub.broadcast(Clip.PubSub, user.email, {:snippet_pasted, %{snippet: snippet}}) + Board.paste(user, snippet) {:noreply, assign(socket, snippet: snippet)} end