Просмотр исходного кода

add whois support for services

tags/v1.0.0-rc1
Shivaram Lingamneni 5 лет назад
Родитель
Сommit
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
 	clients.RLock()
189
 	clients.RLock()
190
 	defer clients.RUnlock()
190
 	defer clients.RUnlock()
191
 	for _, client := range clients.byNick {
191
 	for _, client := range clients.byNick {
192
-		if matcher.Match(client.nickMaskCasefolded) {
192
+		if matcher.Match(client.NickMaskCasefolded()) {
193
 			set.Add(client)
193
 			set.Add(client)
194
 		}
194
 		}
195
 	}
195
 	}
209
 	clients.RLock()
209
 	clients.RLock()
210
 	defer clients.RUnlock()
210
 	defer clients.RUnlock()
211
 	for _, client := range clients.byNick {
211
 	for _, client := range clients.byNick {
212
-		if matcher.Match(client.nickMaskCasefolded) {
212
+		if matcher.Match(client.NickMaskCasefolded()) {
213
 			matchedClient = client
213
 			matchedClient = client
214
 			break
214
 			break
215
 		}
215
 		}

+ 25
- 16
irc/handlers.go Просмотреть файл

2478
 		return false
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
 	if client.HasMode(modes.Operator) {
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
 				rb.Add(nil, client.server.name, ERR_NOSUCHNICK, client.nick, mask, client.t("No such nick"))
2500
 				rb.Add(nil, client.server.name, ERR_NOSUCHNICK, client.nick, mask, client.t("No such nick"))
2492
 				continue
2501
 				continue
2493
 			}
2502
 			}
2496
 			}
2505
 			}
2497
 		}
2506
 		}
2498
 	} else {
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
 			client.getWhoisOf(mclient, rb)
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
 	rb.Add(nil, server.name, RPL_ENDOFWHOIS, client.nick, masksString, client.t("End of /WHOIS list"))
2518
 	rb.Add(nil, server.name, RPL_ENDOFWHOIS, client.nick, masksString, client.t("End of /WHOIS list"))
2510
 	return false
2519
 	return false

Загрузка…
Отмена
Сохранить