X-Git-Url: https://git.quassel-irc.org/?p=quassel.git;a=blobdiff_plain;f=src%2Fcore%2Fircserverhandler.cpp;h=53f6846bb7a2d00e02a1a807032c67ca0f1ccd97;hp=9df74478f89b5cf30b9da5cf8d1c6a070449d799;hb=c6df551bf5d6b2f33daa5235d320239fcca37688;hpb=0d4a48e61b990d0e909296489f7dc9ef8bf4ad07 diff --git a/src/core/ircserverhandler.cpp b/src/core/ircserverhandler.cpp index 9df74478..53f6846b 100644 --- a/src/core/ircserverhandler.cpp +++ b/src/core/ircserverhandler.cpp @@ -209,42 +209,46 @@ void IrcServerHandler::handleKick(QString prefix, QList params) { } void IrcServerHandler::handleMode(QString prefix, QList params) { + if(params.count() < 2) { + emit displayMsg(Message::Error, "", tr("Received invalid MODE from %s: %s").arg(prefix).arg(serverDecode(params).join(" "))); + return; + } + if(networkInfo()->isChannelName(params[0])) { + // Channel Modes + emit displayMsg(Message::Mode, serverDecode(params[0]), serverDecode(params).join(" "), prefix); + + IrcChannel *channel = networkInfo()->ircChannel(params.takeFirst()); + // FIXME: currently the IrcChannels only support PREFIX-Modes for users + // This cannot be fixed unless the SignalProxy() doesn't rely on methodIds anymore + QString modes = params.takeFirst(); + bool add = true; + int modeIndex = 0; + for(int c = 0; c < modes.length(); c++) { + if(modes[c] == '+') { + add = true; + continue; + } + if(modes[c] == '-') { + add = false; + continue; + } + + // this is the part where we restrict the mode changes to PREFIXES: + if(networkInfo()->prefixModes().contains(modes[c]) && modeIndex < params.count()) { + IrcUser *ircUser = networkInfo()->ircUser(params[modeIndex]); + if(add) + channel->addUserMode(ircUser, QString(modes[c])); + else + channel->removeUserMode(ircUser, QString(modes[c])); + } + modeIndex++; + } + } else { + // pure User Modes + emit displayMsg(Message::Mode, "", serverDecode(params).join(" "), prefix); } -// if(isChannelName(params[0])) { -// // TODO only channel-user modes supported by now -// QString prefixes = serverSupports["PrefixModes"].toString(); -// QString modes = params[1]; -// int p = 2; -// int m = 0; -// bool add = true; -// while(m < modes.length()) { -// if(modes[m] == '+') { add = true; m++; continue; } -// if(modes[m] == '-') { add = false; m++; continue; } -// if(prefixes.contains(modes[m])) { // it's a user channel mode -// Q_ASSERT(params.count() > m); -// QString nick = params[p++]; -// if(nicks.contains(nick)) { // sometimes, a server might try to set a MODE on a nick that is no longer there -// QVariantMap n = nicks[nick]; QVariantMap clist = n["Channels"].toMap(); QVariantMap chan = clist[params[0]].toMap(); -// QString mstr = chan["Mode"].toString(); -// add ? mstr += modes[m] : mstr.remove(modes[m]); -// chan["Mode"] = mstr; clist[params[0]] = chan; n["Channels"] = clist; nicks[nick] = n; -// emit nickUpdated(network, nick, n); -// } -// m++; -// } else { -// // TODO add more modes -// m++; -// } -// } -// emit displayMsg(Message::Mode, params[0], params.join(" "), prefix); -// } else { -// //Q_ASSERT(nicks.contains(params[0])); -// //QVariantMap n = nicks[params[0]].toMap(); -// //QString mode = n["Mode"].toString(); -// emit displayMsg(Message::Mode, "", params.join(" ")); -// } } void IrcServerHandler::handleNick(QString prefix, QList params) {