Event backend porting - CTCP
authorManuel Nickschas <sputnick@quassel-irc.org>
Wed, 20 Oct 2010 17:01:30 +0000 (19:01 +0200)
committerManuel Nickschas <sputnick@quassel-irc.org>
Wed, 20 Oct 2010 17:01:30 +0000 (19:01 +0200)
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).

src/core/coresessioneventprocessor.cpp
src/core/coresessioneventprocessor.h
src/core/ctcpparser.cpp
src/core/eventstringifier.cpp
src/core/eventstringifier.h
src/core/ircparser.cpp

index 7d5d244..59565a0 100644 (file)
 #include "coreirclisthelper.h"
 #include "corenetwork.h"
 #include "coresession.h"
 #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 "ircevent.h"
 #include "ircuser.h"
 #include "messageevent.h"
 #include "netsplit.h"
+#include "quassel.h"
 
 CoreSessionEventProcessor::CoreSessionEventProcessor(CoreSession *session)
 
 CoreSessionEventProcessor::CoreSessionEventProcessor(CoreSession *session)
-  : QObject(session),
+  : BasicHandler("handleCtcp", session),
   _coreSession(session)
 {
   connect(coreSession(), SIGNAL(networkDisconnected(NetworkId)), this, SLOT(destroyNetsplits(NetworkId)));
   _coreSession(session)
 {
   connect(coreSession(), SIGNAL(networkDisconnected(NetworkId)), this, SLOT(destroyNetsplits(NetworkId)));
@@ -804,3 +806,49 @@ void CoreSessionEventProcessor::destroyNetsplits(NetworkId netId) {
   QHash<QString, Netsplit *> splits = _netsplits.take(net);
   qDeleteAll(splits);
 }
   QHash<QString, Netsplit *> 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));
+}
index 7b359d0..e0219e3 100644 (file)
 #ifndef CORESESSIONEVENTPROCESSOR_H
 #define CORESESSIONEVENTPROCESSOR_H
 
 #ifndef CORESESSIONEVENTPROCESSOR_H
 #define CORESESSIONEVENTPROCESSOR_H
 
+#include "basichandler.h"
 #include "corenetwork.h"
 #include "networkevent.h"
 
 class CoreSession;
 #include "corenetwork.h"
 #include "networkevent.h"
 
 class CoreSession;
+class CtcpEvent;
 class IrcEvent;
 class IrcEventNumeric;
 class Netsplit;
 
 class IrcEvent;
 class IrcEventNumeric;
 class Netsplit;
 
-class CoreSessionEventProcessor : public QObject {
+class CoreSessionEventProcessor : public BasicHandler {
   Q_OBJECT
 
 public:
   Q_OBJECT
 
 public:
@@ -82,6 +84,16 @@ public:
 
   // Q_INVOKABLE void processIrcEvent(IrcEvent *event);
 
 
   // 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<CoreNetwork *>(e->network()); }
 protected:
   bool checkParamCount(IrcEvent *event, int minParams);
   inline CoreNetwork *coreNetwork(NetworkEvent *e) const { return qobject_cast<CoreNetwork *>(e->network()); }
index fc71057..7619a69 100644 (file)
@@ -188,7 +188,8 @@ void CtcpParser::parse(IrcEventRawMessage *e, Message::Type messagetype) {
   }
   if(!ctcpEvents.isEmpty()) {
     _replies.insert(uuid, CtcpReply(coreNetwork(e), nickFromMask(e->prefix())));
   }
   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);
     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());
     }
   } 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);
   }
 }
 
   }
 }
 
index c301dbf..1b817af 100644 (file)
 #include "eventstringifier.h"
 
 #include "coresession.h"
 #include "eventstringifier.h"
 
 #include "coresession.h"
+#include "ctcpevent.h"
 #include "messageevent.h"
 
 #include "messageevent.h"
 
-EventStringifier::EventStringifier(CoreSession *parent) : QObject(parent),
+EventStringifier::EventStringifier(CoreSession *parent) : BasicHandler("handleCtcp", parent),
   _coreSession(parent),
   _whois(false)
 {
   _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())));
+  }
+}
index 7bfd1f2..1c317c8 100644 (file)
 #ifndef EVENTSTRINGIFIER_H
 #define EVENTSTRINGIFIER_H
 
 #ifndef EVENTSTRINGIFIER_H
 #define EVENTSTRINGIFIER_H
 
-#include <QObject>
-
+#include "basichandler.h"
 #include "ircevent.h"
 #include "message.h"
 
 class CoreSession;
 #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 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:
   Q_OBJECT
 
 public:
@@ -93,6 +93,13 @@ public:
 
   // Q_INVOKABLE void processIrcEvent(IrcEvent *event);
 
 
   // 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,
 public slots:
   //! Creates and sends a MessageEvent
   void displayMsg(NetworkEvent *event,
index 260e80b..de72a73 100644 (file)
@@ -213,7 +213,7 @@ void IrcParser::processNetworkIncoming(NetworkDataEvent *e) {
           if(!net->isChannelName(target))
             target = nickFromMask(prefix);
         }
           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;
       }
     }
     break;