Я использую феникс-фреймворк для своего приложения Elixir с соединением WebSocket. У меня две разные темы: одна для пользователей и другая для администраторов. Администратор должен видеть, какие пользователи присутствуют. Я решил использовать модуль Presence
от Phoenix. К сожалению, вы можете отправить текущее состояние Presence
только в сокет, который начинает отслеживать.Можно ли отслеживать присутствие пользователей из разных тем?
Пример код:
def join("users", params, socket) do
socket |> assign(:user_id, params[:user_id])
send(self, :after_join)
{:ok, socket}
end
def join("admins", _params, socket) do
{:ok, socket}
end
def handle_info(:after_join, socket) do
push(socket, "presence_state", Presence.list(socket))
{:ok, _} = Presence.track(socket, socket.assigns[:user_id], %{
online_at: inspect(System.system_time(:seconds))
})
{:noreply, socket}
end
Я хочу слушать событие в фронтальном применении админы для изменения присутствия. Можно ли это сделать с Phoenix.Presence
?
Это было полезно. У вас есть идея, как обрабатывать событие «presence_diff»? Я получаю присутствие, когда пользователь подключается к каналу, но когда администратор будет регистрировать позже этого пользователя, он получит пустое состояние присутствия. – mirox
Я отредактировал ответ. Упование, которое помогает – TheAnh
Я пробовал вашу идею, и она не работает должным образом. Когда пользователь выходит из режима присутствия, что часы администратора не обновляются. Это происходит, когда это один пользователь онлайн. Просто нет другого пользователя, который уведомляет канал администратора о различии присутствия. Я выкопаю его, я увидел, что если у вас есть канал, то его кабриолет будет присутствовать, см. Https://hexdocs.pm/phoenix/Phoenix.Presence.html#c:track/4. Так что теперь мне нужно получить каналы pid. – mirox