Detect and label changes from ourself
authorShane Synan <digitalcircuit36939@gmail.com>
Sat, 3 Dec 2016 03:06:41 +0000 (21:06 -0600)
committerManuel Nickschas <sputnick@quassel-irc.org>
Wed, 12 Apr 2017 20:51:19 +0000 (22:51 +0200)
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
src/core/coresessioneventprocessor.h
src/core/coreuserinputhandler.cpp
src/core/eventstringifier.cpp
src/qtui/chatlinemodelitem.cpp

index e4621bf..7c414ba 100644 (file)
@@ -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<CoreNetwork *>(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));
index 52aa3db..6577f18 100644 (file)
@@ -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);
index ebbaf91..2eede06 100644 (file)
@@ -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);
 }
 
 
index 6ef3f8a..43d29d9 100644 (file)
@@ -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;
     }
 
index 46a9a80..5000221 100644 (file)
@@ -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.
 }