浏览代码

add whois support for services

tags/v1.0.0-rc1
Shivaram Lingamneni 5 年前
父节点
当前提交
c95ed46949
共有 2 个文件被更改,包括 27 次插入18 次删除
  1. 2
    2
      irc/client_lookup_set.go
  2. 25
    16
      irc/handlers.go

+ 2
- 2
irc/client_lookup_set.go 查看文件

@@ -189,7 +189,7 @@ func (clients *ClientManager) FindAll(userhost string) (set ClientSet) {
189 189
 	clients.RLock()
190 190
 	defer clients.RUnlock()
191 191
 	for _, client := range clients.byNick {
192
-		if matcher.Match(client.nickMaskCasefolded) {
192
+		if matcher.Match(client.NickMaskCasefolded()) {
193 193
 			set.Add(client)
194 194
 		}
195 195
 	}
@@ -209,7 +209,7 @@ func (clients *ClientManager) Find(userhost string) *Client {
209 209
 	clients.RLock()
210 210
 	defer clients.RUnlock()
211 211
 	for _, client := range clients.byNick {
212
-		if matcher.Match(client.nickMaskCasefolded) {
212
+		if matcher.Match(client.NickMaskCasefolded()) {
213 213
 			matchedClient = client
214 214
 			break
215 215
 		}

+ 25
- 16
irc/handlers.go 查看文件

@@ -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

正在加载...
取消
保存