2016-06-07 2 views
4

Привет Я пытаюсь переопределить функциональность whatsapp с помощью elixir phoenix. У меня возникли проблемы с выяснением следующего: если все люди в чате получили сообщение, я хочу отправить владельцу статус сообщения «получено», чтобы он мог показывать знак двойного тика. Однако как вы передаете один конкретный клиент?Каналы Phoenix: отправить push конкретному клиенту

+0

Проверьте этот вопрос: http://stackoverflow.com/questions/37373766/phoenix-return-ecto-query-results-to-a-specific-client/37375057#37375057 – simo

+0

@simo Вопрос немного , потому что клиент A отправляет сообщение и получает сообщение также. Что мне нужно: клиент A отправляет сообщение, и только клиент B получает некоторую обратную связь – Nomad

+0

Я думаю, что это хорошая идея посвятить тему только для клиента B, тогда вы можете транслировать эту тему, иначе я не знаю, как исключите конкретного пользователя, посмотрите здесь: http://stackoverflow.com/questions/37279779/how-to-exclude-some-users-when-broadcast – simo

ответ

3

Вы можете решить эту проблему с помощью темы для каждого пользователя, это может быть легко реализовано путем сопоставления с образцом, обратите внимание на проверку безопасности также:

def join("users:" <> user_id, _params, socket) do 
    {user_id, _} = Integer.parse(user_id) 

    %{id: id} = socket.assigns[:user] 

    #prevent connection to solo channel of other users, but allow in development 
    case id == user_id || Mix.env == :dev do 
     true -> 
     {:ok, socket} 
     false -> 
     {:error, "This is not your solo channel!"} 
     end 
    end 

Как вы бы сохранили пользователь Repo.get, когда пользователь подключает к розетка на:

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 

И, наконец, вы можете отправлять сообщения конкретному пользователю из контекста сокета, как:

YourAll.Endpoint.broadcast user_topic, "message", %{details: "etc"} 

Чтобы проверить производительность, это very informative session, в котором Гэри Ренни показывает, как тестировать WebSockets с помощью инструмента Tsung.

Смежные вопросы