X-Git-Url: https://git.quassel-irc.org/?p=quassel.git;a=blobdiff_plain;f=src%2Fcore%2Fcoresessioneventprocessor.cpp;h=0e9bb0197314ca6c8e9da7021c0364f83b27cff4;hp=e4621bf4bf81983dd62cf55771bc5fcdd3579cb5;hb=5fc6f7e2d63b45770574260afd6ce535e9548d23;hpb=eabcc4905f991bb372cb2fb125b766802366701a diff --git a/src/core/coresessioneventprocessor.cpp b/src/core/coresessioneventprocessor.cpp index e4621bf4..0e9bb019 100644 --- a/src/core/coresessioneventprocessor.cpp +++ b/src/core/coresessioneventprocessor.cpp @@ -1,5 +1,5 @@ /*************************************************************************** - * Copyright (C) 2005-2016 by the Quassel Project * + * Copyright (C) 2005-2018 by the Quassel Project * * devel@quassel-irc.org * * * * This program is free software; you can redistribute it and/or modify * @@ -415,6 +415,8 @@ void CoreSessionEventProcessor::processIrcEventJoin(IrcEvent *e) if (net->isMe(ircuser)) { net->setChannelJoined(channel); + // Mark the message as Self + e->setFlag(EventManager::Self); // FIXME use event net->putRawLine(net->serverEncode("MODE " + channel)); // we want to know the modes of the channel we just joined, so we ask politely } @@ -540,12 +542,33 @@ void CoreSessionEventProcessor::processIrcEventMode(IrcEvent *e) ircUser->removeUserModes(removeModes); if (e->network()->isMe(ircUser)) { + // Mark the message as Self + e->setFlag(EventManager::Self); coreNetwork(e)->updatePersistentModes(addModes, removeModes); } } } +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; + } + + if (e->network()->isMe(ircuser)) { + // Mark the message as Self + e->setFlag(EventManager::Self); + } + + // Actual processing is handled in lateProcessIrcEventNick(), this just sets the event flag + } +} + + void CoreSessionEventProcessor::lateProcessIrcEventNick(IrcEvent *e) { if (checkParamCount(e, 1)) { @@ -566,6 +589,25 @@ void CoreSessionEventProcessor::lateProcessIrcEventNick(IrcEvent *e) } +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; + } + + if (e->network()->isMe(ircuser)) { + // Mark the message as Self + e->setFlag(EventManager::Self); + } + + // Actual processing is handled in lateProcessIrcEventNick(), this just sets the event flag + } +} + + void CoreSessionEventProcessor::lateProcessIrcEventPart(IrcEvent *e) { if (checkParamCount(e, 1)) { @@ -576,8 +618,9 @@ void CoreSessionEventProcessor::lateProcessIrcEventPart(IrcEvent *e) } QString channel = e->params().at(0); ircuser->partChannel(channel); - if (e->network()->isMe(ircuser)) + if (e->network()->isMe(ircuser)) { qobject_cast(e->network())->setChannelParted(channel); + } } } @@ -610,6 +653,11 @@ void CoreSessionEventProcessor::processIrcEventQuit(IrcEvent *e) if (!ircuser) return; + if (e->network()->isMe(ircuser)) { + // Mark the message as Self + e->setFlag(EventManager::Self); + } + QString msg; if (e->params().count() > 0) msg = e->params()[0]; @@ -655,7 +703,13 @@ void CoreSessionEventProcessor::lateProcessIrcEventQuit(IrcEvent *e) void CoreSessionEventProcessor::processIrcEventTopic(IrcEvent *e) { if (checkParamCount(e, 2)) { - e->network()->updateNickFromMask(e->prefix()); + IrcUser *ircuser = e->network()->updateNickFromMask(e->prefix()); + + if (e->network()->isMe(ircuser)) { + // Mark the message as Self + e->setFlag(EventManager::Self); + } + IrcChannel *channel = e->network()->ircChannel(e->params().at(0)); if (channel) channel->setTopic(e->params().at(1)); @@ -792,7 +846,9 @@ void CoreSessionEventProcessor::processIrcEvent301(IrcEvent *e) if (ircuser) { ircuser->setAway(true); ircuser->setAwayMessage(e->params().at(1)); - //ircuser->setLastAwayMessage(now); + // lastAwayMessageTime is set in EventStringifier::processIrcEvent301(), no need to set it + // here too + //ircuser->setLastAwayMessageTime(now); } } @@ -905,8 +961,18 @@ void CoreSessionEventProcessor::processIrcEvent317(IrcEvent *e) int idleSecs = e->params()[1].toInt(); if (e->params().count() > 3) { // if we have more then 3 params we have the above mentioned "real life" situation - int logintime = e->params()[2].toInt(); - loginTime = QDateTime::fromTime_t(logintime); + // Allow for 64-bit time + qint64 logintime = e->params()[2].toLongLong(); + // Time in IRC protocol is defined as seconds. Convert from seconds instead. + // See https://doc.qt.io/qt-5/qdatetime.html#fromSecsSinceEpoch +#if QT_VERSION >= 0x050800 + loginTime = QDateTime::fromSecsSinceEpoch(logintime); +#else + // fromSecsSinceEpoch() was added in Qt 5.8. Manually downconvert to seconds for + // now. + // See https://doc.qt.io/qt-5/qdatetime.html#fromMSecsSinceEpoch + loginTime = QDateTime::fromMSecsSinceEpoch((qint64)(logintime * 1000)); +#endif } IrcUser *ircuser = e->network()->ircUser(e->params()[0]); @@ -931,10 +997,13 @@ void CoreSessionEventProcessor::processIrcEvent322(IrcEvent *e) switch (e->params().count()) { case 3: topic = e->params()[2]; + [[clang::fallthrough]]; case 2: userCount = e->params()[1].toUInt(); + [[clang::fallthrough]]; case 1: channelName = e->params()[0]; + [[clang::fallthrough]]; default: break; } @@ -1487,12 +1556,27 @@ void CoreSessionEventProcessor::handleCtcpPing(CtcpEvent *e) void CoreSessionEventProcessor::handleCtcpTime(CtcpEvent *e) { - e->setReply(QDateTime::currentDateTime().toString()); + // Explicitly specify the Qt default DateTime format string to allow for modification + // Qt::TextDate default roughly corresponds to... + // > ddd MMM d yyyy HH:mm:ss + // + // See https://doc.qt.io/qt-5/qdatetime.html#toString + // And https://doc.qt.io/qt-5/qt.html#DateFormat-enum +#if QT_VERSION > 0x050000 + // Append the timezone identifier "t", so other other IRC users have a frame of reference for + // the current timezone. This could be figured out before by manually comparing to UTC, so this + // is just convenience. + + // Alas, "t" was only added in Qt 5 + e->setReply(QDateTime::currentDateTime().toString("ddd MMM d yyyy HH:mm:ss t")); +#else + e->setReply(QDateTime::currentDateTime().toString("ddd MMM d yyyy HH:mm:ss")); +#endif } void CoreSessionEventProcessor::handleCtcpVersion(CtcpEvent *e) { - e->setReply(QString("Quassel IRC %1 (built on %2) -- http://www.quassel-irc.org") + e->setReply(QString("Quassel IRC %1 (built on %2) -- https://www.quassel-irc.org") .arg(Quassel::buildInfo().plainVersionString).arg(Quassel::buildInfo().commitDate)); }