]> Cypherpunks.ru repositories - goircd.git/blobdiff - daemon.go
Increase maximum nickname length for convenience
[goircd.git] / daemon.go
index 7af810ca27196304a246de2966b74707a8daf8d5..9145ba08dd950e345b2df1c7843b93817de17d24 100644 (file)
--- a/daemon.go
+++ b/daemon.go
@@ -39,7 +39,7 @@ const (
 )
 
 var (
-       RENickname = regexp.MustCompile("^[a-zA-Z0-9-]{1,9}$")
+       RENickname = regexp.MustCompile("^[a-zA-Z0-9-]{1,24}$")
 )
 
 type Daemon struct {
@@ -48,7 +48,7 @@ type Daemon struct {
        hostname           *string
        motd               *string
        passwords          *string
-       clients            map[*Client]bool
+       clients            map[*Client]struct{}
        clientAliveness    map[*Client]*ClientAlivenessState
        rooms              map[string]*Room
        roomSinks          map[*Room]chan ClientEvent
@@ -59,12 +59,12 @@ type Daemon struct {
 
 func NewDaemon(version string, hostname, motd, passwords *string, logSink chan<- LogEvent, stateSink chan<- StateEvent) *Daemon {
        daemon := Daemon{
-               version: version,
-               hostname: hostname,
-               motd: motd,
+               version:   version,
+               hostname:  hostname,
+               motd:      motd,
                passwords: passwords,
        }
-       daemon.clients = make(map[*Client]bool)
+       daemon.clients = make(map[*Client]struct{})
        daemon.clientAliveness = make(map[*Client]*ClientAlivenessState)
        daemon.rooms = make(map[string]*Room)
        daemon.roomSinks = make(map[*Room]chan ClientEvent)
@@ -180,9 +180,8 @@ func (daemon *Daemon) ClientRegister(client *Client, command string, cols []stri
                        return
                }
                nickname := cols[1]
-               if (strings.HasPrefix(nickname, ":")) {
-                       nickname = strings.TrimPrefix(nickname, ":")
-               }
+               // Compatibility with some clients prepending colons to nickname
+               nickname = strings.TrimPrefix(nickname, ":")
                for existingClient := range daemon.clients {
                        if existingClient.nickname == nickname {
                                client.ReplyParts("433", "*", nickname, "Nickname is already in use")
@@ -304,8 +303,9 @@ func (daemon *Daemon) HandlerJoin(client *Client, cmd string) {
 }
 
 func (daemon *Daemon) Processor(events <-chan ClientEvent) {
+       var now time.Time
        for event := range events {
-               now := time.Now()
+               now = time.Now()
                client := event.client
 
                // Check for clients aliveness
@@ -335,9 +335,9 @@ func (daemon *Daemon) Processor(events <-chan ClientEvent) {
 
                switch event.eventType {
                case EventNew:
-                       daemon.clients[client] = true
+                       daemon.clients[client] = struct{}{}
                        daemon.clientAliveness[client] = &ClientAlivenessState{
-                               pingSent: false,
+                               pingSent:  false,
                                timestamp: now,
                        }
                case EventDel:
@@ -415,7 +415,8 @@ func (daemon *Daemon) Processor(events <-chan ClientEvent) {
                                        client.ReplyNotEnoughParameters("PART")
                                        continue
                                }
-                               for _, room := range strings.Split(cols[1], ",") {
+                               rooms := strings.Split(cols[1], " ")[0]
+                               for _, room := range strings.Split(rooms, ",") {
                                        r, found := daemon.rooms[room]
                                        if !found {
                                                client.ReplyNoChannel(room)
@@ -459,6 +460,7 @@ func (daemon *Daemon) Processor(events <-chan ClientEvent) {
                                r, found := daemon.rooms[target]
                                if !found {
                                        client.ReplyNoNickChan(target)
+                                       continue
                                }
                                daemon.roomSinks[r] <- ClientEvent{
                                        client,