Various improvement
Signed-off-by: Ettore Dreucci <ettore.dreucci@gmail.com>
This commit is contained in:
@@ -68,7 +68,6 @@ func removeBotAdmins() error {
|
|||||||
}
|
}
|
||||||
return returnErr
|
return returnErr
|
||||||
})
|
})
|
||||||
//for _, token := range tokens {
|
|
||||||
for _, botAdmin := range botAdmins {
|
for _, botAdmin := range botAdmins {
|
||||||
adminID, err := strconv.Atoi(botAdmin)
|
adminID, err := strconv.Atoi(botAdmin)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
@@ -86,6 +85,35 @@ func removeBotAdmins() error {
|
|||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func hasBotAdmins() (bool, error) {
|
||||||
|
if redisClient == nil {
|
||||||
|
return false, ErrNilPointer
|
||||||
|
}
|
||||||
|
|
||||||
|
adminNum, err := redisClient.SCard(adminUsers).Result()
|
||||||
|
if err != nil {
|
||||||
|
log.Printf("Error retrieving number of admins: %v", err)
|
||||||
|
return false, ErrRedisRetrieveSet
|
||||||
|
}
|
||||||
|
|
||||||
|
if adminNum <= 0 {
|
||||||
|
return false, nil
|
||||||
|
}
|
||||||
|
return true, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func isBotAdmin(userID int) (bool, error) {
|
||||||
|
if redisClient == nil {
|
||||||
|
return false, ErrNilPointer
|
||||||
|
}
|
||||||
|
admin, err := redisClient.SIsMember(adminUsers, strconv.Itoa(userID)).Result()
|
||||||
|
if err != nil {
|
||||||
|
log.Printf("Error checking if ID is bot admin: %v", err)
|
||||||
|
return false, ErrRedisCheckSet
|
||||||
|
}
|
||||||
|
return admin, nil
|
||||||
|
}
|
||||||
|
|
||||||
func addBotAdmin(newAdminID string) error {
|
func addBotAdmin(newAdminID string) error {
|
||||||
if redisClient == nil {
|
if redisClient == nil {
|
||||||
return ErrNilPointer
|
return ErrNilPointer
|
||||||
@@ -126,11 +154,24 @@ func addBotAdmin(newAdminID string) error {
|
|||||||
return ErrAddUser
|
return ErrAddUser
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
isAuth, err := isAuthrizedUser(ID)
|
||||||
|
if err != nil {
|
||||||
|
log.Printf("Error checking if ID is authorized: %v", err)
|
||||||
|
return ErrAddAdmin
|
||||||
|
}
|
||||||
|
if !isAuth {
|
||||||
|
err = authorizeUser(ID, true)
|
||||||
|
if err != nil {
|
||||||
|
log.Printf("Error authorizing user: %v", err)
|
||||||
|
return ErrAddAuthUser
|
||||||
|
}
|
||||||
|
}
|
||||||
err = redisClient.SAdd(adminUsers, adminID).Err()
|
err = redisClient.SAdd(adminUsers, adminID).Err()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Printf("Error in adding new admin ID: %v", err)
|
log.Printf("Error in adding new admin ID: %v", err)
|
||||||
return ErrRedisAddSet
|
return ErrRedisAddSet
|
||||||
}
|
}
|
||||||
|
botStatus.hasAdmin = true
|
||||||
|
|
||||||
err = authorizeUser(ID, true)
|
err = authorizeUser(ID, true)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
@@ -142,7 +183,7 @@ func addBotAdmin(newAdminID string) error {
|
|||||||
log.Printf("Error getting user info: %v", err)
|
log.Printf("Error getting user info: %v", err)
|
||||||
return ErrGetUser
|
return ErrGetUser
|
||||||
}
|
}
|
||||||
err = sendMessage(user, newAdminMsg)
|
err = sendMsg(user, newAdminMsg)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Printf("Error sending message to new admin: %v", err)
|
log.Printf("Error sending message to new admin: %v", err)
|
||||||
return ErrSendMsg
|
return ErrSendMsg
|
||||||
@@ -165,11 +206,18 @@ func removeBotAdmin(adminID int) error {
|
|||||||
log.Printf("Error getting user info: %v", err)
|
log.Printf("Error getting user info: %v", err)
|
||||||
return ErrGetUser
|
return ErrGetUser
|
||||||
}
|
}
|
||||||
err = sendMessage(user, delAdminMsg)
|
err = sendMsg(user, delAdminMsg)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Printf("Error sending message to removed admin: %v", err)
|
log.Printf("Error sending message to removed admin: %v", err)
|
||||||
return ErrSendMsg
|
return ErrSendMsg
|
||||||
}
|
}
|
||||||
|
|
||||||
|
hasAdmin, err := hasBotAdmins()
|
||||||
|
if err != nil {
|
||||||
|
log.Printf("Error checking if bot has admins: %v", err)
|
||||||
|
return ErrRedisRetrieveSet
|
||||||
|
}
|
||||||
|
botStatus.hasAdmin = hasAdmin
|
||||||
|
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
@@ -74,6 +74,38 @@ func getUserInfo(userID int) (*tb.User, error) {
|
|||||||
return jsonUser, nil
|
return jsonUser, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func isStartedUser(userID int) (bool, error) {
|
||||||
|
if redisClient == nil {
|
||||||
|
return false, ErrNilPointer
|
||||||
|
}
|
||||||
|
started, err := redisClient.SIsMember(startedUsers, strconv.Itoa(userID)).Result()
|
||||||
|
if err != nil {
|
||||||
|
log.Printf("Error checking if user is started: %v", err)
|
||||||
|
return false, ErrRedisCheckSet
|
||||||
|
}
|
||||||
|
return started, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func startUser(userID int, started bool) error {
|
||||||
|
if redisClient == nil {
|
||||||
|
return ErrNilPointer
|
||||||
|
}
|
||||||
|
if started {
|
||||||
|
err := redisClient.SAdd(startedUsers, strconv.Itoa(userID)).Err()
|
||||||
|
if err != nil {
|
||||||
|
log.Printf("Error adding token to set: %v", err)
|
||||||
|
return ErrRedisAddSet
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
err := redisClient.SRem(startedUsers, strconv.Itoa(userID)).Err()
|
||||||
|
if err != nil {
|
||||||
|
log.Printf("Error removing token from set: %v", err)
|
||||||
|
return ErrRedisRemSet
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
func isAuthrizedUser(userID int) (bool, error) {
|
func isAuthrizedUser(userID int) (bool, error) {
|
||||||
if redisClient == nil {
|
if redisClient == nil {
|
||||||
return false, ErrNilPointer
|
return false, ErrNilPointer
|
||||||
|
@@ -8,13 +8,14 @@ import (
|
|||||||
)
|
)
|
||||||
|
|
||||||
const (
|
const (
|
||||||
botToken = "botToken"
|
botToken = "botToken"
|
||||||
botInfo = "botInfo"
|
botInfo = "botInfo"
|
||||||
usersID = "usersID"
|
usersID = "usersID"
|
||||||
usersInfo = "usersInfo"
|
usersInfo = "usersInfo"
|
||||||
usersGroups = "usersGroups"
|
usersGroups = "usersGroups"
|
||||||
authUsers = "authUsers"
|
startedUsers = "startedUsers"
|
||||||
adminUsers = "adminUsers"
|
authUsers = "authUsers"
|
||||||
|
adminUsers = "adminUsers"
|
||||||
)
|
)
|
||||||
|
|
||||||
var redisClient *redis.Client
|
var redisClient *redis.Client
|
||||||
|
22
src/sys.go
22
src/sys.go
@@ -82,7 +82,7 @@ func getFlags() error {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func exit() error {
|
func exit() error {
|
||||||
if isStartedBot {
|
if botStatus.isStarted {
|
||||||
log.Printf("Stopping %s", bot.Me.Username)
|
log.Printf("Stopping %s", bot.Me.Username)
|
||||||
bot.Stop()
|
bot.Stop()
|
||||||
log.Println("Bot stopped")
|
log.Println("Bot stopped")
|
||||||
@@ -99,7 +99,7 @@ func exit() error {
|
|||||||
func mainMenu() *wmenu.Menu {
|
func mainMenu() *wmenu.Menu {
|
||||||
menu := wmenu.NewMenu("What do you want to do?")
|
menu := wmenu.NewMenu("What do you want to do?")
|
||||||
menu.LoopOnInvalid()
|
menu.LoopOnInvalid()
|
||||||
if !isStartedBot {
|
if !botStatus.isStarted {
|
||||||
menu.Option("Start bot", nil, true, func(opt wmenu.Opt) error {
|
menu.Option("Start bot", nil, true, func(opt wmenu.Opt) error {
|
||||||
return botStart()
|
return botStart()
|
||||||
})
|
})
|
||||||
@@ -107,7 +107,7 @@ func mainMenu() *wmenu.Menu {
|
|||||||
return setBotToken("")
|
return setBotToken("")
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
if isStartedBot {
|
if botStatus.isStarted {
|
||||||
menu.Option("Stop bot", nil, true, func(opt wmenu.Opt) error {
|
menu.Option("Stop bot", nil, true, func(opt wmenu.Opt) error {
|
||||||
return botStop()
|
return botStop()
|
||||||
})
|
})
|
||||||
@@ -115,9 +115,11 @@ func mainMenu() *wmenu.Menu {
|
|||||||
menu.Option("Add bot admin(s)", nil, false, func(opt wmenu.Opt) error {
|
menu.Option("Add bot admin(s)", nil, false, func(opt wmenu.Opt) error {
|
||||||
return addBotAdmins(nil)
|
return addBotAdmins(nil)
|
||||||
})
|
})
|
||||||
menu.Option("Remove bot admin(s)", nil, false, func(opt wmenu.Opt) error {
|
if botStatus.hasAdmin {
|
||||||
return removeBotAdmins()
|
menu.Option("Remove bot admin(s)", nil, false, func(opt wmenu.Opt) error {
|
||||||
})
|
return removeBotAdmins()
|
||||||
|
})
|
||||||
|
}
|
||||||
menu.Option("Exit", nil, false, func(opt wmenu.Opt) error {
|
menu.Option("Exit", nil, false, func(opt wmenu.Opt) error {
|
||||||
return exit()
|
return exit()
|
||||||
})
|
})
|
||||||
@@ -127,15 +129,17 @@ func mainMenu() *wmenu.Menu {
|
|||||||
|
|
||||||
func mainMenuLoop() error {
|
func mainMenuLoop() error {
|
||||||
menu := mainMenu()
|
menu := mainMenu()
|
||||||
botStatus := isStartedBot
|
botStarted := botStatus.isStarted
|
||||||
|
hasAdmin := botStatus.hasAdmin
|
||||||
fmt.Println(welcomeMessage)
|
fmt.Println(welcomeMessage)
|
||||||
for {
|
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)
|
||||||
}
|
}
|
||||||
if botStatus != isStartedBot {
|
if botStarted != botStatus.isStarted || hasAdmin != botStatus.hasAdmin {
|
||||||
botStatus = isStartedBot
|
botStarted = botStatus.isStarted
|
||||||
|
hasAdmin = botStatus.hasAdmin
|
||||||
menu = mainMenu()
|
menu = mainMenu()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -3,20 +3,43 @@ package main
|
|||||||
import (
|
import (
|
||||||
"errors"
|
"errors"
|
||||||
"log"
|
"log"
|
||||||
"strconv"
|
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
tb "gopkg.in/tucnak/telebot.v2"
|
tb "gopkg.in/tucnak/telebot.v2"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
type botBool struct {
|
||||||
|
isStarted bool
|
||||||
|
hasAdmin bool
|
||||||
|
}
|
||||||
|
|
||||||
const (
|
const (
|
||||||
newAdminMsg string = "Sei stato aggiunto come amministratore. Adesso hai a disposizione una serie aggiuntiva di comandi e controlli per il bot."
|
startMsg string = "Salve, sono Stefano, il Magister! Come posso esservi d'aiuto?"
|
||||||
delAdminMsg string = "Sei stato rimosso da amministratore."
|
alreadyStartedMsg string = "Si, mi dica, che c'è?! Sono qui!"
|
||||||
|
restartMsg string = "Eccomi, sono tornato! Ha bisogno? Mi dica pure!"
|
||||||
|
stopMsg string = "Mi assenterò per qualche istante, d'altra parte anch'io ho pur diritto alla mia vita privata. Masino mi attende!"
|
||||||
|
newAdminMsg string = "Beh allora, vediamo... Ah si, la nomino amministratore! Da grandi poteri derivano grandi responsabilità. Mi raccomando, non me ne faccia pentire!"
|
||||||
|
delAdminMsg string = "Ecco, che le avevo detto?! Mi sembrava di essere stato chiaro! Dovrò sollevarla dall'incarico... Mi spiace molto ma da ora in avanti non sarà più amministratore"
|
||||||
)
|
)
|
||||||
|
|
||||||
var bot *tb.Bot
|
var genericCommands = map[string]bool{
|
||||||
var isStartedBot bool
|
"/start": true,
|
||||||
|
"/stop": true,
|
||||||
|
"/menu": true,
|
||||||
|
"/prossimoEvento": true,
|
||||||
|
}
|
||||||
|
var authCommands = map[string]bool{
|
||||||
|
"/prossimaProvaSezione": true,
|
||||||
|
"/prossimaProvaInsieme": true,
|
||||||
|
}
|
||||||
|
var adminCommands = map[string]bool{
|
||||||
|
"/autorizzaUtente": true,
|
||||||
|
"/aggiungiAdmin": true,
|
||||||
|
"/rimuoviAdmin": true,
|
||||||
|
}
|
||||||
|
|
||||||
|
var bot *tb.Bot
|
||||||
|
var botStatus botBool
|
||||||
var (
|
var (
|
||||||
//ErrNilPointer is thrown when a pointer is nil
|
//ErrNilPointer is thrown when a pointer is nil
|
||||||
ErrNilPointer = errors.New("pointer is nil")
|
ErrNilPointer = errors.New("pointer is nil")
|
||||||
@@ -42,32 +65,7 @@ func botInit() error {
|
|||||||
}
|
}
|
||||||
|
|
||||||
poller := &tb.LongPoller{Timeout: 15 * time.Second}
|
poller := &tb.LongPoller{Timeout: 15 * time.Second}
|
||||||
middlePoller := tb.NewMiddlewarePoller(poller, func(upd *tb.Update) bool {
|
middlePoller := tb.NewMiddlewarePoller(poller, setBotPoller)
|
||||||
if upd.Message == nil {
|
|
||||||
return true
|
|
||||||
}
|
|
||||||
if upd.Message.Sender != nil {
|
|
||||||
err := addUser(upd.Message.Sender)
|
|
||||||
if err != nil {
|
|
||||||
log.Printf("Error in adding user info: %v", err)
|
|
||||||
}
|
|
||||||
err = authorizeUser(upd.Message.Sender.ID, true)
|
|
||||||
if err != nil {
|
|
||||||
log.Printf("Error in authorizing user: %v", err)
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
log.Printf("%v", ErrIDFromMsg)
|
|
||||||
}
|
|
||||||
auth, err := isAuthrizedUser(upd.Message.Sender.ID)
|
|
||||||
if err != nil {
|
|
||||||
log.Printf("Error checking if user is authorized: %v", err)
|
|
||||||
}
|
|
||||||
if !auth {
|
|
||||||
return false
|
|
||||||
}
|
|
||||||
|
|
||||||
return true
|
|
||||||
})
|
|
||||||
|
|
||||||
bot, err = tb.NewBot(tb.Settings{
|
bot, err = tb.NewBot(tb.Settings{
|
||||||
Token: token,
|
Token: token,
|
||||||
@@ -84,15 +82,35 @@ func botInit() error {
|
|||||||
return ErrBotInit
|
return ErrBotInit
|
||||||
}
|
}
|
||||||
|
|
||||||
|
err = setBotMenus()
|
||||||
|
if err != nil {
|
||||||
|
log.Printf("Error setting bot menus: %v", err)
|
||||||
|
return ErrBotInit
|
||||||
|
}
|
||||||
|
|
||||||
|
err = setBotCallbacks()
|
||||||
|
if err != nil {
|
||||||
|
log.Printf("Error setting bot callbacks: %v", err)
|
||||||
|
return ErrBotInit
|
||||||
|
}
|
||||||
|
|
||||||
err = addBotInfo(token, bot.Me.Username)
|
err = addBotInfo(token, bot.Me.Username)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Printf("Error: bot %s info couldn't be added: %v", bot.Me.Username, err)
|
log.Printf("Error: bot %s info couldn't be added: %v", bot.Me.Username, err)
|
||||||
|
return ErrBotInit
|
||||||
}
|
}
|
||||||
|
|
||||||
|
hasAdmin, err := hasBotAdmins()
|
||||||
|
if err != nil {
|
||||||
|
log.Printf("Error checking if bot has admins: %v", err)
|
||||||
|
return ErrBotInit
|
||||||
|
}
|
||||||
|
botStatus.hasAdmin = hasAdmin
|
||||||
|
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func sendMessage(user *tb.User, msg string) error {
|
func sendMsg(user *tb.User, msg string) error {
|
||||||
_, err := bot.Send(user, msg)
|
_, err := bot.Send(user, msg)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Printf("Error sending message to user: %v", err)
|
log.Printf("Error sending message to user: %v", err)
|
||||||
@@ -101,28 +119,97 @@ func sendMessage(user *tb.User, msg string) error {
|
|||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func setBotHandlers() error {
|
func sendMsgWithMenu(user *tb.User, msg string) error {
|
||||||
if bot == nil {
|
var menu [][]tb.InlineButton
|
||||||
return ErrNilPointer
|
|
||||||
|
auth, err := isAuthrizedUser(user.ID)
|
||||||
|
if err != nil {
|
||||||
|
log.Printf("Error checking if user is authorized: %v", err)
|
||||||
|
}
|
||||||
|
admin, err := isBotAdmin(user.ID)
|
||||||
|
if err != nil {
|
||||||
|
log.Printf("Error checking if user is admin: %v", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
bot.Handle("/hello", func(m *tb.Message) {
|
if admin {
|
||||||
bot.Send(m.Sender, "hello world")
|
menu = adminInlineMenu
|
||||||
|
} else if auth {
|
||||||
|
menu = authInlineMenu
|
||||||
|
} else {
|
||||||
|
menu = genericInlineMenu
|
||||||
|
}
|
||||||
|
_, err = bot.Send(user, msg, &tb.ReplyMarkup{
|
||||||
|
InlineKeyboard: menu,
|
||||||
})
|
})
|
||||||
bot.Handle("/userID", func(m *tb.Message) {
|
if err != nil {
|
||||||
bot.Send(m.Sender, strconv.Itoa(m.Sender.ID))
|
log.Printf("Error sending message to user: %v", err)
|
||||||
})
|
return ErrSendMsg
|
||||||
|
}
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func sendMsgWithSpecificMenu(user *tb.User, msg string, menu [][]tb.InlineButton) error {
|
||||||
|
_, err := bot.Send(user, msg, &tb.ReplyMarkup{
|
||||||
|
InlineKeyboard: menu,
|
||||||
|
})
|
||||||
|
if err != nil {
|
||||||
|
log.Printf("Error sending message to user: %v", err)
|
||||||
|
return ErrSendMsg
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func setBotPoller(upd *tb.Update) bool {
|
||||||
|
if upd.Message == nil {
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
if upd.Message.Sender != nil {
|
||||||
|
err := addUser(upd.Message.Sender)
|
||||||
|
if err != nil {
|
||||||
|
log.Printf("Error in adding user info: %v", err)
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
log.Printf("%v", ErrIDFromMsg)
|
||||||
|
}
|
||||||
|
_, isGenericCmd := genericCommands[upd.Message.Text]
|
||||||
|
_, isAuthCmd := authCommands[upd.Message.Text]
|
||||||
|
_, isAdminCmd := adminCommands[upd.Message.Text]
|
||||||
|
|
||||||
|
started, err := isStartedUser(upd.Message.Sender.ID)
|
||||||
|
if err != nil {
|
||||||
|
log.Printf("Error checking if user is started: %v", err)
|
||||||
|
}
|
||||||
|
if !started && upd.Message.Text != "/start" {
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
|
||||||
|
auth, err := isAuthrizedUser(upd.Message.Sender.ID)
|
||||||
|
if err != nil {
|
||||||
|
log.Printf("Error checking if user is authorized: %v", err)
|
||||||
|
}
|
||||||
|
admin, err := isBotAdmin(upd.Message.Sender.ID)
|
||||||
|
if err != nil {
|
||||||
|
log.Printf("Error checking if user is admin: %v", err)
|
||||||
|
}
|
||||||
|
if isAdminCmd && !admin {
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
if isAuthCmd && !auth {
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
if !isGenericCmd {
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
|
||||||
func botStart() error {
|
func botStart() error {
|
||||||
if bot == nil {
|
if bot == nil {
|
||||||
return ErrNilPointer
|
return ErrNilPointer
|
||||||
}
|
}
|
||||||
|
|
||||||
go bot.Start()
|
go bot.Start()
|
||||||
isStartedBot = true
|
botStatus.isStarted = true
|
||||||
log.Printf("Started %s", bot.Me.Username)
|
log.Printf("Started %s", bot.Me.Username)
|
||||||
|
|
||||||
return nil
|
return nil
|
||||||
@@ -134,7 +221,7 @@ func botStop() error {
|
|||||||
}
|
}
|
||||||
log.Printf("Stopping %s", bot.Me.Username)
|
log.Printf("Stopping %s", bot.Me.Username)
|
||||||
bot.Stop()
|
bot.Stop()
|
||||||
isStartedBot = false
|
botStatus.isStarted = false
|
||||||
log.Println("Bot stopped")
|
log.Println("Bot stopped")
|
||||||
|
|
||||||
return nil
|
return nil
|
||||||
|
79
src/telegramHandlers.go
Normal file
79
src/telegramHandlers.go
Normal file
@@ -0,0 +1,79 @@
|
|||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"log"
|
||||||
|
"strconv"
|
||||||
|
|
||||||
|
tb "gopkg.in/tucnak/telebot.v2"
|
||||||
|
)
|
||||||
|
|
||||||
|
func startHandler(m *tb.Message) {
|
||||||
|
var msg string
|
||||||
|
|
||||||
|
isUser, err := isUser(m.Sender.ID)
|
||||||
|
if err != nil {
|
||||||
|
log.Printf("Error checking if ID is bot user: %v", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
started, err := isStartedUser(m.Sender.ID)
|
||||||
|
if err != nil {
|
||||||
|
log.Printf("Error checking if user is started: %v", err)
|
||||||
|
}
|
||||||
|
if !started {
|
||||||
|
err = startUser(m.Sender.ID, true)
|
||||||
|
if err != nil {
|
||||||
|
log.Printf("Error starting user: %v", err)
|
||||||
|
}
|
||||||
|
if isUser {
|
||||||
|
msg = restartMsg
|
||||||
|
} else {
|
||||||
|
msg = startMsg
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
msg = alreadyStartedMsg
|
||||||
|
}
|
||||||
|
|
||||||
|
err = sendMsgWithMenu(m.Sender, msg)
|
||||||
|
if err != nil {
|
||||||
|
log.Printf("Error sending message to started user: %v", err)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func stopHandler(m *tb.Message) {
|
||||||
|
admin, err := isBotAdmin(m.Sender.ID)
|
||||||
|
if err != nil {
|
||||||
|
log.Printf("Error checking if user is admin: %v", err)
|
||||||
|
}
|
||||||
|
if admin {
|
||||||
|
msg := "Non ci siamo... Io l'ho nominata AMMINISTRATORE, cosa crede?! Questo ruolo esige impegno! Non può certo bloccarmi!"
|
||||||
|
err := sendMsg(m.Sender, msg)
|
||||||
|
if err != nil {
|
||||||
|
log.Printf("Error sending message to unstoppable user: %v", err)
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
err = startUser(m.Sender.ID, false)
|
||||||
|
if err != nil {
|
||||||
|
log.Printf("Error starting user: %v", err)
|
||||||
|
}
|
||||||
|
err := sendMsgWithSpecificMenu(m.Sender, stopMsg, startMenu)
|
||||||
|
if err != nil {
|
||||||
|
log.Printf("Error sending message to stopped user: %v", err)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func setBotHandlers() error {
|
||||||
|
if bot == nil {
|
||||||
|
return ErrNilPointer
|
||||||
|
}
|
||||||
|
bot.Handle("/start", startHandler)
|
||||||
|
bot.Handle("/stop", stopHandler)
|
||||||
|
bot.Handle("/menu", func(m *tb.Message) {
|
||||||
|
bot.Send(m.Sender, "hello world")
|
||||||
|
})
|
||||||
|
bot.Handle("/userID", func(m *tb.Message) {
|
||||||
|
bot.Send(m.Sender, strconv.Itoa(m.Sender.ID))
|
||||||
|
})
|
||||||
|
|
||||||
|
return nil
|
||||||
|
}
|
87
src/telegramMenu.go
Normal file
87
src/telegramMenu.go
Normal file
@@ -0,0 +1,87 @@
|
|||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"log"
|
||||||
|
|
||||||
|
tb "gopkg.in/tucnak/telebot.v2"
|
||||||
|
)
|
||||||
|
|
||||||
|
var (
|
||||||
|
adminInlineMenu [][]tb.InlineButton
|
||||||
|
authInlineMenu [][]tb.InlineButton
|
||||||
|
genericInlineMenu [][]tb.InlineButton
|
||||||
|
startMenu [][]tb.InlineButton
|
||||||
|
)
|
||||||
|
|
||||||
|
var (
|
||||||
|
startBtn = tb.InlineButton{
|
||||||
|
Unique: "start_btn",
|
||||||
|
Text: "\xE2\x96\xB6 Avvia il barandaBot",
|
||||||
|
}
|
||||||
|
stopBtn = tb.InlineButton{
|
||||||
|
Unique: "stop_btn",
|
||||||
|
Text: "\xF0\x9F\x9A\xAB Ferma il barandaBot",
|
||||||
|
}
|
||||||
|
infoBtn = tb.InlineButton{
|
||||||
|
Unique: "info_btn",
|
||||||
|
Text: "\xE2\x84\xB9 Info",
|
||||||
|
}
|
||||||
|
)
|
||||||
|
|
||||||
|
func setBotMenus() error {
|
||||||
|
adminInlineMenu = append(adminInlineMenu, []tb.InlineButton{stopBtn, infoBtn})
|
||||||
|
|
||||||
|
authInlineMenu = append(authInlineMenu, []tb.InlineButton{stopBtn, infoBtn})
|
||||||
|
|
||||||
|
genericInlineMenu = append(genericInlineMenu, []tb.InlineButton{stopBtn, infoBtn})
|
||||||
|
|
||||||
|
startMenu = append(startMenu, []tb.InlineButton{startBtn})
|
||||||
|
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func setBotCallbacks() error {
|
||||||
|
if bot == nil {
|
||||||
|
return ErrNilPointer
|
||||||
|
}
|
||||||
|
|
||||||
|
bot.Handle(&startBtn, func(c *tb.Callback) {
|
||||||
|
bot.Respond(c, &tb.CallbackResponse{})
|
||||||
|
//TODO: save last message id per user so it's possible to hide inline keyboard
|
||||||
|
//bot.Edit(lastMsgID, tb.ReplyMarkup{})
|
||||||
|
err := startUser(c.Sender.ID, true)
|
||||||
|
if err != nil {
|
||||||
|
log.Printf("Error starting user: %v", err)
|
||||||
|
}
|
||||||
|
err = sendMsgWithMenu(c.Sender, restartMsg)
|
||||||
|
if err != nil {
|
||||||
|
log.Printf("Error sending message to started user: %v", err)
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
||||||
|
bot.Handle(&stopBtn, func(c *tb.Callback) {
|
||||||
|
bot.Respond(c, &tb.CallbackResponse{})
|
||||||
|
admin, err := isBotAdmin(c.Sender.ID)
|
||||||
|
if err != nil {
|
||||||
|
log.Printf("Error checking if user is admin: %v", err)
|
||||||
|
}
|
||||||
|
if admin {
|
||||||
|
msg := "Non ci siamo... Io l'ho nominata AMMINISTRATORE, cosa crede?! Questo ruolo esige impegno! Non può certo bloccarmi!"
|
||||||
|
err := sendMsg(c.Sender, msg)
|
||||||
|
if err != nil {
|
||||||
|
log.Printf("Error sending message to unstoppable user: %v", err)
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
err = startUser(c.Sender.ID, false)
|
||||||
|
if err != nil {
|
||||||
|
log.Printf("Error starting user: %v", err)
|
||||||
|
}
|
||||||
|
err := sendMsgWithSpecificMenu(c.Sender, stopMsg, startMenu)
|
||||||
|
if err != nil {
|
||||||
|
log.Printf("Error sending message to stopped user: %v", err)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
||||||
|
return nil
|
||||||
|
}
|
Reference in New Issue
Block a user