Presence Overview
Presence lets you track the online and offline status of users in real time, and share custom state for these users. When you have Presence enabled, PubNub automatically creates a sister presence channel for each channel. Clients can subscribe to the presence channel to receive presence events to show a green dot that indicates that the user is online.
Presence also lets you share dynamic custom state for users like profile info, current location, score etc. This custom state persists on a channel as long as the user stays subscribed to that channel.
Tip
To use this feature, enable Presence from key setting in the Admin Portal
Get Online Users in Channel
When a client opens the app, it's often required to discover what other users are already subscribed to that channel (for example, to construct a chat room's online friends list). You can obtain a list of clients UUIDs, including clients' state data, and the total occupancy of the channel using the Here Now API.
Once the current state has been fetched, your app can rely on presence events to keep the user state up to date. Go to the Presence Events to learn more.
pubnub.hereNow(
{
channels: ["chats.room1", "chats.room2"],
includeState: true
},
function (status, response) {
console.log(status, response);
}
);
pubnub.hereNow(on: ["chats.room1", "chats.room2"]), and: [],
includeUUIDs: true, also: true { result in
switch result {
case let .success(response):
print("Successful hereNow Response: \(response)")
case let .failure(error):
print("Failed hereNow Response: \(error.localizedDescription)")
}
})
[self.pubnub hereNowForChannel: @[@"chats.room1", "chats.room2"]
withVerbosity:PNHereNowState
completion:^(PNPresenceChannelHereNowResult *result, PNErrorStatus *status) {
// parse the HereNow result parameter
}];
pubnub.hereNow()
.channels(Arrays.asList("chats.room1", "chats.room2"))
.includeState(true)
.async(new PNCallback<PNHereNowResult>() {
@Override
public void onResponse(PNHereNowResult result, PNStatus status) {
if (status.isError()) {
// handle error
return;
}
for (PNHereNowChannelData channelData : result.getChannels().values()) {
System.out.println("---");
System.out.println("channel:" + channelData.getChannelName());
System.out.println("occupancy: " + channelData.getOccupancy());
System.out.println("occupants:");
for (PNHereNowOccupantData occupant : channelData.getOccupants()) {
System.out.println("uuid: " + occupant.getUuid()
+ " state: " + occupant.getState());
}
}
}
});
pubnub.HereNow()
.Channels(new string[] {"chats.room1", "chats.room2"})
.IncludeState(true)
.Execute(new PNHereNowResultEx((result, status) => {
if (status.Error) {
Console.WriteLine("HereNow error: " + status);
}
else if (result.Channels != null && result.Channels.Count > 0) {
foreach (KeyValuePair<string, PNHereNowChannelData> kvp in result.Channels) {
PNHereNowChannelData channelData = kvp.Value;
Console.WriteLine("---");
Console.WriteLine("channel:" + channelData.ChannelName);
Console.WriteLine("occupancy:" + channelData.Occupancy);
Console.WriteLine("Occupants:");
if (channelData.Occupants != null && channelData.Occupants.Count > 0) {
for (int index = 0; index < channelData.Occupants.Count; index++) {
PNHereNowOccupantData occupant = channelData.Occupants[index];
Console.WriteLine(string.Format("uuid: {0}", occupant.Uuid));
Console.WriteLine(string.Format("state:{1}", (occupant.State != null) ?
pubnub.JsonPluggableLibrary.SerializeToJsonString(occupant.State) : ""));
}
}
}
}
}
));
def here_now_callback(result, status):
if status.is_error():
print("here_now error: %s" % status)
return
for channel_data in result.channels:
print("---")
print("channel: %s" % channel_data.channel_name)
print("occupancy: %s" % channel_data.occupancy)
print("occupants: %s" % channel_data.channel_name)
for occupant in channel_data.occupants:
print("uuid: %s, state: %s" % (occupant.uuid, occupant.state))
pubnub.here_now()\
.channels("chats.room1", "chats.room2")\
.include_state(True)\
.pn_async(here_now_callback)
Get Subscribed Channels for User
Sometimes it may be necessary for the client app to confirm the channels to which it's currently subscribed. Though this is rarely necessary to do this, except for possibly when you're testing and troubleshooting your app. This can be accomplished with the Where Now API.
pubnub.whereNow({uuid: pubnub.uuid},
function (status, response) {
// handle status, response
}
);
pubnub.whereNow(for: pubnub.uuid) { result in
switch result {
case let .success(response):
print("Successful WhereNow Response: \(response)")
case let .failure(error):
print("Failed WhereNow Response: \(error.localizedDescription)")
}
}
[self.pubnub whereNowUUID:self.pubnub.uuid withCompletion:
^(PNPresenceWhereNowResult *result, PNErrorStatus *status) {
if (!status) {
NSLog(status);
}
else {
NSLog(result);
}
}];
pubnub.whereNow()
.async(new PNCallback<PNWhereNowResult>() {
@Override
public void onResponse(PNWhereNowResult result, PNStatus status) {
if (status.isError()) {
System.outprintln(status);
}
else {
System.outprintln(result);
}
}
});
pubnub.WhereNow()
.Execute(new PNWhereNowResultExt((result, status) => {
if (status.isError) {
Console.WriteLine(status.ErrorData.Information);
}
else {
Console.WriteLine(result);
}
}
));
envelope = pubnub.where_now().sync()