3
0
mirror of https://github.com/ergochat/ergo.git synced 2024-11-22 11:59:40 +01:00

add sadrop command

This commit is contained in:
Shivaram Lingamneni 2018-03-14 06:50:26 -04:00
parent 679f25491c
commit fd34c78d6b
2 changed files with 39 additions and 25 deletions

View File

@ -358,29 +358,37 @@ func unmarshalReservedNicks(nicks string) (result []string) {
return strings.Split(nicks, ",") return strings.Split(nicks, ",")
} }
func (am *AccountManager) SetNickReserved(client *Client, nick string, reserve bool) error { func (am *AccountManager) SetNickReserved(client *Client, nick string, saUnreserve bool, reserve bool) error {
cfnick, err := CasefoldName(nick) cfnick, err := CasefoldName(nick)
if err != nil { // garbage nick, or garbage options, or disabled
nrconfig := am.server.AccountConfig().NickReservation
if err != nil || cfnick == "" || (reserve && saUnreserve) || !nrconfig.Enabled {
return errAccountNickReservationFailed return errAccountNickReservationFailed
} }
// sanity check so we don't persist bad data // the cache is in sync with the DB while we hold serialCacheUpdateMutex
account := client.Account()
if account == "" || cfnick == "" || !am.server.AccountConfig().NickReservation.Enabled {
return errAccountNickReservationFailed
}
limit := am.server.AccountConfig().NickReservation.AdditionalNickLimit
am.serialCacheUpdateMutex.Lock() am.serialCacheUpdateMutex.Lock()
defer am.serialCacheUpdateMutex.Unlock() defer am.serialCacheUpdateMutex.Unlock()
// the cache is in sync with the DB while we hold serialCacheUpdateMutex // find the affected account, which is usually the client's:
account := client.Account()
if saUnreserve {
// unless this is a sadrop:
account = am.NickToAccount(cfnick)
if account == "" {
// nothing to do
return nil
}
}
if account == "" {
return errAccountNotLoggedIn
}
accountForNick := am.NickToAccount(cfnick) accountForNick := am.NickToAccount(cfnick)
if reserve && accountForNick != "" { if reserve && accountForNick != "" {
return errNicknameReserved return errNicknameReserved
} else if !reserve && accountForNick != account { } else if !reserve && !saUnreserve && accountForNick != account {
return errAccountNickReservationFailed return errNicknameReserved
} else if !reserve && cfnick == account { } else if !reserve && cfnick == account {
return errAccountCantDropPrimaryNick return errAccountCantDropPrimaryNick
} }
@ -405,7 +413,7 @@ func (am *AccountManager) SetNickReserved(client *Client, nick string, reserve b
nicks := unmarshalReservedNicks(rawNicks) nicks := unmarshalReservedNicks(rawNicks)
if reserve { if reserve {
if len(nicks) >= limit { if len(nicks) >= nrconfig.AdditionalNickLimit {
return errAccountTooManyNicks return errAccountTooManyNicks
} }
nicks = append(nicks, cfnick) nicks = append(nicks, cfnick)

View File

@ -90,7 +90,10 @@ func (server *Server) nickservPrivmsgHandler(client *Client, message string, rb
server.nickservGroupHandler(client, rb) server.nickservGroupHandler(client, rb)
} else if command == "drop" { } else if command == "drop" {
nick, _ := extractParam(params) nick, _ := extractParam(params)
server.nickservDropHandler(client, nick, rb) server.nickservDropHandler(client, nick, false, rb)
} else if command == "sadrop" {
nick, _ := extractParam(params)
server.nickservDropHandler(client, nick, true, rb)
} else { } else {
rb.Notice(client.t("Command not recognised. To see the available commands, run /NS HELP")) rb.Notice(client.t("Command not recognised. To see the available commands, run /NS HELP"))
} }
@ -294,13 +297,13 @@ func (server *Server) nickservGroupHandler(client *Client, rb *ResponseBuffer) {
} }
nick := client.NickCasefolded() nick := client.NickCasefolded()
err := server.accounts.SetNickReserved(client, nick, true) err := server.accounts.SetNickReserved(client, nick, false, true)
if err == nil { if err == nil {
rb.Notice(fmt.Sprintf(client.t("Successfully grouped nick %s with your account"), nick)) rb.Notice(fmt.Sprintf(client.t("Successfully grouped nick %s with your account"), nick))
} else if err == errAccountTooManyNicks { } else if err == errAccountTooManyNicks {
rb.Notice(client.t("You have too many nicks reserved already (you can remove some with /NS DROP)")) rb.Notice(client.t("You have too many nicks reserved already (you can remove some with /NS DROP)"))
} else if err == errNicknameReserved { } else if err == errNicknameReserved {
rb.Notice(client.t("That nickname is already reserved")) rb.Notice(client.t("That nickname is already reserved by someone else"))
} else { } else {
rb.Notice(client.t("Error reserving nickname")) rb.Notice(client.t("Error reserving nickname"))
} }
@ -334,20 +337,23 @@ func (server *Server) nickservInfoHandler(client *Client, nick string, rb *Respo
} }
} }
func (server *Server) nickservDropHandler(client *Client, nick string, rb *ResponseBuffer) { func (server *Server) nickservDropHandler(client *Client, nick string, sadrop bool, rb *ResponseBuffer) {
account := client.Account() if sadrop {
if account == "" { if !client.HasRoleCapabs("unregister") {
rb.Notice(client.t("You're not logged into an account")) rb.Notice(client.t("Insufficient oper privs"))
return return
} }
}
err := server.accounts.SetNickReserved(client, nick, false) err := server.accounts.SetNickReserved(client, nick, sadrop, false)
if err == nil { if err == nil {
rb.Notice(fmt.Sprintf(client.t("Successfully ungrouped nick %s with your account"), nick)) rb.Notice(fmt.Sprintf(client.t("Successfully ungrouped nick %s with your account"), nick))
} else if err == errAccountNotLoggedIn {
rb.Notice(fmt.Sprintf(client.t("You're not logged into an account")))
} else if err == errAccountCantDropPrimaryNick { } else if err == errAccountCantDropPrimaryNick {
rb.Notice(fmt.Sprintf(client.t("You can't ungroup your primary nickname (try unregistering your account instead)"))) rb.Notice(fmt.Sprintf(client.t("You can't ungroup your primary nickname (try unregistering your account instead)")))
} else if err == errAccountNickReservationFailed { } else if err == errNicknameReserved {
rb.Notice(fmt.Sprintf(client.t("You don't own that nick"))) rb.Notice(fmt.Sprintf(client.t("That nickname is already reserved by someone else")))
} else { } else {
rb.Notice(client.t("Error ungrouping nick")) rb.Notice(client.t("Error ungrouping nick"))
} }