Skip to content
This repository has been archived by the owner on Apr 26, 2024. It is now read-only.

Commit

Permalink
Add API for setting account_data globaly or on a per room basis
Browse files Browse the repository at this point in the history
  • Loading branch information
Mark Haines committed Dec 1, 2015
1 parent 6e70979 commit 95f30ec
Show file tree
Hide file tree
Showing 11 changed files with 476 additions and 25 deletions.
9 changes: 8 additions & 1 deletion synapse/api/filtering.py
Original file line number Diff line number Diff line change
Expand Up @@ -50,7 +50,7 @@ def _check_valid_filter(self, user_filter_json):
# many definitions.

top_level_definitions = [
"presence"
"presence", "account_data"
]

room_level_definitions = [
Expand Down Expand Up @@ -139,6 +139,10 @@ def __init__(self, filter_json):
self.filter_json.get("presence", {})
)

self.account_data = Filter(
self.filter_json.get("account_data", {})
)

def timeline_limit(self):
return self.room_timeline_filter.limit()

Expand All @@ -151,6 +155,9 @@ def ephemeral_limit(self):
def filter_presence(self, events):
return self.presence_filter.filter(events)

def filter_account_data(self, events):
return self.account_data.filter(events)

def filter_room_state(self, events):
return self.room_state_filter.filter(events)

Expand Down
21 changes: 20 additions & 1 deletion synapse/handlers/account_data.py
Original file line number Diff line number Diff line change
Expand Up @@ -29,16 +29,35 @@ def get_new_events(self, user, from_key, **kwargs):
last_stream_id = from_key

current_stream_id = yield self.store.get_max_account_data_stream_id()
tags = yield self.store.get_updated_tags(user_id, last_stream_id)

results = []
tags = yield self.store.get_updated_tags(user_id, last_stream_id)

for room_id, room_tags in tags.items():
results.append({
"type": "m.tag",
"content": {"tags": room_tags},
"room_id": room_id,
})

account_data, room_account_data = (
yield self.store.get_updated_account_data_for_user(user_id, last_stream_id)
)

for account_data_type, content in account_data.items():
results.append({
"type": account_data_type,
"content": content,
})

for room_id, account_data in room_account_data.items():
for account_data_type, content in account_data.items():
results.append({
"type": account_data_type,
"content": content,
"room_id": room_id,
})

defer.returnValue((results, current_stream_id))

@defer.inlineCallbacks
Expand Down
40 changes: 34 additions & 6 deletions synapse/handlers/message.py
Original file line number Diff line number Diff line change
Expand Up @@ -359,6 +359,10 @@ def snapshot_all_rooms(self, user_id=None, pagin_config=None,

tags_by_room = yield self.store.get_tags_for_user(user_id)

account_data, account_data_by_room = (
yield self.store.get_account_data_for_user(user_id)
)

public_room_ids = yield self.store.get_public_room_ids()

limit = pagin_config.limit
Expand Down Expand Up @@ -436,14 +440,22 @@ def handle_room(event):
for c in current_state.values()
]

account_data = []
account_data_events = []
tags = tags_by_room.get(event.room_id)
if tags:
account_data.append({
account_data_events.append({
"type": "m.tag",
"content": {"tags": tags},
})
d["account_data"] = account_data

account_data = account_data_by_room.get(event.room_id, {})
for account_data_type, content in account_data.items():
account_data_events.append({
"type": account_data_type,
"content": content,
})

d["account_data"] = account_data_events
except:
logger.exception("Failed to get snapshot")

Expand All @@ -456,9 +468,17 @@ def handle_room(event):
consumeErrors=True
).addErrback(unwrapFirstError)

account_data_events = []
for account_data_type, content in account_data.items():
account_data_events.append({
"type": account_data_type,
"content": content,
})

ret = {
"rooms": rooms_ret,
"presence": presence,
"account_data": account_data_events,
"receipts": receipt,
"end": now_token.to_string(),
}
Expand Down Expand Up @@ -498,14 +518,22 @@ def room_initial_sync(self, user_id, room_id, pagin_config=None, is_guest=False)
user_id, room_id, pagin_config, membership, member_event_id, is_guest
)

