summary refs log tree commit diff
path: root/synapse
diff options
context:
space:
mode:
authorKegan Dougal <kegan@matrix.org>2015-02-26 14:35:28 +0000
committerKegan Dougal <kegan@matrix.org>2015-02-26 14:35:28 +0000
commit92478e96d6f6992146102599ca96b8dcacbf3895 (patch)
treeaeef94c256084367165c28ee22afaa6de6efa322 /synapse
parentPEP8 and pyflakes (diff)
downloadsynapse-92478e96d6f6992146102599ca96b8dcacbf3895.tar.xz
Finish impl to extract all room IDs an AS may be interested in when polling the event stream.
Diffstat (limited to 'synapse')
-rw-r--r--synapse/storage/appservice.py35
-rw-r--r--synapse/storage/registration.py7
2 files changed, 36 insertions, 6 deletions
diff --git a/synapse/storage/appservice.py b/synapse/storage/appservice.py
index 017b6d1e86..d0632d55d1 100644
--- a/synapse/storage/appservice.py
+++ b/synapse/storage/appservice.py
@@ -213,8 +213,9 @@ class ApplicationServiceStore(SQLBaseStore):
             A list of RoomsForUser.
         """
         # FIXME: This is assuming that this store has methods from
-        # RoomStore, DirectoryStore, which is a bad assumption to
-        # make as it makes testing trickier and coupling less obvious.
+        # RoomStore, DirectoryStore, RegistrationStore, RoomMemberStore which is
+        # a bad assumption to make as it makes testing trickier and coupling
+        # less obvious.
 
         # get all rooms matching the room ID regex.
         room_entries = yield self.get_all_rooms()  # RoomEntry list
@@ -229,12 +230,34 @@ class ApplicationServiceStore(SQLBaseStore):
             r.room_id for r in room_alias_mappings if
             service.is_interested_in_alias(r.room_alias)
         ]
-        logging.debug(matching_alias_list)
-        logging.debug(matching_room_id_list)
+        room_ids_matching_alias_or_id = set(
+            matching_room_id_list + matching_alias_list
+        )
 
-        # TODO get all rooms for every user for this AS.
+        # get all rooms for every user for this AS. This is scoped to users on
+        # this HS only.
+        user_list = yield self.get_all_users()
+        user_list = [
+            u["name"] for u in user_list if
+            service.is_interested_in_user(u["name"])
+        ]
+        rooms_for_user_matching_user_id = []  # RoomsForUser list
+        for user_id in user_list:
+            rooms_for_user = yield self.get_rooms_for_user(user_id)
+            rooms_for_user_matching_user_id += rooms_for_user
+        rooms_for_user_matching_user_id = set(rooms_for_user_matching_user_id)
+
+        # make RoomsForUser tuples for room ids and aliases which are not in the
+        # main rooms_for_user_list - e.g. they are rooms which do not have AS
+        # registered users in it.
+        known_room_ids = [r.room_id for r in rooms_for_user_matching_user_id]
+        missing_rooms_for_user = [
+            RoomsForUser(r, service.sender, "join") for r in
+            room_ids_matching_alias_or_id if r not in known_room_ids
+        ]
+        rooms_for_user_matching_user_id |= set(missing_rooms_for_user)
 
-        defer.returnValue([RoomsForUser("!foo:bar", service.sender, "join")])
+        defer.returnValue(rooms_for_user_matching_user_id)
 
     @defer.inlineCallbacks
     def _populate_cache(self):
diff --git a/synapse/storage/registration.py b/synapse/storage/registration.py
index 029b07cc66..7aff3dbd33 100644
--- a/synapse/storage/registration.py
+++ b/synapse/storage/registration.py
@@ -92,6 +92,13 @@ class RegistrationStore(SQLBaseStore):
             query, user_id
         )
 
+    def get_all_users(self):
+        query = ("SELECT users.name FROM users")
+        return self._execute(
+            self.cursor_to_dict,
+            query
+        )
+
     def get_user_by_token(self, token):
         """Get a user from the given access token.