From: Manuel Nickschas Date: Wed, 25 Oct 2006 15:50:19 +0000 (+0000) Subject: More good news: X-Git-Tag: 0.1.0~260 X-Git-Url: https://git.quassel-irc.org/?p=quassel.git;a=commitdiff_plain;h=23221be79f5a6c064061f425a156b27fd9802a09 More good news: * Switched channel widget to HTML, using for a nice layout now. * More server messages parsed, including JOIN, PART, QUIT, KICK, NICK. * More tidbits. --- diff --git a/core/core.cpp b/core/core.cpp index 44c925a0..9ccbd211 100644 --- a/core/core.cpp +++ b/core/core.cpp @@ -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(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))); diff --git a/core/coreproxy.h b/core/coreproxy.h index 8cdea831..4f6185aa 100644 --- a/core/coreproxy.h +++ b/core/coreproxy.h @@ -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 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); } diff --git a/gui/channelwidget.cpp b/gui/channelwidget.cpp index 5053654b..17e85e77 100644 --- a/gui/channelwidget.cpp +++ b/gui/channelwidget.cpp @@ -20,6 +20,8 @@ #include "channelwidget.h" #include "guiproxy.h" +#include "global.h" +#include "util.h" #include #include @@ -40,14 +42,16 @@ ChannelWidget::ChannelWidget(QString netname, QString bufname, QString own, QWid //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() { @@ -56,11 +60,14 @@ void ChannelWidget::enterPressed() { } 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: - c = stdCol; s = QString("<%1> %2").arg(msg.sender).arg(msg.msg); + c = stdCol; n = QString("<%1>").arg(nick); 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 = joinCol; s = msg.msg; + c = joinCol; + s = QString(tr("--> %1 (%2@%3) has joined %4")).arg(nick).arg(user).arg(host).arg(bufferName()); + break; + case Message::Part: + c = partCol; + s = QString(tr("<-- %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("--> %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("<-- %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("<-> You are now known as %1")).arg(msg.msg); + else s = QString(tr("<-> %1 is now known as %2")).arg(nick).arg(msg.msg); 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; } - ui.chatWidget->setTextColor(c); - ui.chatWidget->insertPlainText(QString("[%2] %1\n").arg(s).arg(msg.timeStamp.toLocalTime().toString("hh:mm:ss"))); + QString html = QString("
" + "") + .arg(msg.timeStamp.toLocalTime().toString("hh:mm:ss")).arg("darkblue"); + if(!n.isEmpty()) + html += QString("") + .arg(n).arg("mediumseagreen"); + html += QString("""
[%1]
%1
%1
") + .arg(s).arg(c); + ui.chatWidget->append(html); + //ui.chatWidget->append(QString("
%1
%2
 %3
