X-Git-Url: https://git.quassel-irc.org/?p=quassel.git;a=blobdiff_plain;f=src%2Fcore%2Feventstringifier.cpp;h=a852be1b8facedc6b69b2a87b1a64865978ba45a;hp=41108a713f5c46ad99cfcfa390e898287907bc6f;hb=HEAD;hpb=c1cf157116de7fc3da96203aa6f03c38c7ebb650 diff --git a/src/core/eventstringifier.cpp b/src/core/eventstringifier.cpp index 41108a71..a9c68c80 100644 --- a/src/core/eventstringifier.cpp +++ b/src/core/eventstringifier.cpp @@ -1,5 +1,5 @@ /*************************************************************************** - * Copyright (C) 2005-2018 by the Quassel Project * + * Copyright (C) 2005-2022 by the Quassel Project * * devel@quassel-irc.org * * * * This program is free software; you can redistribute it and/or modify * @@ -22,6 +22,7 @@ #include "coresession.h" #include "ctcpevent.h" +#include "irctags.h" #include "messageevent.h" EventStringifier::EventStringifier(CoreSession* parent) @@ -32,22 +33,29 @@ EventStringifier::EventStringifier(CoreSession* parent) connect(this, &EventStringifier::newMessageEvent, coreSession()->eventManager(), &EventManager::postEvent); } -void EventStringifier::displayMsg( - NetworkEvent* event, Message::Type msgType, const QString& msg, const QString& sender, const QString& target, Message::Flags msgFlags) +void EventStringifier::displayMsg(NetworkEvent* event, + Message::Type msgType, + QString msg, + QString sender, + QString target, + Message::Flags msgFlags) { if (event->flags().testFlag(EventManager::Silent)) return; - MessageEvent* msgEvent = createMessageEvent(event, msgType, msg, sender, target, msgFlags); + MessageEvent* msgEvent = createMessageEvent(event, msgType, std::move(msg), std::move(sender), std::move(target), msgFlags); // sendMessageEvent(msgEvent); emit newMessageEvent(msgEvent); } -MessageEvent* EventStringifier::createMessageEvent( - NetworkEvent* event, Message::Type msgType, const QString& msg, const QString& sender, const QString& target, Message::Flags msgFlags) +MessageEvent* EventStringifier::createMessageEvent(NetworkEvent* event, + Message::Type msgType, + QString msg, + QString sender, + QString target, + Message::Flags msgFlags) { - MessageEvent* msgEvent = new MessageEvent(msgType, event->network(), msg, sender, target, msgFlags); - msgEvent->setTimestamp(event->timestamp()); + MessageEvent* msgEvent = new MessageEvent(msgType, event->network(), std::move(msg), std::move(sender), std::move(target), msgFlags, event->timestamp()); return msgEvent; } @@ -59,7 +67,7 @@ bool EventStringifier::checkParamCount(IrcEvent* e, int minParams) << "params, got: " << e->params(); } else { - QString name = coreSession()->eventManager()->enumName(e->type()); + QString name = EventManager::enumName(e->type()); qWarning() << qPrintable(name) << "requires" << minParams << "params, got:" << e->params(); } e->stop(); @@ -243,7 +251,18 @@ 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))); + if (!checkParamCount(e, 2)) + return; + + // TODO: provide a nicer UI for invite notifications + QString target = e->params().at(0); + QString channel = e->params().at(1); + if (e->network()->isMyNick(target)) { + displayMsg(e, Message::Invite, tr("%1 invited you to channel %2").arg(e->nick(), channel)); + } + else { + displayMsg(e, Message::Invite, tr("%1 invited %2 to channel %3").arg(e->nick(), target, channel)); + } } void EventStringifier::processIrcEventJoin(IrcEvent* e) @@ -328,7 +347,7 @@ void EventStringifier::processIrcEventNick(IrcEvent* e) } // Announce to all channels the IrcUser is in - foreach (const QString& channel, ircuser->channels()) { + for (const QString& channel : ircuser->channels()) { displayMsg(e, Message::Nick, newnick, sender, channel, msgFlags); } } @@ -375,7 +394,7 @@ void EventStringifier::processIrcEventQuit(IrcEvent* e) } // Announce to all channels the IrcUser is in - foreach (const QString& channel, ircuser->channels()) { + for (const QString& channel : ircuser->channels()) { displayMsg(e, Message::Quit, e->params().count() ? e->params().first() : QString(), e->prefix(), channel, msgFlags); } } @@ -528,9 +547,10 @@ void EventStringifier::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 - // Time in IRC protocol is defined as seconds. Convert from seconds instead. - // See https://doc.qt.io/qt-5/qdatetime.html#fromSecsSinceEpoch + if (e->params().count() > 3) { + // if we have more then 3 params we have the above mentioned "real life" situation + // 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 QDateTime loginTime = QDateTime::fromSecsSinceEpoch(e->params()[2].toLongLong()).toUTC(); #else @@ -566,7 +586,7 @@ void EventStringifier::processIrcEvent319(IrcEvent* e) QStringList op; QStringList voice; QStringList user; - foreach (QString channel, e->params().last().split(" ")) { + for (QString channel : e->params().last().split(" ")) { if (channel.startsWith("@")) op.append(channel.remove(0, 1)); else if (channel.startsWith("+")) @@ -781,7 +801,12 @@ void EventStringifier::processCtcpEvent(CtcpEvent* e) if (e->type() != EventManager::CtcpEvent) return; - if (e->testFlag(EventManager::Self)) { + // Only stringify outgoing CTCP messages this way + if (e->testFlag(EventManager::Self) && + // Only stringify CTCP queries this way + e->ctcpType() == CtcpEvent::CtcpType::Query && + // Always handle ACTIONs as if they were sent from network, to properly handle echo-message + e->ctcpCmd() != "ACTION") { displayMsg(e, Message::Action, tr("sending CTCP-%1 request to %2").arg(e->ctcpCmd(), e->target()), @@ -803,14 +828,24 @@ void EventStringifier::defaultHandler(const QString& ctcpCmd, CtcpEvent* e) //: 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; + } else { + // Ignore echo messages for our own answers + if (!e->testFlag(EventManager::Self)) { + displayMsg(e, Message::Server, + tr("Received CTCP-%1 answer from %2: %3").arg(e->ctcpCmd(), nickFromMask(e->prefix()),e->param())); + } } - 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()); + Message::Flag msgFlags = Message::Flag::None; + if (e->testFlag(EventManager::Self)) { + // Mark the message as Self + msgFlags = Message::Self; + } + + displayMsg(e, Message::Action, e->param(), e->prefix(), e->target(), msgFlags); } void EventStringifier::handleCtcpPing(CtcpEvent* e)