Menus and cmd flags for tokens

Signed-off-by: Ettore Dreucci <ettore.dreucci@gmail.com>
This commit is contained in:
2018-06-19 12:43:25 +02:00
parent cb07e131d9
commit b87c2758e9
4 changed files with 114 additions and 38 deletions

View File

@@ -1,6 +1,14 @@
package main package main
import "log" import (
"log"
"github.com/go-redis/redis"
)
var (
redisClient *redis.Client
)
func main() { func main() {
@@ -9,26 +17,11 @@ func main() {
log.Fatalln("Error in parsing command line flags. Abort!") 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() defer redisClient.Close()
if err != nil { if err != nil {
log.Fatalf("Error in initializing redis instance: %v", err) log.Fatalf("Error in initializing redis instance: %v", err)
} }
startMenu() mainMenu()
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()*/
} }

View File

@@ -9,6 +9,7 @@ import (
"regexp" "regexp"
"strings" "strings"
"github.com/dixonwille/wmenu"
"github.com/go-redis/redis" "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 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") 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 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) { func redisInit(addr string, pwd string, db int) (*redis.Client, error) {
@@ -64,7 +67,9 @@ func addBotToken(newToken string, client *redis.Client) error {
return nil return nil
} }
func addBotTokens(client *redis.Client) error { func addBotTokens(client *redis.Client, newTokens []string) error {
errNum := 0
if newTokens == nil {
fmt.Println("Add the new tokens, comma-separated:") fmt.Println("Add the new tokens, comma-separated:")
reader := bufio.NewReader(os.Stdin) reader := bufio.NewReader(os.Stdin)
line, err := reader.ReadString('\n') line, err := reader.ReadString('\n')
@@ -73,12 +78,47 @@ func addBotTokens(client *redis.Client) error {
return ErrStdRead return ErrStdRead
} }
newTokens := strings.Split(line, ",") newTokens := strings.Split(line, ",")
}
for _, newToken := range newTokens { for _, newToken := range newTokens {
err = addBotToken(newToken, client) err := addBotToken(newToken, client)
if err != nil { if err != nil {
errNum++
log.Printf("Error in adding new bot token %s: %v", newToken, err) 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 return nil
} }
@@ -90,7 +130,7 @@ func getBotTokens(client *redis.Client) ([]string, error) {
} }
if tkNum == 0 { if tkNum == 0 {
fmt.Println("No bot token found.") fmt.Println("No bot token found.")
err := addBotTokens(client) err := addBotTokens(client, nil)
if err != nil { if err != nil {
log.Printf("Couldn't add new bot tokens: %v", err) log.Printf("Couldn't add new bot tokens: %v", err)
return nil, ErrAddToken return nil, ErrAddToken

View File

@@ -4,14 +4,18 @@ import (
"errors" "errors"
"flag" "flag"
"fmt" "fmt"
"log"
"github.com/dixonwille/wmenu" "github.com/dixonwille/wmenu"
) )
type stringSlice []string
type flags struct { type flags struct {
redisAddr string redisAddr string
redisPwd string redisPwd string
redisDB int redisDB int
tokens stringSlice
} }
var ( var (
@@ -19,6 +23,12 @@ var (
ErrStdRead = errors.New("couldn't read string from stdin") 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) { func getFlags() (flags, error) {
var cmdFlags flags var cmdFlags flags
@@ -30,6 +40,7 @@ func getFlags() (flags, error) {
pwdUsage = "The password of the redis instance" pwdUsage = "The password of the redis instance"
defaultDB = 0 defaultDB = 0
dbUsage = "The database to be selected after connecting to redis instance" 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) flag.StringVar(&(cmdFlags.redisAddr), "redisAddr", defaultAddr, addrUsage)
@@ -38,14 +49,28 @@ func getFlags() (flags, error) {
flag.StringVar(&(cmdFlags.redisPwd), "p", defaultPwd, pwdUsage+"(shorthand)") flag.StringVar(&(cmdFlags.redisPwd), "p", defaultPwd, pwdUsage+"(shorthand)")
flag.IntVar(&(cmdFlags.redisDB), "redisDB", defaultDB, dbUsage) flag.IntVar(&(cmdFlags.redisDB), "redisDB", defaultDB, dbUsage)
flag.IntVar(&(cmdFlags.redisDB), "d", defaultDB, dbUsage+"(shorthand)") flag.IntVar(&(cmdFlags.redisDB), "d", defaultDB, dbUsage+"(shorthand)")
flag.Var(&(cmdFlags.tokens), "token", tokenUsage)
flag.Var(&(cmdFlags.tokens), "t", tokenUsage+"(shorthand")
flag.Parse() flag.Parse()
return cmdFlags, nil return cmdFlags, nil
} }
func startMenu() { func mainMenu() {
fmt.Println("Welcome in barandaBot! Here you can control the bot(s) options and configurations.") 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 := 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)
}
} }

View File

@@ -4,17 +4,18 @@ import (
"log" "log"
"time" "time"
"github.com/go-redis/redis"
tb "gopkg.in/tucnak/telebot.v2" tb "gopkg.in/tucnak/telebot.v2"
) )
func botInit(redisClient *redis.Client) ([]*tb.Bot, error) { var (
var bots []*tb.Bot bots []*tb.Bot
)
func botInit() error {
tokens, err := getBotTokens(redisClient) tokens, err := getBotTokens(redisClient)
if err != nil { if err != nil {
log.Printf("Error in retriving bot tokens: %v. Cannot start telebot without tokens.", err) log.Printf("Error in retriving bot tokens: %v. Cannot start telebot without tokens.", err)
return nil, err return err
} }
for _, token := range tokens { for _, token := range tokens {
@@ -29,5 +30,22 @@ func botInit(redisClient *redis.Client) ([]*tb.Bot, error) {
bots = append(bots, bot) 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()*/
} }