") + //.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("" // "" // "" @@ -109,6 +153,12 @@ void ChannelWidget::updateNick(QString nick, VarMap props) { 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(); @@ -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(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))); @@ -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 *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); @@ -190,7 +241,7 @@ void IrcWidget::recvMessage(QString net, QString buf, Message 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) { - 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) { @@ -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:"<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(); @@ -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); } - nicks[net].toMap()[nick] = props; + VarMap netnicks = nicks[net].toMap(); + netnicks[nick] = props; + nicks[net] = netnicks; } 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); } - 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) { - ownNick = nick; + ownNick[net] = nick; foreach(ChannelWidget *cw, buffers.values()) { if(cw->networkName() == net) cw->setOwnNick(nick); } diff --git a/gui/channelwidget.h b/gui/channelwidget.h index e1d2f2e2..a9b33287 100644 --- a/gui/channelwidget.h +++ b/gui/channelwidget.h @@ -44,6 +44,7 @@ class ChannelWidget : public QWidget { 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); @@ -56,7 +57,8 @@ class ChannelWidget : public QWidget { 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; @@ -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 renameNick(QString net, QString oldnick, QString newnick); 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 buffers; VarMap nicks; - QString ownNick; + QHash ownNick; ChannelWidget * getBuffer(QString net, QString buf); }; diff --git a/gui/channelwidget.ui b/gui/channelwidget.ui index 3bc85eb0..7cedde0b 100644 --- a/gui/channelwidget.ui +++ b/gui/channelwidget.ui @@ -31,7 +31,7 @@ - 1 + 9 6 @@ -78,138 +78,134 @@ - - - - 7 - 5 - 0 - 0 - - - - 1 + + + 0 - - Qt::Horizontal + + 6 - - - - 7 - 5 - 4 - 0 - - - - - Monospace - - - - - - - 5 - 5 - 1 - 0 - - - - Qt::LeftToRight - - - true - - - Qt::ElideRight - - - true - - - false - - - false - - - 1 - - - - 32 Users + + + + + 7 + 7 + 4 + 0 + - - - - @ Operators + + + Monospace + - - - New Sub Item - - - - - New Item - - - - - New Item - - - - - - 4 Voiced + + true - - - New Item - - - - - New Item - - - - - New Item - - - - - - 19 Users + + + + + + + 5 + 5 + 1 + 0 + - + + Qt::LeftToRight + + + true + + + Qt::ElideRight + + + false + + + false + + + 1 + + - New Sub Item + 32 Users - + - New Item + @ Operators + + + New Sub Item + + + + + New Item + + + + + New Item + + - New Item + 4 Voiced + + + New Item + + + + + New Item + + + + + New Item + + - New Item + 19 Users + + + New Sub Item + + + + + New Item + + + + + New Item + + + + + New Item + + - - - + + + @@ -221,9 +217,16 @@ - - QComboBox::AdjustToContents - + + + mainNick + + + + + altNick + + @@ -239,7 +242,6 @@ nickTree topicEdit chanSettingsButton - chatWidget diff --git a/gui/guiproxy.cpp b/gui/guiproxy.cpp index 9848ff3b..6dd5ea37 100644 --- a/gui/guiproxy.cpp +++ b/gui/guiproxy.cpp @@ -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_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; diff --git a/gui/guiproxy.h b/gui/guiproxy.h index a068b6d1..92ac0d27 100644 --- a/gui/guiproxy.h +++ b/gui/guiproxy.h @@ -58,6 +58,7 @@ class GUIProxy : public QObject { 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); diff --git a/main/message.h b/main/message.h index c1954f56..80b2b8b0 100644 --- a/main/message.h +++ b/main/message.h @@ -35,7 +35,7 @@ struct Message { 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(); }; }; diff --git a/main/proxy_common.h b/main/proxy_common.h index 64dd228b..e06a9ac1 100644 --- a/main/proxy_common.h +++ b/main/proxy_common.h @@ -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, - 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, }; diff --git a/main/util.cpp b/main/util.cpp index 71c19132..c0ef888a 100644 --- a/main/util.cpp +++ b/main/util.cpp @@ -22,6 +22,22 @@ #include +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); diff --git a/main/util.h b/main/util.h index 1df034ca..e7b74f9b 100644 --- a/main/util.h +++ b/main/util.h @@ -23,6 +23,11 @@ #include #include +#include + +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, diff --git a/network/server.cpp b/network/server.cpp index e4d37a6a..bf78eafa 100644 --- a/network/server.cpp +++ b/network/server.cpp @@ -18,6 +18,7 @@ * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ***************************************************************************/ +#include "util.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; } -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) { @@ -176,7 +178,7 @@ void Server::handleServerMsg(QString msg) { 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: - emit displayMsg("", Message(params.join(" "), prefix, Message::Server)); + emit displayMsg("", Message(Message::Server, params.join(" "), prefix)); 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: - emit displayMsg("", Message(cmd + " " + params.join(" "), prefix, Message::Error)); + emit displayMsg("", Message(Message::Error, cmd + " " + params.join(" "), prefix)); } //qDebug() << prefix <<":"<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); - 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]); @@ -280,24 +282,77 @@ void Server::handleServerJoin(QString prefix, QStringList params) { 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); } - 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) { - 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) { @@ -305,16 +360,28 @@ void Server::handleServerPing(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); - emit displayMsg("", Message(params[1], prefix, Message::Server)); + emit displayMsg("", Message(Message::Server, params[1], prefix)); } /* 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]); - 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) { - 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 */ diff --git a/network/server.h b/network/server.h index c5a3daa5..48bce3ed 100644 --- a/network/server.h +++ b/network/server.h @@ -67,6 +67,7 @@ class Server : public QThread { 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); @@ -85,17 +86,21 @@ class Server : public QThread { /* Message Handlers */ - /* handleUser(QString, Buffer *) */ + /* void handleUser(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 handleServerKick(QString, QStringList); + void handleServerNick(QString, QStringList); void handleServerNotice(QString, QStringList); + void handleServerPart(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 @@ -120,9 +125,7 @@ class Server : public QThread { 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:
[12:13]
[nickname]
This is the Message!
[12:13]
[nick]
This is the Message!
[12:13]
[looongnickname]
This is the Message!