Skip to content

Commit 029cf75

Browse files
committed
Added notif settings for "Messages sent by bot" (element-hq#692)
In order to do that, the rules definitions have been update to support "dont_notify" hs default push rules
1 parent 1a248c8 commit 029cf75

File tree

1 file changed

+118
-39
lines changed

1 file changed

+118
-39
lines changed

src/components/views/settings/Notifications.js

Lines changed: 118 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -54,8 +54,7 @@ var VectorPushRulesDefinitions = {
5454
conditions: [{
5555
"kind": "contains_display_name"
5656
}],
57-
hsDefaultRuleVectorState: PushRuleVectorState.LOUD,
58-
vectorStateToActions: {
57+
vectorStateToActions: { // The actions for each vector state
5958
on: [
6059
"notify"
6160
],
@@ -69,7 +68,12 @@ var VectorPushRulesDefinitions = {
6968
"set_tweak":"highlight"
7069
}
7170
]
72-
}
71+
},
72+
vectorStateToHsDefaultRuleEnabled: { // If it exists, the hs default push rule enabled expected value for each vector state
73+
on: undefined, // ON (and its actions) does not corresponds to the default hs push rule, so NA
74+
loud: true, // LOUD corresponds to the default rule when its enabled value is true
75+
off: false // OFF corresponds to the default rule when its enabled value is false
76+
},
7377
},
7478

7579
// Messages just sent to the user in a 1:1 room
@@ -80,7 +84,6 @@ var VectorPushRulesDefinitions = {
8084
"is": "2",
8185
"kind": "room_member_count"
8286
}],
83-
hsDefaultRuleVectorState: PushRuleVectorState.LOUD,
8487
vectorStateToActions: {
8588
on: [
8689
"notify"
@@ -92,6 +95,11 @@ var VectorPushRulesDefinitions = {
9295
"value": "default"
9396
}
9497
]
98+
},
99+
vectorStateToHsDefaultRuleEnabled: {
100+
on: undefined,
101+
loud: true,
102+
off: false
95103
}
96104
},
97105

@@ -103,7 +111,6 @@ var VectorPushRulesDefinitions = {
103111
"kind": "room_member_count"
104112
}],
105113
hsDefaultRuleId: undefined, // Matrix does not define a default hs push rule for group
106-
hsDefaultRuleVectorState: PushRuleVectorState.on,
107114
vectorStateToActions: {
108115
on: [
109116
"notify"
@@ -115,6 +122,11 @@ var VectorPushRulesDefinitions = {
115122
"value": "default"
116123
}
117124
]
125+
},
126+
vectorStateToHsDefaultRuleEnabled: {
127+
on: true,
128+
loud: undefined,
129+
off: false
118130
}
119131
},
120132

@@ -139,7 +151,6 @@ var VectorPushRulesDefinitions = {
139151
"pattern": "" // It is updated at runtime the user id
140152
}
141153
],
142-
hsDefaultRuleVectorState: PushRuleVectorState.LOUD,
143154
vectorStateToActions: {
144155
on: [
145156
"notify"
@@ -151,19 +162,23 @@ var VectorPushRulesDefinitions = {
151162
"value": "default"
152163
}
153164
]
165+
},
166+
vectorStateToHsDefaultRuleEnabled: {
167+
on: undefined,
168+
loud: true,
169+
off: false
154170
}
155171
},
156172

157173
// When people join or leave a room
158-
/*"im.vector.rule.member_event": {
174+
"im.vector.rule.member_event": {
159175
hsDefaultRuleId: ".m.rule.member_event",
160176
description: "When people join or leave a room",
161177
conditions: [{
162178
"pattern": "m.room.member",
163179
"kind": "event_match",
164180
"key": "type"
165181
}],
166-
hsDefaultRuleVectorState: PushRuleVectorState.ON,
167182
vectorStateToActions: {
168183
on: [
169184
"notify"
@@ -175,8 +190,13 @@ var VectorPushRulesDefinitions = {
175190
"value": "default"
176191
}
177192
]
193+
},
194+
vectorStateToHsDefaultRuleEnabled: {
195+
on: true,
196+
loud: undefined,
197+
off: false
178198
}
179-
},*/
199+
},
180200

