2016-05-17 47 views
0

由於broadcast!會發送消息給訂閱主題的所有用戶,發件人除外,是否有可能對某些用戶除外?或發送給特定用戶?如何在廣播時排除某些用戶?

我需要用戶將事件推送到某個頻道,但只有管理員用戶纔會收到消息,其他用戶將不會收到消息,但只會發送消息。

我可以通過簡單地讓用戶忽略它們通過broadcast!收到的消息,並且只有管理員用戶進程收到的消息來解決此問題,但是如何在服務器端解決此問題?

總之,加入一個頻道,但只能讀取,或只發送?

回答

0

如果存儲插槽上的用戶在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 

解釋然後,您可以檢查用戶在handle_out功能管理狀態爲自己的頻道documented here

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

即使我專門爲管理員設置一個頻道,其他用戶也會加入到發送他們的消息給管理員,那麼我將不得不忽略非管理員用戶在handle_out ..所以其相同的..對嗎? – simo

+1

您可以擁有隻有管理員加入的頻道。無論消息如何發送,都可以廣播消息。所以你會保留現有的頻道,然後使用MyApp.Endpoint.broadcast從那裏廣播到管理頻道。 https://hexdocs.pm/phoenix/Phoenix.Endpoint.html – Gazler

+0

謝謝,這正是我需要的,推送消息沒有套接字上下文。 – simo