1 files changed, 59 insertions, 1 deletions
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
|