From 857cd690b022d912344392b673574d7a6fe2b716 Mon Sep 17 00:00:00 2001 From: Shivaram Lingamneni Date: Tue, 30 Jun 2026 19:36:59 +0000 Subject: [PATCH 1/2] apply deferred fakelag immediately after execution If the client sends a long multiline, then pauses on its own before sending more data, we want to apply deferred fakelag during the pause, rather than upon receiving the next input line. --- irc/client.go | 18 ++++++++---------- 1 file changed, 8 insertions(+), 10 deletions(-) diff --git a/irc/client.go b/irc/client.go index c2b5fa30..a66798d0 100644 --- a/irc/client.go +++ b/irc/client.go @@ -263,10 +263,7 @@ func (s *Session) EndMultilineBatch(label string) (batch MultilineBatch, err err // heuristics to estimate how much data they used while fakelag was suspended fakelagBill := (batch.lenBytes / MaxLineLen) + 1 fakelagBillLines := (batch.message.LenLines() * 60) / MaxLineLen - if fakelagBill < fakelagBillLines { - fakelagBill = fakelagBillLines - } - s.deferredFakelagCount = fakelagBill + s.deferredFakelagCount = max(fakelagBill, fakelagBillLines) if batch.label == "" || batch.label != label || !batch.message.ValidMultiline() { err = errInvalidMultilineBatch @@ -744,12 +741,7 @@ func (client *Client) run(session *Session) { // XXX defer processing of command error parsing until after fakelag if client.registered { - // apply deferred fakelag - for i := 0; i < session.deferredFakelagCount; i++ { - session.fakelag.Touch("") - } - session.deferredFakelagCount = 0 - // touch for the current command + // apply fakelag var command string if err == nil { command = msg.Command @@ -797,6 +789,12 @@ func (client *Client) run(session *Session) { go session.client.run(session) break } + // apply deferred fakelag immediately, so as to coincide with any delay imposed + // on the client side (avoiding double penalization) + for range session.deferredFakelagCount { + session.fakelag.Touch("") + } + session.deferredFakelagCount = 0 } } From 8ec95e912a4e69bcf51cfcb46726163ea651e38d Mon Sep 17 00:00:00 2001 From: Shivaram Lingamneni Date: Tue, 30 Jun 2026 21:22:38 +0000 Subject: [PATCH 2/2] fix: don't close multiline batch twice --- irc/handlers.go | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/irc/handlers.go b/irc/handlers.go index 74777dc7..e64d788c 100644 --- a/irc/handlers.go +++ b/irc/handlers.go @@ -592,6 +592,9 @@ func batchHandlerMultiline(server *Server, client *Client, msg ircmsg.Message, r rb.Label = "" } } + if fail { + rb.session.EndMultilineBatch("") + } } else if tag[0] == '-' { batch, err := rb.session.EndMultilineBatch(tag[1:]) fail = (err != nil) @@ -609,7 +612,6 @@ func batchHandlerMultiline(server *Server, client *Client, msg ircmsg.Message, r } if fail { - rb.session.EndMultilineBatch("") if sendErrors { rb.Add(nil, server.name, "FAIL", "BATCH", "MULTILINE_INVALID", client.t("Invalid multiline batch")) }