aboutsummaryrefslogtreecommitdiff
path: root/internal/pushrules/action.go
diff options
context:
space:
mode:
Diffstat (limited to 'internal/pushrules/action.go')
-rw-r--r--internal/pushrules/action.go102
1 files changed, 102 insertions, 0 deletions
diff --git a/internal/pushrules/action.go b/internal/pushrules/action.go
new file mode 100644
index 00000000..c7b8cec8
--- /dev/null
+++ b/internal/pushrules/action.go
@@ -0,0 +1,102 @@
+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"
+)