@@ -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
206259module . 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