Fixing $FU in some server handlers. ircUser() does not always return a valid pointer...
[quassel.git] / src / core / ircserverhandler.cpp
index 09b53d3..3f15015 100644 (file)
@@ -155,9 +155,15 @@ void IrcServerHandler::defaultHandler(QString cmd, QString prefix, QList<QByteAr
         emit displayMsg(Message::Error, "", params.join(" "), prefix);
         break;
       // Server error messages, display them in red. First param will be appended.
-      case 401: case 402: case 403: case 404: case 406: case 408: case 415: case 421: case 442:
-      { QString p = params.takeFirst();
-        emit displayMsg(Message::Error, "", params.join(" ") + " " + p, prefix);
+      case 401: 
+      { QString channelName = params.takeFirst();
+        emit displayMsg(Message::Error, "", params.join(" ") + " " + channelName, prefix);
+        emit displayMsg(Message::Error, channelName, params.join(" ") + " " + channelName, prefix);
+        break;
+      }
+      case 402: case 403: case 404: case 406: case 408: case 415: case 421: case 442:
+      { QString channelName = params.takeFirst();
+        emit displayMsg(Message::Error, "", params.join(" ") + " " + channelName, prefix);
         break;
       }
       // Server error messages which will be displayed with a colon between the first param and the rest
@@ -326,12 +332,6 @@ void IrcServerHandler::handlePrivmsg(QString prefix, QList<QByteArray> params) {
   // it's possible to pack multiple privmsgs into one param using ctcp
   // - > we let the ctcpHandler do the work
   networkConnection->ctcpHandler()->parse(Message::Plain, prefix, target, userDecode(ircuser->nick(), params[1]));
-//   QStringList messages = 
-
-//   foreach(QString message, messages) {
-//     emit displayMsg(Message::Plain, target, message, prefix);
-//   }
-  
 }
 
 void IrcServerHandler::handleQuit(QString prefix, QList<QByteArray> params) {
@@ -417,12 +417,17 @@ void IrcServerHandler::handle301(QString prefix, QList<QByteArray> params) {
   if(_whois) {
     emit displayMsg(Message::Server, "", tr("[Whois] %1 is away: \"%2\"").arg(nickName).arg(awayMessage));
   } else {
-    int now = QDateTime::currentDateTime().toTime_t();
-    int silenceTime = 60;
-    if(ircuser && ircuser->lastAwayMessage() + silenceTime < now) {
+    if(ircuser) {
+      int now = QDateTime::currentDateTime().toTime_t();
+      int silenceTime = 60;
+      if(ircuser->lastAwayMessage() + silenceTime < now) {
+        emit displayMsg(Message::Server, params[0], tr("%1 is away: \"%2\"").arg(nickName).arg(awayMessage));
+      }
+      ircuser->setLastAwayMessage(now);
+    } else {
+      // probably should not happen
       emit displayMsg(Message::Server, params[0], tr("%1 is away: \"%2\"").arg(nickName).arg(awayMessage));
     }
-    ircuser->setLastAwayMessage(now);
   }
 }
 
@@ -537,13 +542,15 @@ void IrcServerHandler::handle352(QString prefix, QList<QByteArray> params) {
   Q_UNUSED(prefix)
   QString channel = serverDecode(params[0]);
   IrcUser *ircuser = network()->ircUser(serverDecode(params[4]));
-  ircuser->setUser(serverDecode(params[1]));
-  ircuser->setHost(serverDecode(params[2]));
+  if(ircuser) {
+    ircuser->setUser(serverDecode(params[1]));
+    ircuser->setHost(serverDecode(params[2]));
 
-  bool away = serverDecode(params[5]).startsWith("G") ? true : false;
-  ircuser->setAway(away);
-  ircuser->setServer(serverDecode(params[3])); 
-  ircuser->setRealName(serverDecode(params.last()).section(" ", 1));
+    bool away = serverDecode(params[5]).startsWith("G") ? true : false;
+    ircuser->setAway(away);
+    ircuser->setServer(serverDecode(params[3])); 
+    ircuser->setRealName(serverDecode(params.last()).section(" ", 1));
+  }
 
   emit displayMsg(Message::Server, "", tr("[Who] %1").arg(serverDecode(params).join(" ")));
 }