2016-06-09 4 views
4

whatsapp 클론을 만들고 현재 상태로 몇 가지 문제를 파악하는 데 어려움이 있습니다.Phoenix Presence 트랙 사용자가 여러 채널에서 번갈아 메타를 사용합니다.

나는이 두 채널 :

사용자는 자신이 응용 프로그램에있는 경우 항상 users:... 채널에 연결되고 나는 그의 존재 추적을 시작 가입되어

channel "chats:*", Typi.ChatChannel 
    channel "users:*", Typi.UserChannel 
:

def join("users:" <> user_id, _payload, socket) do 
    send self(), :after_join 
    {:ok, socket} 
    end 

    def handle_info(:after_join, socket) do 
    Presence.track(socket, socket.assigns.current_user.id, %{}) 
    {:noreply, socket} 
    end 

때 사용자 어떤 채팅에 참여하면 chat_id을 메타에 추가합니다 :

def join("chats:" <> chat_id, _payload, socket) do 
    send self(), :after_join 
    {:ok, assign(socket, :current_chat, chat)} 
    end 

    def handle_info(:after_join, socket) do 
    Presence.track(socket, socket.assigns.current_user.id, %{ 
     chat_id: socket.assigns.current_chat.id 
    }) 
    {:noreply, socket} 
    end 

Whe n 사용자가 채팅에서 나가기 메타 정보를 삭제하지만 현재 상태를 유지하려고합니다. 어떻게해야합니까?

감사

답변

1

사실이 상자 밖으로 작동, 다음 테스트를 보여줍니다 테스트의 출력은

test "presence test", %{socket: socket, users: [john], chat: chat} do 
    {:ok, _, user_socket} = subscribe_and_join(socket, "users:#{john.id}", %{}) 
    IO.inspect Presence.list(user_socket) 
    {:ok, _, chat_socket} = subscribe_and_join(socket, "chats:#{chat.id}", %{}) 
    IO.inspect Presence.list(chat_socket) 
    IO.inspect Presence.list(user_socket) 
    end 

입니다

: 또한

%{"7939" => %{metas: [%{phx_ref: "UZDsMseg3as="}]}} 
%{"7939" => %{metas: [%{chat_id: 1392, phx_ref: "sRhw30CJY1U="}]}} 
%{"7939" => %{metas: [%{phx_ref: "UZDsMseg3as="}]}} 

Presence.list(chat_socket) == Presence.list("chats:#{chat.id}")