diff --git a/irc/accounts.go b/irc/accounts.go index b75e34b6..67e3d0c5 100644 --- a/irc/accounts.go +++ b/irc/accounts.go @@ -1183,6 +1183,10 @@ func (am *AccountManager) VHostSet(account string, vhost string) (result VHostIn func (am *AccountManager) VHostRequest(account string, vhost string, cooldown time.Duration) (result VHostInfo, err error) { munger := func(input VHostInfo) (output VHostInfo, err error) { output = input + if input.Forbidden { + err = errVhostsForbidden + return + } // you can update your existing request, but if you were approved or rejected, // you can't spam a new request if output.RequestedVHost == "" { @@ -1204,7 +1208,10 @@ func (am *AccountManager) VHostRequest(account string, vhost string, cooldown ti func (am *AccountManager) VHostTake(account string, vhost string, cooldown time.Duration) (result VHostInfo, err error) { munger := func(input VHostInfo) (output VHostInfo, err error) { output = input - + if input.Forbidden { + err = errVhostsForbidden + return + } // if you have a request pending, you can cancel it using take; // otherwise, you're subject to the same throttling as if you were making a request if output.RequestedVHost == "" { diff --git a/irc/errors.go b/irc/errors.go index 95690527..a3a32c6e 100644 --- a/irc/errors.go +++ b/irc/errors.go @@ -50,6 +50,7 @@ var ( errBanned = errors.New("IP or nickmask banned") errInvalidParams = utils.ErrInvalidParams errNoVhost = errors.New(`You do not have an approved vhost`) + errVhostsForbidden = errors.New(`An administrator has denied you the ability to use vhosts`) errLimitExceeded = errors.New("Limit exceeded") errNoop = errors.New("Action was a no-op") errCASFailed = errors.New("Compare-and-swap update of database value failed") diff --git a/irc/hostserv.go b/irc/hostserv.go index 6424910b..0a1371a9 100644 --- a/irc/hostserv.go +++ b/irc/hostserv.go @@ -216,6 +216,8 @@ func hsRequestHandler(server *Server, client *Client, command string, params []s if err != nil { if throttled, ok := err.(*vhostThrottleExceeded); ok { hsNotice(rb, fmt.Sprintf(client.t("You must wait an additional %v before making another request"), throttled.timeRemaining)) + } else if err == errVhostsForbidden { + hsNotice(rb, client.t("An administrator has denied you the ability to use vhosts")) } else { hsNotice(rb, client.t("An error occurred")) } @@ -408,6 +410,8 @@ func hsTakeHandler(server *Server, client *Client, command string, params []stri if err != nil { if throttled, ok := err.(*vhostThrottleExceeded); ok { hsNotice(rb, fmt.Sprintf(client.t("You must wait an additional %v before taking a vhost"), throttled.timeRemaining)) + } else if err == errVhostsForbidden { + hsNotice(rb, client.t("An administrator has denied you the ability to use vhosts")) } else { hsNotice(rb, client.t("An error occurred")) }