Pushrules for relations
Signed-off-by: Nicolas Werner <nicolas.werner@hotmail.de>pull/3664/head
parent
4a597ace51
commit
d5f43bb7cf
@ -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…
Reference in New Issue