From 8a05a928afcb914e9a62519a00f5a968f8f902a6 Mon Sep 17 00:00:00 2001 From: Luke Bratch Date: Wed, 8 May 2019 21:22:02 +0100 Subject: Don't PART channels when another user PARTs. --- blabouncer.c | 18 ++++++++++++++---- 1 file changed, 14 insertions(+), 4 deletions(-) diff --git a/blabouncer.c b/blabouncer.c index 07461b8..2eabd11 100644 --- a/blabouncer.c +++ b/blabouncer.c @@ -7,7 +7,6 @@ // - Get CAP from server and relay to client // - Add blabouncer MOTD (375, 372, 376) // - "01:53:47 -!- ServerMode/#test [b] by irc.tghost.co.uk" on existing clients when new client connects -// - Other users PARTing causes us to PART // - We might not track new users JOINing a channel (only users who were already in a channel when we joined) // // Example WHOIS reply: @@ -452,10 +451,21 @@ int processircmessage(int *serversockfd, int *clientsockfd, char *str, int sourc return 1; } - // Server PART received? Remove from our local channel list. + // Server PART received? Remove from our local channel list if it's us. if (strncmp(tokens[1], "PART", strlen(tokens[1])) == 0) { - printf("Server PART found and it is: %s with length %zd! Next token is '%s'. Adding to local channel list.\n", tokens[0], strlen(tokens[0]), tokens[2]); - removechannel(channels, tokens[2]); + printf("Server PART found and it is: %s with length %zd! Next token is '%s'. Adding to local channel list if it's us.\n", tokens[0], strlen(tokens[0]), tokens[2]); + + // If the user PARTing is us, then we must have left a channel, so remove it from our local channel array. + // (If it's not us, then it's another user PARTing a channel, so just pass straight through to letting all our clients know.) + // Copy to a temporary string so we still have the original in case we need it + char *prefixcopy = strdup(tokens[0]); + stripprefix(prefixcopy); + if (strncmp(prefixcopy, ircdstrings->nickuserhost, strlen(tokens[0])) == 0) { + printf("Server PART: nickuserhost is ours ('%s' vs '%s').\n", prefixcopy, ircdstrings->nickuserhost); + removechannel(channels, tokens[2]); + } else { + printf("Server PART: nickuserhost is NOT ours ('%s' vs '%s').\n", prefixcopy, ircdstrings->nickuserhost); + } // And then send to all clients sendtoallclients(clientsockfd, fdmax, arr_clients, str, sourcefd); -- cgit v1.2.3