X-Git-Url: http://www.git.cypherpunks.ru/?a=blobdiff_plain;f=client.go;h=211f399969fa008982578daad5664beb8d38903c;hb=7afceda9cb6352809a0a3123c6aae1234329088b;hp=a43cc1efc1eb781a1de8b7f07667857402550480;hpb=e657ffd2ab2cd5fae8c1d19e39b2268fa758153e;p=goircd.git diff --git a/client.go b/client.go index a43cc1e..211f399 100644 --- a/client.go +++ b/client.go @@ -1,6 +1,6 @@ /* goircd -- minimalistic simple Internet Relay Chat (IRC) server -Copyright (C) 2014-2015 Sergey Matveev +Copyright (C) 2014-2017 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 @@ -46,13 +46,24 @@ type Client struct { away *string recvTimestamp time.Time sendTimestamp time.Time - outBuf chan string + outBuf chan *string alive bool sync.Mutex } -func (c Client) String() string { - return *c.nickname + "!" + *c.username + "@" + c.conn.RemoteAddr().String() +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 { @@ -65,20 +76,19 @@ func NewClient(conn net.Conn) *Client { 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() } @@ -122,7 +132,11 @@ func (c *Client) Processor(sink chan ClientEvent) { 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...)) } } @@ -135,11 +149,12 @@ func (c *Client) Msg(text string) { } 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.