From 7331d34839dca468b9e396e1d2952b0bb32011bf Mon Sep 17 00:00:00 2001
From: Kegan Dougal <kegan@matrix.org>
Date: Tue, 27 Jan 2015 16:23:46 +0000
Subject: [PATCH] Add AS specific classes with docstrings.

---
 synapse/storage/appservice.py | 60 ++++++++++++++++++++++++++++++++++-
 1 file changed, 59 insertions(+), 1 deletion(-)

diff --git a/synapse/storage/appservice.py b/synapse/storage/appservice.py
index 99f58b4c62..4c11191fe8 100644
--- a/synapse/storage/appservice.py
+++ b/synapse/storage/appservice.py
@@ -20,11 +20,69 @@ from synapse.api.errors import StoreError
 from ._base import SQLBaseStore
 
 
+# XXX: This feels like it should belong in a "models" module, not storage.
+class ApplicationService(object):
+    """Defines an application service.
+
+    Provides methods to check if this service is "interested" in events.
+    """
+
+    def __init__(self, token, url=None, namespaces=None):
+        self.token = token
+        if url:
+            self.url = url
+        if namespaces:
+            self.namespaces = namespaces
+
+    def is_interested(self, event):
+        """Check if this service is interested in this event.
+
+        Args:
+            event(Event): The event to check.
+        Returns:
+            bool: True if this service would like to know about this event.
+        """
+        # NB: This does not check room alias regex matches because that requires
+        # more context that an Event can provide. Room alias matches are checked
+        # in the ApplicationServiceHandler.
+
+        # TODO check if event.room_id regex matches
+        # TODO check if event.user_id regex matches (or m.room.member state_key)
+
+        return True
+
+
+class ApplicationServiceCache(object):
+    """Caches ApplicationServices and provides utility functions on top.
+
+    This class is designed to be invoked on incoming events in order to avoid
+    hammering the database every time to extract a list of application service
+    regexes.
+    """
+
+    def __init__(self):
+        self.services = []
+
+    def get_services_for_event(self, event):
+        """Retrieve a list of application services interested in this event.
+
+        Args:
+            event(Event): The event to check.
+        Returns:
+            list<ApplicationService>: A list of services interested in this
+            event based on the service regex.
+        """
+        interested_list = [
+            s for s in self.services if s.is_event_claimed(event)
+        ]
+        return interested_list
+
+
 class ApplicationServiceStore(SQLBaseStore):
 
     def __init__(self, hs):
         super(ApplicationServiceStore, self).__init__(hs)
-
+        self.cache = ApplicationServiceCache()
         self.clock = hs.get_clock()
 
     @defer.inlineCallbacks
-- 
GitLab