From 3adffa2ce33d0918c1e9d2b075557ae2712b638e Mon Sep 17 00:00:00 2001 From: Shane Synan Date: Sun, 28 Feb 2016 22:26:17 -0600 Subject: [PATCH] Limit user mode updates from WHO to given channel Limit user mode updates in WHO replies to the given channel, unless a '*' is specified indicating any channel. IrcUsers are shared between channels, while channel user modes are not. Showing user modes in the Quassel tooltips need fixed client-side in IrcUserItem::toolTip(), checking the current channel. --- src/core/coresessioneventprocessor.cpp | 18 ++++++++++++++++-- 1 file changed, 16 insertions(+), 2 deletions(-) diff --git a/src/core/coresessioneventprocessor.cpp b/src/core/coresessioneventprocessor.cpp index 0468d970..82da7817 100644 --- a/src/core/coresessioneventprocessor.cpp +++ b/src/core/coresessioneventprocessor.cpp @@ -942,8 +942,22 @@ void CoreSessionEventProcessor::processIrcEvent352(IrcEvent *e) // Some IRC servers decide to not follow the spec, returning only -some- of the user // modes in WHO despite listing them all in NAMES. For now, assume it can only add // and not take away. *sigh* - if (!validModes.isEmpty()) - ircuser->addUserModes(validModes); + if (!validModes.isEmpty()) { + if (channel != "*") { + // Channel-specific modes received, apply to given channel only + IrcChannel *ircChan = e->network()->ircChannel(channel); + if (ircChan) { + // Do one mode at a time + // TODO Better way of syncing this without breaking protocol? + for (int i = 0; i < validModes.count(); ++i) { + ircChan->addUserMode(ircuser, validModes.at(i)); + } + } + } else { + // Modes apply to the user everywhere + ircuser->addUserModes(validModes); + } + } } } -- 2.20.1