Merging NetworkConnection into CoreNetwork.
[quassel.git] / src / core / ircserverhandler.cpp
index 93076ec..06f968c 100644 (file)
 
 #include "coresession.h"
 #include "coreirclisthelper.h"
-#include "networkconnection.h"
-#include "network.h"
 #include "identity.h"
 #include "ctcphandler.h"
 
 #include "ircuser.h"
-#include "ircchannel.h"
+#include "coreircchannel.h"
 #include "logger.h"
 
 #include <QDebug>
 
-IrcServerHandler::IrcServerHandler(NetworkConnection *parent)
+IrcServerHandler::IrcServerHandler(CoreNetwork *parent)
   : BasicHandler(parent),
     _whois(false)
 {
 }
 
 IrcServerHandler::~IrcServerHandler() {
-
 }
 
 /*! Handle a raw message string sent by the server. We try to find a suitable handler, otherwise we call a default handler. */
@@ -154,8 +151,8 @@ void IrcServerHandler::defaultHandler(QString cmd, const QString &prefix, const
          // many nets define their own WHOIS fields. we fetch those not in need of special attention here:
          emit displayMsg(Message::Server, BufferInfo::StatusBuffer, "", "[Whois] " + params.join(" "), prefix);
        } else {
-         if(networkConnection()->coreSession()->ircListHelper()->requestInProgress(network()->networkId()))
-           networkConnection()->coreSession()->ircListHelper()->reportError(params.join(" "));
+         if(coreSession()->ircListHelper()->requestInProgress(network()->networkId()))
+           coreSession()->ircListHelper()->reportError(params.join(" "));
          else
            emit displayMsg(Message::Error, BufferInfo::StatusBuffer, "", cmd + " " + params.join(" "), prefix);
        }
@@ -180,7 +177,7 @@ void IrcServerHandler::handleJoin(const QString &prefix, const QList<QByteArray>
   //qDebug() << "IrcServerHandler::handleJoin()" << prefix << params;
   ircuser->joinChannel(channel);
   if(network()->isMe(ircuser)) {
-    networkConnection()->setChannelJoined(channel);
+    network()->setChannelJoined(channel);
     putCmd("MODE", params[0]); // we want to know the modes of the channel we just joined, so we ask politely
   }
 }
@@ -204,7 +201,7 @@ void IrcServerHandler::handleKick(const QString &prefix, const QList<QByteArray>
     msg = victim->nick();
 
   emit displayMsg(Message::Kick, BufferInfo::ChannelBuffer, channel, msg, prefix);
-  //if(network()->isMe(victim)) networkConnection()->setKickedFromChannel(channel);
+  //if(network()->isMe(victim)) network()->setKickedFromChannel(channel);
 }
 
 void IrcServerHandler::handleMode(const QString &prefix, const QList<QByteArray> &params) {
@@ -314,7 +311,7 @@ void IrcServerHandler::handleNick(const QString &prefix, const QList<QByteArray>
     ? newnick
     : prefix;
 
-  emit nickChanged(newnick, oldnick);
+  coreSession()->renameBuffer(network()->networkId(), newnick, oldnick);
   foreach(QString channel, ircuser->channels())
     emit displayMsg(Message::Nick, BufferInfo::ChannelBuffer, channel, newnick, sender);
   
@@ -326,12 +323,34 @@ void IrcServerHandler::handleNotice(const QString &prefix, const QList<QByteArra
     return;
 
   QString target = serverDecode(params[0]);
-  if(prefix.isEmpty() || target == "AUTH")
+
+  // special treatment for welcome messages like:
+  // :ChanServ!ChanServ@services. NOTICE egst :[#apache] Welcome, this is #apache. Please read the in-channel topic message. This channel is being logged by IRSeekBot. If you have any question please see http://blog.freenode.net/?p=68
+  if(!network()->isChannelName(target)) {
+    QString msg = serverDecode(params[1]);
+    QRegExp welcomeRegExp("^\\[([^\\]]+)\\] ");
+    if(welcomeRegExp.indexIn(msg) != -1) {
+      QString channelname = welcomeRegExp.cap(1);
+      msg = msg.mid(welcomeRegExp.matchedLength());
+      CoreIrcChannel *chan = static_cast<CoreIrcChannel *>(network()->ircChannel(channelname)); // we only have CoreIrcChannels in the core, so this cast is safe
+      if(chan && !chan->receivedWelcomeMsg()) {
+       chan->setReceivedWelcomeMsg();
+       emit displayMsg(Message::Notice, BufferInfo::ChannelBuffer, channelname, msg, prefix);
+       return;
+      }
+    }
+  }
+
+  if(prefix.isEmpty() || target == "AUTH") {
     target = "";
-  else if(!network()->isChannelName(target))
-    target = nickFromMask(prefix);
+  } else {
+    if(!target.isEmpty() && network()->prefixes().contains(target[0]))
+      target = target.mid(1);
+    if(!network()->isChannelName(target))
+      target = nickFromMask(prefix);
+  }
 
-  networkConnection()->ctcpHandler()->parse(Message::Notice, prefix, target, params[1]);
+  network()->ctcpHandler()->parse(Message::Notice, prefix, target, params[1]);
 }
 
 void IrcServerHandler::handlePart(const QString &prefix, const QList<QByteArray> &params) {
@@ -352,7 +371,7 @@ void IrcServerHandler::handlePart(const QString &prefix, const QList<QByteArray>
     msg = userDecode(ircuser->nick(), params[1]);
 
   emit displayMsg(Message::Part, BufferInfo::ChannelBuffer, channel, msg, prefix);
-  if(network()->isMe(ircuser)) networkConnection()->setChannelParted(channel);
+  if(network()->isMe(ircuser)) network()->setChannelParted(channel);
 }
 
 void IrcServerHandler::handlePing(const QString &prefix, const QList<QByteArray> &params) {
@@ -398,13 +417,12 @@ void IrcServerHandler::handlePrivmsg(const QString &prefix, const QList<QByteArr
     ? QByteArray("")
     : params[1];
 
-  // are we the target?
-  if(network()->isMyNick(target))
-    target = nickFromMask(ircuser->nick());
+  if(!network()->isChannelName(target))
+    target = nickFromMask(prefix);
 
   // 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, msg);
+  network()->ctcpHandler()->parse(Message::Plain, prefix, target, msg);
 }
 
 void IrcServerHandler::handleQuit(const QString &prefix, const QList<QByteArray> &params) {
@@ -418,7 +436,7 @@ void IrcServerHandler::handleQuit(const QString &prefix, const QList<QByteArray>
   foreach(QString channel, ircuser->channels())
     emit displayMsg(Message::Quit, BufferInfo::ChannelBuffer, channel, msg, prefix);
 
-  network()->removeIrcUser(nickFromMask(prefix));
+  ircuser->quit();
 }
 
 void IrcServerHandler::handleTopic(const QString &prefix, const QList<QByteArray> &params) {
@@ -569,8 +587,12 @@ void IrcServerHandler::handle305(const QString &prefix, const QList<QByteArray>
   if(me)
     me->setAway(false);
 
-  if(!params.isEmpty())
-    emit displayMsg(Message::Server, BufferInfo::StatusBuffer, "", serverDecode(params[0]));
+  if(!network()->autoAwayActive()) {
+    if(!params.isEmpty())
+      emit displayMsg(Message::Server, BufferInfo::StatusBuffer, "", serverDecode(params[0]));
+  } else {
+    network()->setAutoAwayActive(false);
+  }
 }
 
 // 306  RPL_NOWAWAY
@@ -581,7 +603,7 @@ void IrcServerHandler::handle306(const QString &prefix, const QList<QByteArray>
   if(me)
     me->setAway(true);
 
-  if(!params.isEmpty())
+  if(!params.isEmpty() && !network()->autoAwayActive())
     emit displayMsg(Message::Server, BufferInfo::StatusBuffer, "", serverDecode(params[0]));
 }
 
@@ -682,7 +704,7 @@ void IrcServerHandler::handle315(const QString &prefix, const QList<QByteArray>
     return;
 
   QStringList p = serverDecode(params);
-  if(networkConnection()->setAutoWhoDone(p[0])) {
+  if(network()->setAutoWhoDone(p[0])) {
     return; // stay silent
   }
   p.takeLast(); // should be "End of WHO list"
@@ -774,7 +796,7 @@ void IrcServerHandler::handle322(const QString &prefix, const QList<QByteArray>
   default:
     break;
   }
-  if(!networkConnection()->coreSession()->ircListHelper()->addChannel(network()->networkId(), channelName, userCount, topic))
+  if(!coreSession()->ircListHelper()->addChannel(network()->networkId(), channelName, userCount, topic))
     emit displayMsg(Message::Server, BufferInfo::StatusBuffer, "", tr("Channel %1 has %2 users. Topic is: %3").arg(channelName).arg(userCount).arg(topic));
 }
 
@@ -783,7 +805,7 @@ void IrcServerHandler::handle323(const QString &prefix, const QList<QByteArray>
   Q_UNUSED(prefix)
   Q_UNUSED(params)
 
-  if(!networkConnection()->coreSession()->ircListHelper()->endOfChannelList(network()->networkId()))
+  if(!coreSession()->ircListHelper()->endOfChannelList(network()->networkId()))
     emit displayMsg(Message::Server, BufferInfo::StatusBuffer, "", tr("End of channel list"));
 }
        
@@ -862,7 +884,7 @@ void IrcServerHandler::handle352(const QString &prefix, const QList<QByteArray>
     ircuser->setRealName(serverDecode(params.last()).section(" ", 1));
   }
 
-  if(!networkConnection()->isAutoWhoInProgress(channel)) {
+  if(!network()->isAutoWhoInProgress(channel)) {
     emit displayMsg(Message::Server, BufferInfo::StatusBuffer, "", tr("[Who] %1").arg(serverDecode(params).join(" ")));
   }
 }
@@ -952,7 +974,7 @@ void IrcServerHandler::handle433(const QString &prefix, const QList<QByteArray>
 /* */
 
 void IrcServerHandler::tryNextNick(const QString &errnick) {
-  QStringList desiredNicks = networkConnection()->coreSession()->identity(network()->identity())->nicks();
+  QStringList desiredNicks = coreSession()->identity(network()->identity())->nicks();
   int nextNick = desiredNicks.indexOf(errnick) + 1;
   if(desiredNicks.size() > nextNick) {
     putCmd("NICK", serverEncode(desiredNicks[nextNick]));