1

Je travaille avec phoenix framework pour créer une application de chat de type différent. Dans mon cas, nous avons des salles de discussion, mais ne fonctionne pas comme un salon de discussion normal. Chaque utilisateur a sa propre pièce, il peut rejoindre sa chambre en utilisant différents dispositifs (mobile, pc, d'autres sources).Comment envoyer un message à un autre utilisateur dans l'application de chat framework phoenix

L'utilisateur A a sa propre chambre et l'utilisateur B a sa propre chambre, ces deux membres ne se connectent pas à une seule pièce comme dans un scénario normal dans le monde réel.

Maintenant, mon utilisateur A veut envoyer un message à l'utilisateur B

par exemple des données de message:

from : A 
to :B 
message : test message 

Ceci est un extrait de app.js j'ai utilisé pour se connecter à la salle spécifique de l'utilisateur:

let room = socket.channel("room:"+ user, {}) 
room.on("presence_state", state => { 
    presences = Presence.syncState(presences, status) 
    console.log(presences) 
    render(presences) 
}) 

Ceci est l'extrait de back-end pour la fonction de pièce jointe
/web/channel/RoomChannel.exMais maintenant je suis coincé au milieu parce que je ne peux pas trouver un moyen d'envoyer des messages entre les utilisateurs. par exemple: Impossible d'identifier moyen de fournir l'utilisateur un message de à l'utilisateur B en utilisant ce scénario spécifique

Ceci est l'architecte de base de cette application de chat:

enter image description here

C'est reste du code dans le fichier Roomchannel Est-ce que quelqu'un peut me montrer un moyen par lequel je peux passer des messages entre les salles de chat de l'utilisateur?

J'utilise redis pour stocker des données et this est l'application de base de chat que je suis grâce à ce développeur.

Répondre

0

Regardez dans Phoenix.Endpoint.broadcast Vous pouvez envoyer un message à un sujet donné en utilisant la fonction broadcast/3


Une autre façon, vous pouvez aller à ce sujet est de souscrire à chaque utilisateur d'un sujet privé unique lorsque l'utilisateur rejoint le canal join fonction

def join("room:" <> _user, _, socket) do 
    send self(), :after_join 
    MyApp.Endpoint.subscribe("private-room:" <> user) # subscribe the connecting client to their private room 
    {:ok, socket} 
end 

Puis, en handle_in("message:new",message, socket) extraire l'ID utilisateur receipient de la charge utile du message et appeler

Endpoint.broadcast

def handle_in("message:new", message, socket) do 

    MyApp.Endpoint.broadcast!("private-room:" <> to_user , "message:new",%{ 
     user: socket.assigns.user, 
     body: message, 
     timestamp: :os.system_time(:millisecond) 
    }) #sends the message to all connected clients for the to_user 

    {:noreply, socket} 
end