diff --git a/irc/hostserv.go b/irc/hostserv.go index 0a1371a9..1b7c4c2b 100644 --- a/irc/hostserv.go +++ b/irc/hostserv.go @@ -7,6 +7,8 @@ import ( "errors" "fmt" "regexp" + + "github.com/oragono/oragono/irc/sno" ) const hostservHelp = `HostServ lets you manage your vhost (i.e., the string displayed @@ -225,7 +227,7 @@ func hsRequestHandler(server *Server, client *Client, command string, params []s hsNotice(rb, client.t("Your vhost request will be reviewed by an administrator")) chanMsg := fmt.Sprintf("Account %s requests vhost %s", accountName, vhost) hsNotifyChannel(server, chanMsg) - // TODO send admins a snomask of some kind + server.snomasks.Send(sno.LocalVhosts, chanMsg) } } @@ -328,6 +330,7 @@ func hsApproveHandler(server *Server, client *Client, command string, params []s hsNotice(rb, fmt.Sprintf(client.t("Successfully approved vhost request for %s"), user)) chanMsg := fmt.Sprintf("Oper %[1]s approved vhost %[2]s for account %[3]s", client.Nick(), vhostInfo.ApprovedVHost, user) hsNotifyChannel(server, chanMsg) + server.snomasks.Send(sno.LocalVhosts, chanMsg) for _, client := range server.accounts.AccountToClients(user) { client.Notice(client.t("Your vhost request was approved by an administrator")) } @@ -348,6 +351,7 @@ func hsRejectHandler(server *Server, client *Client, command string, params []st hsNotice(rb, fmt.Sprintf(client.t("Successfully rejected vhost request for %s"), user)) chanMsg := fmt.Sprintf("Oper %s rejected vhost %s for account %s, with the reason: %v", client.Nick(), vhostInfo.RejectedVHost, user, reason) hsNotifyChannel(server, chanMsg) + server.snomasks.Send(sno.LocalVhosts, chanMsg) for _, client := range server.accounts.AccountToClients(user) { if reason == "" { client.Notice("Your vhost request was rejected by an administrator") @@ -406,7 +410,8 @@ func hsTakeHandler(server *Server, client *Client, command string, params []stri return } - _, err := server.accounts.VHostTake(client.Account(), vhost, config.Accounts.VHosts.UserRequests.Cooldown) + account := client.Account() + _, err := server.accounts.VHostTake(account, vhost, config.Accounts.VHosts.UserRequests.Cooldown) 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)) @@ -415,9 +420,8 @@ func hsTakeHandler(server *Server, client *Client, command string, params []stri } else { hsNotice(rb, client.t("An error occurred")) } - } else if vhost != "" { - hsNotice(rb, client.t("Successfully set vhost")) } else { - hsNotice(rb, client.t("Successfully cleared vhost")) + hsNotice(rb, client.t("Successfully set vhost")) + server.snomasks.Send(sno.LocalVhosts, fmt.Sprintf("Client %s (account %s) took vhost %s", client.Nick(), account, vhost)) } } diff --git a/irc/sno/constants.go b/irc/sno/constants.go index 5449962e..1eb1bc5a 100644 --- a/irc/sno/constants.go +++ b/irc/sno/constants.go @@ -9,7 +9,7 @@ type Mask rune // Notice mask types const ( - LocalAccouncements Mask = 'a' + LocalAnnouncements Mask = 'a' LocalConnects Mask = 'c' LocalChannels Mask = 'j' LocalKills Mask = 'k' @@ -19,12 +19,13 @@ const ( Stats Mask = 't' LocalAccounts Mask = 'u' LocalXline Mask = 'x' + LocalVhosts Mask = 'v' ) var ( // NoticeMaskNames has readable names for our snomask types. NoticeMaskNames = map[Mask]string{ - LocalAccouncements: "ANNOUNCEMENT", + LocalAnnouncements: "ANNOUNCEMENT", LocalConnects: "CONNECT", LocalChannels: "CHANNEL", LocalKills: "KILL", @@ -34,11 +35,12 @@ var ( Stats: "STATS", LocalAccounts: "ACCOUNT", LocalXline: "XLINE", + LocalVhosts: "VHOST", } // ValidMasks contains the snomasks that we support. ValidMasks = map[Mask]bool{ - LocalAccouncements: true, + LocalAnnouncements: true, LocalConnects: true, LocalChannels: true, LocalKills: true, @@ -48,5 +50,6 @@ var ( Stats: true, LocalAccounts: true, LocalXline: true, + LocalVhosts: true, } ) diff --git a/oragono.yaml b/oragono.yaml index 83a29915..54131ad2 100644 --- a/oragono.yaml +++ b/oragono.yaml @@ -466,7 +466,7 @@ opers: vhost: "n" # modes are the modes to auto-set upon opering-up - modes: +is acjknoqtux + modes: +is acjknoqtuxv # operators can be authenticated either by password (with the /OPER command), # or by certificate fingerprint, or both. if a password hash is set, then a