Implementata la possibilitá di deautorizzare gli utenti per singoli gruppi

Signed-off-by: Ettore Dreucci <ettore.dreucci@gmail.com>
This commit is contained in:
2020-04-06 23:09:45 +02:00
parent c0bf3b2b36
commit dd3ab25fba
6 changed files with 114 additions and 23 deletions

View File

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

View File

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

View File

@@ -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:" +

View File

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

View File

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

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