Skip to content

Commit c148080

Browse files
authored
Upgrade telegram api (evcc-io#17049)
1 parent f946781 commit c148080

File tree

5 files changed

+53
-63
lines changed

5 files changed

+53
-63
lines changed

cmd/setup.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -757,7 +757,7 @@ func configureMessengers(conf globalconfig.Messaging, vehicles push.Vehicles, va
757757
}
758758

759759
for _, service := range conf.Services {
760-
impl, err := push.NewFromConfig(service.Type, service.Other)
760+
impl, err := push.NewFromConfig(context.TODO(), service.Type, service.Other)
761761
if err != nil {
762762
return messageChan, fmt.Errorf("failed configuring push service %s: %w", service.Type, err)
763763
}

go.mod

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@ require (
3535
github.com/glebarez/sqlite v1.11.0
3636
github.com/go-http-utils/etag v0.0.0-20161124023236-513ea8f21eb1
3737
github.com/go-playground/validator/v10 v10.22.1
38-
github.com/go-telegram-bot-api/telegram-bot-api/v5 v5.5.1
38+
github.com/go-telegram/bot v1.10.0
3939
github.com/go-viper/mapstructure/v2 v2.2.1
4040
github.com/godbus/dbus/v5 v5.1.0
4141
github.com/gokrazy/updater v0.0.0-20240113102150-4ac511a17e33

go.sum

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -209,8 +209,8 @@ github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/me
209209
github.com/go-task/slim-sprig v0.0.0-20210107165309-348f09dbbbc0/go.mod h1:fyg7847qk6SyHyPtNmDHnmrv/HOrqktSC+C9fM+CJOE=
210210
github.com/go-task/slim-sprig v0.0.0-20230315185526-52ccab3ef572 h1:tfuBGBXKqDEevZMzYi5KSi8KkcZtzBcTgAUUtapy0OI=
211211
github.com/go-task/slim-sprig v0.0.0-20230315185526-52ccab3ef572/go.mod h1:9Pwr4B2jHnOSGXyyzV8ROjYa2ojvAY6HCGYYfMoC3Ls=
212-
github.com/go-telegram-bot-api/telegram-bot-api/v5 v5.5.1 h1:wG8n/XJQ07TmjbITcGiUaOtXxdrINDz1b0J1w0SzqDc=
213-
github.com/go-telegram-bot-api/telegram-bot-api/v5 v5.5.1/go.mod h1:A2S0CWkNylc2phvKXWBBdD3K0iGnDBGbzRpISP2zBl8=
212+
github.com/go-telegram/bot v1.10.0 h1:/Y9ZupcZhYQiAOFE1ETCF8P4836XE42nDkLcWHYTg3g=
213+
github.com/go-telegram/bot v1.10.0/go.mod h1:i2TRs7fXWIeaceF3z7KzsMt/he0TwkVC680mvdTFYeM=
214214
github.com/go-test/deep v1.1.0 h1:WOcxcdHcvdgThNXjw0t76K42FXTU7HpNQWHpA2HHNlg=
215215
github.com/go-test/deep v1.1.0/go.mod h1:5C2ZWiW0ErCdrYzpqxLbTX7MG14M9iiw8DgHncVwcsE=
216216
github.com/go-viper/mapstructure/v2 v2.2.1 h1:ZAaOCxANMuZx5RCeg0mBdEZk7DZasvvZIxtHqx8aGss=

push/config.go

Lines changed: 13 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -1,44 +1,31 @@
11
package push
22

33
import (
4+
"context"
45
"fmt"
56
"strings"
7+
8+
reg "github.com/evcc-io/evcc/util/registry"
69
)
710

811
// Messenger implements message sending
912
type Messenger interface {
1013
Send(title, msg string)
1114
}
1215

13-
type senderRegistry map[string]func(map[string]interface{}) (Messenger, error)
14-
15-
func (r senderRegistry) Add(name string, factory func(map[string]interface{}) (Messenger, error)) {
16-
if _, exists := r[name]; exists {
17-
panic(fmt.Sprintf("cannot register duplicate messenger type: %s", name))
18-
}
19-
r[name] = factory
20-
}
21-
22-
func (r senderRegistry) Get(name string) (func(map[string]interface{}) (Messenger, error), error) {
23-
factory, exists := r[name]
24-
if !exists {
25-
return nil, fmt.Errorf("messenger type not registered: %s", name)
26-
}
27-
return factory, nil
28-
}
29-
30-
var registry senderRegistry = make(map[string]func(map[string]interface{}) (Messenger, error))
16+
var registry = reg.New[Messenger]("messenger")
3117

3218
// NewFromConfig creates messenger from configuration
33-
func NewFromConfig(typ string, other map[string]interface{}) (v Messenger, err error) {
19+
func NewFromConfig(ctx context.Context, typ string, other map[string]interface{}) (Messenger, error) {
3420
factory, err := registry.Get(strings.ToLower(typ))
35-
if err == nil {
36-
if v, err = factory(other); err != nil {
37-
err = fmt.Errorf("cannot create messenger '%s': %w", typ, err)
38-
}
39-
} else {
40-
err = fmt.Errorf("invalid messenger type: %s", typ)
21+
if err != nil {
22+
return nil, err
23+
}
24+
25+
v, err := factory(ctx, other)
26+
if err != nil {
27+
err = fmt.Errorf("cannot create messenger type '%s': %w", typ, err)
4128
}
4229

43-
return
30+
return v, err
4431
}

push/telegram.go

Lines changed: 36 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -1,28 +1,30 @@
11
package push
22

33
import (
4+
"context"
45
"errors"
56
"strconv"
67
"sync"
78

89
"github.com/evcc-io/evcc/util"
9-
tgbotapi "github.com/go-telegram-bot-api/telegram-bot-api/v5"
10+
"github.com/go-telegram/bot"
11+
"github.com/go-telegram/bot/models"
1012
)
1113

1214
func init() {
13-
registry.Add("telegram", NewTelegramFromConfig)
15+
registry.AddCtx("telegram", NewTelegramFromConfig)
1416
}
1517

1618
// Telegram implements the Telegram messenger
1719
type Telegram struct {
1820
log *util.Logger
1921
sync.Mutex
20-
bot *tgbotapi.BotAPI
22+
bot *bot.Bot
2123
chats map[int64]struct{}
2224
}
2325

2426
// NewTelegramFromConfig creates new pushover messenger
25-
func NewTelegramFromConfig(other map[string]interface{}) (Messenger, error) {
27+
func NewTelegramFromConfig(ctx context.Context, other map[string]interface{}) (Messenger, error) {
2628
var cc struct {
2729
Token string
2830
Chats []int64
@@ -32,60 +34,61 @@ func NewTelegramFromConfig(other map[string]interface{}) (Messenger, error) {
3234
return nil, err
3335
}
3436

35-
bot, err := tgbotapi.NewBotAPI(cc.Token)
36-
if err != nil {
37-
return nil, errors.New("telegram: invalid bot token")
38-
}
39-
4037
log := util.NewLogger("telegram").Redact(cc.Token)
41-
_ = tgbotapi.SetLogger(log.ERROR)
42-
43-
for _, i := range cc.Chats {
44-
log.Redact(strconv.FormatInt(i, 10))
45-
}
4638

4739
m := &Telegram{
4840
log: log,
49-
bot: bot,
5041
chats: make(map[int64]struct{}),
5142
}
5243

44+
bot, err := bot.New(cc.Token, bot.WithDefaultHandler(m.handler), bot.WithErrorsHandler(func(err error) {
45+
log.ERROR.Println(err)
46+
}), bot.WithDebugHandler(func(format string, args ...interface{}) {
47+
log.TRACE.Printf(format, args...)
48+
}))
49+
if err != nil {
50+
return nil, errors.New("invalid bot token")
51+
}
52+
53+
m.bot = bot
54+
55+
go bot.Start(ctx)
56+
5357
for _, chat := range cc.Chats {
58+
log.Redact(strconv.FormatInt(chat, 10))
5459
m.chats[chat] = struct{}{}
5560
}
5661

57-
go m.trackChats()
58-
5962
return m, nil
6063
}
6164

62-
// trackChats captures ids of all chats that bot participates in
63-
func (m *Telegram) trackChats() {
64-
conf := tgbotapi.NewUpdate(0)
65-
conf.Timeout = 1000
65+
// handler captures ids of all chats that bot participates in
66+
func (m *Telegram) handler(ctx context.Context, b *bot.Bot, update *models.Update) {
67+
if update.Message == nil {
68+
return
69+
}
6670

67-
for update := range m.bot.GetUpdatesChan(conf) {
68-
if update.Message == nil || update.Message.Chat == nil {
69-
continue
70-
}
71-
m.Lock()
72-
if _, ok := m.chats[update.Message.Chat.ID]; !ok {
73-
m.log.INFO.Printf("new chat id: %d", update.Message.Chat.ID)
74-
}
75-
m.Unlock()
71+
m.Lock()
72+
defer m.Unlock()
73+
74+
if _, ok := m.chats[update.Message.Chat.ID]; !ok {
75+
m.log.INFO.Printf("new chat id: %d", update.Message.Chat.ID)
7676
}
7777
}
7878

7979
// Send sends to all receivers
8080
func (m *Telegram) Send(title, msg string) {
8181
m.Lock()
82+
defer m.Unlock()
83+
8284
for chat := range m.chats {
8385
m.log.DEBUG.Printf("sending to %d", chat)
8486

85-
msg := tgbotapi.NewMessage(chat, msg)
86-
if _, err := m.bot.Send(msg); err != nil {
87+
if _, err := m.bot.SendMessage(context.Background(), &bot.SendMessageParams{
88+
ChatID: chat,
89+
Text: msg,
90+
}); err != nil {
8791
m.log.ERROR.Println("send:", err)
8892
}
8993
}
90-
m.Unlock()
9194
}

0 commit comments

Comments
 (0)