+ conn net.Conn
+ registered bool
+ nickname *string
+ username *string
+ realname *string
+ password *string
+ away *string
+ recvTimestamp time.Time
+ sendTimestamp time.Time
+ outBuf chan *string
+ alive bool
+ sync.Mutex
+}
+
+func (c *Client) Host() string {
+ addr := c.conn.RemoteAddr().String()
+ if host, _, err := net.SplitHostPort(addr); err == nil {
+ addr = host
+ }
+ if domains, err := net.LookupAddr(addr); err == nil {
+ addr = strings.TrimSuffix(domains[0], ".")
+ }
+ return addr
+}
+
+func (c *Client) String() string {
+ return *c.nickname + "!" + *c.username + "@" + c.Host()
+}
+
+func NewClient(conn net.Conn) *Client {
+ nickname := "*"
+ username := ""
+ c := Client{
+ conn: conn,
+ nickname: &nickname,
+ username: &username,
+ recvTimestamp: time.Now(),
+ sendTimestamp: time.Now(),
+ alive: true,
+ outBuf: make(chan *string, MaxOutBuf),
+ }
+ go c.MsgSender()
+ return &c