+ QString banMode = ban ? "+b" : "-b";
+ QString banMsg = QString("MODE %1 %2 %3").arg(banChannel, banMode, banUser);
+ emit putRawLine(serverEncode(banMsg));
+}
+
+
+void CoreUserInputHandler::handleCtcp(const BufferInfo &bufferInfo, const QString &msg)
+{
+ Q_UNUSED(bufferInfo)
+
+ QString nick = msg.section(' ', 0, 0);
+ QString ctcpTag = msg.section(' ', 1, 1).toUpper();
+ if (ctcpTag.isEmpty())
+ return;
+
+ QString message = msg.section(' ', 2);
+ QString verboseMessage = tr("sending CTCP-%1 request to %2").arg(ctcpTag).arg(nick);
+
+ if (ctcpTag == "PING") {
+#if QT_VERSION >= 0x040700
+ message = QString::number(QDateTime::currentMSecsSinceEpoch());
+#else
+ message = QString::number(QDateTime::currentDateTime().toTime_t());
+#endif
+ }
+
+ // FIXME make this a proper event
+ coreNetwork()->coreSession()->ctcpParser()->query(coreNetwork(), nick, ctcpTag, message);
+ emit displayMsg(Message::Action, BufferInfo::StatusBuffer, "", verboseMessage, network()->myNick());
+}
+
+
+void CoreUserInputHandler::handleDelkey(const BufferInfo &bufferInfo, const QString &msg)
+{
+ QString bufname = bufferInfo.bufferName().isNull() ? "" : bufferInfo.bufferName();
+#ifdef HAVE_QCA2
+ if (!bufferInfo.isValid())
+ return;
+
+ if (!Cipher::neededFeaturesAvailable()) {
+ emit displayMsg(Message::Error, typeByTarget(bufname), bufname, tr("Error: QCA provider plugin not found. It is usually provided by the qca-ossl plugin."));
+ return;
+ }
+
+ QStringList parms = msg.split(' ', QString::SkipEmptyParts);
+
+ if (parms.isEmpty() && !bufferInfo.bufferName().isEmpty() && bufferInfo.acceptsRegularMessages())
+ parms.prepend(bufferInfo.bufferName());
+
+ if (parms.isEmpty()) {
+ emit displayMsg(Message::Info, typeByTarget(bufname), bufname,
+ tr("[usage] /delkey <nick|channel> deletes the encryption key for nick or channel or just /delkey when in a channel or query."));
+ return;
+ }
+
+ QString target = parms.at(0);
+
+ if (network()->cipherKey(target).isEmpty()) {
+ emit displayMsg(Message::Info, typeByTarget(bufname), bufname, tr("No key has been set for %1.").arg(target));
+ return;
+ }
+
+ network()->setCipherKey(target, QByteArray());
+ emit displayMsg(Message::Info, typeByTarget(bufname), bufname, tr("The key for %1 has been deleted.").arg(target));
+
+#else
+ Q_UNUSED(msg)
+ emit displayMsg(Message::Error, typeByTarget(bufname), bufname, tr("Error: Setting an encryption key requires Quassel to have been built "
+ "with support for the Qt Cryptographic Architecture (QCA2) library. "
+ "Contact your distributor about a Quassel package with QCA2 "
+ "support, or rebuild Quassel with QCA2 present."));
+#endif
+}
+
+void CoreUserInputHandler::doMode(const BufferInfo &bufferInfo, const QChar& addOrRemove, const QChar& mode, const QString &nicks)
+{
+ QString m;
+ bool isNumber;
+ int maxModes = network()->support("MODES").toInt(&isNumber);
+ if (!isNumber || maxModes == 0) maxModes = 1;
+
+ QStringList nickList;
+ if (nicks == "*") { // All users in channel
+ const QList<IrcUser*> users = network()->ircChannel(bufferInfo.bufferName())->ircUsers();
+ foreach(IrcUser *user, users) {
+ if ((addOrRemove == '+' && !network()->ircChannel(bufferInfo.bufferName())->userModes(user).contains(mode))
+ || (addOrRemove == '-' && network()->ircChannel(bufferInfo.bufferName())->userModes(user).contains(mode)))
+ nickList.append(user->nick());
+ }
+ } else {
+ nickList = nicks.split(' ', QString::SkipEmptyParts);