Phoenix Presence отслеживает пользователя по нескольким каналам с чередованием метаданных.

Я создаю клон WhatsApp и не могу разобраться в некоторых вещах с 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

Когда пользователь покидает чат, я хочу удалить метаинформацию, но сохранить присутствие. Как я могу это сделать?

Спасибо


person almeynman    schedule 09.06.2016    source источник


Ответы (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}")

person almeynman    schedule 10.06.2016