defmodule SomethingErlang.Grover do use GenServer require Logger def mount(user, thread_id) do DynamicSupervisor.start_child( SomethingErlang.Supervisor.Grovers, {__MODULE__, [self(), user, thread_id]} ) end def get_thread!(thread_id, page_number) do GenServer.call(via(self()), {:show_thread, thread_id, page_number}) end def start_link([lv_pid, user, thread_id]) do GenServer.start_link( __MODULE__, [lv_pid, user, thread_id], name: via(lv_pid)) end @impl true def init([pid, user, thread_id]) do %{bbuserid: userid, bbpassword: userhash} = user initial_state = %{ lv_pid: pid, thread_id: thread_id, page_number: 1, user: %{id: userid, hash: userhash} } Logger.debug "init #{userid} #{thread_id}" Process.monitor(pid) {:ok, initial_state} end @impl true def handle_call({:show_thread, thread_id, page_number}, _from, state) do thread = AwfulApi.parsed_thread(thread_id, page_number, state.user) {:reply, thread, %{state | page_number: page_number}} end @impl true def handle_info({:DOWN, _ref, :process, _object, reason}, state) do Logger.debug "received :DOWN from: #{inspect(state.lv_pid)} reason: #{inspect(reason)}" case reason do {:shutdown, _} -> {:stop, :normal, state} :killed -> {:stop, :normal, state} _ -> {:noreply, state} end end defp via(lv_pid), do: {:via, Registry, {SomethingErlang.Registry.Grovers, lv_pid}} end