X-Git-Url: https://git.quassel-irc.org/?p=quassel.git;a=blobdiff_plain;f=src%2Fcore%2Fircserverhandler.cpp;h=3d7596dfb46dc97cb467f0f0dce73979096fe36e;hp=c2264ace6d356fc77aac71e02afc21e0f84379a1;hb=c8cb4218c158e9a4419520804e6972f2321684a1;hpb=6fe30667a4a4747e8fad048dad499f7d2390b044 diff --git a/src/core/ircserverhandler.cpp b/src/core/ircserverhandler.cpp index c2264ace..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()); @@ -506,6 +527,30 @@ void IrcServerHandler::handle301(const QString &prefix, const QList } } +// 305 RPL_UNAWAY +// ":You are no longer marked as being away" +void IrcServerHandler::handle305(const QString &prefix, const QList ¶ms) { + Q_UNUSED(prefix); + IrcUser *me = network()->me(); + if(me) + me->setAway(false); + + if(!params.isEmpty()) + emit displayMsg(Message::Server, BufferInfo::StatusBuffer, "", serverDecode(params[0])); +} + +// 306 RPL_NOWAWAY +// ":You have been marked as being away" +void IrcServerHandler::handle306(const QString &prefix, const QList ¶ms) { + Q_UNUSED(prefix); + IrcUser *me = network()->me(); + if(me) + me->setAway(true); + + if(!params.isEmpty()) + emit displayMsg(Message::Server, BufferInfo::StatusBuffer, "", serverDecode(params[0])); +} + /* RPL_WHOISSERVICE - " is registered nick" */ void IrcServerHandler::handle307(const QString &prefix, const QList ¶ms) { Q_UNUSED(prefix) @@ -677,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);