bbgo_origin/pkg/notifier/telegramnotifier/telegram.go

121 lines
3.0 KiB
Go
Raw Normal View History

2020-12-05 06:20:27 +00:00
package telegramnotifier
import (
"fmt"
"strings"
2020-12-05 06:20:27 +00:00
log "github.com/sirupsen/logrus"
tb "gopkg.in/tucnak/telebot.v2"
2020-12-08 07:03:52 +00:00
"github.com/c9s/bbgo/pkg/bbgo"
2020-12-05 06:20:27 +00:00
)
type Notifier struct {
Bot *tb.Bot
chatUser *tb.User
channel string
2020-12-08 07:03:52 +00:00
redis *bbgo.RedisPersistenceService
2020-12-05 06:20:27 +00:00
}
type NotifyOption func(notifier *Notifier)
2020-12-08 07:03:52 +00:00
func WithRedisPersistence(redis *bbgo.RedisPersistenceService) NotifyOption {
return func(notifier *Notifier) {
notifier.redis = redis
}
}
2020-12-05 06:20:27 +00:00
// start bot daemon
2020-12-08 06:20:49 +00:00
func New(bot *tb.Bot, authToken string, options ...NotifyOption) *Notifier {
notifier := &Notifier{
chatUser: &tb.User{},
2020-12-08 06:20:49 +00:00
Bot: bot,
}
for _, o := range options {
o(notifier)
}
// use token prefix as the redis namespace
tt := strings.Split(bot.Token, ":")
store := notifier.redis.NewStore("bbgo", "telegram", tt[0])
2020-12-08 07:03:52 +00:00
if err := store.Load(notifier.chatUser) ; err == nil {
bot.Send(notifier.chatUser, fmt.Sprintf("Hi %s, I'm back", notifier.chatUser.Username))
}
bot.Handle("/help", func(m *tb.Message) {
helpMsg := `
help - print help message
auth - authorize current telegram user to access telegram bot with authToken. ex. /auth my-token
2020-12-06 04:34:43 +00:00
info - print information about current chat
`
bot.Send(m.Sender, helpMsg)
})
// auth check authToken and then set sender id
bot.Handle("/auth", func(m *tb.Message) {
2020-12-08 07:03:52 +00:00
log.Info("receive message: ", m) //debug
if m.Payload == authToken {
notifier.chatUser = m.Sender
2020-12-08 07:03:52 +00:00
if err := store.Save(notifier.chatUser); err != nil {
log.WithError(err).Error("can not persist telegram chat user")
}
if _, err := bot.Send(m.Sender, fmt.Sprintf("Hi %s, I know you, I will send you the notifications!", m.Sender.Username)) ; err != nil {
log.WithError(err).Error("telegram send error")
}
2020-12-05 06:20:27 +00:00
} else {
2020-12-08 07:03:52 +00:00
if _, err := bot.Send(m.Sender, "Authorization failed. please check your auth token") ; err != nil {
log.WithError(err).Error("telegram send error")
}
2020-12-05 06:20:27 +00:00
}
})
2020-12-06 04:34:43 +00:00
bot.Handle("/info", func(m *tb.Message) {
if m.Sender.ID == notifier.chatUser.ID {
bot.Send(notifier.chatUser,
2020-12-06 05:47:52 +00:00
fmt.Sprintf("Welcome! your username: %s, user ID: %d",
notifier.chatUser.Username,
notifier.chatUser.ID,
2020-12-06 04:34:43 +00:00
))
2020-12-05 06:20:27 +00:00
} else {
2020-12-06 05:47:52 +00:00
log.Warningf("Incorrect user tried to access bot! sender username: %s id: %d", m.Sender.Username, m.Sender.ID)
2020-12-05 06:20:27 +00:00
}
})
2020-12-08 07:03:52 +00:00
go bot.Start()
notifier.Bot = bot
2020-12-05 06:20:27 +00:00
return notifier
}
func (n *Notifier) Notify(format string, args ...interface{}) {
n.NotifyTo(n.channel, format, args...)
}
func (n *Notifier) NotifyTo(channel, format string, args ...interface{}) {
2020-12-06 04:34:43 +00:00
if n.chatUser.ID == 0 {
log.Warningf("Telegram bot has no authenticated user. Skip notification")
2020-12-06 04:34:43 +00:00
return
}
2020-12-05 06:20:27 +00:00
var telegramArgsOffset = -1
var nonTelegramArgs = args
if telegramArgsOffset > -1 {
nonTelegramArgs = args[:telegramArgsOffset]
}
log.Infof(format, nonTelegramArgs...)
_, err := n.Bot.Send(n.chatUser, fmt.Sprintf(format, nonTelegramArgs...))
if err != nil {
log.WithError(err).
WithField("chatUser", n.chatUser).
Errorf("telegram error: %s", err.Error())
}
return
}