anurag.peshne

anurag.peshne

Hello,
I’m new to Phoenix and I’m following this tutorial Channels — Phoenix v1.8.8 to implement something similar to chat application as described in that tutorial.
That article talks about how to broadcast a message, I want to send a message to a particular user. And I couldn’t find something similar to send. How I can do that.
Also, to do this, do I have to save all the connected socket objects in another process’s state, maybe using a map which maps username → socket.

Showing Posts 1 to 10

amnu3387

amnu3387

One way to do it would be to subscribe your users to a particular topic individual to each one of them. Then you would have a way of sending particular messages to them using that topic and simply broadcasting to it, effectively working as if you were “sending” them a message. Of course this only accounts for when the receiving user is online and subscribed to his own topic.

anurag.peshne

anurag.peshne OP

Thanks, this should work.
How costly/cheap is creating a topic?

amnu3387

amnu3387

AFAIK the phoenix team is not yet charging for creating topics, so it’s free.

(j/k)

The cost will probably be one entry with one term in an ETS table? How that translates into “really” useful information I’m not sure.

kokolegorille

kokolegorille

The trick is to broadcast to a specific user with

socket.endpoint.broadcast!(“user:#{id}”, message, payload)

axelson

axelson

Scenic Core Team

Quite cheap, I wouldn’t worry about it at this point.

ankhnaton

ankhnaton

video tutorial for user to user private messages

Zesky665

Zesky665

I might be able to do this if you’re still interested.

SZJX

SZJX

I just wonder if there’s a way to do it without having to create additional channels per user/use specific user IDs. In my use case there will be no registration and there will be no preexisting IDs unless I generate a random one for each new user who connects, which is doable but doesn’t feel exactly natural.

I wonder if there’s a way for Presence to actually fetch specific processes/sockets, e.g. to fetch the first socket connection of the first user that joined, and pair her with the second user as soon as the second user joins. It doesn’t seem exactly easy though so far.

I meant to make a new post but the tag selection seems broken at the moment.

idi527

idi527

You can access the underlying websocket like in Broadcast to socket without channel - #27 by vlad.grb and communicate with the user directly via it, if that’s what you need.

SZJX

SZJX

I guess my problem is how I can keep track of the socket IDs/PIDs. I think I’m still a bit confused over all the terminologies and their relations between each other.

In short, my use case:

  • There is a lobby.
  • Whenever enough number (e.g. 3) of users joined the lobby, they will be teamed up, each assigned a role to start a conversation.
  • They should then be removed from the lobby.
  • The next 3 users to join repeat this process, etc.

My question is, when the third user joins, how can I:

  • know that he’s the third user
  • locate the first two users (i.e. find the PIDs of their sockets I guess)
  • send a customized message to each user (because each has a different role)
  • remove all of them from whatever tracking mechanism I’m using

The problem with normal Channel and Presence mechanisms is that they don’t seem to be able to hold any global state.

One mechanism that I’ve thought of with Presence (likely to be incorrect):

def handle_info(:after_lobby_join, socket) do
  Presence.track(socket, "lobby", %{
    pid: self()
  })

  {:noreply, socket}
end

def handle_info(:start, socket) do
  pid1 = hd(Presence.list(socket)["lobby"][:metas])[:pid]
  # Start the conversation by sending messages individually to pid1 and pid2
  ...
  untrack(pid1, "my_app:lobby", "lobby")
  {:ok, socket}
end

In the example you linked there is the use of Registry. Are you suggesting to record the PIDs of the first two users in Registry under keys such as first_user, second_user, and then look them up and send messages to them via send(socket_pid, {:socket_push, :text, Poison.encode!(%{"oh" => "my"})})?

Where Next? Top

Trending in Questions Top

RSP87
I’m working on a project that simulates the bumbl example in the programming phoenix book. It acts almost like an email client. We have a...
New
nseaSeb
Hello, I know there is an approach for handling lists that allows for optimized traversal, but I can’t recall the specific method (somet...
New
RemyXRenard
I’m seeing that a list inside a Kino.DataTable will be interpreted as a charlist, even if the Kino.configure() is set to charlists: :as_l...
New
velrest
So my question is quite simple and i have found no conclusive answer on forum, google or AI. Should we use :erlang.float for Integer to ...
New
brecabral
Documentation While reading the Scoped Routes section, I noticed that the documentation currently refers to a problem without explainin...
New
samoloth
Hi, I’ve just set up an application with ash_authentication. There is only magic link strategy for now, so there is no confirmation add o...
New
FlyingNoodle
If a change or preparation module uses Ash.Changeset.get_argument/2 or Ash.Query.get_argument/2 (or any of the other get_argument functio...
New

Other Trending Topics Top

mudasobwa
I am happy to introduce the very α version of the new programming language compiled to BEAM. Welcome Cure. It has literally three kille...
New
marciok
Hi there! We created Gust: A task orchestrator inspired by Airflow. For those who have never heard about Aiflow, it’s a Python-based wor...
New
jimsynz
Beam Bots (or just BB for short) is a framework for building fault-tolerant robotics applications in Elixir using familiar OTP patterns. ...
New
Dmk
Xamal is a deployment tool for Elixir apps that deploys native releases to bare metal servers over SSH. It’s a port of GitHub - basecamp/...
New
netoum
Corex is an accessible, unstyled UI component library for Phoenix that integrates Zag.js state machines using Vanilla JavaScript and Live...
New
webofbits
With AI doing more of the implementation work, I’ve been wondering how much coding I should deliberately keep doing myself. My main conc...
#ai
New

We're in Beta

About us Mission Statement

Options

Thread Display Mode




Thread Preview

Skip Thread Previews