WebSocket接続で私のElixirアプリケーションにPhoenixフレームワークを使用します。私は、ユーザー用と管理者用の2つの異なるトピックを持っています。管理者は、どのユーザーがいるかを確認する必要があります。私はフェニックスのPresence
モジュールを使用することに決めました。残念ながら、トラッキングを開始するソケットにのみ現在の状態の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
私はあなたの考えを試して、それはうまくいかない。ユーザーがプレゼンスをログアウトすると、admin watchは更新されません。 1人のユーザーがオンラインになったときに起こります。存在感の違いについて管理者に通知する他のユーザーはいません。私はそれを掘り出すでしょう、あなたがチャンネルポッドを持っているなら、その存在を追跡しているのを見ました:https://hexdocs.pm/phoenix/Phoenix.Presence.html#c:track/4を見てください。だから私はチャンネルをpidにする必要があります。 – mirox