@@ -8,7 +8,7 @@ func main() {
|
|||||||
|
|
||||||
err := getFlags()
|
err := getFlags()
|
||||||
if err != nil {
|
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)
|
err = redisInit(cmdFlags.redisAddr, cmdFlags.redisPwd, cmdFlags.redisDB)
|
||||||
@@ -20,7 +20,7 @@ func main() {
|
|||||||
if cmdFlags.interactive {
|
if cmdFlags.interactive {
|
||||||
mainMenu()
|
mainMenu()
|
||||||
} else if cmdFlags.tokens != nil {
|
} else if cmdFlags.tokens != nil {
|
||||||
err = addBotTokens(redisClient, cmdFlags.tokens)
|
err = addBotTokens(cmdFlags.tokens)
|
||||||
if err == ErrAddToken {
|
if err == ErrAddToken {
|
||||||
log.Printf("Error in adding bot tokens: %v", err)
|
log.Printf("Error in adding bot tokens: %v", err)
|
||||||
}
|
}
|
||||||
|
@@ -11,6 +11,7 @@ import (
|
|||||||
|
|
||||||
"github.com/dixonwille/wmenu"
|
"github.com/dixonwille/wmenu"
|
||||||
"github.com/go-redis/redis"
|
"github.com/go-redis/redis"
|
||||||
|
tb "gopkg.in/tucnak/telebot.v2"
|
||||||
)
|
)
|
||||||
|
|
||||||
const (
|
const (
|
||||||
@@ -18,9 +19,7 @@ const (
|
|||||||
botHash = "botInfos"
|
botHash = "botInfos"
|
||||||
)
|
)
|
||||||
|
|
||||||
var (
|
var redisClient *redis.Client
|
||||||
redisClient *redis.Client
|
|
||||||
)
|
|
||||||
|
|
||||||
var (
|
var (
|
||||||
//ErrRedisConnection is thrown when a redis connection error occurs
|
//ErrRedisConnection is thrown when a redis connection error occurs
|
||||||
@@ -29,6 +28,8 @@ var (
|
|||||||
ErrRedisAddSet = errors.New("redis: couldn't add key in set")
|
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 is thrown when it's not possible to retrive keys from a set
|
||||||
ErrRedisRetriveSet = errors.New("redis: couldn't retrive keys from 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 is thrown when it's not possible to parse the bot token
|
||||||
ErrTokenParsing = errors.New("botToken: cannot parse token")
|
ErrTokenParsing = errors.New("botToken: cannot parse token")
|
||||||
//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
|
||||||
@@ -53,7 +54,10 @@ func redisInit(addr string, pwd string, db int) error {
|
|||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func addBotToken(newToken string, client *redis.Client) error {
|
func addBotToken(newToken string) error {
|
||||||
|
if redisClient == nil {
|
||||||
|
return ErrNilPointer
|
||||||
|
}
|
||||||
token := strings.TrimSpace(newToken)
|
token := strings.TrimSpace(newToken)
|
||||||
matched, err := regexp.MatchString("^\\d+\\:([0-9]|[A-z]|\\_|\\-)+", token)
|
matched, err := regexp.MatchString("^\\d+\\:([0-9]|[A-z]|\\_|\\-)+", token)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
@@ -64,7 +68,7 @@ func addBotToken(newToken string, client *redis.Client) error {
|
|||||||
return ErrTokenInvalid
|
return ErrTokenInvalid
|
||||||
}
|
}
|
||||||
|
|
||||||
err = client.SAdd(tkSet, token).Err()
|
err = redisClient.SAdd(tkSet, token).Err()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Printf("Error in adding new bot token: %v", err)
|
log.Printf("Error in adding new bot token: %v", err)
|
||||||
return ErrRedisAddSet
|
return ErrRedisAddSet
|
||||||
@@ -73,7 +77,10 @@ func addBotToken(newToken string, client *redis.Client) error {
|
|||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func addBotTokens(client *redis.Client, newTokens []string) error {
|
func addBotTokens(newTokens []string) error {
|
||||||
|
if redisClient == nil {
|
||||||
|
return ErrNilPointer
|
||||||
|
}
|
||||||
errNum := 0
|
errNum := 0
|
||||||
if newTokens == nil && cmdFlags.interactive {
|
if newTokens == nil && cmdFlags.interactive {
|
||||||
fmt.Println("Add the new tokens, comma-separated:")
|
fmt.Println("Add the new tokens, comma-separated:")
|
||||||
@@ -86,7 +93,7 @@ func addBotTokens(client *redis.Client, newTokens []string) error {
|
|||||||
newTokens = strings.Split(line, ",")
|
newTokens = strings.Split(line, ",")
|
||||||
}
|
}
|
||||||
for _, newToken := range newTokens {
|
for _, newToken := range newTokens {
|
||||||
err := addBotToken(newToken, client)
|
err := addBotToken(newToken)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
errNum++
|
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)
|
||||||
@@ -98,8 +105,11 @@ func addBotTokens(client *redis.Client, newTokens []string) error {
|
|||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func removeBotToken(token string, client *redis.Client) error {
|
func removeBotToken(token string) error {
|
||||||
err := client.SRem(tkSet, token).Err()
|
if redisClient == nil {
|
||||||
|
return ErrNilPointer
|
||||||
|
}
|
||||||
|
err := redisClient.SRem(tkSet, token).Err()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Printf("Error in removing bot token %s: %v", token, err)
|
log.Printf("Error in removing bot token %s: %v", token, err)
|
||||||
return ErrRemoveToken
|
return ErrRemoveToken
|
||||||
@@ -107,18 +117,35 @@ func removeBotToken(token string, client *redis.Client) error {
|
|||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func removeBotTokens(client *redis.Client) error {
|
func removeBotTokens() error {
|
||||||
tokens, err := client.SMembers(tkSet).Result()
|
if redisClient == nil {
|
||||||
|
return ErrNilPointer
|
||||||
|
}
|
||||||
|
//tokens, err := redisClient.SMembers(tkSet).Result()
|
||||||
|
botsInfo, err := redisClient.HGetAll(botHash).Result()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Printf("Couldn't retrive bot tokens: %v", err)
|
log.Printf("Couldn't retrive bot info: %v", err)
|
||||||
return ErrRedisRetriveSet
|
return ErrRedisRetriveSet
|
||||||
}
|
}
|
||||||
menu := wmenu.NewMenu("Select the token(s) you want to remove:")
|
menu := wmenu.NewMenu("Select the token(s) you want to remove:")
|
||||||
menu.AllowMultiple()
|
menu.AllowMultiple()
|
||||||
menu.LoopOnInvalid()
|
menu.LoopOnInvalid()
|
||||||
menu.Action(func(opts []wmenu.Opt) error { return removeBotToken(opts[0].Text, client) })
|
menu.Action(func(opts []wmenu.Opt) error {
|
||||||
for _, token := range tokens {
|
for _, opt := range opts {
|
||||||
menu.Option(token, nil, false, nil)
|
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()
|
err = menu.Run()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
@@ -128,22 +155,25 @@ func removeBotTokens(client *redis.Client) error {
|
|||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func getBotTokens(client *redis.Client) ([]string, error) {
|
func getBotTokens() ([]string, error) {
|
||||||
tkNum, err := client.SCard(tkSet).Result()
|
if redisClient == nil {
|
||||||
|
return nil, ErrNilPointer
|
||||||
|
}
|
||||||
|
tkNum, err := redisClient.SCard(tkSet).Result()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Printf("Couldn't retrive number of bot tokens: %v", err)
|
log.Printf("Couldn't retrive number of bot tokens: %v", err)
|
||||||
return nil, ErrRedisRetriveSet
|
return nil, ErrRedisRetriveSet
|
||||||
}
|
}
|
||||||
if tkNum == 0 {
|
if tkNum == 0 {
|
||||||
fmt.Println("No bot token found.")
|
fmt.Println("No bot token found.")
|
||||||
err := addBotTokens(client, nil)
|
err := addBotTokens(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
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
tokens, err := client.SMembers(tkSet).Result()
|
tokens, err := redisClient.SMembers(tkSet).Result()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Printf("Couldn't retrive bot tokens: %v", err)
|
log.Printf("Couldn't retrive bot tokens: %v", err)
|
||||||
return nil, ErrRedisRetriveSet
|
return nil, ErrRedisRetriveSet
|
||||||
@@ -151,3 +181,16 @@ func getBotTokens(client *redis.Client) ([]string, error) {
|
|||||||
|
|
||||||
return tokens, nil
|
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
|
||||||
|
}
|
||||||
|
@@ -78,16 +78,18 @@ func mainMenu() error {
|
|||||||
return botsStart()
|
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(nil)
|
||||||
})
|
})
|
||||||
menu.Option("Remove bot token(s)", nil, false, func(opt wmenu.Opt) error {
|
menu.Option("Remove bot token(s)", nil, false, func(opt wmenu.Opt) error {
|
||||||
return removeBotTokens(redisClient)
|
return removeBotTokens()
|
||||||
})
|
})
|
||||||
|
|
||||||
|
for {
|
||||||
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 ErrMainMenu
|
||||||
}
|
}
|
||||||
|
}
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
@@ -1,6 +1,7 @@
|
|||||||
package main
|
package main
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"errors"
|
||||||
"log"
|
"log"
|
||||||
"sync"
|
"sync"
|
||||||
"time"
|
"time"
|
||||||
@@ -8,17 +9,25 @@ import (
|
|||||||
tb "gopkg.in/tucnak/telebot.v2"
|
tb "gopkg.in/tucnak/telebot.v2"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
var bots []*tb.Bot
|
||||||
|
|
||||||
var (
|
var (
|
||||||
bots []*tb.Bot
|
//ErrNilPointer is thrown when a pointer is nil
|
||||||
|
ErrNilPointer = errors.New("pointer is nil")
|
||||||
)
|
)
|
||||||
|
|
||||||
func botsInit() error {
|
func botsInit() error {
|
||||||
tokens, err := getBotTokens(redisClient)
|
tokens, err := getBotTokens()
|
||||||
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 err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if tokens == nil {
|
||||||
|
log.Println("Error: pointer is nil")
|
||||||
|
return ErrNilPointer
|
||||||
|
}
|
||||||
|
|
||||||
for _, token := range tokens {
|
for _, token := range tokens {
|
||||||
bot, err := tb.NewBot(tb.Settings{
|
bot, err := tb.NewBot(tb.Settings{
|
||||||
Token: token,
|
Token: token,
|
||||||
@@ -29,6 +38,10 @@ func botsInit() error {
|
|||||||
log.Printf("Error in enstablishing connection for bot %s: %v", bot.Me.Username, err)
|
log.Printf("Error in enstablishing connection for bot %s: %v", bot.Me.Username, err)
|
||||||
} else {
|
} else {
|
||||||
bots = append(bots, bot)
|
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
|
return nil
|
||||||
@@ -47,13 +60,18 @@ func botsStart() error {
|
|||||||
var wg sync.WaitGroup
|
var wg sync.WaitGroup
|
||||||
for i := range bots {
|
for i := range bots {
|
||||||
defer wg.Done()
|
defer wg.Done()
|
||||||
botStart(bots[i])
|
if bots[i] != nil {
|
||||||
|
go botStart(bots[i])
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func botStart(bot *tb.Bot) error {
|
func botStart(bot *tb.Bot) error {
|
||||||
|
if bot == nil {
|
||||||
|
return ErrNilPointer
|
||||||
|
}
|
||||||
log.Printf("Started bot %s", bot.Me.Username)
|
log.Printf("Started bot %s", bot.Me.Username)
|
||||||
bot.Handle("/hello", func(m *tb.Message) {
|
bot.Handle("/hello", func(m *tb.Message) {
|
||||||
bot.Send(m.Sender, "hello world")
|
bot.Send(m.Sender, "hello world")
|
||||||
|
Reference in New Issue
Block a user