diff --git a/synapse/handlers/room_list.py b/synapse/handlers/room_list.py
index 28bc35f8a3..c5ee3b3cd9 100644
--- a/synapse/handlers/room_list.py
+++ b/synapse/handlers/room_list.py
@@ -39,7 +39,8 @@ class RoomListHandler(BaseHandler):
super(RoomListHandler, self).__init__(hs)
self.response_cache = ResponseCache(hs)
- def get_local_public_room_list(self, limit=None, since_token=None):
+ def get_local_public_room_list(self, limit=None, since_token=None,
+ search_filter=None):
result = self.response_cache.get((limit, since_token))
if not result:
result = self.response_cache.set(
@@ -49,7 +50,8 @@ class RoomListHandler(BaseHandler):
return result
@defer.inlineCallbacks
- def _get_public_room_list(self, limit=None, since_token=None):
+ def _get_public_room_list(self, limit=None, since_token=None,
+ search_filter=None):
if since_token and since_token != "END":
since_token = RoomListNextBatch.from_token(since_token)
else:
@@ -115,22 +117,18 @@ class RoomListHandler(BaseHandler):
sorted_rooms = sorted_rooms[:since_token.current_limit]
sorted_rooms.reverse()
- new_limit = None
- if limit:
- if sorted_rooms[limit:]:
- new_limit = limit
- if since_token:
- if since_token.direction_is_forward:
- new_limit += since_token.current_limit
- else:
- new_limit = since_token.current_limit - new_limit
- new_limit = max(0, new_limit)
- sorted_rooms = sorted_rooms[:limit]
+ rooms_to_scan = sorted_rooms
+ if limit and not search_filter:
+ rooms_to_scan = sorted_rooms[:limit]
chunk = []
@defer.inlineCallbacks
def handle_room(room_id):
+ if limit and len(chunk) > limit:
+ # We've already got enough, so lets just drop it.
+ return
+
num_joined_users = rooms_to_num_joined[room_id]
if num_joined_users == 0:
return
@@ -212,10 +210,29 @@ class RoomListHandler(BaseHandler):
chunk.append(result)
- yield concurrently_execute(handle_room, sorted_rooms, 10)
+ yield concurrently_execute(handle_room, rooms_to_scan, 10)
chunk.sort(key=lambda e: (-e["num_joined_members"], e["room_id"]))
+ new_limit = None
+ if chunk:
+ addition = 1
+ if since_token:
+ addition += since_token.current_limit
+
+ if not since_token or since_token.direction_is_forward:
+ last_room_id = chunk[-1]["room_id"]
+ else:
+ last_room_id = chunk[0]["room_id"]
+ addition *= -1
+
+ try:
+ new_limit = sorted_rooms.index(last_room_id) + addition
+ if new_limit >= len(sorted_rooms):
+ new_limit = None
+ except ValueError:
+ pass
+
results = {
"chunk": chunk,
}
@@ -253,7 +270,8 @@ class RoomListHandler(BaseHandler):
defer.returnValue(results)
@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):
res = yield self.hs.get_replication_layer().get_public_rooms(
server_name, limit=limit, since_token=since_token,
)
diff --git a/synapse/rest/client/v1/room.py b/synapse/rest/client/v1/room.py
index db0cd4380a..be14ae1061 100644
--- a/synapse/rest/client/v1/room.py
+++ b/synapse/rest/client/v1/room.py
@@ -337,6 +337,35 @@ class PublicRoomListRestServlet(ClientV1RestServlet):
defer.returnValue((200, data))
+ @defer.inlineCallbacks
+ def on_POST(self, request):
+ # FIXME
+ # yield self.auth.get_user_by_req(request)
+
+ server = parse_string(request, "server", default=None)
+ content = parse_json_object_from_request(request)
+
+ limit = int(content.get("limit", 100))
+ since_token = content.get("since", None)
+ search_filter = content.get("filter", None)
+
+ handler = self.hs.get_room_list_handler()
+ if server:
+ data = yield handler.get_remote_public_room_list(
+ server,
+ limit=limit,
+ since_token=since_token,
+ search_filter=search_filter,
+ )
+ else:
+ data = yield handler.get_local_public_room_list(
+ limit=limit,
+ since_token=since_token,
+ search_filter=search_filter,
+ )
+
+ defer.returnValue((200, data))
+
# TODO: Needs unit testing
class RoomMemberListRestServlet(ClientV1RestServlet):
|