Merge pull request #71 from c9s/refactor/telegram-bot

refactor: telegram bot auth with persistence
This commit is contained in:
Yo-An Lin 2020-12-08 15:13:03 +08:00 committed by GitHub
commit af0f45fe19
2 changed files with 40 additions and 10 deletions

View File

@ -102,6 +102,12 @@ func runConfig(basectx context.Context, userConfig *bbgo.Config) error {
} }
} }
if userConfig.Persistence != nil {
if err := environ.ConfigurePersistence(userConfig.Persistence); err != nil {
return err
}
}
notification := bbgo.Notifiability{ notification := bbgo.Notifiability{
SymbolChannelRouter: bbgo.NewPatternChannelRouter(nil), SymbolChannelRouter: bbgo.NewPatternChannelRouter(nil),
SessionChannelRouter: bbgo.NewPatternChannelRouter(nil), SessionChannelRouter: bbgo.NewPatternChannelRouter(nil),
@ -141,7 +147,11 @@ func runConfig(basectx context.Context, userConfig *bbgo.Config) error {
return err return err
} }
go bot.Start() var options []telegramnotifier.NotifyOption
if environ.PersistenceServiceFacade != nil && environ.PersistenceServiceFacade.Redis != nil {
options = append(options, telegramnotifier.WithRedisPersistence(environ.PersistenceServiceFacade.Redis))
}
log.Infof("send the following command to the bbgo bot you created to enable the notification...") log.Infof("send the following command to the bbgo bot you created to enable the notification...")
log.Infof("===========================================") log.Infof("===========================================")
@ -149,7 +159,7 @@ func runConfig(basectx context.Context, userConfig *bbgo.Config) error {
log.Infof(" /auth %s", telegramAuthToken) log.Infof(" /auth %s", telegramAuthToken)
log.Infof("") log.Infof("")
log.Infof("===========================================") log.Infof("===========================================")
var notifier = telegramnotifier.New(bot, telegramAuthToken) var notifier = telegramnotifier.New(bot, telegramAuthToken, options...)
notification.AddNotifier(notifier) notification.AddNotifier(notifier)
} }
@ -161,11 +171,6 @@ func runConfig(basectx context.Context, userConfig *bbgo.Config) error {
} }
} }
if userConfig.Persistence != nil {
if err := environ.ConfigurePersistence(userConfig.Persistence); err != nil {
return err
}
}
trader := bbgo.NewTrader(environ) trader := bbgo.NewTrader(environ)

View File

@ -5,16 +5,26 @@ import (
log "github.com/sirupsen/logrus" log "github.com/sirupsen/logrus"
tb "gopkg.in/tucnak/telebot.v2" tb "gopkg.in/tucnak/telebot.v2"
"github.com/c9s/bbgo/pkg/bbgo"
) )
type Notifier struct { type Notifier struct {
Bot *tb.Bot Bot *tb.Bot
chatUser *tb.User chatUser *tb.User
channel string channel string
redis *bbgo.RedisPersistenceService
} }
type NotifyOption func(notifier *Notifier) type NotifyOption func(notifier *Notifier)
func WithRedisPersistence(redis *bbgo.RedisPersistenceService) NotifyOption {
return func(notifier *Notifier) {
notifier.redis = redis
}
}
// start bot daemon // start bot daemon
func New(bot *tb.Bot, authToken string, options ...NotifyOption) *Notifier { func New(bot *tb.Bot, authToken string, options ...NotifyOption) *Notifier {
notifier := &Notifier{ notifier := &Notifier{
@ -26,6 +36,11 @@ func New(bot *tb.Bot, authToken string, options ...NotifyOption) *Notifier {
o(notifier) o(notifier)
} }
store := notifier.redis.NewStore("bbgo", "telegram")
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) { bot.Handle("/help", func(m *tb.Message) {
helpMsg := ` helpMsg := `
help - print help message help - print help message
@ -37,12 +52,20 @@ info - print information about current chat
// auth check authToken and then set sender id // auth check authToken and then set sender id
bot.Handle("/auth", func(m *tb.Message) { bot.Handle("/auth", func(m *tb.Message) {
log.Info("Receive message: ", m) //debug log.Info("receive message: ", m) //debug
if m.Payload == authToken { if m.Payload == authToken {
notifier.chatUser = m.Sender notifier.chatUser = m.Sender
bot.Send(m.Sender, "User authorized") 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")
}
} else { } else {
bot.Send(m.Sender, "Error: User authorization failed. Auth token does not match!") if _, err := bot.Send(m.Sender, "Authorization failed. please check your auth token") ; err != nil {
log.WithError(err).Error("telegram send error")
}
} }
}) })
@ -58,6 +81,8 @@ info - print information about current chat
} }
}) })
go bot.Start()
notifier.Bot = bot notifier.Bot = bot
return notifier return notifier
} }