use maplit::btreeset;
use ruma_identifiers::UserId;
use super::{
Action::*, ConditionalPushRule, ContentPushRule, OverridePushRule, PatternedPushRule,
PushCondition::*, RoomMemberCountIs, Ruleset, Tweak, UnderridePushRule,
};
impl Ruleset {
pub fn server_default(user_id: &UserId) -> Self {
Self {
content: btreeset![ContentPushRule::contains_user_name(user_id)],
override_: btreeset![
OverridePushRule::master(),
OverridePushRule::suppress_notices(),
OverridePushRule::invite_for_me(user_id),
OverridePushRule::member_event(),
OverridePushRule::contains_display_name(),
OverridePushRule::tombstone(),
OverridePushRule::roomnotif(),
],
underride: btreeset![
UnderridePushRule::call(),
UnderridePushRule::encrypted_room_one_to_one(),
UnderridePushRule::room_one_to_one(),
UnderridePushRule::message(),
UnderridePushRule::encrypted(),
],
..Default::default()
}
}
}
impl OverridePushRule {
pub fn master() -> Self {
Self(ConditionalPushRule {
actions: vec![DontNotify],
default: true,
enabled: false,
rule_id: ".m.rule.master".into(),
conditions: vec![],
})
}
pub fn suppress_notices() -> Self {
Self(ConditionalPushRule {
actions: vec![DontNotify],
default: true,
enabled: true,
rule_id: ".m.rule.suppress_notices".into(),
conditions: vec![EventMatch {
key: "content.msgtype".into(),
pattern: "m.notice".into(),
}],
})
}
pub fn invite_for_me(user_id: &UserId) -> Self {
Self(ConditionalPushRule {
actions: vec![
Notify,
SetTweak(Tweak::Sound("default".into())),
SetTweak(Tweak::Highlight(false)),
],
default: true,
enabled: true,
rule_id: ".m.rule.invite_for_me".into(),
conditions: vec![
EventMatch { key: "type".into(), pattern: "m.room.member".into() },
EventMatch { key: "content.membership".into(), pattern: "invite".into() },
EventMatch { key: "state_key".into(), pattern: user_id.to_string() },
],
})
}
pub fn member_event() -> Self {
Self(ConditionalPushRule {
actions: vec![DontNotify],
default: true,
enabled: true,
rule_id: ".m.rule.member_event".into(),
conditions: vec![EventMatch { key: "type".into(), pattern: "m.room.member".into() }],
})
}
pub fn contains_display_name() -> Self {
Self(ConditionalPushRule {
actions: vec![
Notify,
SetTweak(Tweak::Sound("default".into())),
SetTweak(Tweak::Highlight(true)),
],
default: true,
enabled: true,
rule_id: ".m.rule.contains_display_name".into(),
conditions: vec![ContainsDisplayName],
})
}
pub fn tombstone() -> Self {
Self(ConditionalPushRule {
actions: vec![Notify, SetTweak(Tweak::Highlight(true))],
default: true,
enabled: false,
rule_id: ".m.rule.tombstone".into(),
conditions: vec![
EventMatch { key: "type".into(), pattern: "m.room.tombstone".into() },
EventMatch { key: "state_key".into(), pattern: "".into() },
],
})
}
pub fn roomnotif() -> Self {
Self(ConditionalPushRule {
actions: vec![Notify, SetTweak(Tweak::Highlight(true))],
default: true,
enabled: true,
rule_id: ".m.rule.roomnotif".into(),
conditions: vec![
EventMatch { key: "content.body".into(), pattern: "@room".into() },
SenderNotificationPermission { key: "room".into() },
],
})
}
}
impl ContentPushRule {
pub fn contains_user_name(user_id: &UserId) -> Self {
Self(PatternedPushRule {
rule_id: ".m.rules.contains_user_name".into(),
enabled: true,
default: true,
pattern: user_id.localpart().into(),
actions: vec![
Notify,
SetTweak(Tweak::Sound("default".into())),
SetTweak(Tweak::Highlight(true)),
],
})
}
}
impl UnderridePushRule {
pub fn call() -> Self {
Self(ConditionalPushRule {
rule_id: ".m.rules.call".into(),
default: true,
enabled: true,
conditions: vec![EventMatch { key: "type".into(), pattern: "m.call.invite".into() }],
actions: vec![
Notify,
SetTweak(Tweak::Sound("ring".into())),
SetTweak(Tweak::Highlight(false)),
],
})
}
pub fn encrypted_room_one_to_one() -> Self {
Self(ConditionalPushRule {
rule_id: ".m.rules.encrypted_room_one_to_one".into(),
default: true,
enabled: true,
conditions: vec![
RoomMemberCount { is: RoomMemberCountIs::from(js_int::uint!(2)) },
EventMatch { key: "type".into(), pattern: "m.room.encrypted".into() },
],
actions: vec![
Notify,
SetTweak(Tweak::Sound("default".into())),
SetTweak(Tweak::Highlight(false)),
],
})
}
pub fn room_one_to_one() -> Self {
Self(ConditionalPushRule {
rule_id: ".m.rules.room_one_to_one".into(),
default: true,
enabled: true,
conditions: vec![
RoomMemberCount { is: RoomMemberCountIs::from(js_int::uint!(2)) },
EventMatch { key: "type".into(), pattern: "m.room.message".into() },
],
actions: vec![
Notify,
SetTweak(Tweak::Sound("default".into())),
SetTweak(Tweak::Highlight(false)),
],
})
}
pub fn message() -> Self {
Self(ConditionalPushRule {
rule_id: ".m.rules.message".into(),
default: true,
enabled: true,
conditions: vec![EventMatch { key: "type".into(), pattern: "m.room.message".into() }],
actions: vec![Notify, SetTweak(Tweak::Highlight(false))],
})
}
pub fn encrypted() -> Self {
Self(ConditionalPushRule {
rule_id: ".m.rules.encrypted".into(),
default: true,
enabled: true,
conditions: vec![EventMatch { key: "type".into(), pattern: "m.room.encrypted".into() }],
actions: vec![Notify, SetTweak(Tweak::Highlight(false))],
})
}
}