2017-09-27 1 views
0

したがって、プレゼンスの動作を使用して各ユーザーの現在の部屋を追跡したいと思います。問題は、ユーザーが現在の部屋を変更した場合、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

チャンネルにはプレゼンスを更新するために使用できる終了/ 2コールバックがあります。

def terminate(reason, _socket) do 
    Logger.debug"> leave #{inspect reason}" 
    :ok 
end 
関連する問題