account_data = []
account_data_events = []
tags = yield self.store.get_tags_for_room(user_id, room_id)
if tags:
account_data.append({
account_data_events.append({
"type": "m.tag",
"content": {"tags": tags},
})
result["account_data"] = account_data

account_data = yield self.store.get_account_data_for_room(user_id, room_id)
for account_data_type, content in account_data.items():
account_data_events.append({
"type": account_data_type,
"content": content,
})

result["account_data"] = account_data_events

defer.returnValue(result)

Expand Down
72 changes: 57 additions & 15 deletions synapse/handlers/sync.py
Original file line number Diff line number Diff line change
Expand Up @@ -100,6 +100,7 @@ def __nonzero__(self):
class SyncResult(collections.namedtuple("SyncResult", [
"next_batch", # Token for the next sync
"presence", # List of presence events for the user.
"account_data", # List of account_data events for the user.
"joined", # JoinedSyncResult for each joined room.
"invited", # InvitedSyncResult for each invited room.
"archived", # ArchivedSyncResult for each archived room.
Expand Down Expand Up @@ -195,6 +196,12 @@ def full_state_sync(self, sync_config, timeline_since_token):
)
)

account_data, account_data_by_room = (
yield self.store.get_account_data_for_user(
sync_config.user.to_string()
)
)

tags_by_room = yield self.store.get_tags_for_user(
sync_config.user.to_string()
)
Expand All @@ -211,6 +218,7 @@ def full_state_sync(self, sync_config, timeline_since_token):
timeline_since_token=timeline_since_token,
ephemeral_by_room=ephemeral_by_room,
tags_by_room=tags_by_room,
account_data_by_room=account_data_by_room,
)
joined.append(room_sync)
elif event.membership == Membership.INVITE:
Expand All @@ -230,11 +238,13 @@ def full_state_sync(self, sync_config, timeline_since_token):
leave_token=leave_token,
timeline_since_token=timeline_since_token,
tags_by_room=tags_by_room,
account_data_by_room=account_data_by_room,
)
archived.append(room_sync)

defer.returnValue(SyncResult(
presence=presence,
account_data=self.account_data_for_user(account_data),
joined=joined,
invited=invited,
archived=archived,
Expand All @@ -244,7 +254,8 @@ def full_state_sync(self, sync_config, timeline_since_token):
@defer.inlineCallbacks
def full_state_sync_for_joined_room(self, room_id, sync_config,
now_token, timeline_since_token,
ephemeral_by_room, tags_by_room):
ephemeral_by_room, tags_by_room,
account_data_by_room):
"""Sync a room for a client which is starting without any state
Returns:
A Deferred JoinedSyncResult.
Expand All @@ -262,19 +273,38 @@ def full_state_sync_for_joined_room(self, room_id, sync_config,
state=current_state,
ephemeral=ephemeral_by_room.get(room_id, []),
account_data=self.account_data_for_room(
room_id, tags_by_room
room_id, tags_by_room, account_data_by_room
),
))

def account_data_for_room(self, room_id, tags_by_room):
account_data = []
def account_data_for_user(self, account_data):
account_data_events = []

for account_data_type, content in account_data.items():
account_data_events.append({
"type": account_data_type,
"content": content,
})

return account_data_events

def account_data_for_room(self, room_id, tags_by_room, account_data_by_room):
account_data_events = []
tags = tags_by_room.get(room_id)
if tags is not None:
account_data.append({
account_data_events.append({
"type": "m.tag",
"content": {"tags": tags},
})
return account_data

account_data = account_data_by_room.get(room_id, {})
for account_data_type, content in account_data.items():
account_data_events.append({
"type": account_data_type,
"content": content,
})

return account_data_events

@defer.inlineCallbacks
def ephemeral_by_room(self, sync_config, now_token, since_token=None):
Expand Down Expand Up @@ -341,7 +371,8 @@ def ephemeral_by_room(self, sync_config, now_token, since_token=None):
@defer.inlineCallbacks
def full_state_sync_for_archived_room(self, room_id, sync_config,
leave_event_id, leave_token,
timeline_since_token, tags_by_room):
timeline_since_token, tags_by_room,
account_data_by_room):
"""Sync a room for a client which is starting without any state
Returns:
A Deferred JoinedSyncResult.
Expand All @@ -358,7 +389,7 @@ def full_state_sync_for_archived_room(self, room_id, sync_config,
timeline=batch,
state=leave_state,
account_data=self.account_data_for_room(
room_id, tags_by_room
room_id, tags_by_room, account_data_by_room
),
))

Expand Down Expand Up @@ -415,6 +446,13 @@ def incremental_sync_with_gap(self, sync_config, since_token):
since_token.account_data_key,
)

