From dd3ab25fba1df778960071f91d1ca5c92e578c0b Mon Sep 17 00:00:00 2001 From: Ettore Dreucci Date: Mon, 6 Apr 2020 23:09:45 +0200 Subject: [PATCH] =?UTF-8?q?Implementata=20la=20possibilit=C3=A1=20di=20dea?= =?UTF-8?q?utorizzare=20gli=20utenti=20per=20singoli=20gruppi?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Ettore Dreucci --- src/manageUser.go | 58 ++++++++++++++++++++++++++++++++++++++++- src/redisAPI.go | 2 ++ src/telegramAPI.go | 4 +-- src/telegramCommands.go | 37 +++++++++++++++++++------- src/telegramMenus.go | 32 ++++++++++++++++------- todo | 4 ++- 6 files changed, 114 insertions(+), 23 deletions(-) diff --git a/src/manageUser.go b/src/manageUser.go index e1d525e..b570bb2 100644 --- a/src/manageUser.go +++ b/src/manageUser.go @@ -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 { diff --git a/src/redisAPI.go b/src/redisAPI.go index 5fb4b78..dad22f7 100644 --- a/src/redisAPI.go +++ b/src/redisAPI.go @@ -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 diff --git a/src/telegramAPI.go b/src/telegramAPI.go index 77ca3e6..ab891eb 100644 --- a/src/telegramAPI.go +++ b/src/telegramAPI.go @@ -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:" + diff --git a/src/telegramCommands.go b/src/telegramCommands.go index 669f321..4820e59 100644 --- a/src/telegramCommands.go +++ b/src/telegramCommands.go @@ -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 } } diff --git a/src/telegramMenus.go b/src/telegramMenus.go index 10176e7..d98ed84 100644 --- a/src/telegramMenus.go +++ b/src/telegramMenus.go @@ -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 diff --git a/todo b/todo index 6ce6ece..d2fb3e9 100644 --- a/todo +++ b/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? \ No newline at end of file +Controllare stoppedUser anche se comando inviato tramite menu. Dove farlo? + +Help command con descrizione divisa per gruppo \ No newline at end of file