lib/gen_game_world/game_manager.ex

defmodule GenGameWorld.GameManager do
  use GenServer

  alias GenGameWorld.Rpc

  def start_link(init_arg) do
    GenServer.start_link(__MODULE__, init_arg, name: __MODULE__)
  end

  def init(init_arg) do
    GenServer.cast(__MODULE__, :hydrate)
    {:ok, init_arg}
  end

  def handle_cast(:hydrate, state) do
    case hydrate() do
      {:bad_rpc, _} ->
        :timer.sleep(500)
        GenServer.cast(__MODULE__, :hydrate)

      _ ->
        :noop
    end

    {:noreply, state}
  end

  defp hydrate() do
    with games = [_h | _t] <- Rpc.exec(:app, {GenGameApp.Game.Rooms, :find, [[status: :started]]}) do
      create_games(games)
    end
  end

  defp create_games(games) do
    games
    |> Enum.map(fn game ->
      {:ok, _pid, _process_name} = GenGameWorld.Game.new_game(game.token)
    end)
  end
end