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 } } 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")) }