From: Manuel Nickschas Date: Wed, 20 Oct 2010 17:01:30 +0000 (+0200) Subject: Event backend porting - CTCP X-Git-Tag: 0.8-beta1~82 X-Git-Url: https://git.quassel-irc.org/?p=quassel.git;a=commitdiff_plain;h=36ea1791352d34e34b6c6cdef02455a4c43acc17 Event backend porting - CTCP This makes the last missing bits of ircd input processing use events; CTCP handling is now done by both CoreSessionEventProcessor (for the functional parts) and EventStringifier (for the user-visible parts). --- diff --git a/src/core/coresessioneventprocessor.cpp b/src/core/coresessioneventprocessor.cpp index 7d5d2444..59565a08 100644 --- a/src/core/coresessioneventprocessor.cpp +++ b/src/core/coresessioneventprocessor.cpp @@ -23,13 +23,15 @@ #include "coreirclisthelper.h" #include "corenetwork.h" #include "coresession.h" +#include "ctcpevent.h" #include "ircevent.h" #include "ircuser.h" #include "messageevent.h" #include "netsplit.h" +#include "quassel.h" CoreSessionEventProcessor::CoreSessionEventProcessor(CoreSession *session) - : QObject(session), + : BasicHandler("handleCtcp", session), _coreSession(session) { connect(coreSession(), SIGNAL(networkDisconnected(NetworkId)), this, SLOT(destroyNetsplits(NetworkId))); @@ -804,3 +806,49 @@ void CoreSessionEventProcessor::destroyNetsplits(NetworkId netId) { QHash splits = _netsplits.take(net); qDeleteAll(splits); } + +/*******************************/ +/******** CTCP HANDLING ********/ +/*******************************/ + +void CoreSessionEventProcessor::processCtcpEvent(CtcpEvent *e) { + if(e->testFlag(EventManager::Self)) + return; // ignore ctcp events generated by user input + + if(e->type() != EventManager::CtcpEvent || e->ctcpType() != CtcpEvent::Query) + return; + + handle(e->ctcpCmd(), Q_ARG(CtcpEvent *, e)); +} + +void CoreSessionEventProcessor::defaultHandler(const QString &ctcpCmd, CtcpEvent *e) { + // This handler is only there to avoid warnings for unknown CTCPs + Q_UNUSED(e); + Q_UNUSED(ctcpCmd); +} + +void CoreSessionEventProcessor::handleCtcpAction(CtcpEvent *e) { + // This handler is only there to feed CLIENTINFO + Q_UNUSED(e); +} + +void CoreSessionEventProcessor::handleCtcpClientinfo(CtcpEvent *e) { + QStringList supportedHandlers; + foreach(QString handler, providesHandlers()) + supportedHandlers << handler.toUpper(); + qSort(supportedHandlers); + e->setReply(supportedHandlers.join(" ")); +} + +void CoreSessionEventProcessor::handleCtcpPing(CtcpEvent *e) { + e->setReply(e->param()); +} + +void CoreSessionEventProcessor::handleCtcpTime(CtcpEvent *e) { + e->setReply(QDateTime::currentDateTime().toString()); +} + +void CoreSessionEventProcessor::handleCtcpVersion(CtcpEvent *e) { + e->setReply(QString("Quassel IRC %1 (built on %2) -- http://www.quassel-irc.org") + .arg(Quassel::buildInfo().plainVersionString).arg(Quassel::buildInfo().buildDate)); +} diff --git a/src/core/coresessioneventprocessor.h b/src/core/coresessioneventprocessor.h index 7b359d07..e0219e3f 100644 --- a/src/core/coresessioneventprocessor.h +++ b/src/core/coresessioneventprocessor.h @@ -21,15 +21,17 @@ #ifndef CORESESSIONEVENTPROCESSOR_H #define CORESESSIONEVENTPROCESSOR_H +#include "basichandler.h" #include "corenetwork.h" #include "networkevent.h" class CoreSession; +class CtcpEvent; class IrcEvent; class IrcEventNumeric; class Netsplit; -class CoreSessionEventProcessor : public QObject { +class CoreSessionEventProcessor : public BasicHandler { Q_OBJECT public: @@ -82,6 +84,16 @@ public: // Q_INVOKABLE void processIrcEvent(IrcEvent *event); + /* CTCP handlers */ + Q_INVOKABLE void processCtcpEvent(CtcpEvent *event); + + Q_INVOKABLE void handleCtcpAction(CtcpEvent *event); + Q_INVOKABLE void handleCtcpClientinfo(CtcpEvent *event); + Q_INVOKABLE void handleCtcpPing(CtcpEvent *event); + Q_INVOKABLE void handleCtcpTime(CtcpEvent *event); + Q_INVOKABLE void handleCtcpVersion(CtcpEvent *event); + Q_INVOKABLE void defaultHandler(const QString &ctcpCmd, CtcpEvent *event); + protected: bool checkParamCount(IrcEvent *event, int minParams); inline CoreNetwork *coreNetwork(NetworkEvent *e) const { return qobject_cast(e->network()); } diff --git a/src/core/ctcpparser.cpp b/src/core/ctcpparser.cpp index fc710573..7619a697 100644 --- a/src/core/ctcpparser.cpp +++ b/src/core/ctcpparser.cpp @@ -188,7 +188,8 @@ void CtcpParser::parse(IrcEventRawMessage *e, Message::Type messagetype) { } if(!ctcpEvents.isEmpty()) { _replies.insert(uuid, CtcpReply(coreNetwork(e), nickFromMask(e->prefix()))); - CtcpEvent *flushEvent = new CtcpEvent(uuid); + CtcpEvent *flushEvent = new CtcpEvent(EventManager::CtcpEventFlush, e->network(), e->prefix(), e->target(), + ctcptype, "INVALID", QString(), e->timestamp(), uuid); ctcpEvents << flushEvent; foreach(CtcpEvent *event, ctcpEvents) { coreSession()->eventManager()->sendEvent(event); @@ -214,7 +215,8 @@ void CtcpParser::sendCtcpEvent(CtcpEvent *e) { } } else if(e->type() == EventManager::CtcpEventFlush && _replies.contains(e->uuid())) { CtcpReply reply = _replies.take(e->uuid()); - packedReply(net, reply.bufferName, reply.replies); + if(reply.replies.count()) + packedReply(net, reply.bufferName, reply.replies); } } diff --git a/src/core/eventstringifier.cpp b/src/core/eventstringifier.cpp index c301dbf9..1b817afd 100644 --- a/src/core/eventstringifier.cpp +++ b/src/core/eventstringifier.cpp @@ -21,9 +21,10 @@ #include "eventstringifier.h" #include "coresession.h" +#include "ctcpevent.h" #include "messageevent.h" -EventStringifier::EventStringifier(CoreSession *parent) : QObject(parent), +EventStringifier::EventStringifier(CoreSession *parent) : BasicHandler("handleCtcp", parent), _coreSession(parent), _whois(false) { @@ -498,3 +499,45 @@ void EventStringifier::processIrcEvent(IrcEvent *e) { } */ + +/*******************************/ +/******** CTCP HANDLING ********/ +/*******************************/ + +void EventStringifier::processCtcpEvent(CtcpEvent *e) { + if(e->type() != EventManager::CtcpEvent) + return; + + if(e->testFlag(EventManager::Self)) { + displayMsg(e, Message::Action, tr("sending CTCP-%1 request to %2").arg(e->ctcpCmd(), e->target()), e->network()->myNick()); + return; + } + + handle(e->ctcpCmd(), Q_ARG(CtcpEvent *, e)); +} + +void EventStringifier::defaultHandler(const QString &ctcpCmd, CtcpEvent *e) { + Q_UNUSED(ctcpCmd); + if(e->ctcpType() == CtcpEvent::Query) { + QString unknown; + if(e->reply().isNull()) // all known core-side handlers (except for ACTION) set a reply! + //: Optional "unknown" in "Received unknown CTCP-FOO request by bar" + unknown = tr("unknown") + ' '; + displayMsg(e, Message::Server, tr("Received %1CTCP-%2 request by %3").arg(unknown, e->ctcpCmd(), e->prefix())); + return; + } + displayMsg(e, Message::Server, tr("Received CTCP-%1 answer from %2: %3").arg(e->ctcpCmd(), nickFromMask(e->prefix()), e->param())); +} + +void EventStringifier::handleCtcpAction(CtcpEvent *e) { + displayMsg(e, Message::Action, e->param(), e->prefix(), e->target()); +} + +void EventStringifier::handleCtcpPing(CtcpEvent *e) { + if(e->ctcpType() == CtcpEvent::Query) + defaultHandler(e->ctcpCmd(), e); + else { + displayMsg(e, Message::Server, tr("Received CTCP-PING answer from %1 with %2 seconds round trip time") + .arg(nickFromMask(e->prefix())).arg(QDateTime::fromTime_t(e->param().toInt()).secsTo(e->timestamp()))); + } +} diff --git a/src/core/eventstringifier.h b/src/core/eventstringifier.h index 7bfd1f24..1c317c86 100644 --- a/src/core/eventstringifier.h +++ b/src/core/eventstringifier.h @@ -21,18 +21,18 @@ #ifndef EVENTSTRINGIFIER_H #define EVENTSTRINGIFIER_H -#include - +#include "basichandler.h" #include "ircevent.h" #include "message.h" class CoreSession; +class CtcpEvent; class MessageEvent; //! Generates user-visible MessageEvents from incoming IrcEvents /* replaces the string-generating parts of the old IrcServerHandler */ -class EventStringifier : public QObject { +class EventStringifier : public BasicHandler { Q_OBJECT public: @@ -93,6 +93,13 @@ public: // Q_INVOKABLE void processIrcEvent(IrcEvent *event); + /* CTCP handlers */ + Q_INVOKABLE void processCtcpEvent(CtcpEvent *event); + + Q_INVOKABLE void handleCtcpAction(CtcpEvent *event); + Q_INVOKABLE void handleCtcpPing(CtcpEvent *event); + Q_INVOKABLE void defaultHandler(const QString &cmd, CtcpEvent *event); + public slots: //! Creates and sends a MessageEvent void displayMsg(NetworkEvent *event, diff --git a/src/core/ircparser.cpp b/src/core/ircparser.cpp index 260e80b1..de72a73e 100644 --- a/src/core/ircparser.cpp +++ b/src/core/ircparser.cpp @@ -213,7 +213,7 @@ void IrcParser::processNetworkIncoming(NetworkDataEvent *e) { if(!net->isChannelName(target)) target = nickFromMask(prefix); } - events << new IrcEventRawMessage(EventManager::IrcEventRawNotice, net, msg, prefix, target, e->timestamp()); + events << new IrcEventRawMessage(EventManager::IrcEventRawNotice, net, params[1], prefix, target, e->timestamp()); } } break;