
### Presence

Each user has the concept of presence information. This encodes:

-   Whether the user is currently online
-   How recently the user was last active (as seen by the server)
-   Whether a given client considers the user to be currently idle
-   Arbitrary information about the user's current status (e.g. "in a
    meeting").

This information is collated from both per-device (`online`, `idle`,
`last_active`) and per-user (status) data, aggregated by the user's
homeserver and transmitted as an `m.presence` event. Presence events are
sent to interested parties where users share a room membership.

User's presence state is represented by the `presence` key, which is an
enum of one of the following:

-   `online` : The default state when the user is connected to an event
    stream.
-   `unavailable` : The user is not reachable at this time e.g. they are
    idle.
-   `offline` : The user is not connected to an event stream or is
    explicitly suppressing their profile information from being sent.

#### Events

{{% event-group group_name="m.presence" %}}

#### Client behaviour

Clients can manually set/get their presence using the HTTP APIs listed
below.

{{% http-api spec="client-server" api="presence" %}}

##### Last active ago

The server maintains a timestamp of the last time it saw a pro-active
event from the user. A pro-active event may be sending a message to a
room or changing presence state to `online`. This timestamp is presented
via a key called `last_active_ago` which gives the relative number of
milliseconds since the pro-active event.

To reduce the number of presence updates sent to clients the server may
include a `currently_active` boolean field when the presence state is
`online`. When true, the server will not send further updates to the
last active time until an update is sent to the client with either a)
`currently_active` set to false or b) a presence state other than
`online`. During this period clients must consider the user to be
currently active, irrespective of the last active time.

The last active time must be up to date whenever the server gives a
presence event to the client. The `currently_active` mechanism should
purely be used by servers to stop sending continuous presence updates,
as opposed to disabling last active tracking entirely. Thus clients can
fetch up to date last active times by explicitly requesting the presence
for a given user.

##### Idle timeout

The server will automatically set a user's presence to `unavailable` if
their last active time was over a threshold value (e.g. 5 minutes).
Clients can manually set a user's presence to `unavailable`. Any
activity that bumps the last active time on any of the user's clients
will cause the server to automatically set their presence to `online`.

#### Security considerations

Presence information is published to all users who share a room with the
target user. If the target user is a member of a room with a `public`
[join rule](#mroomjoin_rules), any other user in the federation is
able to gain access to the target user's presence. This could be undesirable.
