2018-04-11 22:58:37 +00:00
|
|
|
/*
|
2021-07-13 03:48:20 +00:00
|
|
|
Copyright 2016 - 2021 The Matrix.org Foundation C.I.C.
|
2018-04-11 22:58:37 +00:00
|
|
|
|
|
|
|
Licensed under the Apache License, Version 2.0 (the "License");
|
|
|
|
you may not use this file except in compliance with the License.
|
|
|
|
You may obtain a copy of the License at
|
|
|
|
|
|
|
|
http://www.apache.org/licenses/LICENSE-2.0
|
|
|
|
|
|
|
|
Unless required by applicable law or agreed to in writing, software
|
|
|
|
distributed under the License is distributed on an "AS IS" BASIS,
|
|
|
|
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
|
|
See the License for the specific language governing permissions and
|
|
|
|
limitations under the License.
|
|
|
|
*/
|
|
|
|
|
2021-10-22 22:23:32 +00:00
|
|
|
import { PushRuleAction, PushRuleKind } from "matrix-js-sdk/src/@types/PushRules";
|
|
|
|
import { logger } from "matrix-js-sdk/src/logger";
|
|
|
|
|
2018-04-12 23:43:44 +00:00
|
|
|
import { _td } from '../languageHandler';
|
2021-06-29 12:11:58 +00:00
|
|
|
import { StandardActions } from "./StandardActions";
|
2021-07-13 03:48:20 +00:00
|
|
|
import { PushRuleVectorState, VectorState } from "./PushRuleVectorState";
|
2021-06-29 12:11:58 +00:00
|
|
|
import { NotificationUtils } from "./NotificationUtils";
|
2021-10-15 14:30:53 +00:00
|
|
|
|
2021-07-13 03:48:20 +00:00
|
|
|
type StateToActionsMap = {
|
|
|
|
[state in VectorState]?: PushRuleAction[];
|
|
|
|
};
|
2018-04-11 22:58:37 +00:00
|
|
|
|
2021-07-03 11:29:13 +00:00
|
|
|
interface IProps {
|
2021-07-13 03:48:20 +00:00
|
|
|
kind: PushRuleKind;
|
2021-07-03 11:29:13 +00:00
|
|
|
description: string;
|
2021-07-13 03:48:20 +00:00
|
|
|
vectorStateToActions: StateToActionsMap;
|
2021-07-03 11:29:13 +00:00
|
|
|
}
|
|
|
|
|
2018-04-11 22:58:37 +00:00
|
|
|
class VectorPushRuleDefinition {
|
2021-07-13 03:48:20 +00:00
|
|
|
private kind: PushRuleKind;
|
2021-07-03 11:29:13 +00:00
|
|
|
private description: string;
|
2021-07-13 03:48:20 +00:00
|
|
|
public readonly vectorStateToActions: StateToActionsMap;
|
2021-07-03 11:29:13 +00:00
|
|
|
|
|
|
|
constructor(opts: IProps) {
|
2018-04-11 22:58:37 +00:00
|
|
|
this.kind = opts.kind;
|
|
|
|
this.description = opts.description;
|
|
|
|
this.vectorStateToActions = opts.vectorStateToActions;
|
|
|
|
}
|
|
|
|
|
|
|
|
// Translate the rule actions and its enabled value into vector state
|
2021-07-03 11:29:13 +00:00
|
|
|
public ruleToVectorState(rule): VectorPushRuleDefinition {
|
2018-10-12 02:59:17 +00:00
|
|
|
let enabled = false;
|
2018-04-11 22:58:37 +00:00
|
|
|
if (rule) {
|
|
|
|
enabled = rule.enabled;
|
|
|
|
}
|
|
|
|
|
2018-12-11 19:01:27 +00:00
|
|
|
for (const stateKey in PushRuleVectorState.states) { // eslint-disable-line guard-for-in
|
2018-10-12 02:59:17 +00:00
|
|
|
const state = PushRuleVectorState.states[stateKey];
|
|
|
|
const vectorStateToActions = this.vectorStateToActions[state];
|
2018-04-11 22:58:37 +00:00
|
|
|
|
|
|
|
if (!vectorStateToActions) {
|
|
|
|
// No defined actions means that this vector state expects a disabled (or absent) rule
|
|
|
|
if (!enabled) {
|
|
|
|
return state;
|
|
|
|
}
|
|
|
|
} else {
|
2018-12-11 19:01:27 +00:00
|
|
|
// The actions must match to the ones expected by vector state.
|
|
|
|
// Use `decodeActions` on both sides to canonicalize things like
|
|
|
|
// value: true vs. unspecified for highlight (which defaults to
|
2018-12-12 01:46:48 +00:00
|
|
|
// true, making them equivalent).
|
2018-12-11 19:01:27 +00:00
|
|
|
if (enabled &&
|
2019-12-20 00:45:24 +00:00
|
|
|
JSON.stringify(NotificationUtils.decodeActions(rule.actions)) ===
|
|
|
|
JSON.stringify(NotificationUtils.decodeActions(vectorStateToActions))) {
|
2018-04-11 22:58:37 +00:00
|
|
|
return state;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2021-10-15 14:30:53 +00:00
|
|
|
logger.error(`Cannot translate rule actions into Vector rule state. ` +
|
2018-12-11 19:01:27 +00:00
|
|
|
`Rule: ${JSON.stringify(rule)}, ` +
|
|
|
|
`Expected: ${JSON.stringify(this.vectorStateToActions)}`);
|
2018-04-11 22:58:37 +00:00
|
|
|
return undefined;
|
|
|
|
}
|
2018-10-12 02:59:17 +00:00
|
|
|
}
|
2018-04-11 22:58:37 +00:00
|
|
|
|
|
|
|
/**
|
|
|
|
* The descriptions of rules managed by the Vector UI.
|
|
|
|
*/
|
2019-12-20 00:45:24 +00:00
|
|
|
export const VectorPushRulesDefinitions = {
|
2018-04-11 22:58:37 +00:00
|
|
|
// Messages containing user's display name
|
|
|
|
".m.rule.contains_display_name": new VectorPushRuleDefinition({
|
2021-07-13 03:48:20 +00:00
|
|
|
kind: PushRuleKind.Override,
|
2018-04-11 22:58:37 +00:00
|
|
|
description: _td("Messages containing my display name"), // passed through _t() translation in src/components/views/settings/Notifications.js
|
|
|
|
vectorStateToActions: { // The actions for each vector state, or null to disable the rule.
|
2021-07-13 03:48:20 +00:00
|
|
|
[VectorState.On]: StandardActions.ACTION_NOTIFY,
|
|
|
|
[VectorState.Loud]: StandardActions.ACTION_HIGHLIGHT_DEFAULT_SOUND,
|
|
|
|
[VectorState.Off]: StandardActions.ACTION_DISABLED,
|
2018-10-12 02:59:17 +00:00
|
|
|
},
|
2018-04-11 22:58:37 +00:00
|
|
|
}),
|
|
|
|
|
|
|
|
// Messages containing user's username (localpart/MXID)
|
|
|
|
".m.rule.contains_user_name": new VectorPushRuleDefinition({
|
2021-07-13 03:48:20 +00:00
|
|
|
kind: PushRuleKind.Override,
|
2019-01-25 20:25:29 +00:00
|
|
|
description: _td("Messages containing my username"), // passed through _t() translation in src/components/views/settings/Notifications.js
|
2018-04-11 22:58:37 +00:00
|
|
|
vectorStateToActions: { // The actions for each vector state, or null to disable the rule.
|
2021-07-13 03:48:20 +00:00
|
|
|
[VectorState.On]: StandardActions.ACTION_NOTIFY,
|
|
|
|
[VectorState.Loud]: StandardActions.ACTION_HIGHLIGHT_DEFAULT_SOUND,
|
|
|
|
[VectorState.Off]: StandardActions.ACTION_DISABLED,
|
2018-10-12 02:59:17 +00:00
|
|
|
},
|
2018-04-11 22:58:37 +00:00
|
|
|
}),
|
|
|
|
|
2018-12-11 19:01:27 +00:00
|
|
|
// Messages containing @room
|
|
|
|
".m.rule.roomnotif": new VectorPushRuleDefinition({
|
2021-07-13 03:48:20 +00:00
|
|
|
kind: PushRuleKind.Override,
|
2018-12-11 19:01:27 +00:00
|
|
|
description: _td("Messages containing @room"), // passed through _t() translation in src/components/views/settings/Notifications.js
|
|
|
|
vectorStateToActions: { // The actions for each vector state, or null to disable the rule.
|
2021-07-13 03:48:20 +00:00
|
|
|
[VectorState.On]: StandardActions.ACTION_NOTIFY,
|
|
|
|
[VectorState.Loud]: StandardActions.ACTION_HIGHLIGHT,
|
|
|
|
[VectorState.Off]: StandardActions.ACTION_DISABLED,
|
2018-12-11 19:01:27 +00:00
|
|
|
},
|
|
|
|
}),
|
|
|
|
|
2018-04-11 22:58:37 +00:00
|
|
|
// Messages just sent to the user in a 1:1 room
|
|
|
|
".m.rule.room_one_to_one": new VectorPushRuleDefinition({
|
2021-07-13 03:48:20 +00:00
|
|
|
kind: PushRuleKind.Underride,
|
2018-04-11 22:58:37 +00:00
|
|
|
description: _td("Messages in one-to-one chats"), // passed through _t() translation in src/components/views/settings/Notifications.js
|
|
|
|
vectorStateToActions: {
|
2021-07-13 03:48:20 +00:00
|
|
|
[VectorState.On]: StandardActions.ACTION_NOTIFY,
|
|
|
|
[VectorState.Loud]: StandardActions.ACTION_NOTIFY_DEFAULT_SOUND,
|
|
|
|
[VectorState.Off]: StandardActions.ACTION_DONT_NOTIFY,
|
2018-10-12 02:59:17 +00:00
|
|
|
},
|
2018-04-11 22:58:37 +00:00
|
|
|
}),
|
|
|
|
|
2018-12-11 19:01:27 +00:00
|
|
|
// Encrypted messages just sent to the user in a 1:1 room
|
|
|
|
".m.rule.encrypted_room_one_to_one": new VectorPushRuleDefinition({
|
2021-07-13 03:48:20 +00:00
|
|
|
kind: PushRuleKind.Underride,
|
2018-12-11 19:01:27 +00:00
|
|
|
description: _td("Encrypted messages in one-to-one chats"), // passed through _t() translation in src/components/views/settings/Notifications.js
|
|
|
|
vectorStateToActions: {
|
2021-07-13 03:48:20 +00:00
|
|
|
[VectorState.On]: StandardActions.ACTION_NOTIFY,
|
|
|
|
[VectorState.Loud]: StandardActions.ACTION_NOTIFY_DEFAULT_SOUND,
|
|
|
|
[VectorState.Off]: StandardActions.ACTION_DONT_NOTIFY,
|
2018-12-11 19:01:27 +00:00
|
|
|
},
|
|
|
|
}),
|
|
|
|
|
2018-04-11 22:58:37 +00:00
|
|
|
// Messages just sent to a group chat room
|
|
|
|
// 1:1 room messages are catched by the .m.rule.room_one_to_one rule if any defined
|
|
|
|
// By opposition, all other room messages are from group chat rooms.
|
|
|
|
".m.rule.message": new VectorPushRuleDefinition({
|
2021-07-13 03:48:20 +00:00
|
|
|
kind: PushRuleKind.Underride,
|
2018-04-11 22:58:37 +00:00
|
|
|
description: _td("Messages in group chats"), // passed through _t() translation in src/components/views/settings/Notifications.js
|
|
|
|
vectorStateToActions: {
|
2021-07-13 03:48:20 +00:00
|
|
|
[VectorState.On]: StandardActions.ACTION_NOTIFY,
|
|
|
|
[VectorState.Loud]: StandardActions.ACTION_NOTIFY_DEFAULT_SOUND,
|
|
|
|
[VectorState.Off]: StandardActions.ACTION_DONT_NOTIFY,
|
2018-10-12 02:59:17 +00:00
|
|
|
},
|
2018-04-11 22:58:37 +00:00
|
|
|
}),
|
|
|
|
|
2018-12-11 19:01:27 +00:00
|
|
|
// Encrypted messages just sent to a group chat room
|
|
|
|
// Encrypted 1:1 room messages are catched by the .m.rule.encrypted_room_one_to_one rule if any defined
|
|
|
|
// By opposition, all other room messages are from group chat rooms.
|
|
|
|
".m.rule.encrypted": new VectorPushRuleDefinition({
|
2021-07-13 03:48:20 +00:00
|
|
|
kind: PushRuleKind.Underride,
|
2018-12-11 19:01:27 +00:00
|
|
|
description: _td("Encrypted messages in group chats"), // passed through _t() translation in src/components/views/settings/Notifications.js
|
|
|
|
vectorStateToActions: {
|
2021-07-13 03:48:20 +00:00
|
|
|
[VectorState.On]: StandardActions.ACTION_NOTIFY,
|
|
|
|
[VectorState.Loud]: StandardActions.ACTION_NOTIFY_DEFAULT_SOUND,
|
|
|
|
[VectorState.Off]: StandardActions.ACTION_DONT_NOTIFY,
|
2018-12-11 19:01:27 +00:00
|
|
|
},
|
|
|
|
}),
|
|
|
|
|
2018-04-11 22:58:37 +00:00
|
|
|
// Invitation for the user
|
|
|
|
".m.rule.invite_for_me": new VectorPushRuleDefinition({
|
2021-07-13 03:48:20 +00:00
|
|
|
kind: PushRuleKind.Underride,
|
2018-04-11 22:58:37 +00:00
|
|
|
description: _td("When I'm invited to a room"), // passed through _t() translation in src/components/views/settings/Notifications.js
|
|
|
|
vectorStateToActions: {
|
2021-07-13 03:48:20 +00:00
|
|
|
[VectorState.On]: StandardActions.ACTION_NOTIFY,
|
|
|
|
[VectorState.Loud]: StandardActions.ACTION_NOTIFY_DEFAULT_SOUND,
|
|
|
|
[VectorState.Off]: StandardActions.ACTION_DISABLED,
|
2018-10-12 02:59:17 +00:00
|
|
|
},
|
2018-04-11 22:58:37 +00:00
|
|
|
}),
|
|
|
|
|
|
|
|
// Incoming call
|
|
|
|
".m.rule.call": new VectorPushRuleDefinition({
|
2021-07-13 03:48:20 +00:00
|
|
|
kind: PushRuleKind.Underride,
|
2018-04-11 22:58:37 +00:00
|
|
|
description: _td("Call invitation"), // passed through _t() translation in src/components/views/settings/Notifications.js
|
|
|
|
vectorStateToActions: {
|
2021-07-13 03:48:20 +00:00
|
|
|
[VectorState.On]: StandardActions.ACTION_NOTIFY,
|
|
|
|
[VectorState.Loud]: StandardActions.ACTION_NOTIFY_RING_SOUND,
|
|
|
|
[VectorState.Off]: StandardActions.ACTION_DISABLED,
|
2018-10-12 02:59:17 +00:00
|
|
|
},
|
2018-04-11 22:58:37 +00:00
|
|
|
}),
|
|
|
|
|
|
|
|
// Notifications from bots
|
|
|
|
".m.rule.suppress_notices": new VectorPushRuleDefinition({
|
2021-07-13 03:48:20 +00:00
|
|
|
kind: PushRuleKind.Override,
|
2018-04-11 22:58:37 +00:00
|
|
|
description: _td("Messages sent by bot"), // passed through _t() translation in src/components/views/settings/Notifications.js
|
|
|
|
vectorStateToActions: {
|
|
|
|
// .m.rule.suppress_notices is a "negative" rule, we have to invert its enabled value for vector UI
|
2021-07-13 03:48:20 +00:00
|
|
|
[VectorState.On]: StandardActions.ACTION_DISABLED,
|
|
|
|
[VectorState.Loud]: StandardActions.ACTION_NOTIFY_DEFAULT_SOUND,
|
|
|
|
[VectorState.Off]: StandardActions.ACTION_DONT_NOTIFY,
|
2018-10-12 02:59:17 +00:00
|
|
|
},
|
2018-04-11 22:58:37 +00:00
|
|
|
}),
|
2019-03-15 20:13:15 +00:00
|
|
|
|
|
|
|
// Room upgrades (tombstones)
|
|
|
|
".m.rule.tombstone": new VectorPushRuleDefinition({
|
2021-07-13 03:48:20 +00:00
|
|
|
kind: PushRuleKind.Override,
|
2019-03-15 20:13:15 +00:00
|
|
|
description: _td("When rooms are upgraded"), // passed through _t() translation in src/components/views/settings/Notifications.js
|
|
|
|
vectorStateToActions: { // The actions for each vector state, or null to disable the rule.
|
2021-07-13 03:48:20 +00:00
|
|
|
[VectorState.On]: StandardActions.ACTION_NOTIFY,
|
|
|
|
[VectorState.Loud]: StandardActions.ACTION_HIGHLIGHT,
|
|
|
|
[VectorState.Off]: StandardActions.ACTION_DISABLED,
|
2019-03-15 20:13:15 +00:00
|
|
|
},
|
|
|
|
}),
|
2018-04-11 22:58:37 +00:00
|
|
|
};
|