diff --git a/rust/benches/evaluator.rs b/rust/benches/evaluator.rs
index 6b16a3f75b..859d54961c 100644
--- a/rust/benches/evaluator.rs
+++ b/rust/benches/evaluator.rs
@@ -33,6 +33,7 @@ fn bench_match_exact(b: &mut Bencher) {
let eval = PushRuleEvaluator::py_new(
flattened_keys,
+ false,
BTreeSet::new(),
false,
10,
@@ -71,6 +72,7 @@ fn bench_match_word(b: &mut Bencher) {
let eval = PushRuleEvaluator::py_new(
flattened_keys,
+ false,
BTreeSet::new(),
false,
10,
@@ -109,6 +111,7 @@ fn bench_match_word_miss(b: &mut Bencher) {
let eval = PushRuleEvaluator::py_new(
flattened_keys,
+ false,
BTreeSet::new(),
false,
10,
@@ -147,6 +150,7 @@ fn bench_eval_message(b: &mut Bencher) {
let eval = PushRuleEvaluator::py_new(
flattened_keys,
+ false,
BTreeSet::new(),
false,
10,
diff --git a/rust/src/push/evaluator.rs b/rust/src/push/evaluator.rs
index aa71202e43..da6f704c0e 100644
--- a/rust/src/push/evaluator.rs
+++ b/rust/src/push/evaluator.rs
@@ -68,6 +68,8 @@ pub struct PushRuleEvaluator {
/// The "content.body", if any.
body: String,
+ /// True if the event has a mentions property and MSC3952 support is enabled.
+ has_mentions: bool,
/// The user mentions that were part of the message.
user_mentions: BTreeSet<String>,
/// True if the message is a room message.
@@ -105,6 +107,7 @@ impl PushRuleEvaluator {
#[new]
pub fn py_new(
flattened_keys: BTreeMap<String, String>,
+ has_mentions: bool,
user_mentions: BTreeSet<String>,
room_mention: bool,
room_member_count: u64,
@@ -123,6 +126,7 @@ impl PushRuleEvaluator {
Ok(PushRuleEvaluator {
flattened_keys,
body,
+ has_mentions,
user_mentions,
room_mention,
room_member_count,
@@ -155,6 +159,19 @@ impl PushRuleEvaluator {
}
let rule_id = &push_rule.rule_id().to_string();
+
+ // For backwards-compatibility the legacy mention rules are disabled
+ // if the event contains the 'm.mentions' property (and if the
+ // experimental feature is enabled, both of these are represented
+ // by the has_mentions flag).
+ if self.has_mentions
+ && (rule_id == "global/override/.m.rule.contains_display_name"
+ || rule_id == "global/content/.m.rule.contains_user_name"
+ || rule_id == "global/override/.m.rule.roomnotif")
+ {
+ continue;
+ }
+
let extev_flag = &RoomVersionFeatures::ExtensibleEvents.as_str().to_string();
let supports_extensible_events = self.room_version_feature_flags.contains(extev_flag);
let safe_from_rver_condition = SAFE_EXTENSIBLE_EVENTS_RULE_IDS.contains(rule_id);
@@ -441,6 +458,7 @@ fn push_rule_evaluator() {
flattened_keys.insert("content.body".to_string(), "foo bar bob hello".to_string());
let evaluator = PushRuleEvaluator::py_new(
flattened_keys,
+ false,
BTreeSet::new(),
false,
10,
@@ -468,6 +486,7 @@ fn test_requires_room_version_supports_condition() {
let flags = vec![RoomVersionFeatures::ExtensibleEvents.as_str().to_string()];
let evaluator = PushRuleEvaluator::py_new(
flattened_keys,
+ false,
BTreeSet::new(),
false,
10,
|