diff --git a/irc/caps/constants.go b/irc/caps/constants.go index da37c1ed..57f088e3 100644 --- a/irc/caps/constants.go +++ b/irc/caps/constants.go @@ -62,6 +62,8 @@ const ( RelaymsgTagName = "draft/relaymsg" // BOT mode: https://ircv3.net/specs/extensions/bot-mode BotTagName = "bot" + // https://ircv3.net/specs/extensions/chathistory + ChathistoryTargetsBatchType = "draft/chathistory-targets" ) func init() { diff --git a/irc/channel.go b/irc/channel.go index d8c5606f..61b5a159 100644 --- a/irc/channel.go +++ b/irc/channel.go @@ -1059,7 +1059,7 @@ func (channel *Channel) replayHistoryItems(rb *ResponseBuffer, items []history.I } } - batchID := rb.StartNestedHistoryBatch(chname) + batchID := rb.StartNestedBatch(chname, "chathistory") defer rb.EndNestedBatch(batchID) for _, item := range items { diff --git a/irc/client.go b/irc/client.go index f26985aa..feca599b 100644 --- a/irc/client.go +++ b/irc/client.go @@ -850,7 +850,7 @@ func (client *Client) replayPrivmsgHistory(rb *ResponseBuffer, items []history.I if target == "" { target = nick } - batchID = rb.StartNestedHistoryBatch(target) + batchID = rb.StartNestedBatch(target, "chathistory") isSelfMessage := func(item *history.Item) bool { // XXX: Params[0] is the message target. if the source of this message is an in-memory diff --git a/irc/handlers.go b/irc/handlers.go index 0c54a02c..71c724ef 100644 --- a/irc/handlers.go +++ b/irc/handlers.go @@ -655,10 +655,8 @@ func chathistoryHandler(server *Server, client *Client, msg ircmsg.Message, rb * } else { // successful responses are sent as a chathistory or history batch if listTargets { - if rb.session.capabilities.Has(caps.Batch) { // #2066 - batchID := rb.StartNestedBatch("draft/chathistory-targets") - defer rb.EndNestedBatch(batchID) - } + batchID := rb.StartNestedBatch(caps.ChathistoryTargetsBatchType) + defer rb.EndNestedBatch(batchID) for _, target := range targets { name := server.UnfoldName(target.CfName) rb.Add(nil, server.name, "CHATHISTORY", "TARGETS", name, diff --git a/irc/responsebuffer.go b/irc/responsebuffer.go index bacfbc11..6dfeade8 100644 --- a/irc/responsebuffer.go +++ b/irc/responsebuffer.go @@ -193,6 +193,9 @@ func (rb *ResponseBuffer) sendBatchEnd(blocking bool) { // Starts a nested batch (see the ResponseBuffer struct definition for a description of // how this works) func (rb *ResponseBuffer) StartNestedBatch(batchType string, params ...string) (batchID string) { + if !rb.session.capabilities.Has(caps.Batch) { + return + } batchID = rb.session.generateBatchID() msgParams := make([]string, len(params)+2) msgParams[0] = "+" + batchID @@ -219,19 +222,6 @@ func (rb *ResponseBuffer) EndNestedBatch(batchID string) { rb.AddMessage(ircmsg.MakeMessage(nil, rb.target.server.name, "BATCH", "-"+batchID)) } -// Convenience to start a nested batch for history lines, at the highest level -// supported by the client (`history`, `chathistory`, or no batch, in descending order). -func (rb *ResponseBuffer) StartNestedHistoryBatch(params ...string) (batchID string) { - var batchType string - if rb.session.capabilities.Has(caps.Batch) { - batchType = "chathistory" - } - if batchType != "" { - batchID = rb.StartNestedBatch(batchType, params...) - } - return -} - // Send sends all messages in the buffer to the client. // Afterwards, the buffer is in an undefined state and MUST NOT be used further. // If `blocking` is true you MUST be sending to the client from its own goroutine.