2016-05-17 3 views
0

broadcast!は送信者以外のトピックを購読しているすべてのユーザーにメッセージを送信しますので、特定のユーザーを除外することはできますか?または特定のユーザーに送信しますか?ブロードキャスト時に一部のユーザーを除外する方法は?

イベントをチャンネルにプッシュする必要がありますが、管理者のみがメッセージを受信し、他のユーザーはメッセージを受信せずに送信します。

私はクライアント側でbroadcast!で受信したメッセージを無視し、管理者プロセスで受信したメッセージのみを無視させることで解決できますが、サーバー側でこれを解決する方法はありますか?

要するに、チャンネルに参加することはできますが、読み取り専用か、または送信のみできますか?

答えて

0

次に、あなたがあなたのチャンネルdocumented hereのためのユーザーのためにhandle_out機能で、管理状況を確認することができhttps://hexdocs.pm/phoenix/Phoenix.Token.html

defmodule MyApp.UserSocket do 
    use Phoenix.Socket 

    def connect(%{"token" => token}, socket) do 
    case Phoenix.Token.verify(socket, "user", token, max_age: 1209600) do 
     {:ok, user_id} -> 
     socket = assign(socket, :user, Repo.get!(User, user_id)) 
     {:ok, socket} 
     {:error, _} -> #... 
    end 
    end 
end 

で説明したように、あなたは、ソケット上のユーザーを保存する場合:

defmodule HelloPhoenix.RoomChannel do 
    intercept ["new_msg"] 
    ... 
    def handle_out("new_msg", payload, socket) do 
    if socket.assigns.user.admin do 
     push socket, "new_msg", payload 
    end 
    {:noreply, socket} 
    end 
end 

に応じて、あなたのメッセージの量と管理者の数、これらのイベントのための管理者固有のチャネルを持つことを検討するかもしれません。これにより、単純に無視するのではなく、管理者以外のユーザーのプロセスにメッセージが送信されるのを防ぐことができます。

+0

私がadminのためにチャンネルを捧げたとしても、他のユーザーがそれに参加して自分のメッセージをadminに送信すると、handle_outの非管理者ユーザーを無視する必要があります。 – simo

+1

adminsだけが参加するチャンネルを持つことができます。メッセージの送信方法に関係なく、メッセージをブロードキャストできます。したがって、既存のチャンネルを維持してから、そこからMyApp.Endpoint.broadcastを使用して管理チャンネルにブロードキャストします。 https://hexdocs.pm/phoenix/Phoenix.Endpoint.html – Gazler

+0

ありがとう、ちょうど私がソケットコンテキストなしでメッセージをプッシュするために必要なものです。 – simo

関連する問題