diff --git a/gencapdefs.py b/gencapdefs.py index 2daf59bd..0dab5b3e 100644 --- a/gencapdefs.py +++ b/gencapdefs.py @@ -77,7 +77,7 @@ CAPDEFS = [ ), CapDef( identifier="LabeledResponse", - name="draft/labeled-response", + name="draft/labeled-response-0.2", url="https://ircv3.net/specs/extensions/labeled-response.html", standard="draft IRCv3", ), diff --git a/irc/caps/defs.go b/irc/caps/defs.go index 6a691bbc..4092bb2f 100644 --- a/irc/caps/defs.go +++ b/irc/caps/defs.go @@ -53,7 +53,7 @@ const ( // https://ircv3.net/specs/extensions/invite-notify-3.2.html InviteNotify Capability = iota - // LabeledResponse is the draft IRCv3 capability named "draft/labeled-response": + // LabeledResponse is the draft IRCv3 capability named "draft/labeled-response-0.2": // https://ircv3.net/specs/extensions/labeled-response.html LabeledResponse Capability = iota @@ -135,7 +135,7 @@ var ( "echo-message", "extended-join", "invite-notify", - "draft/labeled-response", + "draft/labeled-response-0.2", "draft/languages", "oragono.io/maxline-2", "message-tags", diff --git a/irc/responsebuffer.go b/irc/responsebuffer.go index 794254c0..e651cd4a 100644 --- a/irc/responsebuffer.go +++ b/irc/responsebuffer.go @@ -212,16 +212,24 @@ func (rb *ResponseBuffer) flushInternal(final bool, blocking bool) error { } useLabel := rb.session.capabilities.Has(caps.LabeledResponse) && rb.Label != "" - // use a batch if we have a label, and we either currently have 0 or 2+ messages, + // use a batch if we have a label, and we either currently have 2+ messages, // or we are doing a Flush() and we have to assume that there will be more messages // in the future. - useBatch := useLabel && (len(rb.messages) != 1 || !final) + startBatch := useLabel && (1 < len(rb.messages) || !final) - // if label but no batch, add label to first message - if useLabel && !useBatch && len(rb.messages) == 1 && rb.batchID == "" { - rb.messages[0].SetTag(caps.LabelTagName, rb.Label) - } else if useBatch { + if startBatch { rb.sendBatchStart(blocking) + } else if useLabel && len(rb.messages) == 0 && rb.batchID == "" && final { + // 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.SendRawMessage(message, blocking) + } else if useLabel && len(rb.messages) == 1 && rb.batchID == "" && final { + // single labeled message + rb.messages[0].SetTag(caps.LabelTagName, rb.Label) } // send each message out