account_data, account_data_by_room = (
yield self.store.get_updated_account_data_for_user(
sync_config.user.to_string(),
since_token.account_data_key,
)
)

joined = []
archived = []
if len(room_events) <= timeline_limit:
Expand Down Expand Up @@ -469,7 +507,7 @@ def incremental_sync_with_gap(self, sync_config, since_token):
state=state,
ephemeral=ephemeral_by_room.get(room_id, []),
account_data=self.account_data_for_room(
room_id, tags_by_room
room_id, tags_by_room, account_data_by_room
),
)
logger.debug("Result for room %s: %r", room_id, room_sync)
Expand All @@ -492,14 +530,15 @@ def incremental_sync_with_gap(self, sync_config, since_token):
for room_id in joined_room_ids:
room_sync = yield self.incremental_sync_with_gap_for_room(
room_id, sync_config, since_token, now_token,
ephemeral_by_room, tags_by_room
ephemeral_by_room, tags_by_room, account_data_by_room
)
if room_sync:
joined.append(room_sync)

for leave_event in leave_events:
room_sync = yield self.incremental_sync_for_archived_room(
sync_config, leave_event, since_token, tags_by_room
sync_config, leave_event, since_token, tags_by_room,
account_data_by_room
)
archived.append(room_sync)

Expand All @@ -510,6 +549,7 @@ def incremental_sync_with_gap(self, sync_config, since_token):

defer.returnValue(SyncResult(
presence=presence,
account_data=self.account_data_for_user(account_data),
joined=joined,
invited=invited,
archived=archived,
Expand Down Expand Up @@ -566,7 +606,8 @@ def load_filtered_recents(self, room_id, sync_config, now_token,
@defer.inlineCallbacks
def incremental_sync_with_gap_for_room(self, room_id, sync_config,
since_token, now_token,
ephemeral_by_room, tags_by_room):
ephemeral_by_room, tags_by_room,
account_data_by_room):
""" Get the incremental delta needed to bring the client up to date for
the room. Gives the client the most recent events and the changes to
state.
Expand Down Expand Up @@ -606,7 +647,7 @@ def incremental_sync_with_gap_for_room(self, room_id, sync_config,
state=state,
ephemeral=ephemeral_by_room.get(room_id, []),
account_data=self.account_data_for_room(
room_id, tags_by_room
room_id, tags_by_room, account_data_by_room
),
)

Expand All @@ -616,7 +657,8 @@ def incremental_sync_with_gap_for_room(self, room_id, sync_config,

@defer.inlineCallbacks
def incremental_sync_for_archived_room(self, sync_config, leave_event,
since_token, tags_by_room):
since_token, tags_by_room,
account_data_by_room):
""" Get the incremental delta needed to bring the client up to date for
the archived room.
Returns:
Expand Down Expand Up @@ -654,7 +696,7 @@ def incremental_sync_for_archived_room(self, sync_config, leave_event,
timeline=batch,
state=state_events_delta,
account_data=self.account_data_for_room(
leave_event.room_id, tags_by_room
leave_event.room_id, tags_by_room, account_data_by_room
),
)

Expand Down
2 changes: 2 additions & 0 deletions synapse/rest/client/v2_alpha/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,7 @@
keys,
tokenrefresh,
tags,
account_data,
)

from synapse.http.server import JsonResource
Expand All @@ -46,3 +47,4 @@ def register_servlets(client_resource, hs):
keys.register_servlets(hs, client_resource)
tokenrefresh.register_servlets(hs, client_resource)
tags.register_servlets(hs, client_resource)
account_data.register_servlets(hs, client_resource)
Loading

0 comments on commit 95f30ec

Please sign in to comment.