X-Git-Url: https://git.quassel-irc.org/?p=quassel.git;a=blobdiff_plain;f=src%2Fcore%2Fcoresessioneventprocessor.cpp;h=1082617c048640b4e27f1cea0b2fa46f650c97e0;hp=7d5d24445e5ff23f8236363680622b10278698c4;hb=4ae8f86c1ce452582d6fe576956c7c1bc1460adf;hpb=712781ef33198acb7267e02ee6f8f9bfc8598d5a diff --git a/src/core/coresessioneventprocessor.cpp b/src/core/coresessioneventprocessor.cpp index 7d5d2444..1082617c 100644 --- a/src/core/coresessioneventprocessor.cpp +++ b/src/core/coresessioneventprocessor.cpp @@ -1,5 +1,5 @@ /*************************************************************************** - * Copyright (C) 2005-2010 by the Quassel Project * + * Copyright (C) 2005-2012 by the Quassel Project * * devel@quassel-irc.org * * * * This program is free software; you can redistribute it and/or modify * @@ -23,16 +23,19 @@ #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))); + connect(this, SIGNAL(newEvent(Event *)), coreSession()->eventManager(), SLOT(postEvent(Event *))); } bool CoreSessionEventProcessor::checkParamCount(IrcEvent *e, int minParams) { @@ -61,7 +64,7 @@ void CoreSessionEventProcessor::tryNextNick(NetworkEvent *e, const QString &errn MessageEvent *msgEvent = new MessageEvent(Message::Error, e->network(), tr("No free and valid nicks in nicklist found. use: /nick to continue"), QString(), QString(), Message::None, e->timestamp()); - coreSession()->eventManager()->sendEvent(msgEvent); + emit newEvent(msgEvent); return; } else { nextNick = errnick + "_"; @@ -662,6 +665,9 @@ void CoreSessionEventProcessor::processIrcEvent353(IrcEvent *e) { /* ERR_ERRONEUSNICKNAME */ void CoreSessionEventProcessor::processIrcEvent432(IrcEventNumeric *e) { + if(!checkParamCount(e, 1)) + return; + QString errnick; if(e->params().count() < 2) { // handle unreal-ircd bug, where unreal ircd doesnt supply a TARGET in ERR_ERRONEUSNICKNAME during registration phase: @@ -745,12 +751,12 @@ void CoreSessionEventProcessor::handleNetsplitJoin(Network *net, ircChannel->joinIrcUsers(ircUsers, newModes); NetworkSplitEvent *event = new NetworkSplitEvent(EventManager::NetworkSplitJoin, net, channel, newUsers, quitMessage); - coreSession()->eventManager()->sendEvent(event); + emit newEvent(event); } void CoreSessionEventProcessor::handleNetsplitQuit(Network *net, const QString &channel, const QStringList &users, const QString& quitMessage) { NetworkSplitEvent *event = new NetworkSplitEvent(EventManager::NetworkSplitQuit, net, channel, users, quitMessage); - coreSession()->eventManager()->sendEvent(event); + emit newEvent(event); foreach(QString user, users) { IrcUser *iu = net->ircUser(nickFromMask(user)); if(iu) @@ -782,7 +788,7 @@ void CoreSessionEventProcessor::handleEarlyNetsplitJoin(Network *net, const QStr ircChannel->joinIrcUsers(ircUsers, newModes); foreach(NetworkEvent *event, events) { event->setFlag(EventManager::Fake); // ignore this in here! - coreSession()->eventManager()->sendEvent(event); + emit newEvent(event); } } @@ -804,3 +810,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)); +}