From: Manuel Nickschas Date: Mon, 22 Sep 2014 20:32:50 +0000 (+0200) Subject: Merge pull request #84 from tecknojock/master X-Git-Tag: 0.11.0~5 X-Git-Url: https://git.quassel-irc.org/?p=quassel.git;a=commitdiff_plain;h=61fd20ec28db1dc1e36edee78a48f9a7d516c8f0;hp=bc715c756677bee7cdb7109cc656e3e5f526c988 Merge pull request #84 from tecknojock/master Fixed splitting of CTCP ACTION --- diff --git a/src/core/coreuserinputhandler.cpp b/src/core/coreuserinputhandler.cpp index 4f551f1c..e9efbaaf 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..db285a68 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,29 @@ 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))); + + 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)))); + params = newparams; + } net->putCmd("PRIVMSG", params); + + if (splitPos < message.count()) + query(net, bufname, ctcpTag, message.mid(splitPos)); }