X-Git-Url: https://git.quassel-irc.org/?p=quassel.git;a=blobdiff_plain;f=src%2Fcore%2Fircserverhandler.cpp;h=3d7596dfb46dc97cb467f0f0dce73979096fe36e;hp=9bb6e1d5182b3a594624e9e9da27d22b0887f84c;hb=c8cb4218c158e9a4419520804e6972f2321684a1;hpb=fc46caf2059654d81251412a13f5db4d40803948;ds=sidebyside diff --git a/src/core/ircserverhandler.cpp b/src/core/ircserverhandler.cpp index 9bb6e1d5..3d7596df 100644 --- a/src/core/ircserverhandler.cpp +++ b/src/core/ircserverhandler.cpp @@ -170,7 +170,10 @@ void IrcServerHandler::handleJoin(const QString &prefix, const QList emit displayMsg(Message::Join, BufferInfo::ChannelBuffer, channel, channel, prefix); //qDebug() << "IrcServerHandler::handleJoin()" << prefix << params; ircuser->joinChannel(channel); - if(network()->isMe(ircuser)) networkConnection()->setChannelJoined(channel); + if(network()->isMe(ircuser)) { + networkConnection()->setChannelJoined(channel); + putCmd("MODE", params[0]); // we want to know the modes of the channel we just joined, so we ask politely + } } void IrcServerHandler::handleKick(const QString &prefix, const QList ¶ms) { @@ -204,11 +207,9 @@ void IrcServerHandler::handleMode(const QString &prefix, const QList emit displayMsg(Message::Mode, BufferInfo::ChannelBuffer, serverDecode(params[0]), serverDecode(params).join(" "), prefix); IrcChannel *channel = network()->ircChannel(params[0]); - // 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[1]; bool add = true; - int modeIndex = 2; + int paramOffset = 2; for(int c = 0; c < modes.length(); c++) { if(modes[c] == '+') { add = true; @@ -219,15 +220,36 @@ void IrcServerHandler::handleMode(const QString &prefix, const QList continue; } - // 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++; + } + if(add) - channel->addUserMode(ircUser, QString(modes[c])); + channel->addChannelMode(modes[c], value); else - channel->removeUserMode(ircUser, QString(modes[c])); + channel->removeChannelMode(modes[c], value); } - modeIndex++; } } else { @@ -411,7 +433,6 @@ void IrcServerHandler::handle005(const QString &prefix, const QList const int numParams = params.size(); if(numParams < 1) { qWarning() << "IrcServerHandler::handle005(): received RPL_ISUPPORT (005) with too few parameters:" << serverDecode(params); - return; } QString rpl_isupport_suffix = serverDecode(params.last()); @@ -701,6 +722,18 @@ void IrcServerHandler::handle320(const QString &prefix, const QList emit displayMsg(Message::Server, BufferInfo::StatusBuffer, "", tr("[Whois] %1").arg(serverDecode(params).join(" "))); } +/* RPL_CHANNELMODEIS - " " */ +void IrcServerHandler::handle324(const QString &prefix, const QList ¶ms) { + Q_UNUSED(prefix); + handleMode(prefix, params); +} + +/* RPL_??? - " " */ +void IrcServerHandler::handle329(const QString &prefix, const QList ¶ms) { + Q_UNUSED(prefix); + // FIXME implement this... +} + /* RPL_NOTOPIC */ void IrcServerHandler::handle331(const QString &prefix, const QList ¶ms) { Q_UNUSED(prefix);