91 lines
1.8 KiB
Go
91 lines
1.8 KiB
Go
package messenger
|
|
|
|
import (
|
|
"bytes"
|
|
"context"
|
|
"encoding/csv"
|
|
"encoding/json"
|
|
"strings"
|
|
|
|
"github.com/evcc-io/evcc/api"
|
|
"github.com/evcc-io/evcc/plugin"
|
|
"github.com/evcc-io/evcc/util"
|
|
)
|
|
|
|
func init() {
|
|
registry.AddCtx(api.Custom, NewConfigurableFromConfig)
|
|
}
|
|
|
|
// NewConfigurableFromConfig creates a new messenger from config
|
|
func NewConfigurableFromConfig(ctx context.Context, other map[string]any) (api.Messenger, error) {
|
|
var cc struct {
|
|
Send plugin.Config
|
|
Encoding string
|
|
}
|
|
|
|
if err := util.DecodeOther(other, &cc); err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
send, err := cc.Send.StringSetter(ctx, "send")
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
return NewConfigurable(send, cc.Encoding)
|
|
}
|
|
|
|
// NewConfigurable creates a new Messenger
|
|
func NewConfigurable(send func(string) error, encoding string) (*Push, error) {
|
|
m := &Push{
|
|
log: util.NewLogger("push"),
|
|
send: send,
|
|
encoding: strings.ToLower(encoding),
|
|
}
|
|
return m, nil
|
|
}
|
|
|
|
// Push is a configurable Messenger implementation
|
|
type Push struct {
|
|
log *util.Logger
|
|
send func(string) error
|
|
encoding string
|
|
}
|
|
|
|
func (m *Push) csv(separator rune, title, msg string) string {
|
|
var b bytes.Buffer
|
|
ww := csv.NewWriter(&b)
|
|
ww.Comma = separator
|
|
_ = ww.Write([]string{title, msg})
|
|
ww.Flush()
|
|
return b.String()
|
|
}
|
|
|
|
// Send implements the Messenger interface
|
|
func (m *Push) Send(title, msg string) {
|
|
var res string
|
|
|
|
switch m.encoding {
|
|
case "json":
|
|
b, _ := json.Marshal(struct {
|
|
Title string `json:"title,omitempty"`
|
|
Msg string `json:"msg"`
|
|
}{
|
|
Title: title,
|
|
Msg: msg,
|
|
})
|
|
res = string(b)
|
|
case "csv":
|
|
res = m.csv(',', title, msg)
|
|
case "tsv":
|
|
res = m.csv('\t', title, msg)
|
|
case "title":
|
|
res = title
|
|
default:
|
|
res = msg
|
|
}
|
|
|
|
if err := m.send(res); err != nil {
|
|
m.log.ERROR.Printf("send: %v", err)
|
|
}
|
|
}
|