diff --git a/changelog.d/17231.bugfix b/changelog.d/17231.bugfix index 322b79dc12..d09b455654 100644 --- a/changelog.d/17231.bugfix +++ b/changelog.d/17231.bugfix @@ -1 +1 @@ -Fixed presence results not returning offline users on initial sync. Contributed by @Michael-Hollister. \ No newline at end of file +Added configurable option to always include offline users in presence sync results. Contributed by @Michael-Hollister. diff --git a/docs/usage/configuration/config_documentation.md b/docs/usage/configuration/config_documentation.md index 2c917d1f8e..045d6acc55 100644 --- a/docs/usage/configuration/config_documentation.md +++ b/docs/usage/configuration/config_documentation.md @@ -246,6 +246,7 @@ Example configuration: ```yaml presence: enabled: false + include_offline_users_on_sync: false ``` `enabled` can also be set to a special value of "untracked" which ignores updates @@ -254,6 +255,10 @@ received via clients and federation, while still accepting updates from the *The "untracked" option was added in Synapse 1.96.0.* +When clients perform an initial or `full_state` sync, presence results for offline users are +not included by default. Setting `include_offline_users_on_sync` to `true` will always include +offline users in the results. Defaults to false. + --- ### `require_auth_for_profile_requests` diff --git a/synapse/config/server.py b/synapse/config/server.py index a2b2305776..f9d4287cee 100644 --- a/synapse/config/server.py +++ b/synapse/config/server.py @@ -384,6 +384,11 @@ def read_config(self, config: JsonDict, **kwargs: Any) -> None: # Whether to internally track presence, requires that presence is enabled, self.track_presence = self.presence_enabled and presence_enabled != "untracked" + # Determines if presence results for offline users are included on initial/full sync + self.presence_include_offline_users_on_sync = presence_config.get( + "include_offline_users_on_sync", False + ) + # Custom presence router module # This is the legacy way of configuring it (the config should now be put in the modules section) self.presence_router_module_class = None diff --git a/synapse/handlers/sync.py b/synapse/handlers/sync.py index 56da624895..f06f2d63b4 100644 --- a/synapse/handlers/sync.py +++ b/synapse/handlers/sync.py @@ -2281,13 +2281,20 @@ async def _generate_sync_entry_for_presence( since_token = sync_result_builder.since_token presence_key = None + include_offline = False if since_token and not sync_result_builder.full_state: presence_key = since_token.presence_key + include_offline = True presence, presence_key = await presence_source.get_new_events( user=user, from_key=presence_key, is_guest=sync_config.is_guest, + include_offline=( + True + if self.hs_config.server.presence_include_offline_users_on_sync + else include_offline + ), ) assert presence_key sync_result_builder.now_token = now_token.copy_and_replace( diff --git a/tests/module_api/test_api.py b/tests/module_api/test_api.py index 1182343ddc..5eb1406a06 100644 --- a/tests/module_api/test_api.py +++ b/tests/module_api/test_api.py @@ -916,7 +916,7 @@ def _test_sending_local_online_presence_to_local_user( presence_updates, sync_token = sync_presence( test_case, test_case.presence_receiver_id ) - test_case.assertEqual(len(presence_updates), 2) + test_case.assertEqual(len(presence_updates), 1) presence_update: UserPresenceState = presence_updates[0] test_case.assertEqual(presence_update.user_id, test_case.presence_sender_id)