This commit is contained in:
Erik Johnston 2015-07-13 13:30:43 +01:00
parent ed88720952
commit e5991af629
2 changed files with 23 additions and 4 deletions

View file

@ -41,10 +41,9 @@ class ReceiptsHandler(BaseHandler):
@defer.inlineCallbacks
def received_client_receipt(self, room_id, receipt_type, user_id,
event_id):
# 1. Persist.
# 2. Notify local clients
# 3. Notify remote servers
"""Called when a client tells us a local user has read up to the given
event_id in the room.
"""
receipt = {
"room_id": room_id,
"receipt_type": receipt_type,
@ -62,6 +61,8 @@ class ReceiptsHandler(BaseHandler):
@defer.inlineCallbacks
def _received_remote_receipt(self, origin, content):
"""Called when we receive an EDU of type m.receipt from a remote HS.
"""
receipts = [
{
"room_id": room_id,
@ -79,6 +80,8 @@ class ReceiptsHandler(BaseHandler):
@defer.inlineCallbacks
def _handle_new_receipts(self, receipts):
"""Takes a list of receipts, stores them and informs the notifier.
"""
for receipt in receipts:
room_id = receipt["room_id"]
receipt_type = receipt["receipt_type"]
@ -105,6 +108,9 @@ class ReceiptsHandler(BaseHandler):
@defer.inlineCallbacks
def _push_remotes(self, receipts):
"""Given a list of receipts, works out which remote servers should be
poked and pokes them.
"""
# TODO: Some of this stuff should be coallesced.
for receipt in receipts:
room_id = receipt["room_id"]
@ -140,6 +146,8 @@ class ReceiptsHandler(BaseHandler):
@defer.inlineCallbacks
def get_receipts_for_room(self, room_id, to_key):
"""Gets all receipts for a room, upto the given key.
"""
result = yield self.store.get_linearized_receipts_for_room(
room_id, None, to_key
)

View file

@ -35,6 +35,8 @@ class ReceiptsStore(SQLBaseStore):
@defer.inlineCallbacks
def get_linearized_receipts_for_rooms(self, room_ids, from_key, to_key):
"""Get receipts for multiple rooms for sending to clients.
"""
room_ids = set(room_ids)
if from_key:
@ -54,6 +56,8 @@ class ReceiptsStore(SQLBaseStore):
@defer.inlineCallbacks
def get_linearized_receipts_for_room(self, room_id, from_key, to_key):
"""Get receipts for a single room for sending to clients.
"""
def f(txn):
if from_key:
sql = (
@ -107,6 +111,8 @@ class ReceiptsStore(SQLBaseStore):
@cached
@defer.inlineCallbacks
def get_graph_receipts_for_room(self, room_id):
"""Get receipts for sending to remote servers.
"""
rows = yield self._simple_select_list(
table="receipts_graph",
keyvalues={"room_id": room_id},
@ -181,6 +187,11 @@ class ReceiptsStore(SQLBaseStore):
@defer.inlineCallbacks
def insert_receipt(self, room_id, receipt_type, user_id, event_ids, data):
"""Insert a receipt, either from local client or remote server.
Automatically does conversion between linearized and graph
representations.
"""
if not event_ids:
return