From b87c2758e9709b36c6923476acf9996607983155 Mon Sep 17 00:00:00 2001 From: Ettore Dreucci Date: Tue, 19 Jun 2018 12:43:25 +0200 Subject: [PATCH] Menus and cmd flags for tokens Signed-off-by: Ettore Dreucci --- src/barandaBot.go | 29 ++++++++------------ src/redisAPI.go | 66 +++++++++++++++++++++++++++++++++++++--------- src/sys.go | 29 ++++++++++++++++++-- src/telegramAPI.go | 28 ++++++++++++++++---- 4 files changed, 114 insertions(+), 38 deletions(-) diff --git a/src/barandaBot.go b/src/barandaBot.go index ad22e84..59205fa 100644 --- a/src/barandaBot.go +++ b/src/barandaBot.go @@ -1,6 +1,14 @@ package main -import "log" +import ( + "log" + + "github.com/go-redis/redis" +) + +var ( + redisClient *redis.Client +) func main() { @@ -9,26 +17,11 @@ func main() { log.Fatalln("Error in parsing command line flags. Abort!") } - redisClient, err := redisInit(cmdFlags.redisAddr, cmdFlags.redisPwd, cmdFlags.redisDB) + redisClient, err = redisInit(cmdFlags.redisAddr, cmdFlags.redisPwd, cmdFlags.redisDB) defer redisClient.Close() if err != nil { log.Fatalf("Error in initializing redis instance: %v", err) } - startMenu() - - bots, err := botInit(redisClient) - if err != nil { - log.Fatalf("Error in initializing bots: %v", err) - } - - for _, bot := range bots { - defer bot.Stop() - } - - /*b.Handle("/hello", func(m *tb.Message) { - b.Send(m.Sender, "hello world") - }) - - b.Start()*/ + mainMenu() } diff --git a/src/redisAPI.go b/src/redisAPI.go index 68addcd..799084f 100644 --- a/src/redisAPI.go +++ b/src/redisAPI.go @@ -9,6 +9,7 @@ import ( "regexp" "strings" + "github.com/dixonwille/wmenu" "github.com/go-redis/redis" ) @@ -28,7 +29,9 @@ var ( //ErrTokenInvalid is thrown when the string parsed isn't a valid telegram bot token ErrTokenInvalid = errors.New("botToken: string isn't a valid telegram bot token") //ErrAddToken is thrown when one or more bot token hasn't been added - ErrAddToken = errors.New("couldn't add one or more token") + ErrAddToken = errors.New("couldn't add one or more tokens") + //ErrRemoveToken is thrown when one or more bot tokens hasn't been removed + ErrRemoveToken = errors.New("couldn't remove one or more tokens") ) func redisInit(addr string, pwd string, db int) (*redis.Client, error) { @@ -64,21 +67,58 @@ func addBotToken(newToken string, client *redis.Client) error { return nil } -func addBotTokens(client *redis.Client) error { - fmt.Println("Add the new tokens, comma-separated:") - reader := bufio.NewReader(os.Stdin) - line, err := reader.ReadString('\n') - if err != nil { - log.Printf("Error in reading new bot tokens: %v", err) - return ErrStdRead - } - newTokens := strings.Split(line, ",") - for _, newToken := range newTokens { - err = addBotToken(newToken, client) +func addBotTokens(client *redis.Client, newTokens []string) error { + errNum := 0 + if newTokens == nil { + fmt.Println("Add the new tokens, comma-separated:") + reader := bufio.NewReader(os.Stdin) + line, err := reader.ReadString('\n') if err != nil { + log.Printf("Error in reading new bot tokens: %v", err) + return ErrStdRead + } + newTokens := strings.Split(line, ",") + } + for _, newToken := range newTokens { + err := addBotToken(newToken, client) + if err != nil { + errNum++ log.Printf("Error in adding new bot token %s: %v", newToken, err) } } + if errNum == len(newTokens) { + return ErrAddToken + } + return nil +} + +func removeBotToken(token string, client *redis.Client) error { + err := client.SRem(tkSet, token).Err() + if err != nil { + log.Printf("Error in removing bot token %s: %v", token, err) + return ErrRemoveToken + } + return nil +} + +func removeBotTokens(client *redis.Client) error { + tokens, err := client.SMembers(tkSet).Result() + if err != nil { + log.Printf("Couldn't retrive bot tokens: %v", err) + return ErrRedisRetriveSet + } + menu := wmenu.NewMenu("Select the token(s) you want to remove:") + menu.AllowMultiple() + menu.LoopOnInvalid() + menu.Action(func(opts []wmenu.Opt) error { return removeBotToken(opts[0].Text, client) }) + for _, token := range tokens { + menu.Option(token, nil, false, nil) + } + err = menu.Run() + if err != nil { + log.Printf("Error in removeToken menu: %v", err) + return ErrRemoveToken + } return nil } @@ -90,7 +130,7 @@ func getBotTokens(client *redis.Client) ([]string, error) { } if tkNum == 0 { fmt.Println("No bot token found.") - err := addBotTokens(client) + err := addBotTokens(client, nil) if err != nil { log.Printf("Couldn't add new bot tokens: %v", err) return nil, ErrAddToken diff --git a/src/sys.go b/src/sys.go index 4446a9d..2428523 100644 --- a/src/sys.go +++ b/src/sys.go @@ -4,14 +4,18 @@ import ( "errors" "flag" "fmt" + "log" "github.com/dixonwille/wmenu" ) +type stringSlice []string + type flags struct { redisAddr string redisPwd string redisDB int + tokens stringSlice } var ( @@ -19,6 +23,12 @@ var ( ErrStdRead = errors.New("couldn't read string from stdin") ) +func (i *stringSlice) Set(value string) error { + + *i = append(*i, value) + return nil +} + func getFlags() (flags, error) { var cmdFlags flags @@ -30,6 +40,7 @@ func getFlags() (flags, error) { pwdUsage = "The password of the redis instance" defaultDB = 0 dbUsage = "The database to be selected after connecting to redis instance" + tokenUsage = "A bot token to be added to the set of tokens" ) flag.StringVar(&(cmdFlags.redisAddr), "redisAddr", defaultAddr, addrUsage) @@ -38,14 +49,28 @@ func getFlags() (flags, error) { flag.StringVar(&(cmdFlags.redisPwd), "p", defaultPwd, pwdUsage+"(shorthand)") flag.IntVar(&(cmdFlags.redisDB), "redisDB", defaultDB, dbUsage) flag.IntVar(&(cmdFlags.redisDB), "d", defaultDB, dbUsage+"(shorthand)") + flag.Var(&(cmdFlags.tokens), "token", tokenUsage) + flag.Var(&(cmdFlags.tokens), "t", tokenUsage+"(shorthand") flag.Parse() return cmdFlags, nil } -func startMenu() { +func mainMenu() { fmt.Println("Welcome in barandaBot! Here you can control the bot(s) options and configurations.") menu := wmenu.NewMenu("What do you want to do?") - menu.Action(func) + menu.LoopOnInvalid() + menu.Option("Start Bot(s)", nil, true, nil) + menu.Option("Add bot token(s)", nil, false, func(opt wmenu.Opt) error { + return addBotTokens(redisClient, nil) + }) + menu.Option("Remove bot token(s)", nil, false, func(opt wmenu.Opt) error { + return removeBotTokens(redisClient) + }) + + err := menu.Run() + if err != nil { + log.Printf("Error in main menu: %v", err) + } } diff --git a/src/telegramAPI.go b/src/telegramAPI.go index 97bd6fe..f576fbe 100644 --- a/src/telegramAPI.go +++ b/src/telegramAPI.go @@ -4,17 +4,18 @@ import ( "log" "time" - "github.com/go-redis/redis" tb "gopkg.in/tucnak/telebot.v2" ) -func botInit(redisClient *redis.Client) ([]*tb.Bot, error) { - var bots []*tb.Bot +var ( + bots []*tb.Bot +) +func botInit() error { tokens, err := getBotTokens(redisClient) if err != nil { log.Printf("Error in retriving bot tokens: %v. Cannot start telebot without tokens.", err) - return nil, err + return err } for _, token := range tokens { @@ -29,5 +30,22 @@ func botInit(redisClient *redis.Client) ([]*tb.Bot, error) { bots = append(bots, bot) } } - return bots, nil + return nil +} + +func botStart() { + err := botInit() + if err != nil { + log.Fatalf("Error in initializing bots: %v", err) + } + + for _, bot := range bots { + defer bot.Stop() + } + + /*b.Handle("/hello", func(m *tb.Message) { + b.Send(m.Sender, "hello world") + }) + + b.Start()*/ }