Fixed CTCP Action Spliting
authortecknojock <tecknojock@gmail.com>
Thu, 14 Aug 2014 19:53:30 +0000 (14:53 -0500)
committerManuel Nickschas <sputnick@quassel-irc.org>
Tue, 23 Sep 2014 21:25:04 +0000 (23:25 +0200)
Previously /me would truncate if it was over the 512 character limit,
forming a malformed action as the last \01 character is cut off. Now the
CTCP Action should autosplit the same way that overflow on normal
messages does. Additionally the characters !? were added to the
splittable characters list, bringing the new list to " ,.-!?"

src/core/coreuserinputhandler.cpp
src/core/coreuserinputhandler.h
src/core/ctcpparser.cpp

index cc508cf..6891692 100644 (file)
@@ -767,7 +767,7 @@ void CoreUserInputHandler::putPrivmsg(const QByteArray &target, const QByteArray
     //       For example, blowfish-ebc seems to create 8-char chunks.
 
     static const char *cmd = "PRIVMSG";
-    static const char *splitter = " .,-";
+    static const char *splitter = " .,-!?";
 
     int maxSplitPos = message.count();
     int splitPos = maxSplitPos;
index cd9e6bc..3c03508 100644 (file)
@@ -36,6 +36,7 @@ public:
     inline CoreNetwork *coreNetwork() const { return qobject_cast<CoreNetwork *>(parent()); }
 
     void handleUserInput(const BufferInfo &bufferInfo, const QString &text);
+    int lastParamOverrun(const QString &cmd, const QList<QByteArray> &params);
 
 public slots:
     void handleAway(const BufferInfo &bufferInfo, const QString &text);
@@ -87,7 +88,6 @@ private:
     void doMode(const BufferInfo& bufferInfo, const QChar &addOrRemove, const QChar &mode, const QString &nickList);
     void banOrUnban(const BufferInfo &bufferInfo, const QString &text, bool ban);
     void putPrivmsg(const QByteArray &target, const QByteArray &message, Cipher *cipher = 0);
-    int lastParamOverrun(const QString &cmd, const QList<QByteArray> &params);
 
 #ifdef HAVE_QCA2
     QByteArray encrypt(const QString &target, const QByteArray &message, bool *didEncrypt = 0) const;
index ddaea7a..2afe993 100644 (file)
@@ -24,6 +24,7 @@
 #include "coresession.h"
 #include "ctcpevent.h"
 #include "messageevent.h"
+#include "coreuserinputhandler.h"
 
 const QByteArray XDELIM = "\001";
 
@@ -312,8 +313,28 @@ QByteArray CtcpParser::pack(const QByteArray &ctcpTag, const QByteArray &message
 void CtcpParser::query(CoreNetwork *net, const QString &bufname, const QString &ctcpTag, const QString &message)
 {
     QList<QByteArray> params;
+    QList<QByteArray> newparams;
     params << net->serverEncode(bufname) << lowLevelQuote(pack(net->serverEncode(ctcpTag), net->userEncode(bufname, message)));
-    net->putCmd("PRIVMSG", params);
+
+    static const char *splitter = " .,-!?";
+    int maxSplitPos = message.count();
+    int splitPos = maxSplitPos;
+
+    int overrun = net->userInputHandler()->lastParamOverrun("PRIVMSG", params);
+    if (overrun) {
+        maxSplitPos = message.count() - overrun -2;
+        splitPos = -1;
+        for (const char *splitChar = splitter; *splitChar != 0; splitChar++) {
+            splitPos = qMax(splitPos, message.lastIndexOf(*splitChar, maxSplitPos) + 1); // keep split char on old line
+        }
+        if (splitPos <= 0 || splitPos > maxSplitPos)
+            splitPos = maxSplitPos;
+    }
+    newparams << net->serverEncode(bufname) << lowLevelQuote(pack(net->serverEncode(ctcpTag), net->userEncode(bufname, message.left(splitPos))));
+    net->putCmd("PRIVMSG", newparams);
+
+    if (splitPos < message.count())
+        query(net, bufname, ctcpTag, message.mid(splitPos));
 }