forked from MirrorHub/synapse
Make get_if_app_services_interested_in_user faster
This commit is contained in:
parent
c57789d138
commit
760625acba
4 changed files with 34 additions and 13 deletions
|
@ -241,6 +241,16 @@ class ApplicationService(object):
|
||||||
def is_exclusive_room(self, room_id):
|
def is_exclusive_room(self, room_id):
|
||||||
return self._is_exclusive(ApplicationService.NS_ROOMS, room_id)
|
return self._is_exclusive(ApplicationService.NS_ROOMS, room_id)
|
||||||
|
|
||||||
|
def get_exlusive_user_regexes(self):
|
||||||
|
"""Get the list of regexes used to determine if a user is exclusively
|
||||||
|
registered by the AS
|
||||||
|
"""
|
||||||
|
return [
|
||||||
|
regex_obj["regex"]
|
||||||
|
for regex_obj in self.namespaces[ApplicationService.NS_USERS]
|
||||||
|
if regex_obj["exclusive"]
|
||||||
|
]
|
||||||
|
|
||||||
def is_rate_limited(self):
|
def is_rate_limited(self):
|
||||||
return self.rate_limited
|
return self.rate_limited
|
||||||
|
|
||||||
|
|
|
@ -251,9 +251,7 @@ class RulesForRoom(object):
|
||||||
if not self.is_mine_id(user_id):
|
if not self.is_mine_id(user_id):
|
||||||
continue
|
continue
|
||||||
|
|
||||||
if self.store.get_if_app_services_interested_in_user(
|
if self.store.get_if_app_services_interested_in_user(user_id):
|
||||||
user_id, exclusive=True
|
|
||||||
):
|
|
||||||
continue
|
continue
|
||||||
|
|
||||||
# If a user has left a room we remove their push rule. If they
|
# If a user has left a room we remove their push rule. If they
|
||||||
|
|
|
@ -13,6 +13,7 @@
|
||||||
# See the License for the specific language governing permissions and
|
# See the License for the specific language governing permissions and
|
||||||
# limitations under the License.
|
# limitations under the License.
|
||||||
import logging
|
import logging
|
||||||
|
import re
|
||||||
import simplejson as json
|
import simplejson as json
|
||||||
from twisted.internet import defer
|
from twisted.internet import defer
|
||||||
|
|
||||||
|
@ -36,18 +37,30 @@ class ApplicationServiceStore(SQLBaseStore):
|
||||||
hs.config.app_service_config_files
|
hs.config.app_service_config_files
|
||||||
)
|
)
|
||||||
|
|
||||||
|
# We precompie a regex constructed from all the regexes that the AS's
|
||||||
|
# have registered for exclusive users.
|
||||||
|
exclusive_user_regexes = [
|
||||||
|
regex.pattern
|
||||||
|
for service in self.services_cache
|
||||||
|
for regex in service.get_exlusive_user_regexes()
|
||||||
|
]
|
||||||
|
if exclusive_user_regexes:
|
||||||
|
exclusive_user_regex = "|".join("(" + r + ")" for r in exclusive_user_regexes)
|
||||||
|
self.exclusive_user_regex = re.compile(exclusive_user_regex)
|
||||||
|
else:
|
||||||
|
# We handle this case specially otherwise the constructed regex
|
||||||
|
# will always match
|
||||||
|
self.exclusive_user_regex = None
|
||||||
|
|
||||||
def get_app_services(self):
|
def get_app_services(self):
|
||||||
return self.services_cache
|
return self.services_cache
|
||||||
|
|
||||||
def get_if_app_services_interested_in_user(self, user_id, exclusive=False):
|
def get_if_app_services_interested_in_user(self, user_id):
|
||||||
"""Check if the user is one associated with an app service
|
"""Check if the user is one associated with an app service (exclusively)
|
||||||
"""
|
"""
|
||||||
for service in self.services_cache:
|
if self.exclusive_user_regex:
|
||||||
if service.is_interested_in_user(user_id):
|
return bool(self.exclusive_user_regex.match(user_id))
|
||||||
if exclusive:
|
|
||||||
return service.is_exclusive_user(user_id)
|
|
||||||
else:
|
else:
|
||||||
return True
|
|
||||||
return False
|
return False
|
||||||
|
|
||||||
def get_app_service_by_user_id(self, user_id):
|
def get_app_service_by_user_id(self, user_id):
|
||||||
|
|
|
@ -163,7 +163,7 @@ class PushRuleStore(SQLBaseStore):
|
||||||
local_users_in_room = set(
|
local_users_in_room = set(
|
||||||
u for u in users_in_room
|
u for u in users_in_room
|
||||||
if self.hs.is_mine_id(u)
|
if self.hs.is_mine_id(u)
|
||||||
and not self.get_if_app_services_interested_in_user(u, exclusive=True)
|
and not self.get_if_app_services_interested_in_user(u)
|
||||||
)
|
)
|
||||||
|
|
||||||
# users in the room who have pushers need to get push rules run because
|
# users in the room who have pushers need to get push rules run because
|
||||||
|
|
Loading…
Reference in a new issue