diff --git a/irc/client.go b/irc/client.go index 355876d8..b1c7fe6c 100644 --- a/irc/client.go +++ b/irc/client.go @@ -1160,12 +1160,7 @@ func (session *Session) sendFromClientInternal(blocking bool, serverTime time.Ti msg.SetTag("msgid", msgid) } // attach server-time - if session.capabilities.Has(caps.ServerTime) { - if serverTime.IsZero() { - serverTime = time.Now().UTC() - } - msg.SetTag("time", serverTime.Format(IRCv3TimestampFormat)) - } + session.setTimeTag(&msg, serverTime) return session.SendRawMessage(msg, blocking) } @@ -1246,12 +1241,19 @@ func (client *Client) Send(tags map[string]string, prefix string, command string func (session *Session) Send(tags map[string]string, prefix string, command string, params ...string) (err error) { msg := ircmsg.MakeMessage(tags, prefix, command, params...) - if session.capabilities.Has(caps.ServerTime) && !msg.HasTag("time") { - msg.SetTag("time", time.Now().UTC().Format(IRCv3TimestampFormat)) - } + session.setTimeTag(&msg, time.Time{}) return session.SendRawMessage(msg, false) } +func (session *Session) setTimeTag(msg *ircmsg.IrcMessage, serverTime time.Time) { + if session.capabilities.Has(caps.ServerTime) && !msg.HasTag("time") { + if serverTime.IsZero() { + serverTime = time.Now() + } + msg.SetTag("time", serverTime.UTC().Format(IRCv3TimestampFormat)) + } +} + // Notice sends the client a notice from the server. func (client *Client) Notice(text string) { client.Send(nil, client.server.name, "NOTICE", client.Nick(), text) diff --git a/irc/responsebuffer.go b/irc/responsebuffer.go index e651cd4a..9df090a0 100644 --- a/irc/responsebuffer.go +++ b/irc/responsebuffer.go @@ -93,9 +93,7 @@ func (rb *ResponseBuffer) AddFromClient(time time.Time, msgid string, fromNickMa msg.SetTag("msgid", msgid) } // attach server-time - if rb.session.capabilities.Has(caps.ServerTime) && !msg.HasTag("time") { - msg.SetTag("time", time.UTC().Format(IRCv3TimestampFormat)) - } + rb.session.setTimeTag(&msg, time) rb.AddMessage(msg) } @@ -223,9 +221,7 @@ func (rb *ResponseBuffer) flushInternal(final bool, blocking bool) error { // ACK message message := ircmsg.MakeMessage(nil, rb.session.client.server.name, "ACK") message.SetTag(caps.LabelTagName, rb.Label) - if rb.session.capabilities.Has(caps.ServerTime) { - message.SetTag("time", time.Now().UTC().Format(IRCv3TimestampFormat)) - } + rb.session.setTimeTag(&message, time.Time{}) rb.session.SendRawMessage(message, blocking) } else if useLabel && len(rb.messages) == 1 && rb.batchID == "" && final { // single labeled message @@ -235,9 +231,7 @@ func (rb *ResponseBuffer) flushInternal(final bool, blocking bool) error { // send each message out for _, message := range rb.messages { // attach server-time if needed - if rb.session.capabilities.Has(caps.ServerTime) && !message.HasTag("time") { - message.SetTag("time", time.Now().UTC().Format(IRCv3TimestampFormat)) - } + rb.session.setTimeTag(&message, time.Time{}) // attach batch ID, unless this message was part of a nested batch and is // already tagged