Gestione token bot

Signed-off-by: Ettore Dreucci <ettore.dreucci@gmail.com>
This commit is contained in:
2018-06-20 00:26:38 +02:00
parent b87c2758e9
commit 57e58bef0e
5 changed files with 91 additions and 43 deletions

View File

@@ -2,26 +2,27 @@ package main
import ( import (
"log" "log"
"github.com/go-redis/redis"
)
var (
redisClient *redis.Client
) )
func main() { func main() {
cmdFlags, err := getFlags() err := getFlags()
if err != nil { if err != nil {
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) 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)
} }
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)
}
}
} }

View File

@@ -15,6 +15,11 @@ import (
const ( const (
tkSet = "botTokens" tkSet = "botTokens"
botHash = "botInfos"
)
var (
redisClient *redis.Client
) )
var ( var (
@@ -34,8 +39,8 @@ var (
ErrRemoveToken = errors.New("couldn't remove one or more tokens") 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) error {
redisClient := redis.NewClient(&redis.Options{ redisClient = redis.NewClient(&redis.Options{
Addr: addr, Addr: addr,
Password: pwd, Password: pwd,
DB: db, DB: db,
@@ -43,9 +48,9 @@ func redisInit(addr string, pwd string, db int) (*redis.Client, error) {
err := redisClient.Ping().Err() err := redisClient.Ping().Err()
if err != nil { if err != nil {
log.Printf("Error in connecting to redis instance: %v", err) 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 { 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) log.Printf("Error in adding new bot token: %v", err)
return ErrRedisAddSet return ErrRedisAddSet
} }
return nil return nil
} }
func addBotTokens(client *redis.Client, newTokens []string) error { func addBotTokens(client *redis.Client, newTokens []string) error {
errNum := 0 errNum := 0
if newTokens == nil { if newTokens == nil && cmdFlags.interactive {
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')
@@ -77,7 +83,7 @@ func addBotTokens(client *redis.Client, newTokens []string) error {
log.Printf("Error in reading new bot tokens: %v", err) log.Printf("Error in reading new bot tokens: %v", err)
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)

View File

@@ -5,6 +5,7 @@ import (
"flag" "flag"
"fmt" "fmt"
"log" "log"
"strings"
"github.com/dixonwille/wmenu" "github.com/dixonwille/wmenu"
) )
@@ -12,37 +13,49 @@ import (
type stringSlice []string type stringSlice []string
type flags struct { type flags struct {
redisAddr string interactive bool
redisPwd string redisAddr string
redisDB int redisPwd string
tokens stringSlice redisDB int
tokens stringSlice
} }
var cmdFlags flags
var ( var (
//ErrStdRead it thrown when it's not possible to read from the standard input //ErrStdRead is thrown when it's not possible to read from the standard input
ErrStdRead = errors.New("couldn't read string from stdin") 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 return nil
} }
func getFlags() (flags, error) { func getFlags() error {
var cmdFlags flags
const ( const (
defaultAddr = "127.0.0.1:6379" defaultInteractive = true
addrUsage = "The address of the redis instance" interactiveUsage = "False if the bot isn't executed on a tty"
defaultPwd = "" defaultAddr = "127.0.0.1:6379"
pwdUsage = "The password of the redis instance" addrUsage = "The address of the redis instance"
defaultDB = 0 defaultPwd = ""
dbUsage = "The database to be selected after connecting to redis instance" pwdUsage = "The password of the redis instance"
tokenUsage = "A bot token to be added to the set of tokens" 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), "redisAddr", defaultAddr, addrUsage)
flag.StringVar(&(cmdFlags.redisAddr), "a", defaultAddr, addrUsage+"(shorthand)") flag.StringVar(&(cmdFlags.redisAddr), "a", defaultAddr, addrUsage+"(shorthand)")
flag.StringVar(&(cmdFlags.redisPwd), "redisPwd", defaultPwd, pwdUsage) flag.StringVar(&(cmdFlags.redisPwd), "redisPwd", defaultPwd, pwdUsage)
@@ -54,14 +67,16 @@ func getFlags() (flags, error) {
flag.Parse() 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.") 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.LoopOnInvalid() 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 { menu.Option("Add bot token(s)", nil, false, func(opt wmenu.Opt) error {
return addBotTokens(redisClient, nil) return addBotTokens(redisClient, nil)
}) })
@@ -72,5 +87,7 @@ func mainMenu() {
err := menu.Run() err := menu.Run()
if err != nil { if err != nil {
log.Printf("Error in main menu: %v", err) log.Printf("Error in main menu: %v", err)
return ErrMainMenu
} }
return nil
} }

View File

@@ -2,6 +2,7 @@ package main
import ( import (
"log" "log"
"sync"
"time" "time"
tb "gopkg.in/tucnak/telebot.v2" tb "gopkg.in/tucnak/telebot.v2"
@@ -11,7 +12,7 @@ var (
bots []*tb.Bot bots []*tb.Bot
) )
func botInit() error { func botsInit() 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)
@@ -33,8 +34,8 @@ func botInit() error {
return nil return nil
} }
func botStart() { func botsStart() error {
err := botInit() err := botsInit()
if err != nil { if err != nil {
log.Fatalf("Error in initializing bots: %v", err) log.Fatalf("Error in initializing bots: %v", err)
} }
@@ -43,9 +44,22 @@ func botStart() {
defer bot.Stop() defer bot.Stop()
} }
/*b.Handle("/hello", func(m *tb.Message) { var wg sync.WaitGroup
b.Send(m.Sender, "hello world") 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
} }

10
todo Normal file
View File

@@ -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