diff --git a/src/barandaBot.go b/src/barandaBot.go index 59205fa..3ee7742 100644 --- a/src/barandaBot.go +++ b/src/barandaBot.go @@ -2,26 +2,27 @@ package main import ( "log" - - "github.com/go-redis/redis" -) - -var ( - redisClient *redis.Client ) func main() { - cmdFlags, err := getFlags() + err := getFlags() if err != nil { log.Fatalln("Error in parsing command line flags. Abort!") } - redisClient, err = redisInit(cmdFlags.redisAddr, cmdFlags.redisPwd, cmdFlags.redisDB) + err = redisInit(cmdFlags.redisAddr, cmdFlags.redisPwd, cmdFlags.redisDB) defer redisClient.Close() if err != nil { log.Fatalf("Error in initializing redis instance: %v", err) } - mainMenu() + if cmdFlags.interactive { + mainMenu() + } else if cmdFlags.tokens != nil { + err = addBotTokens(redisClient, 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 799084f..0f2a069 100644 --- a/src/redisAPI.go +++ b/src/redisAPI.go @@ -15,6 +15,11 @@ import ( const ( tkSet = "botTokens" + botHash = "botInfos" +) + +var ( + redisClient *redis.Client ) var ( @@ -34,8 +39,8 @@ var ( ErrRemoveToken = errors.New("couldn't remove one or more tokens") ) -func redisInit(addr string, pwd string, db int) (*redis.Client, error) { - redisClient := redis.NewClient(&redis.Options{ +func redisInit(addr string, pwd string, db int) error { + redisClient = redis.NewClient(&redis.Options{ Addr: addr, Password: pwd, DB: db, @@ -43,9 +48,9 @@ func redisInit(addr string, pwd string, db int) (*redis.Client, error) { err := redisClient.Ping().Err() if err != nil { log.Printf("Error in connecting to redis instance: %v", err) - return nil, ErrRedisConnection + return ErrRedisConnection } - return redisClient, nil + return nil } func addBotToken(newToken string, client *redis.Client) error { @@ -64,12 +69,13 @@ func addBotToken(newToken string, client *redis.Client) error { log.Printf("Error in adding new bot token: %v", err) return ErrRedisAddSet } + return nil } func addBotTokens(client *redis.Client, newTokens []string) error { errNum := 0 - if newTokens == nil { + if newTokens == nil && cmdFlags.interactive { fmt.Println("Add the new tokens, comma-separated:") reader := bufio.NewReader(os.Stdin) line, err := reader.ReadString('\n') @@ -77,7 +83,7 @@ func addBotTokens(client *redis.Client, newTokens []string) error { log.Printf("Error in reading new bot tokens: %v", err) return ErrStdRead } - newTokens := strings.Split(line, ",") + newTokens = strings.Split(line, ",") } for _, newToken := range newTokens { err := addBotToken(newToken, client) diff --git a/src/sys.go b/src/sys.go index 2428523..ca94206 100644 --- a/src/sys.go +++ b/src/sys.go @@ -5,6 +5,7 @@ import ( "flag" "fmt" "log" + "strings" "github.com/dixonwille/wmenu" ) @@ -12,37 +13,49 @@ import ( type stringSlice []string type flags struct { - redisAddr string - redisPwd string - redisDB int - tokens stringSlice + interactive bool + redisAddr string + redisPwd string + redisDB int + tokens stringSlice } +var cmdFlags flags + var ( - //ErrStdRead it thrown when it's not possible to read from the standard input - ErrStdRead = errors.New("couldn't read string from stdin") + //ErrStdRead is thrown when it's not possible to read from the standard input + ErrStdRead = errors.New("stdin: couldn't read string from stdin") + //ErrMainMenu is thrown when a menu couldn't be started + ErrMainMenu = errors.New("menu: couldn't start menu") ) -func (i *stringSlice) Set(value string) error { +func (i *stringSlice) String() string { + return fmt.Sprint(*i) +} - *i = append(*i, value) +func (i *stringSlice) Set(values string) error { + splittedValues := strings.Split(values, ",") + for _, value := range splittedValues { + *i = append(*i, value) + } return nil } -func getFlags() (flags, error) { - - var cmdFlags flags - +func getFlags() error { const ( - defaultAddr = "127.0.0.1:6379" - addrUsage = "The address of the redis instance" - defaultPwd = "" - 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" + defaultInteractive = true + interactiveUsage = "False if the bot isn't executed on a tty" + defaultAddr = "127.0.0.1:6379" + addrUsage = "The address of the redis instance" + defaultPwd = "" + 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.BoolVar(&(cmdFlags.interactive), "interactive", defaultInteractive, interactiveUsage) + flag.BoolVar(&(cmdFlags.interactive), "i", defaultInteractive, interactiveUsage+"(shorthand)") flag.StringVar(&(cmdFlags.redisAddr), "redisAddr", defaultAddr, addrUsage) flag.StringVar(&(cmdFlags.redisAddr), "a", defaultAddr, addrUsage+"(shorthand)") flag.StringVar(&(cmdFlags.redisPwd), "redisPwd", defaultPwd, pwdUsage) @@ -54,14 +67,16 @@ func getFlags() (flags, error) { flag.Parse() - return cmdFlags, nil + return nil } -func mainMenu() { +func mainMenu() error { 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.LoopOnInvalid() - menu.Option("Start Bot(s)", nil, true, nil) + menu.Option("Start Bot(s)", nil, true, func(opt wmenu.Opt) error { + return botsStart() + }) menu.Option("Add bot token(s)", nil, false, func(opt wmenu.Opt) error { return addBotTokens(redisClient, nil) }) @@ -72,5 +87,7 @@ func mainMenu() { 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 f576fbe..87783c2 100644 --- a/src/telegramAPI.go +++ b/src/telegramAPI.go @@ -2,6 +2,7 @@ package main import ( "log" + "sync" "time" tb "gopkg.in/tucnak/telebot.v2" @@ -11,7 +12,7 @@ var ( bots []*tb.Bot ) -func botInit() error { +func botsInit() error { tokens, err := getBotTokens(redisClient) if err != nil { log.Printf("Error in retriving bot tokens: %v. Cannot start telebot without tokens.", err) @@ -33,8 +34,8 @@ func botInit() error { return nil } -func botStart() { - err := botInit() +func botsStart() error { + err := botsInit() if err != nil { log.Fatalf("Error in initializing bots: %v", err) } @@ -43,9 +44,22 @@ func botStart() { defer bot.Stop() } - /*b.Handle("/hello", func(m *tb.Message) { - b.Send(m.Sender, "hello world") + var wg sync.WaitGroup + for i := range bots { + defer wg.Done() + botStart(bots[i]) + } + + return nil +} + +func botStart(bot *tb.Bot) error { + log.Printf("Started bot %s", bot.Me.Username) + bot.Handle("/hello", func(m *tb.Message) { + bot.Send(m.Sender, "hello world") }) - b.Start()*/ + bot.Start() + + return nil } diff --git a/todo b/todo new file mode 100644 index 0000000..6918670 --- /dev/null +++ b/todo @@ -0,0 +1,10 @@ +menu con gorutine: + start bot + stop bot + stop daemon + info bot + delete bot -> per nome e non per token (segreto) + +redis hash per bot (si puó usare la struct tb.Bot come interface?): + rinnovare info ad ogni start del bot + visualizzare info bot \ No newline at end of file