Support filtering remote room lists
This commit is contained in:
parent
e58a9d781c
commit
23b6701a28
|
@ -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):
|
||||||
|
|
|
@ -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,
|
||||||
|
|
|
@ -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)
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue