2017-09-27 73 views
0

因此,我想使用存在行为跟踪每个用户的当前房间。问题是如果用户改变当前房间,我不能/不知道如何更新room_id。Phoenix Presence跟踪多个频道的用户

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。

回答

0

一个频道有一个终止/ 2回调,您可以使用它来更新状态。

def terminate(reason, _socket) do 
    Logger.debug"> leave #{inspect reason}" 
    :ok 
end