diff --git a/synapse_antispam/mjolnir/ban_list.py b/synapse_antispam/mjolnir/ban_list.py index 58d317e..8b7e897 100644 --- a/synapse_antispam/mjolnir/ban_list.py +++ b/synapse_antispam/mjolnir/ban_list.py @@ -16,6 +16,7 @@ import logging from .list_rule import ListRule, ALL_RULE_TYPES, USER_RULE_TYPES, SERVER_RULE_TYPES, ROOM_RULE_TYPES from twisted.internet import defer +from synapse.logging.context import LoggingContext logger = logging.getLogger("synapse.contrib." + __name__) @@ -28,45 +29,49 @@ class BanList(object): self.room_rules = [] self.build() - @defer.inlineCallbacks - def build(self, with_event=None): - events = yield self.get_relevant_state_events() - if with_event is not None: - events = [*events, with_event] - self.server_rules = [] - self.user_rules = [] - self.room_rules = [] - for event in events: - event_type = event.get("type", "") - state_key = event.get("state_key", "") - content = event.get("content", {}) - if state_key is None: - continue # Some message event got in here? - - # Skip over events which are replaced by with_event. We do this - # to ensure that when we rebuild the list we're using updated rules. + def build(with_event=None): + @defer.inlineCallbacks + def run(self, with_event=None): + events = yield self.get_relevant_state_events() if with_event is not None: - w_event_type = with_event.get("type", "") - w_state_key = with_event.get("state_key", "") - w_event_id = with_event.event_id - event_id = event.event_id - if w_event_type == event_type and w_state_key == state_key and w_event_id != event_id: - continue + events = [*events, with_event] + self.server_rules = [] + self.user_rules = [] + self.room_rules = [] + for event in events: + event_type = event.get("type", "") + state_key = event.get("state_key", "") + content = event.get("content", {}) + if state_key is None: + continue # Some message event got in here? - entity = content.get("entity", None) - recommendation = content.get("recommendation", None) - reason = content.get("reason", None) - if entity is None or recommendation is None or reason is None: - continue # invalid event + # Skip over events which are replaced by with_event. We do this + # to ensure that when we rebuild the list we're using updated rules. + if with_event is not None: + w_event_type = with_event.get("type", "") + w_state_key = with_event.get("state_key", "") + w_event_id = with_event.event_id + event_id = event.event_id + if w_event_type == event_type and w_state_key == state_key and w_event_id != event_id: + continue - logger.info("Adding rule %s/%s with action %s" % (event_type, entity, recommendation)) - rule = ListRule(entity=entity, action=recommendation, reason=reason, kind=event_type) - if event_type in USER_RULE_TYPES: - self.user_rules.append(rule) - elif event_type in ROOM_RULE_TYPES: - self.room_rules.append(rule) - elif event_type in SERVER_RULE_TYPES: - self.server_rules.append(rule) + entity = content.get("entity", None) + recommendation = content.get("recommendation", None) + reason = content.get("reason", None) + if entity is None or recommendation is None or reason is None: + continue # invalid event + + logger.info("Adding rule %s/%s with action %s" % (event_type, entity, recommendation)) + rule = ListRule(entity=entity, action=recommendation, reason=reason, kind=event_type) + if event_type in USER_RULE_TYPES: + self.user_rules.append(rule) + elif event_type in ROOM_RULE_TYPES: + self.room_rules.append(rule) + elif event_type in SERVER_RULE_TYPES: + self.server_rules.append(rule) + + with LoggingContext("mjolnir_ban_list_build"): + run(with_event=with_event) def get_relevant_state_events(self): return self.api.get_state_events_in_room(self.room_id, [(t, None) for t in ALL_RULE_TYPES])