Highlight = 0x02,
Redirected = 0x04,
ServerMsg = 0x08,
+ StatusMsg = 0x10,
Backlog = 0x80
};
Q_DECLARE_FLAGS(Flags, Flag)
}
+bool Network::isStatusMsg(const QString &target) const
+{
+ if (target.isEmpty())
+ return false;
+
+ if (supports("STATUSMSG"))
+ return support("STATUSMSG").contains(target[0]);
+ else
+ return QString("@+").contains(target[0]);
+}
+
+
NetworkInfo Network::networkInfo() const
{
NetworkInfo info;
inline bool isMe(IrcUser *ircuser) const { return (ircuser->nick().toLower() == myNick().toLower()); }
bool isChannelName(const QString &channelname) const;
+ bool isStatusMsg(const QString &target) const;
inline bool isConnected() const { return _connected; }
//Network::ConnectionState connectionState() const;
? 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;
+ }
+
if (coreSession()->networkConfig()->standardCtcp())
parseStandard(e, messagetype, dequotedMessage, ctcptype, flags);
else
QStringList targets = net->serverDecode(params.at(0)).split(',', QString::SkipEmptyParts);
QStringList::const_iterator targetIter;
for (targetIter = targets.constBegin(); targetIter != targets.constEnd(); ++targetIter) {
- QString target = net->isChannelName(*targetIter) ? *targetIter : senderNick;
+ QString target = net->isChannelName(*targetIter) || net->isStatusMsg(*targetIter) ? *targetIter : senderNick;
msg = decrypt(net, target, msg);