More good news:
authorManuel Nickschas <sputnick@quassel-irc.org>
Wed, 25 Oct 2006 15:50:19 +0000 (15:50 +0000)
committerManuel Nickschas <sputnick@quassel-irc.org>
Wed, 25 Oct 2006 15:50:19 +0000 (15:50 +0000)
* Switched channel widget to HTML, using <table> for a nice layout now.
* More server messages parsed, including JOIN, PART, QUIT, KICK, NICK.
* More tidbits.

13 files changed:
core/core.cpp
core/coreproxy.h
gui/channelwidget.cpp
gui/channelwidget.h
gui/channelwidget.ui
gui/guiproxy.cpp
gui/guiproxy.h
main/message.h
main/proxy_common.h
main/util.cpp
main/util.h
network/server.cpp
network/server.h

index 44c925a..9ccbd21 100644 (file)
@@ -69,6 +69,7 @@ void Core::connectToIrc(QStringList networks) {
       connect(server, SIGNAL(topicSet(QString, QString, QString)), coreProxy, SLOT(csTopicSet(QString, QString, QString)));
       connect(server, SIGNAL(setNicks(QString, QString, QStringList)), coreProxy, SLOT(csSetNicks(QString, QString, QStringList)));
       connect(server, SIGNAL(nickAdded(QString, QString, VarMap)), coreProxy, SLOT(csNickAdded(QString, QString, VarMap)));
       connect(server, SIGNAL(topicSet(QString, QString, QString)), coreProxy, SLOT(csTopicSet(QString, QString, QString)));
       connect(server, SIGNAL(setNicks(QString, QString, QStringList)), coreProxy, SLOT(csSetNicks(QString, QString, QStringList)));
       connect(server, SIGNAL(nickAdded(QString, QString, VarMap)), coreProxy, SLOT(csNickAdded(QString, QString, VarMap)));
+      connect(server, SIGNAL(nickRenamed(QString, QString, QString)), coreProxy, SLOT(csNickRenamed(QString, QString, QString)));
       connect(server, SIGNAL(nickRemoved(QString, QString)), coreProxy, SLOT(csNickRemoved(QString, QString)));
       connect(server, SIGNAL(nickUpdated(QString, QString, VarMap)), coreProxy, SLOT(csNickUpdated(QString, QString, VarMap)));
       connect(server, SIGNAL(ownNickSet(QString, QString)), coreProxy, SLOT(csOwnNickSet(QString, QString)));
       connect(server, SIGNAL(nickRemoved(QString, QString)), coreProxy, SLOT(csNickRemoved(QString, QString)));
       connect(server, SIGNAL(nickUpdated(QString, QString, VarMap)), coreProxy, SLOT(csNickUpdated(QString, QString, VarMap)));
       connect(server, SIGNAL(ownNickSet(QString, QString)), coreProxy, SLOT(csOwnNickSet(QString, QString)));
index 8cdea83..4f6185a 100644 (file)
@@ -48,6 +48,7 @@ class CoreProxy : public QObject {
     inline void csSetNicks(QString net, QString buf, QStringList nicks) { send(CS_SET_NICKS, net, buf, nicks); }
     inline void csNickAdded(QString net, QString nick, VarMap props)    { send(CS_NICK_ADDED, net, nick, props); }
     inline void csNickRemoved(QString net, QString nick)                { send(CS_NICK_REMOVED, net, nick); }
     inline void csSetNicks(QString net, QString buf, QStringList nicks) { send(CS_SET_NICKS, net, buf, nicks); }
     inline void csNickAdded(QString net, QString nick, VarMap props)    { send(CS_NICK_ADDED, net, nick, props); }
     inline void csNickRemoved(QString net, QString nick)                { send(CS_NICK_REMOVED, net, nick); }
+    inline void csNickRenamed(QString net, QString oldn, QString newn)  { send(CS_NICK_RENAMED, net, oldn, newn); }
     inline void csNickUpdated(QString net, QString nick, VarMap props)  { send(CS_NICK_UPDATED, net, nick, props); }
     inline void csOwnNickSet(QString net, QString nick)                 { send(CS_OWN_NICK_SET, net, nick); }
 
     inline void csNickUpdated(QString net, QString nick, VarMap props)  { send(CS_NICK_UPDATED, net, nick, props); }
     inline void csOwnNickSet(QString net, QString nick)                 { send(CS_OWN_NICK_SET, net, nick); }
 
index 5053654..17e85e7 100644 (file)
@@ -20,6 +20,8 @@
 
 #include "channelwidget.h"
 #include "guiproxy.h"
 
 #include "channelwidget.h"
 #include "guiproxy.h"
+#include "global.h"
+#include "util.h"
 
 #include <QtGui>
 #include <iostream>
 
 #include <QtGui>
 #include <iostream>
@@ -40,14 +42,16 @@ ChannelWidget::ChannelWidget(QString netname, QString bufname, QString own, QWid
   //ui.inputEdit->setFocus();
 
   // Define standard colors
   //ui.inputEdit->setFocus();
 
   // Define standard colors
-  stdCol = QColor("black");
-  noticeCol = QColor("darkblue");
-  serverCol = QColor("darkblue");
-  errorCol = QColor("red");
-  joinCol = QColor("green");
-  quitCol = QColor("firebrick");
-  partCol = QColor("firebrick");
-  
+  stdCol = "black";
+  noticeCol = "darkblue";
+  serverCol = "darkblue";
+  errorCol = "red";
+  joinCol = "green";
+  quitCol = "firebrick";
+  partCol = "firebrick";
+  kickCol = "firebrick";
+  nickCol = "magenta";
+
 }
 
 void ChannelWidget::enterPressed() {
 }
 
 void ChannelWidget::enterPressed() {
@@ -56,11 +60,14 @@ void ChannelWidget::enterPressed() {
 }
 
 void ChannelWidget::recvMessage(Message msg) {
 }
 
 void ChannelWidget::recvMessage(Message msg) {
-  QString s;
-  QColor c = stdCol;
+  QString s, n;
+  QString c = stdCol;
+  QString user = userFromMask(msg.sender);
+  QString host = hostFromMask(msg.sender);
+  QString nick = nickFromMask(msg.sender);
   switch(msg.type) {
     case Message::Msg:
   switch(msg.type) {
     case Message::Msg:
-      c = stdCol; s = QString("<%1> %2").arg(msg.sender).arg(msg.msg);
+      c = stdCol; n = QString("&lt;%1&gt;").arg(nick); s = msg.msg;
       break;
     case Message::Server:
       c = serverCol; s = msg.msg;
       break;
     case Message::Server:
       c = serverCol; s = msg.msg;
@@ -69,14 +76,51 @@ void ChannelWidget::recvMessage(Message msg) {
       c = errorCol; s = msg.msg;
       break;
     case Message::Join:
       c = errorCol; s = msg.msg;
       break;
     case Message::Join:
-      c = joinCol; s = msg.msg;
+      c = joinCol;
+      s = QString(tr("--&gt; %1 (%2@%3) has joined %4")).arg(nick).arg(user).arg(host).arg(bufferName());
+      break;
+    case Message::Part:
+      c = partCol;
+      s = QString(tr("&lt;-- %1 (%2@%3) has left %4")).arg(nick).arg(user).arg(host).arg(bufferName());
+      if(!msg.msg.isEmpty()) s = QString("%1 (%2)").arg(s).arg(msg.msg);
+      break;
+    case Message::Kick:
+      { c = kickCol;
+        QString victim = msg.msg.section(" ", 0, 0);
+        QString kickmsg = msg.msg.section(" ", 1);
+        s = QString(tr("--&gt; %1 has kicked %2 from %3")).arg(nick).arg(victim).arg(bufferName());
+        if(!kickmsg.isEmpty()) s = QString("%1 (%2)").arg(s).arg(kickmsg);
+      }
+      break;
+    case Message::Quit:
+      c = quitCol;
+      s = QString(tr("&lt;-- %1 (%2@%3) has quit")).arg(nick).arg(user).arg(host);
+      if(!msg.msg.isEmpty()) s = QString("%1 (%2)").arg(s).arg(msg.msg);
+      break;
+    case Message::Nick:
+      c = nickCol;
+      if(nick == msg.msg) s = QString(tr("&lt;-&gt; You are now known as %1")).arg(msg.msg);
+      else s = QString(tr("&lt;-&gt; %1 is now known as %2")).arg(nick).arg(msg.msg);
       break;
     default:
       break;
     default:
-      c = stdCol; s = QString("[%1] %2").arg(msg.sender).arg(msg.msg);
+      c = stdCol; n = QString("[%1]").arg(msg.sender); s = msg.msg;
       break;
   }
       break;
   }
-  ui.chatWidget->setTextColor(c);
-  ui.chatWidget->insertPlainText(QString("[%2] %1\n").arg(s).arg(msg.timeStamp.toLocalTime().toString("hh:mm:ss")));
+  QString html = QString("<table cellspacing=0 cellpadding=0><tr>"
+      "<td width=50><div style=\"color:%2;\">[%1]</div></td>")
+      .arg(msg.timeStamp.toLocalTime().toString("hh:mm:ss")).arg("darkblue");
+  if(!n.isEmpty())
+    html += QString("<td width=100><div align=right style=\"white-space:nowrap;margin-left:6px;color:%2;\">%1</div></td>")
+        .arg(n).arg("mediumseagreen");
+  html += QString("<td><div style=\"margin-left:6px;color:%2;\">%1</div></td>""</tr></table>")
+      .arg(s).arg(c);
+  ui.chatWidget->append(html);
+  //ui.chatWidget->append(QString("<table border=1 cellspacing=0 cellpadding=0><tr><td>%1</td><td width=100 style=border-right-width:1px;><div style=margin-left:8px; margin-right:8px;>%2</div></td><td style=color:firebrick>&nbsp;%3</td></tr></table>")
+      //.arg(msg.timeStamp.toLocalTime().toString("hh:mm:ss")).arg(nick).arg(s));
+  //ui.chatWidget->setTextColor(stdCol);
+  //ui.chatWidget->append(QString("[%1] ").arg(msg.timeStamp.toLocalTime().toString("hh:mm:ss")));
+  //ui.chatWidget->setTextColor(c);
+  //ui.chatWidget->append(s + "\n");
   //ui.chatWidget->insertHtml(QString("<table><tr><td>[12:13]</td><td width=20><div align=right>[nickname]</div></td><td>This is the Message!</td></tr>"
   //    "<tr><td>[12:13]</td><td><div align=right>[nick]</div></td><td>This is the Message!</td></tr>"
   //    "<tr><td>[12:13]</td><td><div align=right>[looongnickname]</div></td><td>This is the Message!</td></tr>"
   //ui.chatWidget->insertHtml(QString("<table><tr><td>[12:13]</td><td width=20><div align=right>[nickname]</div></td><td>This is the Message!</td></tr>"
   //    "<tr><td>[12:13]</td><td><div align=right>[nick]</div></td><td>This is the Message!</td></tr>"
   //    "<tr><td>[12:13]</td><td><div align=right>[looongnickname]</div></td><td>This is the Message!</td></tr>"
@@ -109,6 +153,12 @@ void ChannelWidget::updateNick(QString nick, VarMap props) {
   updateNickList();
 }
 
   updateNickList();
 }
 
+void ChannelWidget::renameNick(QString oldnick, QString newnick) {
+  QVariant v = nicks.take(oldnick);
+  nicks[newnick] = v;
+  updateNickList();
+}
+
 void ChannelWidget::removeNick(QString nick) {
   nicks[nick].toMap().remove(nick);
   updateNickList();
 void ChannelWidget::removeNick(QString nick) {
   nicks[nick].toMap().remove(nick);
   updateNickList();
@@ -165,6 +215,7 @@ IrcWidget::IrcWidget(QWidget *parent) : QWidget(parent) {
   connect(guiProxy, SIGNAL(csSetNicks(QString, QString, QStringList)), this, SLOT(setNicks(QString, QString, QStringList)));
   connect(guiProxy, SIGNAL(csNickAdded(QString, QString, VarMap)), this, SLOT(addNick(QString, QString, VarMap)));
   connect(guiProxy, SIGNAL(csNickRemoved(QString, QString)), this, SLOT(removeNick(QString, QString)));
   connect(guiProxy, SIGNAL(csSetNicks(QString, QString, QStringList)), this, SLOT(setNicks(QString, QString, QStringList)));
   connect(guiProxy, SIGNAL(csNickAdded(QString, QString, VarMap)), this, SLOT(addNick(QString, QString, VarMap)));
   connect(guiProxy, SIGNAL(csNickRemoved(QString, QString)), this, SLOT(removeNick(QString, QString)));
+  connect(guiProxy, SIGNAL(csNickRenamed(QString, QString, QString)), this, SLOT(renameNick(QString, QString, QString)));
   connect(guiProxy, SIGNAL(csNickUpdated(QString, QString, VarMap)), this, SLOT(updateNick(QString, QString, VarMap)));
   connect(guiProxy, SIGNAL(csOwnNickSet(QString, QString)), this, SLOT(setOwnNick(QString, QString)));
   connect(this, SIGNAL(sendInput( QString, QString, QString )), guiProxy, SLOT(gsUserInput(QString, QString, QString)));
   connect(guiProxy, SIGNAL(csNickUpdated(QString, QString, VarMap)), this, SLOT(updateNick(QString, QString, VarMap)));
   connect(guiProxy, SIGNAL(csOwnNickSet(QString, QString)), this, SLOT(setOwnNick(QString, QString)));
   connect(this, SIGNAL(sendInput( QString, QString, QString )), guiProxy, SLOT(gsUserInput(QString, QString, QString)));
@@ -173,7 +224,7 @@ IrcWidget::IrcWidget(QWidget *parent) : QWidget(parent) {
 ChannelWidget * IrcWidget::getBuffer(QString net, QString buf) {
   QString key = net + buf;
   if(!buffers.contains(key)) {
 ChannelWidget * IrcWidget::getBuffer(QString net, QString buf) {
   QString key = net + buf;
   if(!buffers.contains(key)) {
-    ChannelWidget *cw = new ChannelWidget(net, buf, ownNick);
+    ChannelWidget *cw = new ChannelWidget(net, buf, ownNick[net]);
     connect(cw, SIGNAL(sendInput(QString, QString, QString)), this, SLOT(userInput(QString, QString, QString)));
     ui.tabWidget->addTab(cw, net+buf);
     ui.tabWidget->setCurrentWidget(cw);
     connect(cw, SIGNAL(sendInput(QString, QString, QString)), this, SLOT(userInput(QString, QString, QString)));
     ui.tabWidget->addTab(cw, net+buf);
     ui.tabWidget->setCurrentWidget(cw);
@@ -190,7 +241,7 @@ void IrcWidget::recvMessage(QString net, QString buf, Message msg) {
 }
 
 void IrcWidget::recvStatusMsg(QString net, QString msg) {
 }
 
 void IrcWidget::recvStatusMsg(QString net, QString msg) {
-  recvMessage(net, "", QString("[STATUS] %1").arg(msg));
+  recvMessage(net, "", Message(Message::Server, QString("[STATUS] %1").arg(msg)));
 
 }
 
 
 }
 
@@ -209,7 +260,9 @@ void IrcWidget::setNicks(QString net, QString buf, QStringList nicks) {
 }
 
 void IrcWidget::addNick(QString net, QString nick, VarMap props) {
 }
 
 void IrcWidget::addNick(QString net, QString nick, VarMap props) {
-  nicks[net].toMap()[nick] = props;
+  VarMap netnicks = nicks[net].toMap();
+  netnicks[nick] = props;
+  nicks[net] = netnicks;
   VarMap chans = props["Channels"].toMap();
   QStringList c = chans.keys();
   foreach(QString bufname, c) {
   VarMap chans = props["Channels"].toMap();
   QStringList c = chans.keys();
   foreach(QString bufname, c) {
@@ -217,6 +270,20 @@ void IrcWidget::addNick(QString net, QString nick, VarMap props) {
   }
 }
 
   }
 }
 
+void IrcWidget::renameNick(QString net, QString oldnick, QString newnick) {
+  VarMap netnicks = nicks[net].toMap();
+  qDebug() << "renNICK:"<<oldnick<<newnick;
+  Q_ASSERT(netnicks.contains(oldnick));
+  QStringList chans = netnicks[oldnick].toMap()["Channels"].toMap().keys(); qDebug() << "l:" << chans;
+  foreach(QString c, chans) {
+    qDebug() << net << c;
+    getBuffer(net, c)->renameNick(oldnick, newnick);
+  }
+  QVariant v = netnicks.take(oldnick);
+  netnicks[newnick] = v;
+  nicks[net] = netnicks;
+}
+
 void IrcWidget::updateNick(QString net, QString nick, VarMap props) {
   QStringList oldchans = nicks[net].toMap()[nick].toMap()["Channels"].toMap().keys();
   QStringList newchans = props["Channels"].toMap().keys();
 void IrcWidget::updateNick(QString net, QString nick, VarMap props) {
   QStringList oldchans = nicks[net].toMap()[nick].toMap()["Channels"].toMap().keys();
   QStringList newchans = props["Channels"].toMap().keys();
@@ -227,7 +294,9 @@ void IrcWidget::updateNick(QString net, QString nick, VarMap props) {
   foreach(QString c, oldchans) {
     if(!newchans.contains(c)) getBuffer(net, c)->removeNick(nick);
   }
   foreach(QString c, oldchans) {
     if(!newchans.contains(c)) getBuffer(net, c)->removeNick(nick);
   }
-  nicks[net].toMap()[nick] = props;
+  VarMap netnicks = nicks[net].toMap();
+  netnicks[nick] = props;
+  nicks[net] = netnicks;
 }
 
 void IrcWidget::removeNick(QString net, QString nick) {
 }
 
 void IrcWidget::removeNick(QString net, QString nick) {
@@ -235,13 +304,13 @@ void IrcWidget::removeNick(QString net, QString nick) {
   foreach(QString bufname, chans.keys()) {
     getBuffer(net, bufname)->removeNick(nick);
   }
   foreach(QString bufname, chans.keys()) {
     getBuffer(net, bufname)->removeNick(nick);
   }
-  qDebug() << nicks;
-  nicks[net].toMap().remove(nick);
-  qDebug() << nicks;
+  VarMap netnicks = nicks[net].toMap();
+  netnicks.remove(nick);
+  nicks[net] = netnicks;
 }
 
 void IrcWidget::setOwnNick(QString net, QString nick) {
 }
 
 void IrcWidget::setOwnNick(QString net, QString nick) {
-  ownNick = nick;
+  ownNick[net] = nick;
   foreach(ChannelWidget *cw, buffers.values()) {
     if(cw->networkName() == net) cw->setOwnNick(nick);
   }
   foreach(ChannelWidget *cw, buffers.values()) {
     if(cw->networkName() == net) cw->setOwnNick(nick);
   }
index e1d2f2e..a9b3328 100644 (file)
@@ -44,6 +44,7 @@ class ChannelWidget : public QWidget {
     void setTopic(QString);
     void setNicks(QStringList);
     void addNick(QString nick, VarMap props);
     void setTopic(QString);
     void setNicks(QStringList);
     void addNick(QString nick, VarMap props);
+    void renameNick(QString oldnick, QString newnick);
     void removeNick(QString nick);
     void updateNick(QString nick, VarMap props);
     void setOwnNick(QString nick);
     void removeNick(QString nick);
     void updateNick(QString nick, VarMap props);
     void setOwnNick(QString nick);
@@ -56,7 +57,8 @@ class ChannelWidget : public QWidget {
   private:
     Ui::ChannelWidget ui;
 
   private:
     Ui::ChannelWidget ui;
 
-    QColor stdCol, errorCol, noticeCol, joinCol, quitCol, partCol, serverCol;
+    QString stdCol, errorCol, noticeCol, joinCol, quitCol, partCol, kickCol, serverCol, nickCol;
+    QString CSS;
     QString _networkName;
     QString _bufferName;
     VarMap nicks;
     QString _networkName;
     QString _bufferName;
     VarMap nicks;
@@ -76,6 +78,7 @@ class IrcWidget : public QWidget {
     void setNicks(QString, QString, QStringList);
     void addNick(QString net, QString nick, VarMap props);
     void removeNick(QString net, QString nick);
     void setNicks(QString, QString, QStringList);
     void addNick(QString net, QString nick, VarMap props);
     void removeNick(QString net, QString nick);
+    void renameNick(QString net, QString oldnick, QString newnick);
     void updateNick(QString net, QString nick, VarMap props);
     void setOwnNick(QString net, QString nick);
 
     void updateNick(QString net, QString nick, VarMap props);
     void setOwnNick(QString net, QString nick);
 
@@ -89,7 +92,7 @@ class IrcWidget : public QWidget {
     Ui::IrcWidget ui;
     QHash<QString, ChannelWidget *> buffers;
     VarMap nicks;
     Ui::IrcWidget ui;
     QHash<QString, ChannelWidget *> buffers;
     VarMap nicks;
-    QString ownNick;
+    QHash<QString, QString> ownNick;
 
     ChannelWidget * getBuffer(QString net, QString buf);
 };
 
     ChannelWidget * getBuffer(QString net, QString buf);
 };
index 3bc85eb..7cedde0 100644 (file)
@@ -31,7 +31,7 @@
   </property>
   <layout class="QVBoxLayout" >
    <property name="margin" >
   </property>
   <layout class="QVBoxLayout" >
    <property name="margin" >
-    <number>1</number>
+    <number>9</number>
    </property>
    <property name="spacing" >
     <number>6</number>
    </property>
    <property name="spacing" >
     <number>6</number>
     </layout>
    </item>
    <item>
     </layout>
    </item>
    <item>
-    <widget class="QSplitter" name="splitter" >
-     <property name="sizePolicy" >
-      <sizepolicy>
-       <hsizetype>7</hsizetype>
-       <vsizetype>5</vsizetype>
-       <horstretch>0</horstretch>
-       <verstretch>0</verstretch>
-      </sizepolicy>
-     </property>
-     <property name="lineWidth" >
-      <number>1</number>
+    <layout class="QHBoxLayout" >
+     <property name="margin" >
+      <number>0</number>
      </property>
      </property>
-     <property name="orientation" >
-      <enum>Qt::Horizontal</enum>
+     <property name="spacing" >
+      <number>6</number>
      </property>
      </property>
-     <widget class="QTextBrowser" name="chatWidget" >
-      <property name="sizePolicy" >
-       <sizepolicy>
-        <hsizetype>7</hsizetype>
-        <vsizetype>5</vsizetype>
-        <horstretch>4</horstretch>
-        <verstretch>0</verstretch>
-       </sizepolicy>
-      </property>
-      <property name="font" >
-       <font>
-        <family>Monospace</family>
-       </font>
-      </property>
-     </widget>
-     <widget class="QTreeWidget" name="nickTree" >
-      <property name="sizePolicy" >
-       <sizepolicy>
-        <hsizetype>5</hsizetype>
-        <vsizetype>5</vsizetype>
-        <horstretch>1</horstretch>
-        <verstretch>0</verstretch>
-       </sizepolicy>
-      </property>
-      <property name="layoutDirection" >
-       <enum>Qt::LeftToRight</enum>
-      </property>
-      <property name="dragEnabled" >
-       <bool>true</bool>
-      </property>
-      <property name="textElideMode" >
-       <enum>Qt::ElideRight</enum>
-      </property>
-      <property name="rootIsDecorated" >
-       <bool>true</bool>
-      </property>
-      <property name="sortingEnabled" >
-       <bool>false</bool>
-      </property>
-      <property name="animated" >
-       <bool>false</bool>
-      </property>
-      <property name="columnCount" >
-       <number>1</number>
-      </property>
-      <column>
-       <property name="text" >
-        <string>32 Users</string>
+     <item>
+      <widget class="QTextEdit" name="chatWidget" >
+       <property name="sizePolicy" >
+        <sizepolicy>
+         <hsizetype>7</hsizetype>
+         <vsizetype>7</vsizetype>
+         <horstretch>4</horstretch>
+         <verstretch>0</verstretch>
+        </sizepolicy>
        </property>
        </property>
-      </column>
-      <item>
-       <property name="text" >
-        <string>@ Operators</string>
+       <property name="font" >
+        <font>
+         <family>Monospace</family>
+        </font>
        </property>
        </property>
-       <item>
-        <property name="text" >
-         <string>New Sub Item</string>
-        </property>
-       </item>
-       <item>
-        <property name="text" >
-         <string>New Item</string>
-        </property>
-       </item>
-       <item>
-        <property name="text" >
-         <string>New Item</string>
-        </property>
-       </item>
-      </item>
-      <item>
-       <property name="text" >
-        <string>4 Voiced</string>
+       <property name="readOnly" >
+        <bool>true</bool>
        </property>
        </property>
-       <item>
-        <property name="text" >
-         <string>New Item</string>
-        </property>
-       </item>
-       <item>
-        <property name="text" >
-         <string>New Item</string>
-        </property>
-       </item>
-       <item>
-        <property name="text" >
-         <string>New Item</string>
-        </property>
-       </item>
-      </item>
-      <item>
-       <property name="text" >
-        <string>19 Users</string>
+      </widget>
+     </item>
+     <item>
+      <widget class="QTreeWidget" name="nickTree" >
+       <property name="sizePolicy" >
+        <sizepolicy>
+         <hsizetype>5</hsizetype>
+         <vsizetype>5</vsizetype>
+         <horstretch>1</horstretch>
+         <verstretch>0</verstretch>
+        </sizepolicy>
        </property>
        </property>
-       <item>
+       <property name="layoutDirection" >
+        <enum>Qt::LeftToRight</enum>
+       </property>
+       <property name="dragEnabled" >
+        <bool>true</bool>
+       </property>
+       <property name="textElideMode" >
+        <enum>Qt::ElideRight</enum>
+       </property>
+       <property name="sortingEnabled" >
+        <bool>false</bool>
+       </property>
+       <property name="animated" >
+        <bool>false</bool>
+       </property>
+       <property name="columnCount" >
+        <number>1</number>
+       </property>
+       <column>
         <property name="text" >
         <property name="text" >
-         <string>New Sub Item</string>
+         <string>32 Users</string>
         </property>
         </property>
-       </item>
+       </column>
        <item>
         <property name="text" >
        <item>
         <property name="text" >
-         <string>New Item</string>
+         <string>@ Operators</string>
         </property>
         </property>
+        <item>
+         <property name="text" >
+          <string>New Sub Item</string>
+         </property>
+        </item>
+        <item>
+         <property name="text" >
+          <string>New Item</string>
+         </property>
+        </item>
+        <item>
+         <property name="text" >
+          <string>New Item</string>
+         </property>
+        </item>
        </item>
        <item>
         <property name="text" >
        </item>
        <item>
         <property name="text" >
-         <string>New Item</string>
+         <string>4 Voiced</string>
         </property>
         </property>
+        <item>
+         <property name="text" >
+          <string>New Item</string>
+         </property>
+        </item>
+        <item>
+         <property name="text" >
+          <string>New Item</string>
+         </property>
+        </item>
+        <item>
+         <property name="text" >
+          <string>New Item</string>
+         </property>
+        </item>
        </item>
        <item>
         <property name="text" >
        </item>
        <item>
         <property name="text" >
-         <string>New Item</string>
+         <string>19 Users</string>
         </property>
         </property>
+        <item>
+         <property name="text" >
+          <string>New Sub Item</string>
+         </property>
+        </item>
+        <item>
+         <property name="text" >
+          <string>New Item</string>
+         </property>
+        </item>
+        <item>
+         <property name="text" >
+          <string>New Item</string>
+         </property>
+        </item>
+        <item>
+         <property name="text" >
+          <string>New Item</string>
+         </property>
+        </item>
        </item>
        </item>
-      </item>
-     </widget>
-    </widget>
+      </widget>
+     </item>
+    </layout>
    </item>
    <item>
     <layout class="QHBoxLayout" >
    </item>
    <item>
     <layout class="QHBoxLayout" >
      </property>
      <item>
       <widget class="QComboBox" name="ownNick" >
      </property>
      <item>
       <widget class="QComboBox" name="ownNick" >
-       <property name="sizeAdjustPolicy" >
-        <enum>QComboBox::AdjustToContents</enum>
-       </property>
+       <item>
+        <property name="text" >
+         <string>mainNick</string>
+        </property>
+       </item>
+       <item>
+        <property name="text" >
+         <string>altNick</string>
+        </property>
+       </item>
       </widget>
      </item>
      <item>
       </widget>
      </item>
      <item>
   <tabstop>nickTree</tabstop>
   <tabstop>topicEdit</tabstop>
   <tabstop>chanSettingsButton</tabstop>
   <tabstop>nickTree</tabstop>
   <tabstop>topicEdit</tabstop>
   <tabstop>chanSettingsButton</tabstop>
-  <tabstop>chatWidget</tabstop>
  </tabstops>
  <resources/>
  <connections/>
  </tabstops>
  <resources/>
  <connections/>
index 9848ff3..6dd5ea3 100644 (file)
@@ -37,6 +37,7 @@ void GUIProxy::recv(CoreSignal sig, QVariant arg1, QVariant arg2, QVariant arg3)
     case CS_SET_NICKS: emit csSetNicks(arg1.toString(), arg2.toString(), arg3.toStringList()); break;
     case CS_NICK_ADDED: emit csNickAdded(arg1.toString(), arg2.toString(), arg3.toMap()); break;
     case CS_NICK_REMOVED: emit csNickRemoved(arg1.toString(), arg2.toString()); break;
     case CS_SET_NICKS: emit csSetNicks(arg1.toString(), arg2.toString(), arg3.toStringList()); break;
     case CS_NICK_ADDED: emit csNickAdded(arg1.toString(), arg2.toString(), arg3.toMap()); break;
     case CS_NICK_REMOVED: emit csNickRemoved(arg1.toString(), arg2.toString()); break;
+    case CS_NICK_RENAMED: emit csNickRenamed(arg1.toString(), arg2.toString(), arg3.toString()); break;
     case CS_NICK_UPDATED: emit csNickUpdated(arg1.toString(), arg2.toString(), arg3.toMap()); break;
     case CS_OWN_NICK_SET: emit csOwnNickSet(arg1.toString(), arg2.toString()); break;
 
     case CS_NICK_UPDATED: emit csNickUpdated(arg1.toString(), arg2.toString(), arg3.toMap()); break;
     case CS_OWN_NICK_SET: emit csOwnNickSet(arg1.toString(), arg2.toString()); break;
 
index a068b6d..92ac0d2 100644 (file)
@@ -58,6 +58,7 @@ class GUIProxy : public QObject {
     void csSetNicks(QString, QString, QStringList);
     void csNickAdded(QString, QString, VarMap);
     void csNickRemoved(QString, QString);
     void csSetNicks(QString, QString, QStringList);
     void csNickAdded(QString, QString, VarMap);
     void csNickRemoved(QString, QString);
+    void csNickRenamed(QString, QString, QString);
     void csNickUpdated(QString, QString, VarMap);
     void csOwnNickSet(QString, QString);
 
     void csNickUpdated(QString, QString, VarMap);
     void csOwnNickSet(QString, QString);
 
index c1954f5..80b2b8b 100644 (file)
@@ -35,7 +35,7 @@ struct Message {
   QString msg;
   QDateTime timeStamp;
 
   QString msg;
   QDateTime timeStamp;
 
-  Message(QString _msg = "", QString _sender = "", Type _type = Msg, Flags _flags = None)
+  Message(Type _type = Msg, QString _msg = "", QString _sender = "", Flags _flags = None)
   : msg(_msg), sender(_sender), type(_type), flags(_flags) { timeStamp = QDateTime::currentDateTime().toUTC(); };
 
 };
   : msg(_msg), sender(_sender), type(_type), flags(_flags) { timeStamp = QDateTime::currentDateTime().toUTC(); };
 
 };
index 64dd228..e06a9ac 100644 (file)
@@ -26,7 +26,7 @@ enum GUISignal { GS_CLIENT_INIT, GS_USER_INPUT, GS_REQUEST_CONNECT, GS_UPDATE_GL
 };
 
 enum CoreSignal { CS_CORE_STATE, CS_DISPLAY_MSG, CS_DISPLAY_STATUS_MSG, CS_UPDATE_GLOBAL_DATA,
 };
 
 enum CoreSignal { CS_CORE_STATE, CS_DISPLAY_MSG, CS_DISPLAY_STATUS_MSG, CS_UPDATE_GLOBAL_DATA,
-  CS_MODE_SET, CS_TOPIC_SET, CS_SET_NICKS, CS_NICK_ADDED, CS_NICK_REMOVED, CS_NICK_UPDATED,
+  CS_MODE_SET, CS_TOPIC_SET, CS_SET_NICKS, CS_NICK_ADDED, CS_NICK_REMOVED, CS_NICK_RENAMED, CS_NICK_UPDATED,
   CS_OWN_NICK_SET,
 
 };
   CS_OWN_NICK_SET,
 
 };
index 71c1913..c0ef888 100644 (file)
 
 #include <QtCore>
 
 
 #include <QtCore>
 
+QString nickFromMask(QString mask) {
+  return mask.section('!', 0, 0);
+}
+
+QString userFromMask(QString mask) {
+  QString userhost = mask.section('!', 1);
+  if(userhost.isEmpty()) return QString();
+  return userhost.section('@', 0, 0);
+}
+
+QString hostFromMask(QString mask) {
+  QString userhost = mask.section('!', 1);
+  if(userhost.isEmpty()) return QString();
+  return userhost.section('@', 1);
+}
+
 void writeDataToDevice(QIODevice *dev, const QVariant &item) {
   QByteArray block;
   QDataStream out(&block, QIODevice::WriteOnly);
 void writeDataToDevice(QIODevice *dev, const QVariant &item) {
   QByteArray block;
   QDataStream out(&block, QIODevice::WriteOnly);
index 1df034c..e7b74f9 100644 (file)
 
 #include <QIODevice>
 #include <QVariant>
 
 #include <QIODevice>
 #include <QVariant>
+#include <QString>
+
+QString nickFromMask(QString mask);
+QString userFromMask(QString mask);
+QString hostFromMask(QString mask);
 
 /**
  *  Writes a QVariant to a device. The data item is prefixed with the resulting blocksize,
 
 /**
  *  Writes a QVariant to a device. The data item is prefixed with the resulting blocksize,
index e4d37a6..bf78eaf 100644 (file)
@@ -18,6 +18,7 @@
  *   59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.             *
  ***************************************************************************/
 
  *   59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.             *
  ***************************************************************************/
 
+#include "util.h"
 #include "global.h"
 #include "server.h"
 #include "cmdcodes.h"
 #include "global.h"
 #include "server.h"
 #include "cmdcodes.h"
@@ -89,20 +90,21 @@ void Server::socketStateChanged(QAbstractSocket::SocketState state) {
   //qDebug() << "Socket state changed: " << state;
 }
 
   //qDebug() << "Socket state changed: " << state;
 }
 
-QString Server::nickFromMask(QString mask) {
-  return mask.section('!', 0, 0);
-}
-
-QString Server::userFromMask(QString mask) {
-  QString userhost = mask.section('!', 1);
-  if(userhost.isEmpty()) return QString();
-  return userhost.section('@', 0, 0);
-}
-
-QString Server::hostFromMask(QString mask) {
-  QString userhost = mask.section('!', 1);
-  if(userhost.isEmpty()) return QString();
-  return userhost.section('@', 1);
+QString Server::updateNickFromMask(QString mask) {
+  QString user = userFromMask(mask);
+  QString host = hostFromMask(mask);
+  QString nick = nickFromMask(mask);
+  if(nicks.contains(nick) && !user.isEmpty() && !host.isEmpty()) {
+    VarMap n = nicks[nick].toMap();
+    if(n["User"].toString() != user || n["Host"].toString() != host) {
+      if(!n["User"].toString().isEmpty() || !n["Host"].toString().isEmpty())
+        qWarning(QString("Strange: Hostmask for nick %1 has changed!").arg(nick).toAscii());
+      n["User"] = user; n["Host"] = host;
+      nicks[nick] = n;
+      emit nickUpdated(network, nick, n);
+    }
+  }
+  return nick;
 }
 
 void Server::userInput(QString net, QString buf, QString msg) {
 }
 
 void Server::userInput(QString net, QString buf, QString msg) {
@@ -176,7 +178,7 @@ void Server::handleServerMsg(QString msg) {
       defaultServerHandler(cmd, prefix, params);
     }
   } catch(Exception e) {
       defaultServerHandler(cmd, prefix, params);
     }
   } catch(Exception e) {
-    emit displayMsg("", Message(e.msg(), "", Message::Error));
+    emit displayMsg("", Message(Message::Error, e.msg()));
   }
 }
 
   }
 }
 
@@ -188,7 +190,7 @@ void Server::defaultServerHandler(QString cmd, QString prefix, QStringList param
     switch(num) {
       // Welcome, status, info messages. Just display these.
       case 2: case 3: case 4: case 5: case 251: case 252: case 253: case 254: case 255: case 372: case 375:
     switch(num) {
       // Welcome, status, info messages. Just display these.
       case 2: case 3: case 4: case 5: case 251: case 252: case 253: case 254: case 255: case 372: case 375:
-        emit displayMsg("", Message(params.join(" "), prefix, Message::Server));
+        emit displayMsg("", Message(Message::Server, params.join(" "), prefix));
         break;
       // Ignore these commands.
       case 366: case 376:
         break;
       // Ignore these commands.
       case 366: case 376:
@@ -196,11 +198,11 @@ void Server::defaultServerHandler(QString cmd, QString prefix, QStringList param
 
       // Everything else will be marked in red, so we can add them somewhere.
       default:
 
       // Everything else will be marked in red, so we can add them somewhere.
       default:
-        emit displayMsg("", Message(cmd + " " + params.join(" "), prefix, Message::Error));
+        emit displayMsg("", Message(Message::Error, cmd + " " + params.join(" "), prefix));
     }
     //qDebug() << prefix <<":"<<cmd<<params;
   } else {
     }
     //qDebug() << prefix <<":"<<cmd<<params;
   } else {
-    emit displayMsg("", Message(QString("Unknown: ") + cmd + " " + params.join(" "), prefix, Message::Error));
+    emit displayMsg("", Message(Message::Error, QString("Unknown: ") + cmd + " " + params.join(" "), prefix));
     //qDebug() << prefix <<":"<<cmd<<params;
   }
 }
     //qDebug() << prefix <<":"<<cmd<<params;
   }
 }
@@ -222,12 +224,12 @@ void Server::handleUserMsg(QString bufname, QString usrMsg) {
       defaultUserHandler(cmd, msg, buffer);
     }
   } catch(Exception e) {
       defaultUserHandler(cmd, msg, buffer);
     }
   } catch(Exception e) {
-    emit displayMsg("", Message(e.msg(), "", Message::Error));
+    emit displayMsg("", Message(Message::Error, e.msg()));
   }
 }
 
 void Server::defaultUserHandler(QString cmd, QString msg, Buffer *buf) {
   }
 }
 
 void Server::defaultUserHandler(QString cmd, QString msg, Buffer *buf) {
-  emit displayMsg("", Message(QString("Error: %1 %2").arg(cmd).arg(msg), "", Message::Error));
+  emit displayMsg("", Message(Message::Error, QString("Error: %1 %2").arg(cmd).arg(msg)));
 
 }
 
 
 }
 
@@ -254,14 +256,14 @@ void Server::handleUserSay(QString msg, Buffer *buf) {
   QStringList params;
   params << buf->name() << msg;
   putCmd("PRIVMSG", params);
   QStringList params;
   params << buf->name() << msg;
   putCmd("PRIVMSG", params);
-  emit displayMsg(params[0], Message(msg, currentNick, Message::Msg, Message::Self));
+  emit displayMsg(params[0], Message(Message::Msg, msg, currentNick, Message::Self));
 }
 
 /**********************************************************************************/
 
 void Server::handleServerJoin(QString prefix, QStringList params) {
   Q_ASSERT(params.count() == 1);
 }
 
 /**********************************************************************************/
 
 void Server::handleServerJoin(QString prefix, QStringList params) {
   Q_ASSERT(params.count() == 1);
-  QString nick = nickFromMask(prefix);
+  QString nick = updateNickFromMask(prefix);
   if(nick == currentNick) {
     Q_ASSERT(!buffers.contains(params[0]));  // cannot join a buffer twice!
     Buffer *buf = new Buffer(params[0]);
   if(nick == currentNick) {
     Q_ASSERT(!buffers.contains(params[0]));  // cannot join a buffer twice!
     Buffer *buf = new Buffer(params[0]);
@@ -280,24 +282,77 @@ void Server::handleServerJoin(QString prefix, QStringList params) {
       VarMap chans;
       chans[params[0]] = VarMap();
       n["Channels"] = chans;
       VarMap chans;
       chans[params[0]] = VarMap();
       n["Channels"] = chans;
-      n["Nick"] = nick;
       n["User"] = userFromMask(prefix);
       n["Host"] = hostFromMask(prefix);
       nicks[nick] = n;
       emit nickAdded(network, nick, n);
     }
       n["User"] = userFromMask(prefix);
       n["Host"] = hostFromMask(prefix);
       nicks[nick] = n;
       emit nickAdded(network, nick, n);
     }
-    QString user = n["User"].toString(); QString host = n["Host"].toString();
-    if(user.isEmpty() || host.isEmpty()) emit displayMsg(params[0], Message(tr("%1 has joined %2").arg(nick).arg(params[0]), "", Message::Join));
-    else emit displayMsg(params[0], Message(tr("%1 (%2@%3) has joined %4").arg(nick).arg(user).arg(host).arg(params[0]), "", Message::Join));
+    emit displayMsg(params[0], Message(Message::Join, params[0], prefix));
   }
 }
 
   }
 }
 
+void Server::handleServerKick(QString prefix, QStringList params) {
+  QString kicker = updateNickFromMask(prefix);
+  QString nick = params[1];
+  Q_ASSERT(nicks.contains(nick));
+  VarMap n = nicks[nick].toMap();
+  VarMap chans = n["Channels"].toMap();
+  Q_ASSERT(chans.contains(params[0]));
+  chans.remove(params[0]);
+  QString msg = nick;
+  if(params.count() > 2) msg = QString("%1 %2").arg(msg).arg(params[2]);
+  emit displayMsg(params[0], Message(Message::Kick, msg, prefix));
+  if(chans.count() > 0) {
+    n["Channels"] = chans;
+    nicks[nick] = n;
+    emit nickUpdated(network, nick, n);
+  } else {
+    nicks.remove(nick);
+    emit nickRemoved(network, nick);
+  }
+}
 
 
+void Server::handleServerNick(QString prefix, QStringList params) {
+  QString oldnick = updateNickFromMask(prefix);
+  QString newnick = params[0];
+  QVariant v = nicks.take(oldnick);
+  nicks[newnick] = v;
+  VarMap chans = v.toMap()["Channels"].toMap();
+  foreach(QString c, chans.keys()) {
+    if(oldnick != currentNick) { emit displayMsg(c, Message(Message::Nick, newnick, prefix)); }
+    else { emit displayMsg(c, Message(Message::Nick, newnick, newnick)); }
+  }
+  emit nickRenamed(network, oldnick, newnick);
+  if(oldnick == currentNick) {
+    currentNick == newnick;
+    emit ownNickSet(network, newnick);
+  }
+}
 
 void Server::handleServerNotice(QString prefix, QStringList params) {
 
 void Server::handleServerNotice(QString prefix, QStringList params) {
-  Message msg(params[1], prefix, Message::Notice);
-  if(prefix == currentServer) emit displayMsg("", Message(params[1], prefix, Message::Server));
-  else emit displayMsg("", Message(params[1], prefix, Message::Notice));
+  //Message msg(Message::Notice, params[1], prefix);
+  if(prefix == currentServer) emit displayMsg("", Message(Message::Server, params[1], prefix));
+  else emit displayMsg("", Message(Message::Notice, params[1], prefix));
+}
+
+void Server::handleServerPart(QString prefix, QStringList params) {
+  QString nick = updateNickFromMask(prefix);
+  Q_ASSERT(nicks.contains(nick));
+  VarMap n = nicks[nick].toMap();
+  VarMap chans = n["Channels"].toMap();
+  Q_ASSERT(chans.contains(params[0]));
+  chans.remove(params[0]);
+  QString msg;
+  if(params.count() > 1) msg = params[1];
+  emit displayMsg(params[0], Message(Message::Part, msg, prefix));
+  if(chans.count() > 0) {
+    n["Channels"] = chans;
+    nicks[nick] = n;
+    emit nickUpdated(network, nick, n);
+  } else {
+    nicks.remove(nick);
+    emit nickRemoved(network, nick);
+  }
 }
 
 void Server::handleServerPing(QString prefix, QStringList params) {
 }
 
 void Server::handleServerPing(QString prefix, QStringList params) {
@@ -305,16 +360,28 @@ void Server::handleServerPing(QString prefix, QStringList params) {
 }
 
 void Server::handleServerPrivmsg(QString prefix, QStringList params) {
 }
 
 void Server::handleServerPrivmsg(QString prefix, QStringList params) {
-  emit displayMsg(params[0], Message(params[1], nickFromMask(prefix), Message::Msg));
+  updateNickFromMask(prefix);
+  emit displayMsg(params[0], Message(Message::Msg, params[1], prefix));
 
 }
 
 
 }
 
+void Server::handleServerQuit(QString prefix, QStringList params) {
+  QString nick = updateNickFromMask(prefix);
+  Q_ASSERT(nicks.contains(nick));
+  VarMap chans = nicks[nick].toMap()["Channels"].toMap();
+  foreach(QString c, chans.keys()) {
+    emit displayMsg(c, Message(Message::Quit, params[0], prefix));
+  }
+  nicks.remove(nick);
+  emit nickRemoved(network, nick);
+}
+
 /* RPL_WELCOME */
 void Server::handleServer001(QString prefix, QStringList params) {
   currentServer = prefix;
   currentNick = params[0];
   emit ownNickSet(network, currentNick);
 /* RPL_WELCOME */
 void Server::handleServer001(QString prefix, QStringList params) {
   currentServer = prefix;
   currentNick = params[0];
   emit ownNickSet(network, currentNick);
-  emit displayMsg("", Message(params[1], prefix, Message::Server));
+  emit displayMsg("", Message(Message::Server, params[1], prefix));
 }
 
 /* RPL_NOTOPIC */
 }
 
 /* RPL_NOTOPIC */
@@ -325,12 +392,13 @@ void Server::handleServer331(QString prefix, QStringList params) {
 /* RPL_TOPIC */
 void Server::handleServer332(QString prefix, QStringList params) {
   emit topicSet(network, params[0], params[1]);
 /* RPL_TOPIC */
 void Server::handleServer332(QString prefix, QStringList params) {
   emit topicSet(network, params[0], params[1]);
-  emit displayMsg(params[0], Message(tr("Topic for %1 is \"%2\"").arg(params[0]).arg(params[1]), "", Message::Server));
+  emit displayMsg(params[0], Message(Message::Server, tr("Topic for %1 is \"%2\"").arg(params[0]).arg(params[1])));
 }
 
 /* Topic set by... */
 void Server::handleServer333(QString prefix, QStringList params) {
 }
 
 /* Topic set by... */
 void Server::handleServer333(QString prefix, QStringList params) {
-  emit displayMsg(params[0], Message(tr("Topic set by %1 on %2").arg(params[1]).arg(QDateTime::fromTime_t(params[2].toUInt()).toString()), "", Message::Server));
+  emit displayMsg(params[0], Message(Message::Server,
+                  tr("Topic set by %1 on %2").arg(params[1]).arg(QDateTime::fromTime_t(params[2].toUInt()).toString())));
 }
 
 /* RPL_NAMREPLY */
 }
 
 /* RPL_NAMREPLY */
index c5a3daa..48bce3e 100644 (file)
@@ -67,6 +67,7 @@ class Server : public QThread {
     void disconnected();
 
     void nickAdded(QString network, QString nick, VarMap props);
     void disconnected();
 
     void nickAdded(QString network, QString nick, VarMap props);
+    void nickRenamed(QString network, QString oldnick, QString newnick);
     void nickRemoved(QString network, QString nick);
     void nickUpdated(QString network, QString nick, VarMap props);
     void modeSet(QString network, QString target, QString mode);
     void nickRemoved(QString network, QString nick);
     void nickUpdated(QString network, QString nick, VarMap props);
     void modeSet(QString network, QString target, QString mode);
@@ -85,17 +86,21 @@ class Server : public QThread {
 
     /* Message Handlers */
 
 
     /* Message Handlers */
 
-    /* handleUser(QString, Buffer *) */
+    /* void handleUser(QString, Buffer *) */
     void handleUserJoin(QString, Buffer *);
     void handleUserQuote(QString, Buffer *);
     void handleUserSay(QString, Buffer *);
 
 
     void handleUserJoin(QString, Buffer *);
     void handleUserQuote(QString, Buffer *);
     void handleUserSay(QString, Buffer *);
 
 
-    /* handleServer(QString, QStringList); */
+    /* void handleServer(QString, QStringList); */
     void handleServerJoin(QString, QStringList);
     void handleServerJoin(QString, QStringList);
+    void handleServerKick(QString, QStringList);
+    void handleServerNick(QString, QStringList);
     void handleServerNotice(QString, QStringList);
     void handleServerNotice(QString, QStringList);
+    void handleServerPart(QString, QStringList);
     void handleServerPing(QString, QStringList);
     void handleServerPrivmsg(QString, QStringList);
     void handleServerPing(QString, QStringList);
     void handleServerPrivmsg(QString, QStringList);
+    void handleServerQuit(QString, QStringList);
 
     void handleServer001(QString, QStringList);   // RPL_WELCOME
     void handleServer331(QString, QStringList);   // RPL_NOTOPIC
 
     void handleServer001(QString, QStringList);   // RPL_WELCOME
     void handleServer331(QString, QStringList);   // RPL_NOTOPIC
@@ -120,9 +125,7 @@ class Server : public QThread {
     void handleServerMsg(QString rawMsg);
     void handleUserMsg(QString buffer, QString usrMsg);
 
     void handleServerMsg(QString rawMsg);
     void handleUserMsg(QString buffer, QString usrMsg);
 
-    QString nickFromMask(QString mask);
-    QString userFromMask(QString mask);
-    QString hostFromMask(QString mask);
+    QString updateNickFromMask(QString mask);
 
     class ParseError : public Exception {
       public:
 
     class ParseError : public Exception {
       public: