Merge pull request #53 from arachnist/verbose-truncate
Give explicit notice on message truncation.master
commit
95e143e1c6
26
irc/irc.go
26
irc/irc.go
|
@ -11,6 +11,7 @@ import (
|
|||
"net"
|
||||
"sync"
|
||||
"time"
|
||||
"unicode/utf8"
|
||||
|
||||
"github.com/arachnist/dyncfg"
|
||||
)
|
||||
|
@ -39,9 +40,28 @@ type Connection struct {
|
|||
func (c *Connection) Sender(msg Message) {
|
||||
c.l.Lock()
|
||||
defer c.l.Unlock()
|
||||
c.writer.WriteString(msg.String() + endline)
|
||||
log.Println(c.network, "-->", msg.String())
|
||||
c.writer.Flush()
|
||||
if msg.WireLen() > maxLength {
|
||||
currLen := 0
|
||||
for i, ch := range msg.String() {
|
||||
currLen += utf8.RuneLen(ch)
|
||||
if currLen > maxLength {
|
||||
c.writer.WriteString(msg.String()[:i] + endline)
|
||||
log.Println(c.network, "-->", msg.String())
|
||||
c.writer.Flush()
|
||||
// eh, it is a bit naive to assume that we won't explode again…
|
||||
if msg.Command == "PRIVMSG" { // we don't care otherwise
|
||||
newMsg := msg
|
||||
newMsg.Trailing = "Message truncated"
|
||||
go c.Sender(newMsg)
|
||||
}
|
||||
return
|
||||
}
|
||||
}
|
||||
} else {
|
||||
c.writer.WriteString(msg.String() + endline)
|
||||
log.Println(c.network, "-->", msg.String())
|
||||
c.writer.Flush()
|
||||
}
|
||||
}
|
||||
|
||||
// Receiver receives IRC messages from server, logs their contents, sets message
|
||||
|
|
|
@ -288,12 +288,36 @@ func (m *Message) Bytes() []byte {
|
|||
buffer.WriteString(m.Trailing)
|
||||
}
|
||||
|
||||
// We need the limit the buffer length.
|
||||
if buffer.Len() > (maxLength) {
|
||||
buffer.Truncate(maxLength)
|
||||
return buffer.Bytes()
|
||||
}
|
||||
|
||||
func (m *Message) WireLen() int {
|
||||
|
||||
buffer := new(bytes.Buffer)
|
||||
|
||||
// Message prefix
|
||||
if m.Prefix != nil {
|
||||
buffer.WriteByte(prefix)
|
||||
m.Prefix.writeTo(buffer)
|
||||
buffer.WriteByte(space)
|
||||
}
|
||||
|
||||
return buffer.Bytes()
|
||||
// Command is required
|
||||
buffer.WriteString(m.Command)
|
||||
|
||||
// Space separated list of arguments
|
||||
if len(m.Params) > 0 {
|
||||
buffer.WriteByte(space)
|
||||
buffer.WriteString(strings.Join(m.Params, string(space)))
|
||||
}
|
||||
|
||||
if len(m.Trailing) > 0 || m.EmptyTrailing {
|
||||
buffer.WriteByte(space)
|
||||
buffer.WriteByte(prefix)
|
||||
buffer.WriteString(m.Trailing)
|
||||
}
|
||||
|
||||
return buffer.Len()
|
||||
}
|
||||
|
||||
// String returns a string representation of this message.
|
||||
|
|
Loading…
Reference in New Issue