2016-06-09 5 views
4

Ich bin ein WhatsApp-Klon erstellen und Probleme mit Presence herauszufinden.Phoenix Presence track Benutzer über mehrere Kanäle mit wechselnden Meta

Ich habe zwei Kanal:

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

Der Benutzer immer users:... Kanal verbunden ist, wenn er in der App ist, und auf beitreten beginne ich seine Anwesenheit Tracking:

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 

Wenn Benutzer ich chat_id Meta schließt sich einige Chat hinzufügen:

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 Wenn der Benutzer den Chat verlässt, möchte ich Meta-Informationen löschen, aber die Anwesenheit beibehalten. Wie kann ich das machen?

Dank

Antwort

1

Eigentlich funktioniert es aus der Box, zeigt der folgende Test es:

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 

Der Ausgang des Tests ist:

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

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

Verwandte Themen