From c6df551bf5d6b2f33daa5235d320239fcca37688 Mon Sep 17 00:00:00 2001 From: Marcus Eggenberger Date: Wed, 2 Jan 2008 15:59:56 +0000 Subject: [PATCH 1/1] - Implemented IrcServerHandler::handleMode(). In the current state only PREFIX modes (ovh etc...) are taken care of. Other modes would require changes to ircchannel.h that would break beakward compatibilty. - added overloaded functions to NetworkInfo for [new]Irc[User|Channel] that take a QByteArray as param which is automagically decoded (credit goes to sput). --- src/common/networkinfo.cpp | 16 ++++++++ src/common/networkinfo.h | 5 +++ src/core/ircserverhandler.cpp | 70 ++++++++++++++++++----------------- 3 files changed, 58 insertions(+), 33 deletions(-) diff --git a/src/common/networkinfo.cpp b/src/common/networkinfo.cpp index 62dacace..e0c3c75d 100644 --- a/src/common/networkinfo.cpp +++ b/src/common/networkinfo.cpp @@ -186,6 +186,10 @@ IrcUser *NetworkInfo::newIrcUser(const QString &hostmask) { return _ircUsers[nick]; } +IrcUser *NetworkInfo::newIrcUser(const QByteArray &hostmask) { + return newIrcUser(decodeString(hostmask)); +} + void NetworkInfo::removeIrcUser(IrcUser *ircuser) { QString nick = _ircUsers.key(ircuser); if(nick.isNull()) @@ -210,6 +214,10 @@ IrcUser *NetworkInfo::ircUser(QString nickname) const { return 0; } +IrcUser *NetworkInfo::ircUser(const QByteArray &nickname) const { + return ircUser(decodeString(nickname)); +} + QList NetworkInfo::ircUsers() const { return _ircUsers.values(); } @@ -234,6 +242,9 @@ IrcChannel *NetworkInfo::newIrcChannel(const QString &channelname) { return _ircChannels[channelname.toLower()]; } +IrcChannel *NetworkInfo::newIrcChannel(const QByteArray &channelname) { + return newIrcChannel(decodeString(channelname)); +} IrcChannel *NetworkInfo::ircChannel(QString channelname) { channelname = channelname.toLower(); @@ -243,6 +254,11 @@ IrcChannel *NetworkInfo::ircChannel(QString channelname) { return 0; } +IrcChannel *NetworkInfo::ircChannel(const QByteArray &channelname) { + return ircChannel(decodeString(channelname)); +} + + QList NetworkInfo::ircChannels() const { return _ircChannels.values(); } diff --git a/src/common/networkinfo.h b/src/common/networkinfo.h index 1f712fbb..093cb43c 100644 --- a/src/common/networkinfo.h +++ b/src/common/networkinfo.h @@ -75,11 +75,16 @@ public: QString support(const QString ¶m) const; IrcUser *newIrcUser(const QString &hostmask); + IrcUser *newIrcUser(const QByteArray &hostmask); IrcUser *ircUser(QString nickname) const; + IrcUser *ircUser(const QByteArray &nickname) const; QList ircUsers() const; IrcChannel *newIrcChannel(const QString &channelname); + IrcChannel *newIrcChannel(const QByteArray &channelname); IrcChannel *ircChannel(QString channelname); + IrcChannel *ircChannel(const QByteArray &channelname); + QList ircChannels() const; QTextCodec *codecForEncoding() const; 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) { -- 2.20.1