Implementata la possibilitá di deautorizzare gli utenti per singoli gruppi
Signed-off-by: Ettore Dreucci <ettore.dreucci@gmail.com>
This commit is contained in:
@@ -163,7 +163,7 @@ func authorizeUser(userID int, authorize bool) error {
|
||||
return nil
|
||||
}
|
||||
|
||||
func setUserGroups(userID int, groups ...userGroup) error {
|
||||
func addUserGroups(userID int, groups ...userGroup) error {
|
||||
if redisClient == nil {
|
||||
return ErrNilPointer
|
||||
}
|
||||
@@ -186,6 +186,41 @@ func setUserGroups(userID int, groups ...userGroup) error {
|
||||
return nil
|
||||
}
|
||||
|
||||
func remUserGroups(userID int, newGroups []userGroup, remGroups ...userGroup) error {
|
||||
if redisClient == nil {
|
||||
return ErrNilPointer
|
||||
}
|
||||
sort.Slice(newGroups, func(i, j int) bool { return newGroups[i] < newGroups[j] })
|
||||
|
||||
for _, remGroup := range remGroups {
|
||||
err := redisClient.SRem("ug"+strconv.Itoa(int(remGroup)), strconv.Itoa(userID)).Err()
|
||||
if err != nil {
|
||||
log.Printf("Error removing user from usergroup set: %v", err)
|
||||
return ErrRedisAddSet
|
||||
}
|
||||
}
|
||||
|
||||
if len(newGroups) > 0 {
|
||||
var csvGroups string
|
||||
for _, group := range newGroups {
|
||||
csvGroups += strconv.Itoa(int(group)) + ","
|
||||
}
|
||||
err := redisClient.HSet(usersGroups, strconv.Itoa(userID), csvGroups).Err()
|
||||
if err != nil {
|
||||
log.Printf("Error adding user groups to hash: %v", err)
|
||||
return ErrRedisAddHash
|
||||
}
|
||||
} else {
|
||||
err := redisClient.HDel(usersGroups, strconv.Itoa(userID)).Err()
|
||||
if err != nil {
|
||||
log.Printf("Error removing user from usersGroups hash: %v", err)
|
||||
return ErrRedisAddHash
|
||||
}
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
func getUserGroups(userID int) ([]userGroup, error) {
|
||||
if redisClient == nil {
|
||||
return nil, ErrNilPointer
|
||||
@@ -271,6 +306,27 @@ func convertUserGroups(groups []userGroup) []string {
|
||||
return stringGroups
|
||||
}
|
||||
|
||||
func getGroupName(group userGroup) (string, error) {
|
||||
switch group {
|
||||
case ugSoprano:
|
||||
return "Soprano", nil
|
||||
case ugContralto:
|
||||
return "Contralto", nil
|
||||
case ugTenore:
|
||||
return "Tenore", nil
|
||||
case ugBasso:
|
||||
return "Basso", nil
|
||||
case ugCommissario:
|
||||
return "Commissario", nil
|
||||
case ugReferente:
|
||||
return "Referente", nil
|
||||
case ugPreparatore:
|
||||
return "Preparatore", nil
|
||||
default:
|
||||
return "", ErrGroupInvalid
|
||||
}
|
||||
}
|
||||
|
||||
func getUserDescription(u *tb.User) (string, error) {
|
||||
userGroups, err := getUserGroups(u.ID)
|
||||
if err != nil {
|
||||
|
@@ -51,6 +51,8 @@ var (
|
||||
ErrIDParsing = errors.New("userID: cannot parse ID")
|
||||
//ErrIDInvalid is thrown when the string parsed isn't a valid telegram user ID
|
||||
ErrIDInvalid = errors.New("userID: string isn't a valid telegram user ID")
|
||||
//ErrGroupInvalid is thrown when the group parsed isn't a valid userGroup
|
||||
ErrGroupInvalid = errors.New("group is not a valid userGroup")
|
||||
//ErrAddToken is thrown when one or more bot token hasn't been added
|
||||
ErrAddToken = errors.New("couldn't add one or more tokens")
|
||||
//ErrAddUser is thrown when one or more user hasn't been added
|
||||
|
@@ -23,9 +23,9 @@ const (
|
||||
authHowToMsg string = "Per autorizzare un utente invia un messaggio con scritto \n`/authUser ID_UTENTE`\n sostituendo `ID_UTENTE` con l'ID che ti é stato comunicato dall'utente da autorizzare"
|
||||
deAuthHowToMsg string = "Per deautorizzare un utente invia un messaggio con scritto \n`/deAuthUser ID_UTENTE`\n sostituendo `ID_UTENTE` con il nome utente da deautorizzare"
|
||||
newAuthMsg string = "Benvenuto! Da ora in poi lei fa ufficialmente parte del magnifico *Coro dell'Università di Pisa*! Deve sentirsi onorato."
|
||||
delAuthMsg string = "Capisco, quindi se ne sta andando... Beh un po' mi dispiace, devo ammetterlo. Se ripassa da queste parti sarà sempre il benvenuto! Arrivederci."
|
||||
delAuthMsg string = "Allora arrivederci! Beh un po' mi dispiace, devo ammetterlo. Se ripassa da queste parti sarà sempre il benvenuto! Addio, e grazie per tutto il pesce!"
|
||||
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"
|
||||
delAdminMsg string = "Ecco, che le avevo detto?! Mi sembrava di essere stato chiaro, eppure non ha fatto attenzione! Dovrò sollevarla dall'incarico... Mi spiace molto ma da ora in avanti non sarà più amministratore"
|
||||
menuMsg string = "Ecco a lei, questo è l'elenco di tutto ciò che può chiedermi. Non mi disturbi con altre richieste!"
|
||||
contactMsg string = "*BarandaBot*\xE2\x84\xA2" +
|
||||
"\nSe hai domande, suggerimenti o se vuoi segnalare bug e altri malfunzionamenti puoi contattare l'Altissimo con i seguenti mezzi di comunicazione:" +
|
||||
|
@@ -116,7 +116,7 @@ func authUserCmd(sender *tb.User, payload string) {
|
||||
log.Printf("Error retriving user groups: %v", err)
|
||||
}
|
||||
|
||||
menu := authUserMenu
|
||||
menu := getAuthUserMenu()
|
||||
menu[0][0].Data = strconv.Itoa(user.ID)
|
||||
menu[0][1].Data = strconv.Itoa(user.ID)
|
||||
menu[1][0].Data = strconv.Itoa(user.ID)
|
||||
@@ -176,7 +176,7 @@ func deAuthUserCmd(sender *tb.User, payload string) {
|
||||
log.Printf("Error retriving user description: %v", err)
|
||||
}
|
||||
|
||||
menu := authUserMenu
|
||||
menu := getAuthUserMenu()
|
||||
menu[0][0].Data = strconv.Itoa(user.ID) + "+remove"
|
||||
menu[0][1].Data = strconv.Itoa(user.ID) + "+remove"
|
||||
menu[1][0].Data = strconv.Itoa(user.ID) + "+remove"
|
||||
@@ -230,19 +230,36 @@ func addUserGroupCmd(userID int, group userGroup, add bool) error {
|
||||
return ErrAddAuthUser
|
||||
}
|
||||
if is && !add {
|
||||
//REMOVE USER FROM GROUP
|
||||
//TODO
|
||||
} else if !is && add {
|
||||
userGroups = append(userGroups, group)
|
||||
err = setUserGroups(userID, userGroups...)
|
||||
if len(userGroups) <= 1 {
|
||||
err = authorizeUser(userID, false)
|
||||
if err != nil {
|
||||
log.Printf("Error deauthorizing user: %v", err)
|
||||
return ErrAddAuthUser
|
||||
}
|
||||
}
|
||||
for i, ug := range userGroups {
|
||||
if ug == group {
|
||||
userGroups = append(userGroups[:i], userGroups[i+1:]...)
|
||||
break
|
||||
}
|
||||
}
|
||||
err = remUserGroups(userID, userGroups, group)
|
||||
if err != nil {
|
||||
log.Printf("Error adding user in group: %v", err)
|
||||
return ErrAddAuthUser
|
||||
}
|
||||
|
||||
err = authorizeUser(userID, true)
|
||||
} else if !is && add {
|
||||
if len(userGroups) == 0 {
|
||||
err = authorizeUser(userID, true)
|
||||
if err != nil {
|
||||
log.Printf("Error authorizing user: %v", err)
|
||||
return ErrAddAuthUser
|
||||
}
|
||||
}
|
||||
userGroups = append(userGroups, group)
|
||||
err = addUserGroups(userID, userGroups...)
|
||||
if err != nil {
|
||||
log.Printf("Error authorizing user: %v", err)
|
||||
log.Printf("Error adding user in group: %v", err)
|
||||
return ErrAddAuthUser
|
||||
}
|
||||
}
|
||||
|
@@ -119,7 +119,18 @@ func setBotMenus() error {
|
||||
return nil
|
||||
}
|
||||
|
||||
func groupCallback(c *tb.Callback, groupName string) {
|
||||
func getAuthUserMenu() [][]tb.InlineButton {
|
||||
var authUserMenu [][]tb.InlineButton
|
||||
authUserMenu = append(authUserMenu,
|
||||
[]tb.InlineButton{authUGSopranoBtn, authUGContraltoBtn},
|
||||
[]tb.InlineButton{authUGTenoreBtn, authUGBassoBtn},
|
||||
[]tb.InlineButton{authUGCommissarioBtn, authUGReferenteBtn, authUGPreparatoreBtn},
|
||||
[]tb.InlineButton{backBtn},
|
||||
)
|
||||
return authUserMenu
|
||||
}
|
||||
|
||||
func groupCallback(c *tb.Callback, group userGroup) {
|
||||
dataContent := strings.Split(c.Data, "+")
|
||||
userID, err := strconv.Atoi(dataContent[0])
|
||||
if err != nil {
|
||||
@@ -128,6 +139,9 @@ func groupCallback(c *tb.Callback, groupName string) {
|
||||
}
|
||||
var errAlert, authAlert string
|
||||
var add bool
|
||||
|
||||
groupName, err := getGroupName(group)
|
||||
|
||||
if len(dataContent) > 1 && dataContent[1] == "remove" {
|
||||
add = false
|
||||
errAlert = "Impossibile deautorizzare l'utente per il gruppo " + groupName
|
||||
@@ -137,7 +151,7 @@ func groupCallback(c *tb.Callback, groupName string) {
|
||||
errAlert = "Impossibile aggiungere l'utente al gruppo " + groupName
|
||||
authAlert = "Utente " + dataContent[0] + " aggiunto al gruppo " + groupName
|
||||
}
|
||||
err = addUserGroupCmd(userID, ugContralto, add)
|
||||
err = addUserGroupCmd(userID, group, add)
|
||||
if err != nil {
|
||||
bot.Respond(c, &tb.CallbackResponse{
|
||||
Text: errAlert,
|
||||
@@ -195,25 +209,25 @@ func setBotCallbacks() error {
|
||||
|
||||
})
|
||||
bot.Handle(&authUGSopranoBtn, func(c *tb.Callback) {
|
||||
groupCallback(c, "Soprani")
|
||||
groupCallback(c, ugSoprano)
|
||||
})
|
||||
bot.Handle(&authUGContraltoBtn, func(c *tb.Callback) {
|
||||
groupCallback(c, "Contralti")
|
||||
groupCallback(c, ugContralto)
|
||||
})
|
||||
bot.Handle(&authUGTenoreBtn, func(c *tb.Callback) {
|
||||
groupCallback(c, "Tenori")
|
||||
groupCallback(c, ugTenore)
|
||||
})
|
||||
bot.Handle(&authUGBassoBtn, func(c *tb.Callback) {
|
||||
groupCallback(c, "Bassi")
|
||||
groupCallback(c, ugBasso)
|
||||
})
|
||||
bot.Handle(&authUGCommissarioBtn, func(c *tb.Callback) {
|
||||
groupCallback(c, "Commissari")
|
||||
groupCallback(c, ugCommissario)
|
||||
})
|
||||
bot.Handle(&authUGReferenteBtn, func(c *tb.Callback) {
|
||||
groupCallback(c, "Referenti")
|
||||
groupCallback(c, ugReferente)
|
||||
})
|
||||
bot.Handle(&authUGPreparatoreBtn, func(c *tb.Callback) {
|
||||
groupCallback(c, "Preparatori")
|
||||
groupCallback(c, ugPreparatore)
|
||||
})
|
||||
|
||||
return nil
|
||||
|
4
todo
4
todo
@@ -4,4 +4,6 @@ redis hash per bot (si puó usare la struct tb.Bot come interface?):
|
||||
|
||||
SuperAdmin? Menú giá presente
|
||||
|
||||
Controllare stoppedUser anche se comando inviato tramite menu. Dove farlo?
|
||||
Controllare stoppedUser anche se comando inviato tramite menu. Dove farlo?
|
||||
|
||||
Help command con descrizione divisa per gruppo
|
Reference in New Issue
Block a user