mirror of
https://github.com/1f349/dendrite.git
synced 2024-11-25 05:01:41 +00:00
103 lines
2.5 KiB
Go
103 lines
2.5 KiB
Go
|
package pushrules
|
||
|
|
||
|
import (
|
||
|
"bytes"
|
||
|
"encoding/json"
|
||
|
"fmt"
|
||
|
)
|
||
|
|
||
|
// An Action is (part of) an outcome of a rule. There are
|
||
|
// (unofficially) terminal actions, and modifier actions.
|
||
|
type Action struct {
|
||
|
// Kind is the type of action. Has custom encoding in JSON.
|
||
|
Kind ActionKind `json:"-"`
|
||
|
|
||
|
// Tweak is the property to tweak. Has custom encoding in JSON.
|
||
|
Tweak TweakKey `json:"-"`
|
||
|
|
||
|
// Value is some value interpreted according to Kind and Tweak.
|
||
|
Value interface{} `json:"value"`
|
||
|
}
|
||
|
|
||
|
func (a *Action) MarshalJSON() ([]byte, error) {
|
||
|
if a.Tweak == UnknownTweak && a.Value == nil {
|
||
|
return json.Marshal(a.Kind)
|
||
|
}
|
||
|
|
||
|
if a.Kind != SetTweakAction {
|
||
|
return nil, fmt.Errorf("only set_tweak actions may have a value, but got kind %q", a.Kind)
|
||
|
}
|
||
|
|
||
|
m := map[string]interface{}{
|
||
|
string(a.Kind): a.Tweak,
|
||
|
}
|
||
|
if a.Value != nil {
|
||
|
m["value"] = a.Value
|
||
|
}
|
||
|
|
||
|
return json.Marshal(m)
|
||
|
}
|
||
|
|
||
|
func (a *Action) UnmarshalJSON(bs []byte) error {
|
||
|
if bytes.HasPrefix(bs, []byte("\"")) {
|
||
|
return json.Unmarshal(bs, &a.Kind)
|
||
|
}
|
||
|
|
||
|
var raw struct {
|
||
|
SetTweak TweakKey `json:"set_tweak"`
|
||
|
Value interface{} `json:"value"`
|
||
|
}
|
||
|
if err := json.Unmarshal(bs, &raw); err != nil {
|
||
|
return err
|
||
|
}
|
||
|
if raw.SetTweak == UnknownTweak {
|
||
|
return fmt.Errorf("got unknown action JSON: %s", string(bs))
|
||
|
}
|
||
|
a.Kind = SetTweakAction
|
||
|
a.Tweak = raw.SetTweak
|
||
|
if raw.Value != nil {
|
||
|
a.Value = raw.Value
|
||
|
}
|
||
|
|
||
|
return nil
|
||
|
}
|
||
|
|
||
|
// ActionKind is the primary discriminator for actions.
|
||
|
type ActionKind string
|
||
|
|
||
|
const (
|
||
|
UnknownAction ActionKind = ""
|
||
|
|
||
|
// NotifyAction indicates the clients should show a notification.
|
||
|
NotifyAction ActionKind = "notify"
|
||
|
|
||
|
// DontNotifyAction indicates the clients should not show a notification.
|
||
|
DontNotifyAction ActionKind = "dont_notify"
|
||
|
|
||
|
// CoalesceAction tells the clients to show a notification, and
|
||
|
// tells both servers and clients that multiple events can be
|
||
|
// coalesced into a single notification. The behaviour is
|
||
|
// implementation-specific.
|
||
|
CoalesceAction ActionKind = "coalesce"
|
||
|
|
||
|
// SetTweakAction uses the Tweak and Value fields to add a
|
||
|
// tweak. Multiple SetTweakAction can be provided in a rule,
|
||
|
// combined with NotifyAction or CoalesceAction.
|
||
|
SetTweakAction ActionKind = "set_tweak"
|
||
|
)
|
||
|
|
||
|
// A TweakKey describes a property to be modified/tweaked for events
|
||
|
// that match the rule.
|
||
|
type TweakKey string
|
||
|
|
||
|
const (
|
||
|
UnknownTweak TweakKey = ""
|
||
|
|
||
|
// SoundTweak describes which sound to play. Using "default" means
|
||
|
// "enable sound".
|
||
|
SoundTweak TweakKey = "sound"
|
||
|
|
||
|
// HighlightTweak asks the clients to highlight the conversation.
|
||
|
HighlightTweak TweakKey = "highlight"
|
||
|
)
|