|
@@ -2478,16 +2478,25 @@ func whoisHandler(server *Server, client *Client, msg ircmsg.IrcMessage, rb *Res
|
2478
|
2478
|
return false
|
2479
|
2479
|
}
|
2480
|
2480
|
|
|
2481
|
+ handleService := func(nick string) bool {
|
|
2482
|
+ cfnick, _ := CasefoldName(nick)
|
|
2483
|
+ service, ok := OragonoServices[cfnick]
|
|
2484
|
+ if !ok {
|
|
2485
|
+ return false
|
|
2486
|
+ }
|
|
2487
|
+ clientNick := client.Nick()
|
|
2488
|
+ rb.Add(nil, client.server.name, RPL_WHOISUSER, clientNick, service.Name, service.Name, "localhost", "*", fmt.Sprintf(client.t("Network service, for more info /msg %s HELP"), service.Name))
|
|
2489
|
+ // hehe
|
|
2490
|
+ if client.HasMode(modes.TLS) {
|
|
2491
|
+ rb.Add(nil, client.server.name, RPL_WHOISSECURE, clientNick, service.Name, client.t("is using a secure connection"))
|
|
2492
|
+ }
|
|
2493
|
+ return true
|
|
2494
|
+ }
|
|
2495
|
+
|
2481
|
2496
|
if client.HasMode(modes.Operator) {
|
2482
|
|
- masks := strings.Split(masksString, ",")
|
2483
|
|
- for _, mask := range masks {
|
2484
|
|
- casefoldedMask, err := Casefold(mask)
|
2485
|
|
- if err != nil {
|
2486
|
|
- rb.Add(nil, client.server.name, ERR_NOSUCHNICK, client.nick, mask, client.t("No such nick"))
|
2487
|
|
- continue
|
2488
|
|
- }
|
2489
|
|
- matches := server.clients.FindAll(casefoldedMask)
|
2490
|
|
- if len(matches) == 0 {
|
|
2497
|
+ for _, mask := range strings.Split(masksString, ",") {
|
|
2498
|
+ matches := server.clients.FindAll(mask)
|
|
2499
|
+ if len(matches) == 0 && !handleService(mask) {
|
2491
|
2500
|
rb.Add(nil, client.server.name, ERR_NOSUCHNICK, client.nick, mask, client.t("No such nick"))
|
2492
|
2501
|
continue
|
2493
|
2502
|
}
|
|
@@ -2496,15 +2505,15 @@ func whoisHandler(server *Server, client *Client, msg ircmsg.IrcMessage, rb *Res
|
2496
|
2505
|
}
|
2497
|
2506
|
}
|
2498
|
2507
|
} else {
|
2499
|
|
- // only get the first request
|
2500
|
|
- casefoldedMask, err := Casefold(strings.Split(masksString, ",")[0])
|
2501
|
|
- mclient := server.clients.Get(casefoldedMask)
|
2502
|
|
- if err != nil || mclient == nil {
|
2503
|
|
- rb.Add(nil, client.server.name, ERR_NOSUCHNICK, client.nick, masksString, client.t("No such nick"))
|
2504
|
|
- // fall through, ENDOFWHOIS is always sent
|
2505
|
|
- } else {
|
|
2508
|
+ // only get the first request; also require a nick, not a mask
|
|
2509
|
+ nick := strings.Split(masksString, ",")[0]
|
|
2510
|
+ mclient := server.clients.Get(nick)
|
|
2511
|
+ if mclient != nil {
|
2506
|
2512
|
client.getWhoisOf(mclient, rb)
|
|
2513
|
+ } else if !handleService(nick) {
|
|
2514
|
+ rb.Add(nil, client.server.name, ERR_NOSUCHNICK, client.nick, masksString, client.t("No such nick"))
|
2507
|
2515
|
}
|
|
2516
|
+ // fall through, ENDOFWHOIS is always sent
|
2508
|
2517
|
}
|
2509
|
2518
|
rb.Add(nil, server.name, RPL_ENDOFWHOIS, client.nick, masksString, client.t("End of /WHOIS list"))
|
2510
|
2519
|
return false
|