/*
goircd -- minimalistic simple Internet Relay Chat (IRC) server
-Copyright (C) 2014-2015 Sergey Matveev <stargrave@stargrave.org>
+Copyright (C) 2014-2016 Sergey Matveev <stargrave@stargrave.org>
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
away *string
recvTimestamp time.Time
sendTimestamp time.Time
- outBuf chan string
+ outBuf chan *string
alive bool
sync.Mutex
}
-func (c Client) Host() string {
+func (c *Client) Host() string {
addr := c.conn.RemoteAddr().String()
if host, _, err := net.SplitHostPort(addr); err == nil {
addr = host
return addr
}
-func (c Client) String() string {
+func (c *Client) String() string {
return *c.nickname + "!" + *c.username + "@" + c.Host()
}
recvTimestamp: time.Now(),
sendTimestamp: time.Now(),
alive: true,
- outBuf: make(chan string, MaxOutBuf),
+ outBuf: make(chan *string, MaxOutBuf),
}
go c.MsgSender()
return &c
}
func (c *Client) SetDead() {
- close(c.outBuf)
+ c.outBuf <- nil
c.alive = false
}
func (c *Client) Close() {
c.Lock()
- c.conn.Close()
if c.alive {
c.SetDead()
}
func (c *Client) MsgSender() {
for msg := range c.outBuf {
- c.conn.Write(append([]byte(msg), CRLF...))
+ if msg == nil {
+ c.conn.Close()
+ break
+ }
+ c.conn.Write(append([]byte(*msg), CRLF...))
}
}
}
if len(c.outBuf) == MaxOutBuf {
log.Println(c, "output buffer size exceeded, kicking him")
- go c.Close()
- c.SetDead()
+ if c.alive {
+ c.SetDead()
+ }
return
}
- c.outBuf <- text
+ c.outBuf <- &text
}
// Send message from server. It has ": servername" prefix.