]> Cypherpunks.ru repositories - goircd.git/blobdiff - client.go
Example lighttpd configuration for logs directory viewing
[goircd.git] / client.go
index fbaf8a326e8d6e3137f50e9ed2ee202013846497..640a58a5cae90a356944af8a1e2bc64e33340c96 100644 (file)
--- a/client.go
+++ b/client.go
@@ -1,6 +1,6 @@
 /*
 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
@@ -46,12 +46,12 @@ type Client struct {
        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
@@ -62,7 +62,7 @@ func (c Client) Host() string {
        return addr
 }
 
-func (c Client) String() string {
+func (c *Client) String() string {
        return *c.nickname + "!" + *c.username + "@" + c.Host()
 }
 
@@ -76,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()
        }
@@ -133,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...))
        }
 }
 
@@ -146,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.