From 707cd1f21f655c34a5c2b77b02832f283cb80f71 Mon Sep 17 00:00:00 2001 From: Shane Synan Date: Fri, 2 Dec 2016 21:06:41 -0600 Subject: [PATCH] Detect and label changes from ourself On the core, detect when changes apply to our own nick and flag the message as Self. On the client, work around old nick change messages lacking the Self flag. Working around the other messages would be more difficult. This fixes nick change styling not correctly applying for "sender=self" in themes. --- src/core/coresessioneventprocessor.cpp | 58 ++++++++++++++++++- src/core/coresessioneventprocessor.h | 2 + src/core/coreuserinputhandler.cpp | 3 +- src/core/eventstringifier.cpp | 79 ++++++++++++++++++++++---- src/qtui/chatlinemodelitem.cpp | 9 +++ 5 files changed, 136 insertions(+), 15 deletions(-) diff --git a/src/core/coresessioneventprocessor.cpp b/src/core/coresessioneventprocessor.cpp index e4621bf4..7c414ba1 100644 --- a/src/core/coresessioneventprocessor.cpp +++ b/src/core/coresessioneventprocessor.cpp @@ -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)); diff --git a/src/core/coresessioneventprocessor.h b/src/core/coresessioneventprocessor.h index 52aa3db0..6577f18d 100644 --- a/src/core/coresessioneventprocessor.h +++ b/src/core/coresessioneventprocessor.h @@ -55,7 +55,9 @@ public: Q_INVOKABLE void processIrcEventJoin(IrcEvent *event); Q_INVOKABLE void lateProcessIrcEventKick(IrcEvent *event); Q_INVOKABLE void processIrcEventMode(IrcEvent *event); + Q_INVOKABLE void processIrcEventNick(IrcEvent *event); /// Nickname changes Q_INVOKABLE void lateProcessIrcEventNick(IrcEvent *event); + Q_INVOKABLE void processIrcEventPart(IrcEvent *event); /// Leaving a channel Q_INVOKABLE void lateProcessIrcEventPart(IrcEvent *event); Q_INVOKABLE void processIrcEventPing(IrcEvent *event); Q_INVOKABLE void processIrcEventPong(IrcEvent *event); diff --git a/src/core/coreuserinputhandler.cpp b/src/core/coreuserinputhandler.cpp index ebbaf911..2eede06a 100644 --- a/src/core/coreuserinputhandler.cpp +++ b/src/core/coreuserinputhandler.cpp @@ -181,7 +181,8 @@ void CoreUserInputHandler::handleCtcp(const BufferInfo &bufferInfo, const QStrin // FIXME make this a proper event coreNetwork()->coreSession()->ctcpParser()->query(coreNetwork(), nick, ctcpTag, message); - emit displayMsg(Message::Action, BufferInfo::StatusBuffer, "", verboseMessage, network()->myNick()); + emit displayMsg(Message::Action, BufferInfo::StatusBuffer, "", verboseMessage, + network()->myNick(), Message::Flag::Self); } diff --git a/src/core/eventstringifier.cpp b/src/core/eventstringifier.cpp index 6ef3f8ad..43d29d9a 100644 --- a/src/core/eventstringifier.cpp +++ b/src/core/eventstringifier.cpp @@ -259,7 +259,13 @@ void EventStringifier::processIrcEventJoin(IrcEvent *e) if (e->testFlag(EventManager::Netsplit)) return; - displayMsg(e, Message::Join, e->params()[0], e->prefix(), e->params()[0]); + Message::Flag msgFlags = Message::Flag::None; + if (e->testFlag(EventManager::Self)) { + // Mark the message as Self + msgFlags = Message::Self; + } + + displayMsg(e, Message::Join, e->params()[0], e->prefix(), e->params()[0], msgFlags); } @@ -275,7 +281,13 @@ void EventStringifier::processIrcEventKick(IrcEvent *e) if (e->params().count() > 2) msg += " " + e->params().at(2); - displayMsg(e, Message::Kick, msg, e->prefix(), channel); + Message::Flag msgFlags = Message::Flag::None; + if (e->testFlag(EventManager::Self)) { + // Mark the message as Self + msgFlags = Message::Self; + } + + displayMsg(e, Message::Kick, msg, e->prefix(), channel, msgFlags); } } @@ -289,7 +301,13 @@ void EventStringifier::processIrcEventMode(IrcEvent *e) else { // User Modes // FIXME: redirect - displayMsg(e, Message::Mode, e->params().join(" "), e->prefix()); + + Message::Flag msgFlags = Message::Flag::None; + if (e->testFlag(EventManager::Self)) { + // Mark the message as Self + msgFlags = Message::Self; + } + displayMsg(e, Message::Mode, e->params().join(" "), e->prefix(), QString(), msgFlags); } } @@ -307,11 +325,22 @@ void EventStringifier::processIrcEventNick(IrcEvent *e) } QString newnick = e->params().at(0); - QString oldnick = ircuser->nick(); - QString sender = e->network()->isMyNick(oldnick) ? newnick : e->prefix(); - foreach(const QString &channel, ircuser->channels()) - displayMsg(e, Message::Nick, newnick, sender, channel); + QString sender; + Message::Flag msgFlags = Message::Flag::None; + if (e->testFlag(EventManager::Self)) { + // Treat the sender as the new nickname, mark the message as Self + sender = newnick; + msgFlags = Message::Self; + } else { + // Take the sender from the event prefix, don't mark the message + sender = e->prefix(); + } + + // Announce to all channels the IrcUser is in + foreach(const QString &channel, ircuser->channels()) { + displayMsg(e, Message::Nick, newnick, sender, channel, msgFlags); + } } @@ -323,7 +352,14 @@ void EventStringifier::processIrcEventPart(IrcEvent *e) QString channel = e->params().at(0); QString msg = e->params().count() > 1 ? e->params().at(1) : QString(); - displayMsg(e, Message::Part, msg, e->prefix(), channel); + + Message::Flag msgFlags = Message::Flag::None; + if (e->testFlag(EventManager::Self)) { + // Mark the message as Self + msgFlags = Message::Self; + } + + displayMsg(e, Message::Part, msg, e->prefix(), channel, msgFlags); } @@ -345,15 +381,32 @@ void EventStringifier::processIrcEventQuit(IrcEvent *e) if (!ircuser) return; - foreach(const QString &channel, ircuser->channels()) - displayMsg(e, Message::Quit, e->params().count() ? e->params().first() : QString(), e->prefix(), channel); + + Message::Flag msgFlags = Message::Flag::None; + if (e->testFlag(EventManager::Self)) { + // Mark the message as Self + msgFlags = Message::Self; + } + + // Announce to all channels the IrcUser is in + foreach(const QString &channel, ircuser->channels()) { + displayMsg(e, Message::Quit, e->params().count() ? e->params().first() : QString(), + e->prefix(), channel, msgFlags); + } } void EventStringifier::processIrcEventTopic(IrcEvent *e) { + Message::Flag msgFlags = Message::Flag::None; + if (e->testFlag(EventManager::Self)) { + // Mark the message as Self + msgFlags = Message::Self; + } + displayMsg(e, Message::Topic, tr("%1 has changed topic for %2 to: \"%3\"") - .arg(e->nick(), e->params().at(0), e->params().at(1)), QString(), e->params().at(0)); + .arg(e->nick(), e->params().at(0), e->params().at(1)), QString(), e->params().at(0), + msgFlags); } void EventStringifier::processIrcEventError(IrcEvent *e) @@ -732,7 +785,9 @@ void EventStringifier::processCtcpEvent(CtcpEvent *e) 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()); + displayMsg(e, Message::Action, + tr("sending CTCP-%1 request to %2").arg(e->ctcpCmd(), e->target()), + e->network()->myNick(), QString(), Message::Flag::Self); return; } diff --git a/src/qtui/chatlinemodelitem.cpp b/src/qtui/chatlinemodelitem.cpp index 46a9a805..50002215 100644 --- a/src/qtui/chatlinemodelitem.cpp +++ b/src/qtui/chatlinemodelitem.cpp @@ -49,6 +49,15 @@ ChatLineModelItem::ChatLineModelItem(const Message &msg) { if (!msg.sender().contains('!')) _styledMsg.setFlags(msg.flags() |= Message::ServerMsg); + + if (_styledMsg.type() == Message::Nick) { + // HACK: Work around nick changes on Quassel core not properly being set as Self + // While this is fixed in the core, old cores and past history will still show incorrectly. + if (nickFromMask(_styledMsg.sender()) == stripFormatCodes(_styledMsg.contents()).toLower()) { + _styledMsg.setFlags(msg.flags() |= Message::Self); + } + } + // Unfortunately, the missing Self flag for other message types can't easily be worked around. } -- 2.20.1