181201
// Incoming call
182202
"im.vector.rule.call": {
@@ -187,7 +207,6 @@ var VectorPushRulesDefinitions = {
187207
"kind": "event_match",
188208
"key": "type"
189209
}],
190-
hsDefaultRuleVectorState: PushRuleVectorState.LOUD,
191210
vectorStateToActions: {
192211
on: [
193212
"notify"
@@ -198,9 +217,43 @@ var VectorPushRulesDefinitions = {
198217
"set_tweak": "sound",
199218
"value": "ring"
200219
}
201-
]
220+
],
221+
},
222+
vectorStateToHsDefaultRuleEnabled: {
223+
on: undefined,
224+
loud: true,
225+
off: false
202226
}
203227
},
228+
229+
// Notifications from bots
230+
"im.vector.rule.notices": {
231+
hsDefaultRuleId: ".m.rule.suppress_notices",
232+
description: "Messages sent by bot",
233+
conditions: [{
234+
"kind": "event_match",
235+
"key": "content.msgtype",
236+
"pattern": "m.notice"
237+
}],
238+
vectorStateToActions: {
239+
on: undefined, // ON for vector UI means that the .m.rule.suppress_notices rule is disabled.
240+
loud: [
241+
"notify",
242+
{
243+
"set_tweak": "sound",
244+
"value": "ring"
245+
}
246+
],
247+
off: [
248+
"dont_notify"
249+
]
250+
},
251+
vectorStateToHsDefaultRuleEnabled: {
252+
on: false, // .m.rule.suppress_notices is a "negative" rule, we have to invert its enabled value for vector UI
253+
loud: undefined,
254+
off: true
255+
}
256+
}
204257
};
205258

