mirror of
https://github.com/element-hq/synapse.git
synced 2024-12-19 17:56:19 +03:00
Add flag to sync to exclude threads
This commit is contained in:
parent
dfa830e61a
commit
78fec6b3c9
3 changed files with 38 additions and 9 deletions
|
@ -28,10 +28,12 @@ from synapse.events.utils import (
|
||||||
format_event_raw,
|
format_event_raw,
|
||||||
serialize_event,
|
serialize_event,
|
||||||
)
|
)
|
||||||
|
from synapse.events import FrozenEvent
|
||||||
from synapse.handlers.presence import format_user_presence_state
|
from synapse.handlers.presence import format_user_presence_state
|
||||||
from synapse.handlers.sync import SyncConfig
|
from synapse.handlers.sync import SyncConfig
|
||||||
from synapse.http.servlet import RestServlet, parse_boolean, parse_integer, parse_string
|
from synapse.http.servlet import RestServlet, parse_boolean, parse_integer, parse_string
|
||||||
from synapse.types import StreamToken
|
from synapse.types import StreamToken
|
||||||
|
from synapse.util.stringutils import random_string
|
||||||
|
|
||||||
from ._base import client_v2_patterns, set_timeline_upper_limit
|
from ._base import client_v2_patterns, set_timeline_upper_limit
|
||||||
|
|
||||||
|
@ -118,6 +120,8 @@ class SyncRestServlet(RestServlet):
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
|
|
||||||
|
exclude_threaded = b"exclude_threaded" in request.args
|
||||||
|
|
||||||
request_key = (user, timeout, since, filter_id, full_state, device_id)
|
request_key = (user, timeout, since, filter_id, full_state, device_id)
|
||||||
|
|
||||||
if filter_id:
|
if filter_id:
|
||||||
|
@ -169,13 +173,14 @@ class SyncRestServlet(RestServlet):
|
||||||
|
|
||||||
time_now = self.clock.time_msec()
|
time_now = self.clock.time_msec()
|
||||||
response_content = self.encode_response(
|
response_content = self.encode_response(
|
||||||
time_now, sync_result, requester.access_token_id, filter
|
time_now, sync_result, requester.access_token_id, filter,
|
||||||
|
exclude_threaded=exclude_threaded,
|
||||||
)
|
)
|
||||||
|
|
||||||
defer.returnValue((200, response_content))
|
defer.returnValue((200, response_content))
|
||||||
|
|
||||||
@staticmethod
|
@staticmethod
|
||||||
def encode_response(time_now, sync_result, access_token_id, filter):
|
def encode_response(time_now, sync_result, access_token_id, filter, exclude_threaded):
|
||||||
if filter.event_format == 'client':
|
if filter.event_format == 'client':
|
||||||
event_formatter = format_event_for_client_v2_without_room_id
|
event_formatter = format_event_for_client_v2_without_room_id
|
||||||
elif filter.event_format == 'federation':
|
elif filter.event_format == 'federation':
|
||||||
|
@ -187,6 +192,7 @@ class SyncRestServlet(RestServlet):
|
||||||
sync_result.joined, time_now, access_token_id,
|
sync_result.joined, time_now, access_token_id,
|
||||||
filter.event_fields,
|
filter.event_fields,
|
||||||
event_formatter,
|
event_formatter,
|
||||||
|
exclude_threaded=exclude_threaded,
|
||||||
)
|
)
|
||||||
|
|
||||||
invited = SyncRestServlet.encode_invited(
|
invited = SyncRestServlet.encode_invited(
|
||||||
|
@ -240,7 +246,7 @@ class SyncRestServlet(RestServlet):
|
||||||
}
|
}
|
||||||
|
|
||||||
@staticmethod
|
@staticmethod
|
||||||
def encode_joined(rooms, time_now, token_id, event_fields, event_formatter):
|
def encode_joined(rooms, time_now, token_id, event_fields, event_formatter, exclude_threaded):
|
||||||
"""
|
"""
|
||||||
Encode the joined rooms in a sync result
|
Encode the joined rooms in a sync result
|
||||||
|
|
||||||
|
@ -263,7 +269,7 @@ class SyncRestServlet(RestServlet):
|
||||||
for room in rooms:
|
for room in rooms:
|
||||||
joined[room.room_id] = SyncRestServlet.encode_room(
|
joined[room.room_id] = SyncRestServlet.encode_room(
|
||||||
room, time_now, token_id, joined=True, only_fields=event_fields,
|
room, time_now, token_id, joined=True, only_fields=event_fields,
|
||||||
event_formatter=event_formatter,
|
event_formatter=event_formatter, exclude_threaded=exclude_threaded,
|
||||||
)
|
)
|
||||||
|
|
||||||
return joined
|
return joined
|
||||||
|
@ -337,7 +343,7 @@ class SyncRestServlet(RestServlet):
|
||||||
@staticmethod
|
@staticmethod
|
||||||
def encode_room(
|
def encode_room(
|
||||||
room, time_now, token_id, joined,
|
room, time_now, token_id, joined,
|
||||||
only_fields, event_formatter,
|
only_fields, event_formatter, exclude_threaded,
|
||||||
):
|
):
|
||||||
"""
|
"""
|
||||||
Args:
|
Args:
|
||||||
|
@ -377,7 +383,31 @@ class SyncRestServlet(RestServlet):
|
||||||
)
|
)
|
||||||
|
|
||||||
serialized_state = [serialize(e) for e in state_events]
|
serialized_state = [serialize(e) for e in state_events]
|
||||||
serialized_timeline = [serialize(e) for e in timeline_events]
|
|
||||||
|
if exclude_threaded:
|
||||||
|
serialized_timeline = []
|
||||||
|
seen_threads = set()
|
||||||
|
for e in reversed(timeline_events):
|
||||||
|
thread_id = e.internal_metadata.thread_id
|
||||||
|
if thread_id != 0:
|
||||||
|
if thread_id not in seen_threads:
|
||||||
|
serialized_timeline.append({
|
||||||
|
"type": "org.matrix.new_thread",
|
||||||
|
"content": {
|
||||||
|
"thread_id": thread_id,
|
||||||
|
"latest_event": e.event_id,
|
||||||
|
},
|
||||||
|
"event_id": random_string(24),
|
||||||
|
"origin_server_ts": e.origin_server_ts,
|
||||||
|
"sender": "@server",
|
||||||
|
})
|
||||||
|
seen_threads.add(thread_id)
|
||||||
|
else:
|
||||||
|
serialized_timeline.append(serialize(e))
|
||||||
|
|
||||||
|
serialized_timeline.reverse()
|
||||||
|
else:
|
||||||
|
serialized_timeline = [serialize(e) for e in timeline_events]
|
||||||
|
|
||||||
account_data = room.account_data
|
account_data = room.account_data
|
||||||
|
|
||||||
|
|
|
@ -194,6 +194,8 @@ class StateHandler(object):
|
||||||
synapse.events.snapshot.EventContext:
|
synapse.events.snapshot.EventContext:
|
||||||
"""
|
"""
|
||||||
|
|
||||||
|
event.internal_metadata.thread_id = thread_id
|
||||||
|
|
||||||
if event.internal_metadata.is_outlier():
|
if event.internal_metadata.is_outlier():
|
||||||
# If this is an outlier, then we know it shouldn't have any current
|
# If this is an outlier, then we know it shouldn't have any current
|
||||||
# state. Certainly store.get_current_state won't return any, and
|
# state. Certainly store.get_current_state won't return any, and
|
||||||
|
|
|
@ -398,7 +398,6 @@ class EventsWorkerStore(SQLBaseStore):
|
||||||
with Measure(self._clock, "_get_event_from_row"):
|
with Measure(self._clock, "_get_event_from_row"):
|
||||||
d = json.loads(js)
|
d = json.loads(js)
|
||||||
internal_metadata = json.loads(internal_metadata)
|
internal_metadata = json.loads(internal_metadata)
|
||||||
internal_metadata["thread_id"] = thread_id
|
|
||||||
|
|
||||||
if rejected_reason:
|
if rejected_reason:
|
||||||
rejected_reason = yield self._simple_select_one_onecol(
|
rejected_reason = yield self._simple_select_one_onecol(
|
||||||
|
@ -414,8 +413,6 @@ class EventsWorkerStore(SQLBaseStore):
|
||||||
rejected_reason=rejected_reason,
|
rejected_reason=rejected_reason,
|
||||||
)
|
)
|
||||||
|
|
||||||
original_ev.unsigned["thread_id"] = thread_id
|
|
||||||
|
|
||||||
redacted_event = None
|
redacted_event = None
|
||||||
if redacted:
|
if redacted:
|
||||||
redacted_event = prune_event(original_ev)
|
redacted_event = prune_event(original_ev)
|
||||||
|
|
Loading…
Reference in a new issue