次に、あなたがあなたのチャンネル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
に応じて、あなたのメッセージの量と管理者の数、これらのイベントのための管理者固有のチャネルを持つことを検討するかもしれません。これにより、単純に無視するのではなく、管理者以外のユーザーのプロセスにメッセージが送信されるのを防ぐことができます。
私がadminのためにチャンネルを捧げたとしても、他のユーザーがそれに参加して自分のメッセージをadminに送信すると、handle_outの非管理者ユーザーを無視する必要があります。 – simo
adminsだけが参加するチャンネルを持つことができます。メッセージの送信方法に関係なく、メッセージをブロードキャストできます。したがって、既存のチャンネルを維持してから、そこからMyApp.Endpoint.broadcastを使用して管理チャンネルにブロードキャストします。 https://hexdocs.pm/phoenix/Phoenix.Endpoint.html – Gazler
ありがとう、ちょうど私がソケットコンテキストなしでメッセージをプッシュするために必要なものです。 – simo