Phoenix Presence отслеживает пользователей по нескольким каналам

Поэтому я хочу отслеживать текущую комнату каждого пользователя, используя поведение присутствия. Проблема в том, что я не могу / не знаю, как обновить room_id, если пользователь меняет свою текущую комнату.

def join("room:" <> room_id, auth_message, socket) do IO.puts "joining room:" <> room_id if authorized?(room_id, socket) do {:ok, assign(socket, :room_id, room_id)} else {:error, %{reason: "unauthorized"}} end end

Я передаю room_id, когда пользователь присоединяется к комнате, а затем я сделал этот обработчик, когда он переключается между комнатами:

 def handle_in("room:changed", %{"room_id" => room_id, "user_id" => user_id}, socket) do
    IO.puts "user moved to room #{inspect room_id} "
    Presence.track(socket, socket.assigns.user_id, %{room_id: socket.assigns.room_id})
    IO.inspect(Presence.list(socket))
    push socket, "presence_state", Presence.list(socket)
    {:noreply, socket}
  end

Дело в том, что для каждой комнаты, на которую он щелкает, в списке появляется новая запись, поэтому в основном он находится во всех этих комнатах одновременно. Что я хочу, так это обновлять room_id, только когда он уходит.

1 ответ

Канал имеет обратный вызов завершения /2, который можно использовать для обновления присутствия.

def terminate(reason, _socket) do
  Logger.debug"> leave #{inspect reason}"
  :ok
end
Другие вопросы по тегам