From: Manuel Nickschas Date: Sun, 3 Oct 2010 22:02:58 +0000 (+0200) Subject: Event backend porting X-Git-Tag: 0.8-beta1~103 X-Git-Url: https://git.quassel-irc.org/?p=quassel.git;a=commitdiff_plain;h=d60c5028b49a95d3c27c35b2ea1d74cdd7bb0e46 Event backend porting INVITE, KICK, NICK, PART are using the event backend now. --- diff --git a/src/core/coresession.cpp b/src/core/coresession.cpp index 9f24007a..2ed950c0 100644 --- a/src/core/coresession.cpp +++ b/src/core/coresession.cpp @@ -96,6 +96,7 @@ CoreSession::CoreSession(UserId uid, bool restoreState, QObject *parent) initScriptEngine(); eventManager()->registerObject(ircParser(), EventManager::NormalPriority); + eventManager()->registerObject(eventStringifier(), EventManager::HighPriority, "earlyProcess"); // some need to be sent before statechange eventManager()->registerObject(eventProcessor(), EventManager::HighPriority); // needs to process events *before* the stringifier! eventManager()->registerObject(eventStringifier(), EventManager::NormalPriority); eventManager()->registerObject(this, EventManager::LowPriority); // for sending MessageEvents to the client diff --git a/src/core/coresessioneventprocessor.cpp b/src/core/coresessioneventprocessor.cpp index 85995247..2147071e 100644 --- a/src/core/coresessioneventprocessor.cpp +++ b/src/core/coresessioneventprocessor.cpp @@ -57,3 +57,52 @@ void CoreSessionEventProcessor::processIrcEventNumeric(IrcEventNumeric *e) { break; } } + +void CoreSessionEventProcessor::processIrcEventInvite(IrcEvent *e) { + if(checkParamCount(e, 2)) { + e->network()->updateNickFromMask(e->prefix()); + } +} + +void CoreSessionEventProcessor::processIrcEventKick(IrcEvent *e) { + if(checkParamCount(e, 2)) { + e->network()->updateNickFromMask(e->prefix()); + IrcUser *victim = e->network()->ircUser(e->params().at(1)); + if(victim) { + victim->partChannel(e->params().at(0)); + //if(e->network()->isMe(victim)) e->network()->setKickedFromChannel(channel); + } + } +} + +void CoreSessionEventProcessor::processIrcEventNick(IrcEvent *e) { + if(checkParamCount(e, 1)) { + IrcUser *ircuser = e->network()->updateNickFromMask(e->prefix()); + if(!ircuser) { + qWarning() << Q_FUNC_INFO << "Unknown IrcUser!"; + return; + } + QString newnick = e->params().at(0); + QString oldnick = ircuser->nick(); + + // the order is cruicial + // otherwise the client would rename the buffer, see that the assigned ircuser doesn't match anymore + // and remove the ircuser from the querybuffer leading to a wrong on/offline state + ircuser->setNick(newnick); + coreSession()->renameBuffer(e->networkId(), newnick, oldnick); + } +} + +void CoreSessionEventProcessor::processIrcEventPart(IrcEvent *e) { + if(checkParamCount(e, 1)) { + IrcUser *ircuser = e->network()->updateNickFromMask(e->prefix()); + if(!ircuser) { + qWarning() << Q_FUNC_INFO<< "Unknown IrcUser!"; + return; + } + QString channel = e->params().at(0); + ircuser->partChannel(channel); + if(e->network()->isMe(ircuser)) + qobject_cast(e->network())->setChannelParted(channel); + } +} diff --git a/src/core/coresessioneventprocessor.h b/src/core/coresessioneventprocessor.h index 4d7559d2..98274fa7 100644 --- a/src/core/coresessioneventprocessor.h +++ b/src/core/coresessioneventprocessor.h @@ -37,6 +37,11 @@ public: Q_INVOKABLE void processIrcEventNumeric(IrcEventNumeric *event); + Q_INVOKABLE void processIrcEventInvite(IrcEvent *event); + Q_INVOKABLE void processIrcEventKick(IrcEvent *event); + Q_INVOKABLE void processIrcEventNick(IrcEvent *event); + Q_INVOKABLE void processIrcEventPart(IrcEvent *event); + protected: bool checkParamCount(IrcEvent *event, int minParams); diff --git a/src/core/eventstringifier.cpp b/src/core/eventstringifier.cpp index 44528e53..304e36c5 100644 --- a/src/core/eventstringifier.cpp +++ b/src/core/eventstringifier.cpp @@ -109,3 +109,48 @@ void EventStringifier::processIrcEventNumeric(IrcEventNumeric *e) { } } } + +void EventStringifier::processIrcEventInvite(IrcEvent *e) { + displayMsg(e, Message::Invite, tr("%1 invited you to channel %2").arg(e->nick(), e->params().at(1))); +} + +void EventStringifier::earlyProcessIrcEventKick(IrcEvent *e) { + IrcUser *victim = e->network()->ircUser(e->params().at(1)); + if(victim) { + QString channel = e->params().at(0); + QString msg = victim->nick(); + if(e->params().count() > 2) + msg += " " + e->params().at(2); + + displayMsg(e, Message::Kick, msg, e->prefix(), channel); + } +} + +// this needs to be called before the ircuser is renamed! +void EventStringifier::earlyProcessIrcEventNick(IrcEvent *e) { + if(e->params().count() < 1) + return; + + IrcUser *ircuser = e->network()->updateNickFromMask(e->prefix()); + if(!ircuser) { + qWarning() << Q_FUNC_INFO << "Unknown IrcUser!"; + return; + } + + QString newnick = e->params().at(0); + QString oldnick = ircuser->nick(); + + QString sender = e->network()->isMyNick(oldnick) ? newnick : e->prefix(); + foreach(const QString &channel, ircuser->channels()) + displayMsg(e, Message::Nick, newnick, sender, channel); +} + +void EventStringifier::earlyProcessIrcEventPart(IrcEvent *e) { + if(e->params().count() < 1) + return; + + QString channel = e->params().at(0); + QString msg = e->params().count() > 1? e->params().at(1) : QString(); + + displayMsg(e, Message::Part, msg, e->prefix(), channel); +} diff --git a/src/core/eventstringifier.h b/src/core/eventstringifier.h index 2e1074a2..0ff417d3 100644 --- a/src/core/eventstringifier.h +++ b/src/core/eventstringifier.h @@ -50,6 +50,11 @@ public: //! Handle generic numeric events Q_INVOKABLE void processIrcEventNumeric(IrcEventNumeric *event); + Q_INVOKABLE void processIrcEventInvite(IrcEvent *event); + Q_INVOKABLE void earlyProcessIrcEventKick(IrcEvent *event); + Q_INVOKABLE void earlyProcessIrcEventNick(IrcEvent *event); + Q_INVOKABLE void earlyProcessIrcEventPart(IrcEvent *event); + public slots: //! Creates and sends a MessageEvent void displayMsg(NetworkEvent *event, diff --git a/src/core/ircserverhandler.cpp b/src/core/ircserverhandler.cpp index 341dd003..fe9f2500 100644 --- a/src/core/ircserverhandler.cpp +++ b/src/core/ircserverhandler.cpp @@ -138,20 +138,6 @@ void IrcServerHandler::defaultHandler(QString cmd, const QString &prefix, const //******************************/ // IRC SERVER HANDLER //******************************/ -void IrcServerHandler::handleInvite(const QString &prefix, const QList ¶ms) { - if(!checkParamCount("IrcServerHandler::handleInvite()", params, 2)) - return; -// qDebug() << "IrcServerHandler::handleInvite()" << prefix << params; - - IrcUser *ircuser = network()->updateNickFromMask(prefix); - if(!ircuser) { - return; - } - - QString channel = serverDecode(params[1]); - - emit displayMsg(Message::Invite, BufferInfo::StatusBuffer, "", tr("%1 invited you to channel %2").arg(ircuser->nick()).arg(channel)); -} void IrcServerHandler::handleJoin(const QString &prefix, const QList ¶ms) { if(!checkParamCount("IrcServerHandler::handleJoin()", params, 1)) @@ -182,28 +168,6 @@ void IrcServerHandler::handleJoin(const QString &prefix, const QList } } -void IrcServerHandler::handleKick(const QString &prefix, const QList ¶ms) { - if(!checkParamCount("IrcServerHandler::handleKick()", params, 2)) - return; - - network()->updateNickFromMask(prefix); - IrcUser *victim = network()->ircUser(params[1]); - if(!victim) - return; - - QString channel = serverDecode(params[0]); - victim->partChannel(channel); - - QString msg; - if(params.count() > 2) // someone got a reason! - msg = QString("%1 %2").arg(victim->nick()).arg(channelDecode(channel, params[2])); - else - msg = victim->nick(); - - emit displayMsg(Message::Kick, BufferInfo::ChannelBuffer, channel, msg, prefix); - //if(network()->isMe(victim)) network()->setKickedFromChannel(channel); -} - void IrcServerHandler::handleMode(const QString &prefix, const QList ¶ms) { if(!checkParamCount("IrcServerHandler::handleMode()", params, 2)) return; @@ -315,33 +279,6 @@ void IrcServerHandler::handleMode(const QString &prefix, const QList } } -void IrcServerHandler::handleNick(const QString &prefix, const QList ¶ms) { - if(!checkParamCount("IrcServerHandler::handleNick()", params, 1)) - return; - - IrcUser *ircuser = network()->updateNickFromMask(prefix); - if(!ircuser) { - qWarning() << "IrcServerHandler::handleNick(): Unknown IrcUser!"; - return; - } - QString newnick = serverDecode(params[0]); - QString oldnick = ircuser->nick(); - - QString sender = network()->isMyNick(oldnick) - ? newnick - : prefix; - - - // the order is cruicial - // otherwise the client would rename the buffer, see that the assigned ircuser doesn't match anymore - // and remove the ircuser from the querybuffer leading to a wrong on/offline state - ircuser->setNick(newnick); - coreSession()->renameBuffer(network()->networkId(), newnick, oldnick); - - foreach(QString channel, ircuser->channels()) - emit displayMsg(Message::Nick, BufferInfo::ChannelBuffer, channel, newnick, sender); -} - void IrcServerHandler::handleNotice(const QString &prefix, const QList ¶ms) { if(!checkParamCount("IrcServerHandler::handleNotice()", params, 2)) return; @@ -383,27 +320,6 @@ void IrcServerHandler::handleNotice(const QString &prefix, const QList ¶ms) { - if(!checkParamCount("IrcServerHandler::handlePart()", params, 1)) - return; - - IrcUser *ircuser = network()->updateNickFromMask(prefix); - QString channel = serverDecode(params[0]); - if(!ircuser) { - qWarning() << "IrcServerHandler::handlePart(): Unknown IrcUser!"; - return; - } - - ircuser->partChannel(channel); - - QString msg; - if(params.count() > 1) - msg = userDecode(ircuser->nick(), params[1]); - - emit displayMsg(Message::Part, BufferInfo::ChannelBuffer, channel, msg, prefix); - if(network()->isMe(ircuser)) network()->setChannelParted(channel); -} - void IrcServerHandler::handlePing(const QString &prefix, const QList ¶ms) { Q_UNUSED(prefix); putCmd("PONG", params); diff --git a/src/core/ircserverhandler.h b/src/core/ircserverhandler.h index 2f9623cb..96ededf8 100644 --- a/src/core/ircserverhandler.h +++ b/src/core/ircserverhandler.h @@ -34,13 +34,9 @@ public: void handleServerMsg(QByteArray rawMsg); public slots: - void handleInvite(const QString &prefix, const QList ¶ms); void handleJoin(const QString &prefix, const QList ¶ms); - void handleKick(const QString &prefix, const QList ¶ms); void handleMode(const QString &prefix, const QList ¶ms); - void handleNick(const QString &prefix, const QList ¶ms); void handleNotice(const QString &prefix, const QList ¶ms); - void handlePart(const QString &prefix, const QList ¶ms); void handlePing(const QString &prefix, const QList ¶ms); void handlePong(const QString &prefix, const QList ¶ms); void handlePrivmsg(const QString &prefix, const QList ¶ms);