From f58f8531b2c171cc1fec04d7ffbfb7e2a312b79c Mon Sep 17 00:00:00 2001 From: Valentin Lorentz Date: Sat, 10 Jul 2021 17:36:39 +0200 Subject: [PATCH] Restore support for multiple channels + single user --- irc/handlers.go | 35 ++++++++++++++++++++++++++--------- 1 file changed, 26 insertions(+), 9 deletions(-) diff --git a/irc/handlers.go b/irc/handlers.go index 697282e2..b45cd80e 100644 --- a/irc/handlers.go +++ b/irc/handlers.go @@ -1273,7 +1273,9 @@ func sajoinHandler(server *Server, client *Client, msg ircmsg.Message, rb *Respo } // KICK {,} {,} [] -// The number of channels must be either 1 or equal to the number of users +// RFC 2812 requires the number of channels to be either 1 or equal to +// the number of users. +// Addditionally, we support multiple channels and a single user. func kickHandler(server *Server, client *Client, msg ircmsg.Message, rb *ResponseBuffer) bool { hasPrivs := client.HasRoleCapabs("samode") channels := strings.Split(msg.Params[0], ",") @@ -1287,16 +1289,31 @@ func kickHandler(server *Server, client *Client, msg ircmsg.Message, rb *Respons channel string nick string } - kicks := make([]kickCmd, 0, len(users)) - channel := channels[0] - for index, user := range users { - if len(channels) > 1 { - channel = channels[index] + var kicks []kickCmd + if len(users) == 1 { + kicks = make([]kickCmd, 0, len(channels)) + // Single user, possibly multiple channels + user := users[0] + for _, channel := range channels { + if channel == "" { + continue // #679 + } + kicks = append(kicks, kickCmd{channel, user}) } - if channel == "" { - continue // #679 + } else { + // Multiple users, either a single channel or as many channels + // as users. + kicks = make([]kickCmd, 0, len(users)) + channel := channels[0] + for index, user := range users { + if len(channels) > 1 { + channel = channels[index] + } + if channel == "" { + continue // #679 + } + kicks = append(kicks, kickCmd{channel, user}) } - kicks = append(kicks, kickCmd{channel, user}) } var comment string