2016-06-09 31 views
4

我正在构建一个whatsapp克隆,并无法找出存在的一些东西。Phoenix Presence跟踪交替多个通道的用户

我有两个渠道:

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

用户总是连接到users:...通道,如果他在的应用程序,并加入我开始跟踪他的存在:

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用户离开聊天我想删除元信息但保持在线状态。我怎样才能做到这一点?

感谢

回答

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}")