- Implemented IrcServerHandler::handleMode(). In the current state only
authorMarcus Eggenberger <egs@quassel-irc.org>
Wed, 2 Jan 2008 15:59:56 +0000 (15:59 +0000)
committerMarcus Eggenberger <egs@quassel-irc.org>
Wed, 2 Jan 2008 15:59:56 +0000 (15:59 +0000)
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
src/common/networkinfo.h
src/core/ircserverhandler.cpp

index 62dacac..e0c3c75 100644 (file)
@@ -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<IrcUser *> 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<IrcChannel *> NetworkInfo::ircChannels() const {
   return _ircChannels.values();
 }
index 1f712fb..093cb43 100644 (file)
@@ -75,11 +75,16 @@ public:
   QString support(const QString &param) const;
 
   IrcUser *newIrcUser(const QString &hostmask);
+  IrcUser *newIrcUser(const QByteArray &hostmask);
   IrcUser *ircUser(QString nickname) const;
+  IrcUser *ircUser(const QByteArray &nickname) const;
   QList<IrcUser *> ircUsers() const;
 
   IrcChannel *newIrcChannel(const QString &channelname);
+  IrcChannel *newIrcChannel(const QByteArray &channelname);
   IrcChannel *ircChannel(QString channelname);
+  IrcChannel *ircChannel(const QByteArray &channelname);
+  
   QList<IrcChannel *> ircChannels() const;
 
   QTextCodec *codecForEncoding() const;
index 9df7447..53f6846 100644 (file)
@@ -209,42 +209,46 @@ void IrcServerHandler::handleKick(QString prefix, QList<QByteArray> params) {
 }
 
 void IrcServerHandler::handleMode(QString prefix, QList<QByteArray> 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<QByteArray> params) {