use indexmap::indexset;
use ruma_identifiers::UserId;
use super::{
Action::*, ConditionalPushRule, PatternedPushRule, PushCondition::*, RoomMemberCountIs,
Ruleset, Tweak,
};
impl Ruleset {
pub fn server_default(user_id: &UserId) -> Self {
Self {
content: indexset![PatternedPushRule::contains_user_name(user_id)],
#[cfg(feature = "unstable-pre-spec")]
override_: indexset![
ConditionalPushRule::master(),
ConditionalPushRule::suppress_notices(),
ConditionalPushRule::invite_for_me(user_id),
ConditionalPushRule::member_event(),
ConditionalPushRule::contains_display_name(),
ConditionalPushRule::tombstone(),
ConditionalPushRule::roomnotif(),
ConditionalPushRule::reaction(),
],
#[cfg(not(feature = "unstable-pre-spec"))]
override_: indexset![
ConditionalPushRule::master(),
ConditionalPushRule::suppress_notices(),
ConditionalPushRule::invite_for_me(user_id),
ConditionalPushRule::member_event(),
ConditionalPushRule::contains_display_name(),
ConditionalPushRule::tombstone(),
ConditionalPushRule::roomnotif(),
],
underride: indexset![
ConditionalPushRule::call(),
ConditionalPushRule::encrypted_room_one_to_one(),
ConditionalPushRule::room_one_to_one(),
ConditionalPushRule::message(),
ConditionalPushRule::encrypted(),
],
..Default::default()
}
}
}
impl ConditionalPushRule {
pub fn master() -> Self {
Self {
actions: vec![DontNotify],
default: true,
enabled: false,
rule_id: ".m.rule.master".into(),
conditions: vec![],
}
}
pub fn suppress_notices() -> Self {
Self {
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 {
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 {
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 {
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 {
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 {
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() },
],
}
}
#[cfg(feature = "unstable-pre-spec")]
#[cfg_attr(docsrs, doc(cfg(feature = "unstable-pre-spec")))]
pub fn reaction() -> Self {
Self {
actions: vec![DontNotify],
default: true,
enabled: true,
rule_id: ".m.rule.reaction".into(),
conditions: vec![EventMatch { key: "type".into(), pattern: "m.reaction".into() }],
}
}
}
impl PatternedPushRule {
pub fn contains_user_name(user_id: &UserId) -> Self {
Self {
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 ConditionalPushRule {
pub fn call() -> Self {
Self {
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 {
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 {
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 {
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 {
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))],
}
}
}