所以我想使用在线行为跟踪每个用户的当前空间。问题是,如果用户更改其当前房间,我无法知道如何更新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。
答案 0 :(得分:0)
频道有一个终止/ 2回调,您可以用它来更新状态。
def terminate(reason, _socket) do
Logger.debug"> leave #{inspect reason}"
:ok
end