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

Add ChanServ and NickServ LIST commands.

These commands search the registered nicknames/channels for ones
matching the provided regex, or return the entire list.

Only operators with chanreg (for ChanServ) or accreg (for NickServ)
capabilities can use LIST.
tags/v2.1.0-rc1
Alex Jaspersen 4 лет назад
Родитель
Сommit
6019ed1e29
3 измененных файлов: 90 добавлений и 0 удалений
  1. 11
    0
      irc/accounts.go
  2. 39
    0
      irc/chanserv.go
  3. 40
    0
      irc/nickserv.go

+ 11
- 0
irc/accounts.go Просмотреть файл

@@ -1047,6 +1047,17 @@ func (am *AccountManager) AuthenticateByPassphrase(client *Client, accountName s
1047 1047
 	return err
1048 1048
 }
1049 1049
 
1050
+func (am *AccountManager) AllNicks() []string {
1051
+	am.RLock()
1052
+	defer am.RUnlock()
1053
+
1054
+	nicks := make([]string, 0, len(am.nickToAccount))
1055
+	for nick := range am.nickToAccount {
1056
+		nicks = append(nicks, nick)
1057
+	}
1058
+	return nicks
1059
+}
1060
+
1050 1061
 func (am *AccountManager) LoadAccount(accountName string) (result ClientAccount, err error) {
1051 1062
 	casefoldedAccount, err := CasefoldName(accountName)
1052 1063
 	if err != nil {

+ 39
- 0
irc/chanserv.go Просмотреть файл

@@ -5,6 +5,7 @@ package irc
5 5
 
6 6
 import (
7 7
 	"fmt"
8
+	"regexp"
8 9
 	"sort"
9 10
 	"strings"
10 11
 	"time"
@@ -126,6 +127,16 @@ set using PURGE.`,
126 127
 			capabs:    []string{"chanreg"},
127 128
 			minParams: 1,
128 129
 		},
130
+		"list": {
131
+			handler: csListHandler,
132
+			help: `Syntax: $bLIST [regex]$b
133
+
134
+LIST returns the list of registered channels, which match the given regex.
135
+If no regex is provided, all registered channels are returned.`,
136
+			helpShort: `$bLIST$b searches the list of registered channels.`,
137
+			capabs:    []string{"chanreg"},
138
+			minParams: 0,
139
+		},
129 140
 		"info": {
130 141
 			handler: csInfoHandler,
131 142
 			help: `Syntax: $INFO #channel$b
@@ -559,6 +570,34 @@ func csUnpurgeHandler(server *Server, client *Client, command string, params []s
559 570
 	}
560 571
 }
561 572
 
573
+func csListHandler(server *Server, client *Client, command string, params []string, rb *ResponseBuffer) {
574
+	if !client.HasRoleCapabs("chanreg") {
575
+		csNotice(rb, client.t("Insufficient privileges"))
576
+		return
577
+	}
578
+
579
+	var searchRegex *regexp.Regexp
580
+	if len(params) > 0 {
581
+		var err error
582
+		searchRegex, err = regexp.Compile(params[0])
583
+		if err != nil {
584
+			csNotice(rb, client.t("Invalid regex"))
585
+			return
586
+		}
587
+	}
588
+
589
+	csNotice(rb, ircfmt.Unescape(client.t("*** $bChanServ LIST$b ***")))
590
+
591
+	channels := server.channelRegistry.AllChannels()
592
+	for _, channel := range channels {
593
+		if searchRegex == nil || searchRegex.MatchString(channel) {
594
+			csNotice(rb, fmt.Sprintf("    %s", channel))
595
+		}
596
+	}
597
+
598
+	csNotice(rb, ircfmt.Unescape(client.t("*** $bEnd of ChanServ LIST$b ***")))
599
+}
600
+
562 601
 func csInfoHandler(server *Server, client *Client, command string, params []string, rb *ResponseBuffer) {
563 602
 	chname, err := CasefoldChannel(params[0])
564 603
 	if err != nil {

+ 40
- 0
irc/nickserv.go Просмотреть файл

@@ -5,6 +5,7 @@ package irc
5 5
 
6 6
 import (
7 7
 	"fmt"
8
+	"regexp"
8 9
 	"strconv"
9 10
 	"strings"
10 11
 	"time"
@@ -97,6 +98,17 @@ certfp (your client certificate) if a password is not given.`,
97 98
 			enabled:   servCmdRequiresAuthEnabled,
98 99
 			minParams: 1,
99 100
 		},
101
+		"list": {
102
+			handler: nsListHandler,
103
+			help: `Syntax: $bLIST [regex]$b
104
+
105
+LIST returns the list of registered nicknames, which match the given regex.
106
+If no regex is provided, all registered nicknames are returned.`,
107
+			helpShort: `$bLIST$b searches the list of registered nicknames.`,
108
+			enabled:   servCmdRequiresAuthEnabled,
109
+			capabs:    []string{"accreg"},
110
+			minParams: 0,
111
+		},
100 112
 		"info": {
101 113
 			handler: nsInfoHandler,
102 114
 			help: `Syntax: $bINFO [username]$b
@@ -681,6 +693,34 @@ func nsIdentifyHandler(server *Server, client *Client, command string, params []
681 693
 	}
682 694
 }
683 695
 
696
+func nsListHandler(server *Server, client *Client, command string, params []string, rb *ResponseBuffer) {
697
+	if !client.HasRoleCapabs("accreg") {
698
+		nsNotice(rb, client.t("Insufficient privileges"))
699
+		return
700
+	}
701
+
702
+	var searchRegex *regexp.Regexp
703
+	if len(params) > 0 {
704
+		var err error
705
+		searchRegex, err = regexp.Compile(params[0])
706
+		if err != nil {
707
+			nsNotice(rb, client.t("Invalid regex"))
708
+			return
709
+		}
710
+	}
711
+
712
+	nsNotice(rb, ircfmt.Unescape(client.t("*** $bNickServ LIST$b ***")))
713
+
714
+	nicks := server.accounts.AllNicks()
715
+	for _, nick := range nicks {
716
+		if searchRegex == nil || searchRegex.MatchString(nick) {
717
+			nsNotice(rb, fmt.Sprintf("    %s", nick))
718
+		}
719
+	}
720
+
721
+	nsNotice(rb, ircfmt.Unescape(client.t("*** $bEnd of NickServ LIST$b ***")))
722
+}
723
+
684 724
 func nsInfoHandler(server *Server, client *Client, command string, params []string, rb *ResponseBuffer) {
685 725
 	if !server.Config().Accounts.AuthenticationEnabled && !client.HasRoleCapabs("accreg") {
686 726
 		nsNotice(rb, client.t("This command has been disabled by the server administrators"))

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