- // this is the part where we restrict the mode changes to PREFIXES:
- if(network()->prefixModes().contains(modes[c]) && modeIndex < params.count()) {
- IrcUser *ircUser = network()->ircUser(params[modeIndex]);
+ if(network()->prefixModes().contains(modes[c])) {
+ // user channel modes (op, voice, etc...)
+ if(paramOffset < params.count()) {
+ IrcUser *ircUser = network()->ircUser(params[paramOffset]);
+ if(add)
+ channel->addUserMode(ircUser, QString(modes[c]));
+ else
+ channel->removeUserMode(ircUser, QString(modes[c]));
+ } else {
+ qWarning() << "Received MODE with too few parameters:" << serverDecode(params);
+ }
+ paramOffset++;
+ } else {
+ // regular channel modes
+ QString value;
+ Network::ChannelModeType modeType = network()->channelModeType(modes[c]);
+ if(modeType == Network::A_CHANMODE || modeType == Network::B_CHANMODE || (modeType == Network::C_CHANMODE && add)) {
+ if(paramOffset < params.count()) {
+ value = params[paramOffset];
+ } else {
+ qWarning() << "Received MODE with too few parameters:" << serverDecode(params);
+ }
+ paramOffset++;
+ }
+