diff --git a/irc/getters.go b/irc/getters.go index c2fd54d2f..a7aeb11f7 100644 --- a/irc/getters.go +++ b/irc/getters.go @@ -55,15 +55,17 @@ func (client *Client) Sessions() (sessions []*Session) { } type SessionData struct { - ctime time.Time - atime time.Time - ip net.IP - hostname string - certfp string - deviceID string - connInfo string - sessionID int64 - caps []string + ctime time.Time + atime time.Time + ip net.IP + hostname string + certfp string + deviceID string + connInfo string + sessionID int64 + caps []string + bytesRead uint64 + bytesWritten uint64 } func (client *Client) AllSessionData(currentSession *Session, hasPrivs bool) (data []SessionData, currentIndex int) { @@ -76,13 +78,16 @@ func (client *Client) AllSessionData(currentSession *Session, hasPrivs bool) (da if session == currentSession { currentIndex = i } + bytesRead, bytesWritten := session.socket.Stats() data[i] = SessionData{ - atime: session.lastActive, - ctime: session.ctime, - hostname: session.rawHostname, - certfp: session.certfp, - deviceID: session.deviceID, - sessionID: session.sessionID, + atime: session.lastActive, + ctime: session.ctime, + hostname: session.rawHostname, + certfp: session.certfp, + deviceID: session.deviceID, + sessionID: session.sessionID, + bytesRead: bytesRead, + bytesWritten: bytesWritten, } if session.proxiedIP != nil { data[i].ip = session.proxiedIP diff --git a/irc/nickserv.go b/irc/nickserv.go index 3658c8fb0..dd06f2c3f 100644 --- a/irc/nickserv.go +++ b/irc/nickserv.go @@ -1275,6 +1275,7 @@ func nsClientsListHandler(service *ircService, server *Server, client *Client, p service.Notice(rb, fmt.Sprintf(client.t("IRCv3 CAPs: %s"), capStr)) } } + service.Notice(rb, fmt.Sprintf(client.t("Bytes RX/TX: %d / %d"), session.bytesRead, session.bytesWritten)) } } diff --git a/irc/socket.go b/irc/socket.go index ce8eb0080..42dcabe4a 100644 --- a/irc/socket.go +++ b/irc/socket.go @@ -35,6 +35,9 @@ type Socket struct { sendQExceeded bool finalData []byte // what to send when we die finalized bool + + bytesRead uint64 + bytesWritten uint64 } // NewSocket returns a new Socket. @@ -56,6 +59,12 @@ func (socket *Socket) Close() { socket.wakeWriter() } +func (socket *Socket) Stats() (bytesRead, bytesWritten uint64) { + socket.Lock() + defer socket.Unlock() + return socket.bytesRead, socket.bytesWritten +} + // Read returns a single IRC line from a Socket. func (socket *Socket) Read() (string, error) { // immediately fail if Close() has been called, even if there's @@ -67,6 +76,10 @@ func (socket *Socket) Read() (string, error) { lineBytes, err := socket.conn.ReadLine() line := string(lineBytes) + socket.Lock() + socket.bytesRead += uint64(len(lineBytes)) + socket.Unlock() + if err == io.EOF { socket.Close() } @@ -96,6 +109,7 @@ func (socket *Socket) Write(data []byte) (err error) { } else { socket.buffers = append(socket.buffers, data) socket.totalLength = prospectiveLen + socket.bytesWritten += uint64(len(data)) } } socket.Unlock() @@ -136,6 +150,10 @@ func (socket *Socket) BlockingWrite(data []byte) (err error) { return io.EOF } + socket.Lock() + socket.bytesWritten += uint64(len(data)) + socket.Unlock() + err = socket.conn.WriteLine(data) if err != nil { socket.finalize()