diff --git a/pkg/cmd/run.go b/pkg/cmd/run.go index eb6f28eb8..8c10a3514 100644 --- a/pkg/cmd/run.go +++ b/pkg/cmd/run.go @@ -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{ SymbolChannelRouter: bbgo.NewPatternChannelRouter(nil), SessionChannelRouter: bbgo.NewPatternChannelRouter(nil), @@ -141,7 +147,11 @@ func runConfig(basectx context.Context, userConfig *bbgo.Config) error { 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("===========================================") @@ -149,7 +159,7 @@ func runConfig(basectx context.Context, userConfig *bbgo.Config) error { log.Infof(" /auth %s", telegramAuthToken) log.Infof("") log.Infof("===========================================") - var notifier = telegramnotifier.New(bot, telegramAuthToken) + var notifier = telegramnotifier.New(bot, telegramAuthToken, options...) 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) diff --git a/pkg/notifier/telegramnotifier/telegram.go b/pkg/notifier/telegramnotifier/telegram.go index 4b3962665..2a4b7ad5f 100644 --- a/pkg/notifier/telegramnotifier/telegram.go +++ b/pkg/notifier/telegramnotifier/telegram.go @@ -5,16 +5,26 @@ import ( log "github.com/sirupsen/logrus" tb "gopkg.in/tucnak/telebot.v2" + + "github.com/c9s/bbgo/pkg/bbgo" ) type Notifier struct { Bot *tb.Bot chatUser *tb.User channel string + + redis *bbgo.RedisPersistenceService } type NotifyOption func(notifier *Notifier) +func WithRedisPersistence(redis *bbgo.RedisPersistenceService) NotifyOption { + return func(notifier *Notifier) { + notifier.redis = redis + } +} + // start bot daemon func New(bot *tb.Bot, authToken string, options ...NotifyOption) *Notifier { notifier := &Notifier{ @@ -26,6 +36,11 @@ func New(bot *tb.Bot, authToken string, options ...NotifyOption) *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) { helpMsg := ` help - print help message @@ -37,12 +52,20 @@ info - print information about current chat // auth check authToken and then set sender id bot.Handle("/auth", func(m *tb.Message) { - log.Info("Receive message: ", m) //debug + log.Info("receive message: ", m) //debug if m.Payload == authToken { 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 { - 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 return notifier }