X-Git-Url: http://www.git.cypherpunks.ru/?a=blobdiff_plain;f=client.go;h=afd6312714837e70b8c89550575054ac5efd7341;hb=5c79c4235ec745fa47c1f176657287dab4f61ed5;hp=632bf1fb339b3fb7ee8e86e6e9ca1f447401b633;hpb=b2f90fb412218973608b24a32eebadc60de9878a;p=goircd.git diff --git a/client.go b/client.go index 632bf1f..afd6312 100644 --- a/client.go +++ b/client.go @@ -26,21 +26,24 @@ import ( ) const ( - CRLF = "\x0d\x0a" - BUF_SIZE = 1380 + CRLF = "\x0d\x0a" + BufSize = 1380 ) type Client struct { hostname string conn net.Conn registered bool - ping_sent bool - timestamp time.Time nickname string username string realname string } +type ClientAlivenessState struct { + pingSent bool + timestamp time.Time +} + func (client Client) String() string { return client.nickname + "!" + client.username + "@" + client.conn.RemoteAddr().String() } @@ -52,29 +55,27 @@ func NewClient(hostname string, conn net.Conn) *Client { // Client processor blockingly reads everything remote client sends, // splits messages by CRLF and send them to Daemon gorouting for processing // it futher. Also it can signalize that client is unavailable (disconnected). -func (client *Client) Processor(sink chan ClientEvent) { - var buf_net []byte +func (client *Client) Processor(sink chan<- ClientEvent) { + var bufNet []byte buf := make([]byte, 0) - log.Println("New client", client) - sink <- ClientEvent{client, EVENT_NEW, ""} + log.Println(client, "New client") + sink <- ClientEvent{client, EventNew, ""} for { - buf_net = make([]byte, BUF_SIZE) - _, err := client.conn.Read(buf_net) + bufNet = make([]byte, BufSize) + _, err := client.conn.Read(bufNet) if err != nil { log.Println(client, "connection lost", err) - sink <- ClientEvent{client, EVENT_DEL, ""} + sink <- ClientEvent{client, EventDel, ""} break } - client.timestamp = time.Now() - client.ping_sent = false - buf_net = bytes.TrimRight(buf_net, "\x00") - buf = append(buf, buf_net...) + bufNet = bytes.TrimRight(bufNet, "\x00") + buf = append(buf, bufNet...) if !bytes.HasSuffix(buf, []byte(CRLF)) { continue } for _, msg := range bytes.Split(buf[:len(buf)-2], []byte(CRLF)) { if len(msg) > 0 { - sink <- ClientEvent{client, EVENT_MSG, string(msg)} + sink <- ClientEvent{client, EventMsg, string(msg)} } } buf = []byte{} @@ -117,3 +118,7 @@ func (client *Client) ReplyNotEnoughParameters(command string) { func (client *Client) ReplyNoChannel(channel string) { client.ReplyNicknamed("403", channel, "No such channel") } + +func (client *Client) ReplyNoNickChan(channel string) { + client.ReplyNicknamed("401", channel, "No such nick/channel") +}