Support filtering remote room lists

This commit is contained in:
Erik Johnston 2016-09-16 10:24:15 +01:00
parent e58a9d781c
commit 23b6701a28
3 changed files with 18 additions and 6 deletions

View File

@ -718,11 +718,14 @@ class FederationClient(FederationBase):
raise RuntimeError("Failed to send to any server.") raise RuntimeError("Failed to send to any server.")
def get_public_rooms(self, destination, limit=None, since_token=None): def get_public_rooms(self, destination, limit=None, since_token=None,
search_filter=None):
if destination == self.server_name: if destination == self.server_name:
return return
return self.transport_layer.get_public_rooms(destination, limit, since_token) return self.transport_layer.get_public_rooms(
destination, limit, since_token, search_filter
)
@defer.inlineCallbacks @defer.inlineCallbacks
def query_auth(self, destination, room_id, event_id, local_auth): def query_auth(self, destination, room_id, event_id, local_auth):

View File

@ -248,7 +248,8 @@ class TransportLayerClient(object):
@defer.inlineCallbacks @defer.inlineCallbacks
@log_function @log_function
def get_public_rooms(self, remote_server, limit, since_token): def get_public_rooms(self, remote_server, limit, since_token,
search_filter=None):
path = PREFIX + "/publicRooms" path = PREFIX + "/publicRooms"
args = {} args = {}
@ -257,6 +258,8 @@ class TransportLayerClient(object):
if since_token: if since_token:
args["since"] = [since_token] args["since"] = [since_token]
# TODO(erikj): Actually send the search_filter across federation.
response = yield self.client.get_json( response = yield self.client.get_json(
destination=remote_server, destination=remote_server,
path=path, path=path,

View File

@ -280,17 +280,23 @@ class RoomListHandler(BaseHandler):
@defer.inlineCallbacks @defer.inlineCallbacks
def get_remote_public_room_list(self, server_name, limit=None, since_token=None, def get_remote_public_room_list(self, server_name, limit=None, since_token=None,
search_filter=None): search_filter=None):
if search_filter:
# We currently don't support searching across federation, so we have
# to do it manually without pagination
limit = None
since_token = None
res = yield self.hs.get_replication_layer().get_public_rooms( res = yield self.hs.get_replication_layer().get_public_rooms(
server_name, limit=limit, since_token=since_token, server_name, limit=limit, since_token=since_token,
search_filter=search_filter, search_filter=search_filter,
) )
if search_filter: if search_filter:
res["chunk"] = [ res = {"chunk": [
entry entry
for entry in dict(res.get("chunk", [])) for entry in list(res.get("chunk", []))
if _matches_room_entry(entry, search_filter) if _matches_room_entry(entry, search_filter)
] ]}
defer.returnValue(res) defer.returnValue(res)