X-Git-Url: http://www.git.cypherpunks.ru/?p=goircd.git;a=blobdiff_plain;f=daemon.go;h=9145ba08dd950e345b2df1c7843b93817de17d24;hp=7af810ca27196304a246de2966b74707a8daf8d5;hb=171c6d6df3afbd6d0895528b2a8a38cb3d25d5f0;hpb=43fccdbbae9c96db2eb26191ac4a4992b837583d diff --git a/daemon.go b/daemon.go index 7af810c..9145ba0 100644 --- 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,