Pushrules for relations

Signed-off-by: Nicolas Werner <nicolas.werner@hotmail.de>
pull/3664/head
Nicolas Werner 4 years ago
parent 4a597ace51
commit d5f43bb7cf
No known key found for this signature in database
GPG Key ID: C8D75E610773F2D9

@ -0,0 +1,152 @@
# 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
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
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
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`.
- `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.
`key` and `pattern` are optional to allow you to enable or suppress all
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
[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"
}
```
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:
```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]"
}
],
"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
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
- 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.
## 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.
## 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`.
Loading…
Cancel
Save