/***************************************************************************
- * Copyright (C) 2005-2014 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 *
QHash<QByteArray, QByteArray>::const_iterator quoteIter = quoteHash.constBegin();
while (quoteIter != quoteHash.constEnd()) {
quotedMessage.replace(quoteIter.value(), quoteIter.key());
- quoteIter++;
+ ++quoteIter;
}
return quotedMessage;
}
QHash<QByteArray, QByteArray>::const_iterator quoteIter = _ctcpXDelimDequoteHash.constBegin();
while (quoteIter != _ctcpXDelimDequoteHash.constEnd()) {
quotedMessage.replace(quoteIter.value(), quoteIter.key());
- quoteIter++;
+ ++quoteIter;
}
return quotedMessage;
}
? 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
if (dequotedMessage.count(XDELIM) != 2 || dequotedMessage[0] != '\001' || dequotedMessage[dequotedMessage.count() -1] != '\001') {
displayMsg(e, messagetype, targetDecode(e, dequotedMessage), e->prefix(), e->target(), flags);
} else {
- int spacePos = -1;
+ int spacePos;
QString ctcpcmd, ctcpparam;
QByteArray ctcp = xdelimDequote(dequotedMessage.mid(1, dequotedMessage.count() - 2));
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)));
+ QString cmd("PRIVMSG");
- 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);
+ std::function<QList<QByteArray>(QString &)> cmdGenerator = [&] (QString &splitMsg) -> QList<QByteArray> {
+ return QList<QByteArray>() << net->serverEncode(bufname) << lowLevelQuote(pack(net->serverEncode(ctcpTag), net->userEncode(bufname, splitMsg)));
+ };
- if (splitPos < message.count())
- query(net, bufname, ctcpTag, message.mid(splitPos));
+ net->putCmd(cmd, net->splitMessage(cmd, message, cmdGenerator));
}