Tracking online users using Phoenix sockets and Presence?

I want to use Phoenix sockets and presence to track users who are currently connected to the Internet (from within an Android application). Is there any online tutorial explaining how to do this? Code sample? Thank you.

Does this help https://hexdocs.pm/phoenix/Phoenix.Presence.html? or this https://whatdidilearn.info/2018/03/11/using-phoenix-presence.html

The second link describes how to track users actively leaving chat rooms. But how to detect disconnected users due to network / internet disconnections?

I want simply to see who is online / offline (who has internet connection on/off).

Any ideas how this can be done?

Found only this https://stackoverflow.com/questions/45350197/how-to-set-and-retrieve-presence-status-online-busy-offline-using-phoenix-pres

Also this https://stackoverflow.com/questions/33934029/how-to-detect-if-a-user-left-a-phoenix-channel-due-to-a-network-disconnect

Everything is done automaticaly, Presence will detect disconnection as well…

This is a simple code I put in my channels

  def join("schedule", _params, socket) do
    send(self(), :after_join)
    {:ok, socket}
  end

  def handle_info(:after_join, socket) do
    user = socket.assigns.user
    {:ok, _} = Presence.track(socket, user.id, %{
      username: user.name,
      online_at: System.system_time(:second)
    })
    push(socket, "presence_state", Presence.list(socket))
    {:noreply, socket}
  end

It does imply the socket is assigned to a user, for this, i extract user from a phoenix token.

You also need a client library supporting Phoenix websocket and channels.

And this library needs to be compliant with the Phoenix version.

2 Likes

It detects, I see that the disconnected client gets removed from the list obtained by Presence.list, but only after some 5 minutes or more.

I cannot tell for the Android client, but using the JS client, it’s almost instantly, when working on my dev machine… Which client do You use?

1 Like

This one for Android:

You mean when you use the the JS client, if the user disconnects he will be removed from the Presence list immediately?

I think it’s not compatible with Phoenix 1.4 (driver is too old)

1 Like

Yes, but I know it’s not possible to use old Phoenix JS with new version, it does not work… I think it’s the same for the Java client.

I had to write a driver for ReasonML, because using the previous was not working.