diff options
-rw-r--r-- | irc/irc.go | 26 | ||||
-rw-r--r-- | irc/message.go | 32 |
2 files changed, 51 insertions, 7 deletions
@@ -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 diff --git a/irc/message.go b/irc/message.go index 2f8971a..e1d448b 100644 --- a/irc/message.go +++ b/irc/message.go @@ -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. |