3
0
mirror of https://github.com/ergochat/ergo.git synced 2024-11-22 03:49:27 +01:00

clean up nested batch logic

This commit is contained in:
Shivaram Lingamneni 2023-06-01 04:43:13 -04:00
parent d082ec7ab9
commit 38a6d17ee5
5 changed files with 9 additions and 19 deletions

View File

@ -62,6 +62,8 @@ const (
RelaymsgTagName = "draft/relaymsg" RelaymsgTagName = "draft/relaymsg"
// BOT mode: https://ircv3.net/specs/extensions/bot-mode // BOT mode: https://ircv3.net/specs/extensions/bot-mode
BotTagName = "bot" BotTagName = "bot"
// https://ircv3.net/specs/extensions/chathistory
ChathistoryTargetsBatchType = "draft/chathistory-targets"
) )
func init() { func init() {

View File

@ -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) defer rb.EndNestedBatch(batchID)
for _, item := range items { for _, item := range items {

View File

@ -850,7 +850,7 @@ func (client *Client) replayPrivmsgHistory(rb *ResponseBuffer, items []history.I
if target == "" { if target == "" {
target = nick target = nick
} }
batchID = rb.StartNestedHistoryBatch(target) batchID = rb.StartNestedBatch(target, "chathistory")
isSelfMessage := func(item *history.Item) bool { isSelfMessage := func(item *history.Item) bool {
// XXX: Params[0] is the message target. if the source of this message is an in-memory // XXX: Params[0] is the message target. if the source of this message is an in-memory

View File

@ -655,10 +655,8 @@ func chathistoryHandler(server *Server, client *Client, msg ircmsg.Message, rb *
} else { } else {
// successful responses are sent as a chathistory or history batch // successful responses are sent as a chathistory or history batch
if listTargets { if listTargets {
if rb.session.capabilities.Has(caps.Batch) { // #2066 batchID := rb.StartNestedBatch(caps.ChathistoryTargetsBatchType)
batchID := rb.StartNestedBatch("draft/chathistory-targets") defer rb.EndNestedBatch(batchID)
defer rb.EndNestedBatch(batchID)
}
for _, target := range targets { for _, target := range targets {
name := server.UnfoldName(target.CfName) name := server.UnfoldName(target.CfName)
rb.Add(nil, server.name, "CHATHISTORY", "TARGETS", name, rb.Add(nil, server.name, "CHATHISTORY", "TARGETS", name,

View File

@ -193,6 +193,9 @@ func (rb *ResponseBuffer) sendBatchEnd(blocking bool) {
// Starts a nested batch (see the ResponseBuffer struct definition for a description of // Starts a nested batch (see the ResponseBuffer struct definition for a description of
// how this works) // how this works)
func (rb *ResponseBuffer) StartNestedBatch(batchType string, params ...string) (batchID string) { func (rb *ResponseBuffer) StartNestedBatch(batchType string, params ...string) (batchID string) {
if !rb.session.capabilities.Has(caps.Batch) {
return
}
batchID = rb.session.generateBatchID() batchID = rb.session.generateBatchID()
msgParams := make([]string, len(params)+2) msgParams := make([]string, len(params)+2)
msgParams[0] = "+" + batchID msgParams[0] = "+" + batchID
@ -219,19 +222,6 @@ func (rb *ResponseBuffer) EndNestedBatch(batchID string) {
rb.AddMessage(ircmsg.MakeMessage(nil, rb.target.server.name, "BATCH", "-"+batchID)) 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. // Send sends all messages in the buffer to the client.
// Afterwards, the buffer is in an undefined state and MUST NOT be used further. // 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. // If `blocking` is true you MUST be sending to the client from its own goroutine.