/***************************************************************************
- * Copyright (C) 2005-2013 by the Quassel Project *
+ * Copyright (C) 2005-2016 by the Quassel Project *
* devel@quassel-irc.org *
* *
* This program is free software; you can redistribute it and/or modify *
if (checkParamCount(cmd, params, 1)) {
QString senderNick = nickFromMask(prefix);
+ net->updateNickFromMask(prefix);
QByteArray msg = params.count() < 2 ? QByteArray() : params.at(1);
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);
else {
if (!target.isEmpty() && net->prefixes().contains(target.at(0)))
target = target.mid(1);
- if (!net->isChannelName(target))
+ if (!net->isChannelName(target)) {
target = nickFromMask(prefix);
+ net->updateNickFromMask(prefix);
+ }
}
#ifdef HAVE_QCA2
// Handle DH1080 key exchange
- if (params[1].startsWith("DH1080_INIT")) {
+ if (params[1].startsWith("DH1080_INIT") && !net->isChannelName(target)) {
events << new KeyEvent(EventManager::KeyEvent, net, prefix, target, KeyEvent::Init, params[1].mid(12));
- } else if (params[1].startsWith("DH1080_FINISH")) {
+ } else if (params[1].startsWith("DH1080_FINISH") && !net->isChannelName(target)) {
events << new KeyEvent(EventManager::KeyEvent, net, prefix, target, KeyEvent::Finish, params[1].mid(14));
} else
#endif
QString channel = net->serverDecode(params.at(0));
decParams << channel;
decParams << net->userDecode(nickFromMask(prefix), params.at(1));
+ net->updateNickFromMask(prefix);
}
break;
case EventManager::IrcEventQuit:
if (params.count() >= 1) {
decParams << net->userDecode(nickFromMask(prefix), params.at(0));
+ net->updateNickFromMask(prefix);
}
break;
}
break;
+ case EventManager::IrcEventAway:
+ {
+ QString nick = nickFromMask(prefix);
+ decParams << nick;
+ decParams << (params.count() >= 1 ? net->userDecode(nick, params.at(0)) : QString());
+ net->updateNickFromMask(prefix);
+ }
+ break;
+
case EventManager::IrcEventNumeric:
switch (num) {
case 301: /* RPL_AWAY */
decParams << net->channelDecode(channel, params.at(2));
}
break;
+ case 451: /* You have not registered... */
+ if (target.compare("CAP", Qt::CaseInsensitive) == 0) {
+ // :irc.server.com 451 CAP :You have not registered
+ // If server doesn't support capabilities, it will report this message. Turn it
+ // into a nicer message since it's not a real error.
+ defaultHandling = false;
+ events << new MessageEvent(Message::Server, e->network(),
+ tr("Capability negotiation not supported"),
+ QString(), QString(), Message::None, e->timestamp());
+ }
+ break;
}
default:
for (int i = decParams.count(); i < params.count(); i++)
decParams << net->serverDecode(params.at(i));
+ // We want to trim the last param just in case, except for PRIVMSG and NOTICE
+ // ... but those happen to be the only ones not using defaultHandling anyway
+ if (!decParams.isEmpty() && decParams.last().endsWith(' '))
+ decParams.append(decParams.takeLast().trimmed());
+
IrcEvent *event;
if (type == EventManager::IrcEventNumeric)
event = new IrcEventNumeric(num, net, prefix, target);