| 
13 | 13 | # limitations under the License.  | 
14 | 14 | import itertools  | 
15 | 15 | import logging  | 
 | 16 | +from collections import defaultdict  | 
16 | 17 | from typing import TYPE_CHECKING, Any, Callable, Dict, List, Tuple  | 
17 | 18 | 
 
  | 
18 | 19 | from synapse.api.constants import Membership, PresenceState  | 
@@ -232,29 +233,51 @@ async def encode_response(self, time_now, sync_result, access_token_id, filter):  | 
232 | 233 |         )  | 
233 | 234 | 
 
  | 
234 | 235 |         logger.debug("building sync response dict")  | 
235 |  | -        return {  | 
236 |  | -            "account_data": {"events": sync_result.account_data},  | 
237 |  | -            "to_device": {"events": sync_result.to_device},  | 
238 |  | -            "device_lists": {  | 
239 |  | -                "changed": list(sync_result.device_lists.changed),  | 
240 |  | -                "left": list(sync_result.device_lists.left),  | 
241 |  | -            },  | 
242 |  | -            "presence": SyncRestServlet.encode_presence(sync_result.presence, time_now),  | 
243 |  | -            "rooms": {  | 
244 |  | -                Membership.JOIN: joined,  | 
245 |  | -                Membership.INVITE: invited,  | 
246 |  | -                Membership.KNOCK: knocked,  | 
247 |  | -                Membership.LEAVE: archived,  | 
248 |  | -            },  | 
249 |  | -            "groups": {  | 
250 |  | -                Membership.JOIN: sync_result.groups.join,  | 
251 |  | -                Membership.INVITE: sync_result.groups.invite,  | 
252 |  | -                Membership.LEAVE: sync_result.groups.leave,  | 
253 |  | -            },  | 
254 |  | -            "device_one_time_keys_count": sync_result.device_one_time_keys_count,  | 
255 |  | -            "org.matrix.msc2732.device_unused_fallback_key_types": sync_result.device_unused_fallback_key_types,  | 
256 |  | -            "next_batch": await sync_result.next_batch.to_string(self.store),  | 
257 |  | -        }  | 
 | 236 | + | 
 | 237 | +        response: dict = defaultdict(dict)  | 
 | 238 | +        response["next_batch"] = await sync_result.next_batch.to_string(self.store)  | 
 | 239 | + | 
 | 240 | +        if sync_result.account_data:  | 
 | 241 | +            response["account_data"] = {"events": sync_result.account_data}  | 
 | 242 | +        if sync_result.presence:  | 
 | 243 | +            response["presence"] = SyncRestServlet.encode_presence(  | 
 | 244 | +                sync_result.presence, time_now  | 
 | 245 | +            )  | 
 | 246 | + | 
 | 247 | +        if sync_result.to_device:  | 
 | 248 | +            response["to_device"] = {"events": sync_result.to_device}  | 
 | 249 | + | 
 | 250 | +        if sync_result.device_lists.changed:  | 
 | 251 | +            response["device_lists"]["changed"] = list(sync_result.device_lists.changed)  | 
 | 252 | +        if sync_result.device_lists.left:  | 
 | 253 | +            response["device_lists"]["left"] = list(sync_result.device_lists.left)  | 
 | 254 | + | 
 | 255 | +        if sync_result.device_one_time_keys_count:  | 
 | 256 | +            response[  | 
 | 257 | +                "device_one_time_keys_count"  | 
 | 258 | +            ] = sync_result.device_one_time_keys_count  | 
 | 259 | +        if sync_result.device_unused_fallback_key_types:  | 
 | 260 | +            response[  | 
 | 261 | +                "org.matrix.msc2732.device_unused_fallback_key_types"  | 
 | 262 | +            ] = sync_result.device_unused_fallback_key_types  | 
 | 263 | + | 
 | 264 | +        if joined:  | 
 | 265 | +            response["rooms"][Membership.JOIN] = joined  | 
 | 266 | +        if invited:  | 
 | 267 | +            response["rooms"][Membership.INVITE] = invited  | 
 | 268 | +        if knocked:  | 
 | 269 | +            response["rooms"][Membership.KNOCK] = knocked  | 
 | 270 | +        if archived:  | 
 | 271 | +            response["rooms"][Membership.LEAVE] = archived  | 
 | 272 | + | 
 | 273 | +        if sync_result.groups.join:  | 
 | 274 | +            response["groups"][Membership.JOIN] = sync_result.groups.join  | 
 | 275 | +        if sync_result.groups.invite:  | 
 | 276 | +            response["groups"][Membership.INVITE] = sync_result.groups.invite  | 
 | 277 | +        if sync_result.groups.leave:  | 
 | 278 | +            response["groups"][Membership.LEAVE] = sync_result.groups.leave  | 
 | 279 | + | 
 | 280 | +        return response  | 
258 | 281 | 
 
  | 
259 | 282 |     @staticmethod  | 
260 | 283 |     def encode_presence(events, time_now):  | 
 | 
0 commit comments