X-Git-Url: http://www.git.cypherpunks.ru/?a=blobdiff_plain;f=daemon.go;h=b3fed28cb10f43be262351b172ce877de7504eab;hb=13a478f8c222ff78664806e296478076461cb439;hp=ed708de9875a7b054f27e5a27bfad6e122ad90d3;hpb=8702ace766119effc2c2ec4afa284bec6f24c4da;p=goircd.git diff --git a/daemon.go b/daemon.go index ed708de..b3fed28 100644 --- a/daemon.go +++ b/daemon.go @@ -1,6 +1,6 @@ /* goircd -- minimalistic simple Internet Relay Chat (IRC) server -Copyright (C) 2014 Sergey Matveev +Copyright (C) 2014-2015 Sergey Matveev This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -15,6 +15,7 @@ GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . */ + package main import ( @@ -29,9 +30,12 @@ import ( ) const ( - PingTimeout = time.Second * 180 // Max time deadline for client's unresponsiveness - PingThreshold = time.Second * 90 // Max idle client's time before PING are sent - AlivenessCheck = time.Second * 10 // Client's aliveness check period + // Max time deadline for client's unresponsiveness + PingTimeout = time.Second * 180 + // Max idle client's time before PING are sent + PingThreshold = time.Second * 90 + // Client's aliveness check period + AlivenessCheck = time.Second * 10 ) var ( @@ -44,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 @@ -54,8 +58,13 @@ 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, passwords: passwords} - daemon.clients = make(map[*Client]bool) + daemon := Daemon{ + version: version, + hostname: hostname, + motd: motd, + passwords: passwords, + } + 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) @@ -171,6 +180,8 @@ func (daemon *Daemon) ClientRegister(client *Client, command string, cols []stri return } nickname := cols[1] + // 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") @@ -292,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 @@ -323,8 +335,11 @@ func (daemon *Daemon) Processor(events <-chan ClientEvent) { switch event.eventType { case EventNew: - daemon.clients[client] = true - daemon.clientAliveness[client] = &ClientAlivenessState{pingSent: false, timestamp: now} + daemon.clients[client] = struct{}{} + daemon.clientAliveness[client] = &ClientAlivenessState{ + pingSent: false, + timestamp: now, + } case EventDel: delete(daemon.clients, client) delete(daemon.clientAliveness, client) @@ -444,8 +459,13 @@ func (daemon *Daemon) Processor(events <-chan ClientEvent) { r, found := daemon.rooms[target] if !found { client.ReplyNoNickChan(target) + continue + } + daemon.roomSinks[r] <- ClientEvent{ + client, + EventMsg, + command + " " + strings.TrimLeft(cols[1], ":"), } - daemon.roomSinks[r] <- ClientEvent{client, EventMsg, command + " " + strings.TrimLeft(cols[1], ":")} case "TOPIC": if len(cols) == 1 { client.ReplyNotEnoughParameters("TOPIC")