'Updates the read marker for a given user in a given room if the event ID given
is ahead in the stream relative to the current read marker.
This uses a notifier to indicate that account data should be sent down /sync if
the read marker has changed.'

@defer.inlineCallbacks
def received_client_read_marker(self, room_id, user_id, event_id):

    with (yield self.read_marker_linearizer.queue((room_id, user_id))):
        account_data = (yield self.store.get_account_data_for_room(user_id, room_id))
        existing_read_marker = account_data.get('m.fully_read', None)
        should_update = True
        if existing_read_marker:
            should_update = (yield self.store.is_event_after(event_id, existing_read_marker['event_id']))
        if should_update:
            content = {'event_id': event_id}
            max_id = (yield self.store.add_account_data_to_room(user_id, room_id, 'm.fully_read', content))
            self.notifier.on_new_event('account_data_key', max_id, users=[user_id])
