Store pushrules in model with (kind, rule_id) keys
Two rules of different kinds can have the same rule ID
This commit is contained in:
		| @@ -1792,8 +1792,11 @@ class MatrixClient(nio.AsyncClient): | |||||||
|         urgency_hint: Optional[bool] = None, |         urgency_hint: Optional[bool] = None, | ||||||
|     ) -> None: |     ) -> None: | ||||||
|  |  | ||||||
|         # XXX: [kind, rule_id] |         kind     = PushRuleKind[kind] if isinstance(kind, str) else kind | ||||||
|         current: PushRule = self.models[self.user_id, "pushrules"][rule_id] |         nio_kind = nio.PushRuleKind[kind.value.lower()] | ||||||
|  |  | ||||||
|  |         current: PushRule = \ | ||||||
|  |             self.models[self.user_id, "pushrules"][kind.value, rule_id] | ||||||
|  |  | ||||||
|         actions: List[nio.PushAction] = [] |         actions: List[nio.PushAction] = [] | ||||||
|  |  | ||||||
| @@ -1819,11 +1822,6 @@ class MatrixClient(nio.AsyncClient): | |||||||
|         elif hint is False or (hint is None and not current.urgency_hint): |         elif hint is False or (hint is None and not current.urgency_hint): | ||||||
|             actions.append(nio.PushSetTweak("urgency_hint", False)) |             actions.append(nio.PushSetTweak("urgency_hint", False)) | ||||||
|  |  | ||||||
|         nio_kind = nio.PushRuleKind[ |  | ||||||
|             (kind if isinstance(kind, str) else kind.value).lower() |  | ||||||
|         ] |  | ||||||
|  |  | ||||||
|         print(nio_kind, rule_id, actions) |  | ||||||
|         await self.set_pushrule_actions("global", nio_kind, rule_id, actions) |         await self.set_pushrule_actions("global", nio_kind, rule_id, actions) | ||||||
|  |  | ||||||
|  |  | ||||||
|   | |||||||
| @@ -97,17 +97,18 @@ class PushRuleKind(AutoStrEnum): | |||||||
| class PushRule(ModelItem): | class PushRule(ModelItem): | ||||||
|     """A push rule configured for one of our account.""" |     """A push rule configured for one of our account.""" | ||||||
|  |  | ||||||
|     id:           str          = field() |     id:           Tuple[str, str] = field()  # (kind.value, rule_id) | ||||||
|     kind:         PushRuleKind = field() |     kind:         PushRuleKind    = field() | ||||||
|     order:        int          = field() |     rule_id:      str             = field() | ||||||
|     default:      bool         = field() |     order:        int             = field() | ||||||
|     enabled:      bool         = True |     default:      bool            = field() | ||||||
|     pattern:      str          = "" |     enabled:      bool            = True | ||||||
|     notify:       bool         = False |     pattern:      str             = "" | ||||||
|     highlight:    bool         = False |     notify:       bool            = False | ||||||
|     bubble:       bool         = False |     highlight:    bool            = False | ||||||
|     sound:        bool         = False |     bubble:       bool            = False | ||||||
|     urgency_hint: bool         = False |     sound:        bool            = False | ||||||
|  |     urgency_hint: bool            = False | ||||||
|  |  | ||||||
|     def __lt__(self, other: "PushRule") -> bool: |     def __lt__(self, other: "PushRule") -> bool: | ||||||
|         """Sort by `kind`, then `order`.""" |         """Sort by `kind`, then `order`.""" | ||||||
|   | |||||||
| @@ -813,9 +813,10 @@ class NioCallbacks: | |||||||
|                 sound  = tweaks.get("sound", False) is not False |                 sound  = tweaks.get("sound", False) is not False | ||||||
|                 hint   = tweaks.get("urgency_hint", high) is not False |                 hint   = tweaks.get("urgency_hint", high) is not False | ||||||
|  |  | ||||||
|                 model[rule.id] = PushRule( |                 model[kind.value, rule.id] = PushRule( | ||||||
|                     id           = rule.id, |                     id           = (kind.value, rule.id), | ||||||
|                     kind         = kind, |                     kind         = kind, | ||||||
|  |                     rule_id      = rule.id, | ||||||
|                     order        = order, |                     order        = order, | ||||||
|                     default      = rule.default, |                     default      = rule.default, | ||||||
|                     enabled      = rule.enabled, |                     enabled      = rule.enabled, | ||||||
|   | |||||||
| @@ -6,11 +6,10 @@ import "../../Base" | |||||||
| HButton { | HButton { | ||||||
|     property string toggles: "" |     property string toggles: "" | ||||||
|  |  | ||||||
|     readonly property string key: JSON.stringify([model.kind, model.id]) |  | ||||||
|  |  | ||||||
|     readonly property bool on: |     readonly property bool on: | ||||||
|         toggles && page.pendingEdits[key] && toggles in page.pendingEdits[key]? |         toggles && page.pendingEdits[model.id] && | ||||||
|         page.pendingEdits[key][toggles] : |         toggles in page.pendingEdits[model.id] ? | ||||||
|  |         page.pendingEdits[model.id][toggles] : | ||||||
|  |  | ||||||
|         toggles ? |         toggles ? | ||||||
|         model[toggles] : |         model[toggles] : | ||||||
| @@ -25,15 +24,15 @@ HButton { | |||||||
|     onClicked: { |     onClicked: { | ||||||
|         if (! toggles) return |         if (! toggles) return | ||||||
|  |  | ||||||
|         if (! (key in page.pendingEdits)) page.pendingEdits[key] = {} |         if (! (model.id in page.pendingEdits)) page.pendingEdits[model.id] = {} | ||||||
|  |  | ||||||
|         if ((! on) === model[toggles]) |         if ((! on) === model[toggles]) | ||||||
|             delete page.pendingEdits[key][toggles] |             delete page.pendingEdits[model.id][toggles] | ||||||
|         else |         else | ||||||
|             page.pendingEdits[key][toggles] = ! on |             page.pendingEdits[model.id][toggles] = ! on | ||||||
|  |  | ||||||
|         if (! Object.keys(page.pendingEdits[key]).length) |         if (! Object.keys(page.pendingEdits[model.id]).length) | ||||||
|             delete page.pendingEdits[key] |             delete page.pendingEdits[model.id] | ||||||
|  |  | ||||||
|         page.pendingEditsChanged() |         page.pendingEditsChanged() | ||||||
|     } |     } | ||||||
|   | |||||||
| @@ -14,7 +14,7 @@ HTile { | |||||||
|  |  | ||||||
|     readonly property QtObject matchingRoom: |     readonly property QtObject matchingRoom: | ||||||
|         model.kind === "Room" ? |         model.kind === "Room" ? | ||||||
|         ModelStore.get(page.userId, "rooms").find(model.id) : |         ModelStore.get(page.userId, "rooms").find(model.rule_id) : | ||||||
|         null |         null | ||||||
|  |  | ||||||
|  |  | ||||||
| @@ -30,69 +30,69 @@ HTile { | |||||||
|             wrapMode: HLabel.Wrap |             wrapMode: HLabel.Wrap | ||||||
|  |  | ||||||
|             textFormat: |             textFormat: | ||||||
|                 model.id === ".m.rule.contains_user_name" || |                 model.rule_id === ".m.rule.contains_user_name" || | ||||||
|                 model.id === ".m.rule.roomnotif" || |                 model.rule_id === ".m.rule.roomnotif" || | ||||||
|                 model.kind === "Sender" ? |                 model.kind === "Sender" ? | ||||||
|                 HLabel.StyledText : |                 HLabel.StyledText : | ||||||
|                 HLabel.PlainText |                 HLabel.PlainText | ||||||
|  |  | ||||||
|             text: |             text: | ||||||
|                 model.id === ".m.rule.master" ? |                 model.rule_id === ".m.rule.master" ? | ||||||
|                 qsTr("Any message") : |                 qsTr("Any message") : | ||||||
|  |  | ||||||
|                 model.id === ".m.rule.suppress_notices" ? |                 model.rule_id === ".m.rule.suppress_notices" ? | ||||||
|                 qsTr("Messages sent by bots") : |                 qsTr("Messages sent by bots") : | ||||||
|  |  | ||||||
|                 model.id === ".m.rule.invite_for_me" ? |                 model.rule_id === ".m.rule.invite_for_me" ? | ||||||
|                 qsTr("Received room invites") : |                 qsTr("Received room invites") : | ||||||
|  |  | ||||||
|                 model.id === ".m.rule.member_event" ? |                 model.rule_id === ".m.rule.member_event" ? | ||||||
|                 qsTr("Membership, name & avatar changes") : |                 qsTr("Membership, name & avatar changes") : | ||||||
|  |  | ||||||
|                 model.id === ".m.rule.contains_display_name" ? |                 model.rule_id === ".m.rule.contains_display_name" ? | ||||||
|                 qsTr("Messages containing my display name") : |                 qsTr("Messages containing my display name") : | ||||||
|  |  | ||||||
|                 model.id === ".m.rule.tombstone" ? |                 model.rule_id === ".m.rule.tombstone" ? | ||||||
|                 qsTr("Room migration alerts") : |                 qsTr("Room migration alerts") : | ||||||
|  |  | ||||||
|                 model.id === ".m.rule.reaction" ? |                 model.rule_id === ".m.rule.reaction" ? | ||||||
|                 qsTr("Emoji reactions") : |                 qsTr("Emoji reactions") : | ||||||
|  |  | ||||||
|                 model.id === ".m.rule.roomnotif" ? |                 model.rule_id === ".m.rule.roomnotif" ? | ||||||
|                 qsTr("Messages containing %1").arg( |                 qsTr("Messages containing %1").arg( | ||||||
|                     utils.htmlColorize("@room", theme.colors.accentText), |                     utils.htmlColorize("@room", theme.colors.accentText), | ||||||
|                 ) : |                 ) : | ||||||
|  |  | ||||||
|                 model.id === ".m.rule.contains_user_name" ? |                 model.rule_id === ".m.rule.contains_user_name" ? | ||||||
|                 qsTr("Contains %1").arg(utils.coloredNameHtml( |                 qsTr("Contains %1").arg(utils.coloredNameHtml( | ||||||
|                     "", page.userId, page.userId.split(":")[0].substring(1), |                     "", page.userId, page.userId.split(":")[0].substring(1), | ||||||
|                 )): |                 )): | ||||||
|  |  | ||||||
|                 model.id === ".m.rule.call" ? |                 model.rule_id === ".m.rule.call" ? | ||||||
|                 qsTr("Incoming audio calls") : |                 qsTr("Incoming audio calls") : | ||||||
|  |  | ||||||
|                 model.id === ".m.rule.encrypted_room_one_to_one" ? |                 model.rule_id === ".m.rule.encrypted_room_one_to_one" ? | ||||||
|                 qsTr("Encrypted 1-to-1 messages") : |                 qsTr("Encrypted 1-to-1 messages") : | ||||||
|  |  | ||||||
|                 model.id === ".m.rule.room_one_to_one" ? |                 model.rule_id === ".m.rule.room_one_to_one" ? | ||||||
|                 qsTr("Unencrypted 1-to-1 messages") : |                 qsTr("Unencrypted 1-to-1 messages") : | ||||||
|  |  | ||||||
|                 model.id === ".m.rule.message" ? |                 model.rule_id === ".m.rule.message" ? | ||||||
|                 qsTr("Unencrypted group messages") : |                 qsTr("Unencrypted group messages") : | ||||||
|  |  | ||||||
|                 model.id === ".m.rule.encrypted" ? |                 model.rule_id === ".m.rule.encrypted" ? | ||||||
|                 qsTr("Encrypted group messages") : |                 qsTr("Encrypted group messages") : | ||||||
|  |  | ||||||
|                 model.kind === "Content" ? |                 model.kind === "Content" ? | ||||||
|                 qsTr('Contains "%1"').arg(model.pattern) : |                 qsTr('Contains "%1"').arg(model.pattern) : | ||||||
|  |  | ||||||
|                 model.kind === "Sender" ? |                 model.kind === "Sender" ? | ||||||
|                 utils.coloredNameHtml("", model.id) : |                 utils.coloredNameHtml("", model.rule_id) : | ||||||
|  |  | ||||||
|                 matchingRoom && matchingRoom.display_name ? |                 matchingRoom && matchingRoom.display_name ? | ||||||
|                 matchingRoom.display_name : |                 matchingRoom.display_name : | ||||||
|  |  | ||||||
|                 model.id |                 model.rule_id | ||||||
|  |  | ||||||
|             Layout.fillWidth: true |             Layout.fillWidth: true | ||||||
|         } |         } | ||||||
|   | |||||||
| @@ -16,8 +16,7 @@ HListView { | |||||||
|     property bool enableFlickShortcuts: |     property bool enableFlickShortcuts: | ||||||
|         SwipeView ? SwipeView.isCurrentItem : true |         SwipeView ? SwipeView.isCurrentItem : true | ||||||
|  |  | ||||||
|     // The object's array keys are run through `JSON.stringify(key)`. |     // {model.id: {notify, highlight, bubble, sound, urgency_hint}} | ||||||
|     // {[kind, rule_id]: {notify, highlight, bubble, sound, urgency_hint}} |  | ||||||
|     property var pendingEdits: ({}) |     property var pendingEdits: ({}) | ||||||
|     property string saveFutureId: "" |     property string saveFutureId: "" | ||||||
|  |  | ||||||
| @@ -28,8 +27,8 @@ HListView { | |||||||
|     function save() { |     function save() { | ||||||
|         const args = [] |         const args = [] | ||||||
|  |  | ||||||
|         for (const [kindRuleId, kwargs] of Object.entries(pendingEdits)) { |         for (const [modelId, kwargs] of Object.entries(pendingEdits)) { | ||||||
|             const [kind, rule_id] = JSON.parse(kindRuleId) |             const [kind, rule_id] = JSON.parse(modelId) | ||||||
|             args.push(Object.assign({}, {kind, rule_id}, kwargs)) |             args.push(Object.assign({}, {kind, rule_id}, kwargs)) | ||||||
|         } |         } | ||||||
|  |  | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user
	