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 (
"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)
}
}
}

View File

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

View File

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

View File

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

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