Phoenix presence across topics

I am beginning to look at phoenix presence and have some questions about the best way to achieve cross topic presence. My current design has every user having their own topic “user:xyz” and they can connect from many different clients (desktop, mobile1, mobile2, etc). Each user needs to be able to know of the presence of all the other users presence (client xyz should get presence updates for client abc, etc). Do I need to have an user:all topic that each user joins in addition to their user:xyz topic? I apologize if I am missing something but I figured somebody could point me in the right direction.

Thanks.

Exactly yes! :slight_smile:

2 Likes

Ok, thanks. Can I auto join the users to the all topic when they join their user topic?

Yep, just in an, say, after_join callback in the topic just put something kind of like:

Presence.track(self(), "user:all", blah_meta)
Presence.list("user:all")

The Presence.list/2 call can take the socket or the topic, and the only thing it does with the socket is grab the topic anyway as seen at:

And Presence.track/3, the one that takes a socket, just delegates to Presence.track/4 by taking out the pic and topic anyway, so you can pass in whatever pid and topic you want (from within your topic use pid self()) as can be seen at:

:slight_smile:

2 Likes

Thanks for the response!

1 Like

Do I need to call Presence.track and Presence.list for both the user:xyz and the user:all topics in the same after_join?

If you want them all then you need to track and list them all. Do note, if you have multiple presence’s tracking at the same time then Phoenix does not have a client-side way of differentiating them since they all go to the same message event name (really wish that were configurable at track time). You can fix that by overriding the presence_diff event as an outgoing type message and re-route each type to their own event names. :slight_smile:

1 Like