Fixed CTCP Action Spliting
[quassel.git] / src / core / ctcpparser.cpp
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));
 }