-
Notifications
You must be signed in to change notification settings - Fork 401
MSC3664: Pushrules for relations #3664
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
base: main
Are you sure you want to change the base?
Changes from 3 commits
d5f43bb
53a4607
fa8fc97
b90cdb6
a6eebe7
0161daa
242a65c
070babc
06b5393
f2a5c57
aebe3e9
1ead1da
6e1d1bb
3a288b6
df9aab5
00b0ef9
519b95d
c9d55e2
22e67c4
7248826
69fe03e
b1897fa
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,157 @@ | ||
# MSC3664: Notifications for relations | ||
|
||
Relations are very powerful and are becoming a platform to build new features | ||
like replies, edits, reactions, threads, polls and much more on. | ||
|
||
On the other hand there is currently no way to control, what you are getting | ||
notified for. Some people want to get notified, when someone replies to their | ||
deepbluev7 marked this conversation as resolved.
Show resolved
Hide resolved
|
||
message. Some want to get notified for reactions to their message. Some people | ||
explicitly do not want that. You might want to be able to mute a thread and you | ||
may want to get notified for poll responeses or not. Some people like getting | ||
notified for edits, others prefer to not get notified, when someone fixes typos | ||
20 times in a row for a long message they sent a week ago. | ||
|
||
We should extend push rules so that a server can provide sane defaults and users | ||
can adjust them to their own wishes. | ||
|
||
## Proposal | ||
|
||
### New push rule condition: `related_event_match` | ||
|
||
Notifications for relation based features need to distinguish, what type of | ||
deepbluev7 marked this conversation as resolved.
Show resolved
Hide resolved
|
||
relation was used and potentially match on the content of the related-to event. | ||
|
||
To do that we introduce a new type of condition: `related_event_match`. This is | ||
largely similar to the existing `event_match`, but operates on the related-to | ||
event. Such a condition could look like this: | ||
|
||
```json5 | ||
{ | ||
"kind": "related_event_match", | ||
"rel_type": "m.in_reply_to", | ||
"key": "sender", | ||
"pattern": "@me:my.server" | ||
} | ||
``` | ||
|
||
This condition can be used to notify me whenever someone sends a reply to my | ||
messages. | ||
|
||
- `rel_type` is the relation type. For the sake of compatibility replies | ||
deepbluev7 marked this conversation as resolved.
Show resolved
Hide resolved
|
||
should be matched as if they were sent in the relation format from | ||
[MSC2674](https://github.com/matrix-org/matrix-doc/pull/2674) with a | ||
`rel_type` of `m.in_reply_to`. If the event has any relation of this type, | ||
the related event should be matched using `pattern` and `key`. | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. This seems to implicitly usurp a relation type of Regardless, it means that There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Yes, the intention is to treat There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. If I've undersrood correctly, you could still use a relation type of There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more.
This is the bulk of my concern. (I think calling that out explicitly would probably be ideal?)
I don't think homeservers doesn't treat There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Imo at least for the context of this MSC, they should be treated the same. It is a bit of a shame, that There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Honestly this feels like putting a cart before a horse. It seems to assume that at some point we will replace replies with It's kinda fine if we do make that change in the near term, but if we don't, then this is going to be a very strange thing for the spec to say. This is all a horrible mess and I don't really know what to do about it :(. There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. I still find it a bit hidden in this MSC that this grabs the
deepbluev7 marked this conversation as resolved.
Show resolved
Hide resolved
|
||
- `key` (optional): The dot-separated field of the event to match, e.g. `content.body` | ||
or `sender`. If it is not present, the condition should match all events, | ||
that have a relation of type `rel_type`. | ||
- `pattern` (optional): The glob-style pattern to match against. Patterns with | ||
no special glob characters should be treated as having asterisks prepended | ||
and appended when testing the condition. If this is not present, it should | ||
match everything if the specific key is present. | ||
richvdh marked this conversation as resolved.
Show resolved
Hide resolved
|
||
|
||
`key` and `pattern` are optional to allow you to enable or suppress all | ||
richvdh marked this conversation as resolved.
Show resolved
Hide resolved
|
||
notifications for a specific event type. For example one could suppress | ||
notifications for all events in | ||
[threads](https://github.com/matrix-org/matrix-doc/pull/3440) and all | ||
richvdh marked this conversation as resolved.
Show resolved
Hide resolved
|
||
[edits](https://github.com/matrix-org/matrix-doc/pull/2676) with the following | ||
two conditions: | ||
|
||
```json5 | ||
{ | ||
"kind": "related_event_match", | ||
"rel_type": "m.replace" | ||
} | ||
``` | ||
|
||
```json5 | ||
{ | ||
"kind": "related_event_match", | ||
"rel_type": "m.thread" | ||
} | ||
``` | ||
Comment on lines
+66
to
+78
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Aren't these identical to: {
"kind": "event_match",
"key": "content.m\\.relates_to.\\.rel_type",
"pattern": "m.replace"
} (And a corresponding one for I'm not sure this example really shows the need for this MSC? There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Well, in the case of replies you need to also match, if it isn't a fallback. Also, it interacts better with #3051 or any other reorganization of the relation format. Matching dotted keys is also #3873. Yes, you can solve this differently, but that solution also has downsides. This is just a convenient extension of this MSC, the actual meat is matching the content of the related event. |
||
|
||
Without a `key` the push rule can be evaluated without fetching the related to | ||
event. | ||
|
||
### A push rule for replies | ||
|
||
To enable notifications for replies without relying on the reply fallback, but | ||
with similar semantics we also define a new default push rule. The proposed | ||
push rule differs slightly from the old behaviour, because it only notifies you | ||
for replies to your events, but it does not notify you for replies to events, | ||
which contained your display name or matrix ID. The rule should look like this: | ||
deepbluev7 marked this conversation as resolved.
Show resolved
Hide resolved
|
||
|
||
```json5 | ||
{ | ||
"rule_id": ".m.rule.reply", | ||
"default": true, | ||
"enabled": true, | ||
"conditions": [ | ||
{ | ||
"kind": "related_event_match" | ||
"rel_type": "m.in_reply_to", | ||
"key": "sender", | ||
"pattern": "[the user's Matrix ID]" | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. for reference: |
||
} | ||
], | ||
"actions": [ | ||
"notify", | ||
{ | ||
"set_tweak": "sound", | ||
"value": "default" | ||
}, | ||
{ | ||
"set_tweak": "highlight" | ||
} | ||
] | ||
} | ||
``` | ||
|
||
This should be an underride rule, since it can't be a content rule. It ensures | ||
richvdh marked this conversation as resolved.
Show resolved
Hide resolved
|
||
you get notified for replies to all events you sent. The actions are the same as | ||
for `.m.rule.contains_display_name` and `.m.rule.contains_user_name`. | ||
|
||
No other rules are proposed as no other relations are in the specification as of | ||
writing this MSC to decrease dependencies. | ||
|
||
## Potential issues | ||
deepbluev7 marked this conversation as resolved.
Show resolved
Hide resolved
|
||
|
||
- Most push rules for relations will need a lookup into a second event. This | ||
causes additional implementation complexity and can potentially be | ||
expensive. Looking up one event shouldn't be that heavy, but it is overhead, | ||
that wasn't there before and it needs to be evaluated for every event, so it | ||
clearly is somewhat performance sensitive. | ||
- If the related to event is not present on the homeserver, evaluating the | ||
push rule may be delayed or fail completely. For most rules this should not | ||
be an issue. You can assume the event was not sent by a user on your server | ||
if the event is not present on your server. | ||
richvdh marked this conversation as resolved.
Show resolved
Hide resolved
|
||
|
||
## Alternatives | ||
|
||
- One could add an optional `rel_type` key to all existing conditions. This | ||
would allow you to also easily match by `contains_display_name`, | ||
`sender_notification_permission` and `room_member_count`. Out of those | ||
conditions only `contains_display_name` seems to be useful in a related | ||
event context. Having a potentially expensive key like `rel_type` available | ||
for all conditions would also increase implementation complexity. As such | ||
this MSC proposes the minimum amount of conditions to support push rules for | ||
most relations, although allowing `rel_type` on `contains_display_name` and | ||
`event_match` could be a good alternative. | ||
- Beeper has a | ||
[similar feature in their synapse](https://gitlab.com/beeper/synapse/-/commit/44a1728b6b021f97900c89e0c00f7d1a23ce0d43), | ||
but it does not allow you to filter by relation type. | ||
|
||
|
||
|
||
## Security considerations | ||
|
||
- These pushrules could be used to increase load on the homeserver. Apart from | ||
that there shouldn't be any potential security issues. | ||
|
||
## Unstable prefix | ||
|
||
While this proposal is still in progress, implementations should use the | ||
unstable prefix `im.nheko.msc3664` for the `related_event_match` condition. As | ||
a result it should be called `im.nheko.msc3664.related_event_match`. | ||
|
Uh oh!
There was an error while loading. Please reload this page.