diff --git a/synapse/app/generic_worker.py b/synapse/app/generic_worker.py
index 236d98a29d..207d5ccd02 100644
--- a/synapse/app/generic_worker.py
+++ b/synapse/app/generic_worker.py
@@ -302,6 +302,8 @@ class GenericWorkerPresence(BasePresenceHandler):
self.send_stop_syncing, UPDATE_SYNCING_USERS_MS
)
+ self._busy_presence_enabled = hs.config.experimental.msc3026_enabled
+
hs.get_reactor().addSystemEventTrigger(
"before",
"shutdown",
@@ -439,8 +441,11 @@ class GenericWorkerPresence(BasePresenceHandler):
PresenceState.ONLINE,
PresenceState.UNAVAILABLE,
PresenceState.OFFLINE,
- PresenceState.BUSY,
)
+
+ if self._busy_presence_enabled:
+ valid_presence += (PresenceState.BUSY,)
+
if presence not in valid_presence:
raise SynapseError(400, "Invalid presence state")
diff --git a/synapse/config/experimental.py b/synapse/config/experimental.py
index b1c1c51e4d..2f0cd0cfdf 100644
--- a/synapse/config/experimental.py
+++ b/synapse/config/experimental.py
@@ -27,3 +27,5 @@ class ExperimentalConfig(Config):
# MSC2858 (multiple SSO identity providers)
self.msc2858_enabled = experimental.get("msc2858_enabled", False) # type: bool
+ # MSC3026 (busy presence state)
+ self.msc3026_enabled = experimental.get("msc3026_enabled", False) # type: bool
diff --git a/synapse/handlers/presence.py b/synapse/handlers/presence.py
index bcb99f627b..372017590d 100644
--- a/synapse/handlers/presence.py
+++ b/synapse/handlers/presence.py
@@ -104,6 +104,8 @@ class BasePresenceHandler(abc.ABC):
self.clock = hs.get_clock()
self.store = hs.get_datastore()
+ self._busy_presence_enabled = hs.config.experimental.msc3026_enabled
+
active_presence = self.store.take_presence_startup_info()
self.user_to_current_state = {state.user_id: state for state in active_presence}
@@ -730,8 +732,11 @@ class PresenceHandler(BasePresenceHandler):
PresenceState.ONLINE,
PresenceState.UNAVAILABLE,
PresenceState.OFFLINE,
- PresenceState.BUSY,
)
+
+ if self._busy_presence_enabled:
+ valid_presence += (PresenceState.BUSY,)
+
if presence not in valid_presence:
raise SynapseError(400, "Invalid presence state")
@@ -745,7 +750,10 @@ class PresenceHandler(BasePresenceHandler):
msg = status_msg if presence != PresenceState.OFFLINE else None
new_fields["status_msg"] = msg
- if presence == PresenceState.ONLINE or presence == PresenceState.BUSY:
+ if (
+ presence == PresenceState.ONLINE or
+ (self._busy_presence_enabled and presence == PresenceState.BUSY)
+ ):
new_fields["last_active_ts"] = self.clock.time_msec()
await self._update_states([prev_state.copy_and_replace(**new_fields)])
|