]> Cypherpunks.ru repositories - goircd.git/blobdiff - client.go
Example lighttpd configuration for logs directory viewing
[goircd.git] / client.go
index a43cc1efc1eb781a1de8b7f07667857402550480..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,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.