2015-12-27 6 views
8

ho un po 'presa con la verifica:Come inviare un messaggio a presa specifico con Phoenix

defmodule Test.UserSocket do 
    use Phoenix.Socket 

    ## Channels 
    channel "user:*", Test.RoomChannel 

    def connect(_params, socket) do 
    case Phoenix.Token.verify(socket, "user", _params["token"]) do 
      {:ok, uid} -> 
      {:ok, assign(socket, :user_id, uid)} 
      {:error, _} -> 
      :error 
    end 
    end 

def id(_socket), do: "user:#{_socket.assigns.user_id}" 
end 

E dopo presa di connessione di nome come user:#id

Dalla documentazione posso inviare caso di disconnessione Test.Endpoint.broadcast("users_socket:" <> user.id, "disconnect", %{})

Domanda: Come inviare un evento personalizzato al socket tramite user:#id, dovrebbe essere come una notifica push a un socket specifico.

Ho provato Test.Endpoint.broadcast "user:1", "new:msg", %{user: "SYSTEM", body: "iex"} ma non funziona, perché non riesco ad ascoltare "nuovo: msg" sul socket.

+0

opere di quando mi unisco la stanza specifica var chan = socket.channel ("user': 1 ", {})' ma è richiesta una verifica aggiuntiva in 'join' – user1156168

+4

Lo fai su un canale come hai descritto. Non è necessario verificare in join/3 se hai già verificato e assegnato un utente corrente al socket in connessione. Basta controllare socket.assigns.user_id contro qualsiasi stanza l'utente stia tentando di partecipare. Quindi trasmetti alle stanze "Endpoint.broadcast" della stanza: 1 "," new_msg ",% {user:" SYSTEM ", body:" iex "} –

+0

Grazie per la risposta. Quindi lavoriamo solo su basi 'stanza'. E le mie fonti saranno come: 'def join (" utente: "<> _uid, message, socket) do if _uid == socket.assigns.user_id do {: ok, socket} else {: error,% { motivo: "non autorizzato"}} fine fine' – user1156168

risposta

2

Copia risposta di Chris McCord giù dal commento:

Lo si fa su un canale come hai descritto. Non è necessario verificare in join/3 se è già stato verificato e assegnato a un utente corrente sul socket in connessione. Basta controllare lo socket.assigns.user_id contro qualsiasi stanza l'utente stia tentando di unirsi. Poi si effettua la trasmissione a quella stanza Endpoint.broadcast "rooms:1", "new_msg", %{user: "SYSTEM", body: "iex"}

(Marcatura risposta come comunità wiki dal momento che non voglio i punti rep se qualcuno decide di upvote questo. Non è la mia risposta :))

0

Grazie per la risposta . Quindi lavoriamo solo su basi 'stanza'. E le mie origini saranno come: def join ("utente:" <> _uid, message, socket) fare se _uid == socket.assigns.user_id do {: ok, socket} else {: errore,% {motivo: "non autorizzato"}} end end

non è necessario verificare di nuovo l'ID utente dal momento che già avete definito la logica in UserSocket # collegano se l'utente non è autenticato ottiene un messaggio che non è autorizzare, che cosa si può fare è utilizzare l'ID utente per verificare se l'utente ha il permesso di visualizzare un canale specifico per esempio

def join("rooms:some_private_room", message, socket) do 
    if socket.assigns.user_id do 
    {:ok, socket} 
    else 
    # kick him out he is not allowed here 
    {:error, %{reason: "unauthorized"}} 
    end 
end