From d86cc80c2a3835bd50f25043283a6338096c5208 Mon Sep 17 00:00:00 2001 From: tecknojock Date: Thu, 14 Aug 2014 14:53:30 -0500 Subject: [PATCH] Fixed CTCP Action Spliting 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 | 2 +- src/core/coreuserinputhandler.h | 2 +- src/core/ctcpparser.cpp | 23 ++++++++++++++++++++++- 3 files changed, 24 insertions(+), 3 deletions(-) diff --git a/src/core/coreuserinputhandler.cpp b/src/core/coreuserinputhandler.cpp index cc508cf8..68916920 100644 --- a/src/core/coreuserinputhandler.cpp +++ b/src/core/coreuserinputhandler.cpp @@ -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; diff --git a/src/core/coreuserinputhandler.h b/src/core/coreuserinputhandler.h index cd9e6bc1..3c035082 100644 --- a/src/core/coreuserinputhandler.h +++ b/src/core/coreuserinputhandler.h @@ -36,6 +36,7 @@ public: inline CoreNetwork *coreNetwork() const { return qobject_cast(parent()); } void handleUserInput(const BufferInfo &bufferInfo, const QString &text); + int lastParamOverrun(const QString &cmd, const QList ¶ms); 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 ¶ms); #ifdef HAVE_QCA2 QByteArray encrypt(const QString &target, const QByteArray &message, bool *didEncrypt = 0) const; diff --git a/src/core/ctcpparser.cpp b/src/core/ctcpparser.cpp index ddaea7aa..2afe993d 100644 --- a/src/core/ctcpparser.cpp +++ b/src/core/ctcpparser.cpp @@ -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 params; + QList 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)); } -- 2.20.1