206259
module.exports = React.createClass({
@@ -369,28 +422,26 @@ module.exports = React.createClass({
369422
var ruleDefinition = VectorPushRulesDefinitions[rule.vectorRuleId];
370423

371424
if (rule.rule) {
372-
if (newPushRuleVectorState === PushRuleVectorState.OFF) {
425+
if (undefined !== ruleDefinition.vectorStateToHsDefaultRuleEnabled[newPushRuleVectorState] && rule.hsDefaultRule) {
426+
// The new state corresponds to the default hs rule
427+
// Enable or disable it according to the rule definition
428+
deferreds.push(cli.setPushRuleEnabled('global', rule.hsDefaultRule.kind, ruleDefinition.hsDefaultRuleId,
429+
ruleDefinition.vectorStateToHsDefaultRuleEnabled[newPushRuleVectorState]));
430+
373431
// Remove the vector rule if any
374432
if (!rule.isHSDefaultRule) {
375433
deferreds.push(cli.deletePushRule('global', rule.rule.kind, rule.rule.rule_id))
376434
}
377-
378-
// And disable the hs default rule
379-
deferreds.push(cli.setPushRuleEnabled('global', 'underride', ruleDefinition.hsDefaultRuleId, false));
380435
}
381436
else {
437+
// The new state (and its implied actions) does not correspond to a default hs rule
438+
// or the HS does not expose this default rule.
382439
if (rule.isHSDefaultRule) {
383-
// If the new state corresponds to the hs default rule actions, enable it
384-
// Else create a new rule that will override it
385-
if (newPushRuleVectorState === ruleDefinition.hsDefaultRuleVectorState) {
386-
deferreds.push(cli.setPushRuleEnabled('global', rule.rule.kind, rule.rule.rule_id, true));
387-
}
388-
else {
389-
deferreds.push(this._addOverridingVectorPushRule(rule.vectorRuleId, newPushRuleVectorState));
390-
}
440+
// Create a new rule that will override the default one
441+
deferreds.push(this._addOverridingVectorPushRule(rule.vectorRuleId, newPushRuleVectorState));
391442
}
392443
else {
393-
// Change the actions of the overriding Vector rule
444+
// Change the actions of the existing overriding Vector rule
394445
deferreds.push(this._updatePushRuleActions(rule.rule, ruleDefinition.vectorStateToActions[newPushRuleVectorState]));
395446
}
396447
}
@@ -614,8 +665,9 @@ module.exports = React.createClass({
614665
'.m.rule.contains_display_name': 'vector',
615666
'.m.rule.room_one_to_one': 'vector',
616667
'.m.rule.invite_for_me': 'vector',
617-
//'.m.rule.member_event': 'vector',
618-
'.m.rule.call': 'vector'
668+
'.m.rule.member_event': 'vector',
669+
'.m.rule.call': 'vector',
670+
'.m.rule.suppress_notices': 'vector'
619671

620672
// Others go to others
621673
};
@@ -741,8 +793,9 @@ module.exports = React.createClass({
741793
'im.vector.rule.room_one_to_one',
742794
'im.vector.rule.room_group',
743795
'im.vector.rule.invite_for_me',
744-
//'im.vector.rule.member_event',
745-
'im.vector.rule.call'
796+
'im.vector.rule.member_event',
797+
'im.vector.rule.call',
798+
'im.vector.rule.notices'
746799
];
747800
for (var i in vectorRuleIds) {
748801
var vectorRuleId = vectorRuleIds[i];
@@ -767,19 +820,46 @@ module.exports = React.createClass({
767820
isHSDefaultRule = true;
768821
}
769822

770-
// Translate the rule actions into vector state
771-
var vectorState = PushRuleVectorState.OFF;
772-
if (rule && rule.enabled) {
773-
if (JSON.stringify(rule.actions) === JSON.stringify(ruleDefinition.vectorStateToActions[PushRuleVectorState.ON])) {
774-
vectorState = PushRuleVectorState.ON;
775-
}
776-
else if (JSON.stringify(rule.actions) === JSON.stringify(ruleDefinition.vectorStateToActions[PushRuleVectorState.LOUD])) {
777-
vectorState = PushRuleVectorState.LOUD;
823+
// Translate the rule actions and its enabled value into vector state
824+
var vectorState;
825+
if (rule) {
826+
for (var stateKey in PushRuleVectorState) {
827+
var state = PushRuleVectorState[stateKey];
828+
var vectorStateToActions = ruleDefinition.vectorStateToActions[state];
829+
830+
if (!vectorStateToActions) {
831+
// No defined actions means that this vector state expects a disabled default hs rule
832+
if (isHSDefaultRule && rule.enabled === ruleDefinition.vectorStateToHsDefaultRuleEnabled[state]) {
833+
vectorState = state;
834+
break;
835+
}
836+
}
837+
else {
838+
// The actions must match to the ones expected by vector state
839+
if (JSON.stringify(rule.actions) === JSON.stringify(vectorStateToActions)) {
840+
if (isHSDefaultRule) {
841+
// In the case of a default hs push rule, the enabled value must also match
842+
if (rule.enabled === ruleDefinition.vectorStateToHsDefaultRuleEnabled[state]) {
843+
vectorState = state;
844+
break;
845+
}
846+
}
847+
else {
848+
vectorState = state;
849+
break;
850+
}
851+
}
852+
}
778853
}
779-
else {
780-
console.error("Cannot translate rule actionsinto Vector rule state");
854+
855+
if (!vectorState) {
856+
console.error("Cannot translate rule actions into Vector rule state. Rule: " + rule);
857+
vectorState = PushRuleVectorState.OFF;
781858
}
782859
}
860+
else {
861+
vectorState = PushRuleVectorState.OFF;
862+
}
783863

784864
self.state.vectorPushRules.push({
785865
"vectorRuleId": vectorRuleId,
@@ -794,7 +874,6 @@ module.exports = React.createClass({
794874

795875
// Build the rules not managed by Vector UI
796876
var otherRulesDescriptions = {
797-
'.m.rule.suppress_notices': "Suppress notifications from bots",
798877
'.m.rule.message': "Notify for all other messages/rooms",
799878
'.m.rule.fallback': "Notify me for anything else"
800879
};

0 commit comments

Comments
 (0)