From 5f5dfad1ed72538b6634d2f658ff8e1a51dcef18 Mon Sep 17 00:00:00 2001 From: Ettore Dreucci Date: Wed, 20 Jun 2018 11:54:53 +0200 Subject: [PATCH] Menus Signed-off-by: Ettore Dreucci --- src/barandaBot.go | 4 +-- src/redisAPI.go | 83 +++++++++++++++++++++++++++++++++++----------- src/sys.go | 14 ++++---- src/telegramAPI.go | 24 ++++++++++++-- 4 files changed, 94 insertions(+), 31 deletions(-) diff --git a/src/barandaBot.go b/src/barandaBot.go index 3ee7742..a50027d 100644 --- a/src/barandaBot.go +++ b/src/barandaBot.go @@ -8,7 +8,7 @@ func main() { err := getFlags() if err != nil { - log.Fatalln("Error in parsing command line flags. Abort!") + log.Fatalf("Error in parsing command line flags: %v", err) } err = redisInit(cmdFlags.redisAddr, cmdFlags.redisPwd, cmdFlags.redisDB) @@ -20,7 +20,7 @@ func main() { if cmdFlags.interactive { mainMenu() } else if cmdFlags.tokens != nil { - err = addBotTokens(redisClient, cmdFlags.tokens) + err = addBotTokens(cmdFlags.tokens) if err == ErrAddToken { log.Printf("Error in adding bot tokens: %v", err) } diff --git a/src/redisAPI.go b/src/redisAPI.go index 0f2a069..0092556 100644 --- a/src/redisAPI.go +++ b/src/redisAPI.go @@ -11,16 +11,15 @@ import ( "github.com/dixonwille/wmenu" "github.com/go-redis/redis" + tb "gopkg.in/tucnak/telebot.v2" ) const ( - tkSet = "botTokens" + tkSet = "botTokens" botHash = "botInfos" ) -var ( - redisClient *redis.Client -) +var redisClient *redis.Client var ( //ErrRedisConnection is thrown when a redis connection error occurs @@ -29,6 +28,8 @@ var ( ErrRedisAddSet = errors.New("redis: couldn't add key in set") //ErrRedisRetriveSet is thrown when it's not possible to retrive keys from a set ErrRedisRetriveSet = errors.New("redis: couldn't retrive keys from set") + //ErrRedisAddHash is thrown when it's not possible to add a key in a hash + ErrRedisAddHash = errors.New("redis: couldn't add key in hash") //ErrTokenParsing is thrown when it's not possible to parse the bot token ErrTokenParsing = errors.New("botToken: cannot parse token") //ErrTokenInvalid is thrown when the string parsed isn't a valid telegram bot token @@ -53,7 +54,10 @@ func redisInit(addr string, pwd string, db int) error { return nil } -func addBotToken(newToken string, client *redis.Client) error { +func addBotToken(newToken string) error { + if redisClient == nil { + return ErrNilPointer + } token := strings.TrimSpace(newToken) matched, err := regexp.MatchString("^\\d+\\:([0-9]|[A-z]|\\_|\\-)+", token) if err != nil { @@ -64,7 +68,7 @@ func addBotToken(newToken string, client *redis.Client) error { return ErrTokenInvalid } - err = client.SAdd(tkSet, token).Err() + err = redisClient.SAdd(tkSet, token).Err() if err != nil { log.Printf("Error in adding new bot token: %v", err) return ErrRedisAddSet @@ -73,7 +77,10 @@ func addBotToken(newToken string, client *redis.Client) error { return nil } -func addBotTokens(client *redis.Client, newTokens []string) error { +func addBotTokens(newTokens []string) error { + if redisClient == nil { + return ErrNilPointer + } errNum := 0 if newTokens == nil && cmdFlags.interactive { fmt.Println("Add the new tokens, comma-separated:") @@ -86,7 +93,7 @@ func addBotTokens(client *redis.Client, newTokens []string) error { newTokens = strings.Split(line, ",") } for _, newToken := range newTokens { - err := addBotToken(newToken, client) + err := addBotToken(newToken) if err != nil { errNum++ log.Printf("Error in adding new bot token %s: %v", newToken, err) @@ -98,8 +105,11 @@ func addBotTokens(client *redis.Client, newTokens []string) error { return nil } -func removeBotToken(token string, client *redis.Client) error { - err := client.SRem(tkSet, token).Err() +func removeBotToken(token string) error { + if redisClient == nil { + return ErrNilPointer + } + err := redisClient.SRem(tkSet, token).Err() if err != nil { log.Printf("Error in removing bot token %s: %v", token, err) return ErrRemoveToken @@ -107,18 +117,35 @@ func removeBotToken(token string, client *redis.Client) error { return nil } -func removeBotTokens(client *redis.Client) error { - tokens, err := client.SMembers(tkSet).Result() +func removeBotTokens() error { + if redisClient == nil { + return ErrNilPointer + } + //tokens, err := redisClient.SMembers(tkSet).Result() + botsInfo, err := redisClient.HGetAll(botHash).Result() if err != nil { - log.Printf("Couldn't retrive bot tokens: %v", err) + log.Printf("Couldn't retrive bot info: %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) + menu.Action(func(opts []wmenu.Opt) error { + for _, opt := range opts { + if opt.Value == nil { + log.Println("Couldn't remove bot: nil token") + return ErrNilPointer + } + err := removeBotToken(opt.Value.(string)) + if err != nil { + log.Printf("Couldn't remove bot: %v", err) + } + } + return nil + }) + //for _, token := range tokens { + for token, botInfo := range botsInfo { + menu.Option(botInfo, token, false, nil) } err = menu.Run() if err != nil { @@ -128,22 +155,25 @@ func removeBotTokens(client *redis.Client) error { return nil } -func getBotTokens(client *redis.Client) ([]string, error) { - tkNum, err := client.SCard(tkSet).Result() +func getBotTokens() ([]string, error) { + if redisClient == nil { + return nil, ErrNilPointer + } + tkNum, err := redisClient.SCard(tkSet).Result() if err != nil { log.Printf("Couldn't retrive number of bot tokens: %v", err) return nil, ErrRedisRetriveSet } if tkNum == 0 { fmt.Println("No bot token found.") - err := addBotTokens(client, nil) + err := addBotTokens(nil) if err != nil { log.Printf("Couldn't add new bot tokens: %v", err) return nil, ErrAddToken } } - tokens, err := client.SMembers(tkSet).Result() + tokens, err := redisClient.SMembers(tkSet).Result() if err != nil { log.Printf("Couldn't retrive bot tokens: %v", err) return nil, ErrRedisRetriveSet @@ -151,3 +181,16 @@ func getBotTokens(client *redis.Client) ([]string, error) { return tokens, nil } + +func addBotInfo(bot *tb.Bot, botToken string) error { + if redisClient == nil { + return ErrNilPointer + } + err := redisClient.HSet(botHash, botToken, bot.Me.Username).Err() + if err != nil { + log.Printf("Error in adding bot info: %v", err) + return ErrRedisAddHash + } + + return nil +} diff --git a/src/sys.go b/src/sys.go index ca94206..97aecc7 100644 --- a/src/sys.go +++ b/src/sys.go @@ -78,16 +78,18 @@ func mainMenu() error { return botsStart() }) menu.Option("Add bot token(s)", nil, false, func(opt wmenu.Opt) error { - return addBotTokens(redisClient, nil) + return addBotTokens(nil) }) menu.Option("Remove bot token(s)", nil, false, func(opt wmenu.Opt) error { - return removeBotTokens(redisClient) + return removeBotTokens() }) - err := menu.Run() - if err != nil { - log.Printf("Error in main menu: %v", err) - return ErrMainMenu + for { + err := menu.Run() + if err != nil { + log.Printf("Error in main menu: %v", err) + return ErrMainMenu + } } return nil } diff --git a/src/telegramAPI.go b/src/telegramAPI.go index 87783c2..1911cf6 100644 --- a/src/telegramAPI.go +++ b/src/telegramAPI.go @@ -1,6 +1,7 @@ package main import ( + "errors" "log" "sync" "time" @@ -8,17 +9,25 @@ import ( tb "gopkg.in/tucnak/telebot.v2" ) +var bots []*tb.Bot + var ( - bots []*tb.Bot + //ErrNilPointer is thrown when a pointer is nil + ErrNilPointer = errors.New("pointer is nil") ) func botsInit() error { - tokens, err := getBotTokens(redisClient) + tokens, err := getBotTokens() if err != nil { log.Printf("Error in retriving bot tokens: %v. Cannot start telebot without tokens.", err) return err } + if tokens == nil { + log.Println("Error: pointer is nil") + return ErrNilPointer + } + for _, token := range tokens { bot, err := tb.NewBot(tb.Settings{ Token: token, @@ -29,6 +38,10 @@ func botsInit() error { log.Printf("Error in enstablishing connection for bot %s: %v", bot.Me.Username, err) } else { bots = append(bots, bot) + err = addBotInfo(bot, token) + if err != nil { + log.Printf("Error: bot %s info couldn't be added: %v", bot.Me.Username, err) + } } } return nil @@ -47,13 +60,18 @@ func botsStart() error { var wg sync.WaitGroup for i := range bots { defer wg.Done() - botStart(bots[i]) + if bots[i] != nil { + go botStart(bots[i]) + } } return nil } func botStart(bot *tb.Bot) error { + if bot == nil { + return ErrNilPointer + } log.Printf("Started bot %s", bot.Me.Username) bot.Handle("/hello", func(m *tb.Message) { bot.Send(m.Sender, "hello world")