modernize: Replace most remaining old-style connects by PMF ones
[quassel.git] / src / core / ctcpparser.cpp
index d2da841..f60311c 100644 (file)
@@ -1,5 +1,5 @@
 /***************************************************************************
- *   Copyright (C) 2005-2015 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  *
@@ -40,14 +40,14 @@ CtcpParser::CtcpParser(CoreSession *coreSession, QObject *parent)
 
     setStandardCtcp(_coreSession->networkConfig()->standardCtcp());
 
-    connect(_coreSession->networkConfig(), SIGNAL(standardCtcpSet(bool)), this, SLOT(setStandardCtcp(bool)));
-    connect(this, SIGNAL(newEvent(Event *)), _coreSession->eventManager(), SLOT(postEvent(Event *)));
+    connect(_coreSession->networkConfig(), &NetworkConfig::standardCtcpSet, this, &CtcpParser::setStandardCtcp);
+    connect(this, &CtcpParser::newEvent, _coreSession->eventManager(), &EventManager::postEvent);
 }
 
 
 void CtcpParser::setStandardCtcp(bool enabled)
 {
-    QByteArray XQUOTE = QByteArray("\134");
+    QByteArray XQUOTE = QByteArray(R"(\)");
     if (enabled)
         _ctcpXDelimDequoteHash[XQUOTE + XQUOTE] = XQUOTE;
     else
@@ -171,6 +171,32 @@ void CtcpParser::parse(IrcEventRawMessage *e, Message::Type messagetype)
                            ? Message::Redirected
                            : Message::None;
 
+    bool isStatusMsg = false;
+
+    // First remove all statusmsg prefix characters that are not also channel prefix characters.
+    while (e->network()->isStatusMsg(e->target()) && !e->network()->isChannelName(e->target())) {
+        isStatusMsg = true;
+        e->setTarget(e->target().remove(0, 1));
+    }
+
+    // Then continue removing statusmsg characters as long as removing the character will still result in a
+    // valid channel name.  This prevents removing the channel prefix character if said character is in the
+    // overlap between the statusmsg characters and the channel prefix characters.
+    while (e->network()->isStatusMsg(e->target()) && e->network()->isChannelName(e->target().remove(0, 1))) {
+        isStatusMsg = true;
+        e->setTarget(e->target().remove(0, 1));
+    }
+
+    // If any statusmsg characters were removed, Flag the message as a StatusMsg.
+    if (isStatusMsg) {
+        flags |= Message::StatusMsg;
+    }
+
+    // For self-messages, pass the flag on to the message, too
+    if (e->testFlag(EventManager::Self)) {
+        flags |= Message::Self;
+    }
+
     if (coreSession()->networkConfig()->standardCtcp())
         parseStandard(e, messagetype, dequotedMessage, ctcptype, flags);
     else