Phoenix Presence отслеживает пользователя по нескольким каналам с чередованием мета
Я создаю клон WhatsApp и испытываю затруднения, выясняя некоторые вещи с Присутствием.
У меня два канала:
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
Когда пользователь покидает чат, я хочу удалить метаинформацию, но сохранить свое присутствие. Как я могу это сделать?
Спасибо
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}")