๐Ÿ“ฆ jhstatewide / pixelwall

๐Ÿ“„ wall_server_registry.ex ยท 31 lines
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31defmodule Pixelwall.WallServerRegistry do
  use GenServer
  require Logger

  def start_link() do
    case GenServer.start_link(__MODULE__, nil, name: :wall_server_registry) do
      {:ok, pid} -> {:ok, pid}
      {:error, {:already_started, pid}} -> {:ok, pid}
    end
  end

  def lookup(pid, wall_name) do
    GenServer.call(pid, {:lookup, wall_name})
  end

  def init(args) do
    {:ok, Map.new}
  end

  def handle_call({:lookup, name}, _from, wall_servers) do
    if wall_servers[name] do
      {:reply, wall_servers[name], wall_servers}
    else
      {:ok, wall_server} = Pixelwall.WallServer.start_link(name: name)
      # now we also want to set up a loop to save every X seconds
      wall_server |> Process.send_after(:periodic_save, Pixelwall.WallServer.save_interval)
      {:reply, wall_server, Map.put(wall_servers, name, wall_server)}
    end
  end
end