Skip to content

Commit 403c71f

Browse files
authored
Add shoutrrr for supporting emails as push channel (#263)
1 parent 58177f6 commit 403c71f

File tree

8 files changed

+101
-12
lines changed

8 files changed

+101
-12
lines changed

evcc.dist.yaml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,8 @@ messaging:
5353
token: # bot id
5454
chats:
5555
- # list of chat ids
56+
- type: email
57+
uri: smtp://<user>:<password>@<host>:<port>/?fromAddress=<from>&toAddresses=<to>
5658

5759
# meters
5860
meters:

go.mod

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ require (
77
github.com/asaskevich/EventBus v0.0.0-20200428142821-4fc0642a29f3
88
github.com/avast/retry-go v2.6.0+incompatible
99
github.com/benbjohnson/clock v1.0.3
10+
github.com/containrrr/shoutrrr v0.0.0-20200721140131-bafc331a1968
1011
github.com/eclipse/paho.mqtt.golang v1.2.0
1112
github.com/go-telegram-bot-api/telegram-bot-api v4.6.4+incompatible
1213
github.com/godbus/dbus/v5 v5.0.3

go.sum

Lines changed: 32 additions & 0 deletions
Large diffs are not rendered by default.

push/config.go

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ import (
99

1010
// Sender implements message sending
1111
type Sender interface {
12-
Send(event Event, title, msg string)
12+
Send(title, msg string)
1313
}
1414

1515
// EventTemplate is the push message template for an event
@@ -25,12 +25,17 @@ func NewMessengerFromConfig(typ string, other map[string]interface{}) (res Sende
2525
case "pushover":
2626
var cc pushOverConfig
2727
if err = util.DecodeOther(other, &cc); err == nil {
28-
res = NewPushOverMessenger(cc.App, cc.Recipients)
28+
res, err = NewPushOverMessenger(cc.App, cc.Recipients)
2929
}
3030
case "telegram":
3131
var cc telegramConfig
3232
if err = util.DecodeOther(other, &cc); err == nil {
33-
res = NewTelegramMessenger(cc.Token, cc.Chats)
33+
res, err = NewTelegramMessenger(cc.Token, cc.Chats)
34+
}
35+
case "email", "shout":
36+
var cc shoutrrrConfig
37+
if err = util.DecodeOther(other, &cc); err == nil {
38+
res, err = NewShoutrrrMessenger(cc.URI)
3439
}
3540
default:
3641
err = fmt.Errorf("unknown messenger type: %s", typ)

push/hub.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -64,7 +64,7 @@ func (h *Hub) Run(events <-chan Event) {
6464
}
6565

6666
for _, sender := range h.sender {
67-
go sender.Send(ev, definition.Title, msg)
67+
go sender.Send(definition.Title, msg)
6868
}
6969
}
7070
}

push/pushover.go

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
package push
22

33
import (
4+
"errors"
5+
46
"github.com/gregdel/pushover"
57
)
68

@@ -17,21 +19,21 @@ type pushOverConfig struct {
1719
}
1820

1921
// NewPushOverMessenger creates new pushover messenger
20-
func NewPushOverMessenger(app string, recipients []string) *PushOver {
22+
func NewPushOverMessenger(app string, recipients []string) (*PushOver, error) {
2123
if app == "" {
22-
log.FATAL.Fatal("pushover: missing app name")
24+
return nil, errors.New("pushover: missing app name")
2325
}
2426

2527
m := &PushOver{
2628
app: pushover.New(app),
2729
recipients: recipients,
2830
}
2931

30-
return m
32+
return m, nil
3133
}
3234

3335
// Send sends to all receivers
34-
func (m *PushOver) Send(event Event, title, msg string) {
36+
func (m *PushOver) Send(title, msg string) {
3537
message := pushover.NewMessageWithTitle(msg, title)
3638

3739
for _, id := range m.recipients {

push/shoutrrr.go

Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
package push
2+
3+
import (
4+
"fmt"
5+
6+
"github.com/containrrr/shoutrrr"
7+
"github.com/containrrr/shoutrrr/pkg/router"
8+
"github.com/containrrr/shoutrrr/pkg/types"
9+
)
10+
11+
// Shoutrrr implements the shoutrrr messenging aggregator
12+
type Shoutrrr struct {
13+
app *router.ServiceRouter
14+
}
15+
16+
type shoutrrrConfig struct {
17+
URI string
18+
}
19+
20+
// NewShoutrrrMessenger creates new Shoutrrr messenger
21+
func NewShoutrrrMessenger(uri string) (*Shoutrrr, error) {
22+
app, err := shoutrrr.CreateSender(uri)
23+
if err != nil {
24+
return nil, fmt.Errorf("shoutrrr: %v", err)
25+
}
26+
27+
m := &Shoutrrr{
28+
app: app,
29+
}
30+
31+
return m, nil
32+
}
33+
34+
// Send sends to all receivers
35+
func (m *Shoutrrr) Send(title, msg string) {
36+
params := &types.Params{
37+
"title": title,
38+
"subject": title,
39+
}
40+
41+
for _, err := range m.app.Send(msg, params) {
42+
if err != nil {
43+
log.ERROR.Printf("shoutrrr: %v", err)
44+
}
45+
}
46+
}

push/telegram.go

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package push
22

33
import (
4+
"errors"
45
"sync"
56

67
tgbotapi "github.com/go-telegram-bot-api/telegram-bot-api"
@@ -25,10 +26,10 @@ func init() {
2526
}
2627

2728
// NewTelegramMessenger creates new pushover messenger
28-
func NewTelegramMessenger(token string, chats []int64) *Telegram {
29+
func NewTelegramMessenger(token string, chats []int64) (*Telegram, error) {
2930
bot, err := tgbotapi.NewBotAPI(token)
3031
if err != nil {
31-
log.FATAL.Fatal("telegram: invalid bot token")
32+
return nil, errors.New("telegram: invalid bot token")
3233
}
3334

3435
m := &Telegram{
@@ -42,7 +43,7 @@ func NewTelegramMessenger(token string, chats []int64) *Telegram {
4243

4344
go m.trackChats()
4445

45-
return m
46+
return m, nil
4647
}
4748

4849
// trackChats captures ids of all chats that bot participates in
@@ -66,7 +67,7 @@ func (m *Telegram) trackChats() {
6667
}
6768

6869
// Send sends to all receivers
69-
func (m *Telegram) Send(event Event, title, msg string) {
70+
func (m *Telegram) Send(title, msg string) {
7071
m.Lock()
7172
for chat := range m.chats {
7273
log.TRACE.Printf("telegram: sending to %d", chat)

0 commit comments

Comments
 (0)