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
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)
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")
}
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
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:
r, found := daemon.rooms[target]
if !found {
client.ReplyNoNickChan(target)
+ continue
}
daemon.roomSinks[r] <- ClientEvent{
client,