X-Git-Url: https://git.quassel-irc.org/?p=quassel.git;a=blobdiff_plain;f=src%2Fcore%2Fcoreuserinputhandler.cpp;h=0b6e5b73995b48e45e6ccf09f26143f5da240f02;hp=c17ea80998e19a001e1d222564d426a2ddb22837;hb=HEAD;hpb=c1cf157116de7fc3da96203aa6f03c38c7ebb650 diff --git a/src/core/coreuserinputhandler.cpp b/src/core/coreuserinputhandler.cpp index c17ea809..5c6f388f 100644 --- a/src/core/coreuserinputhandler.cpp +++ b/src/core/coreuserinputhandler.cpp @@ -1,5 +1,5 @@ /*************************************************************************** - * Copyright (C) 2005-2018 by the Quassel Project * + * Copyright (C) 2005-2022 by the Quassel Project * * devel@quassel-irc.org * * * * This program is free software; you can redistribute it and/or modify * @@ -122,7 +122,12 @@ void CoreUserInputHandler::banOrUnban(const BufferInfo& bufferInfo, const QStrin banChannel = bufferInfo.bufferName(); } else { - emit displayMsg(Message::Error, BufferInfo::StatusBuffer, "", QString("Error: channel unknown in command: /BAN %1").arg(msg)); + emit displayMsg(NetworkInternalMessage( + Message::Error, + BufferInfo::StatusBuffer, + "", + QString("Error: channel unknown in command: /BAN %1").arg(msg) + )); return; } @@ -131,7 +136,12 @@ void CoreUserInputHandler::banOrUnban(const BufferInfo& bufferInfo, const QStrin // generalizedHost changes to *!ident@*.sld.tld. QString generalizedHost = ircuser->host(); if (generalizedHost.isEmpty()) { - emit displayMsg(Message::Error, BufferInfo::StatusBuffer, "", QString("Error: host unknown in command: /BAN %1").arg(msg)); + emit displayMsg(NetworkInternalMessage( + Message::Error, + BufferInfo::StatusBuffer, + "", + QString("Error: host unknown in command: /BAN %1").arg(msg) + )); return; } @@ -173,7 +183,16 @@ void CoreUserInputHandler::handleCtcp(const BufferInfo& bufferInfo, const QStrin // FIXME make this a proper event coreNetwork()->coreSession()->ctcpParser()->query(coreNetwork(), nick, ctcpTag, message); - emit displayMsg(Message::Action, BufferInfo::StatusBuffer, "", verboseMessage, network()->myNick(), Message::Flag::Self); + if (!network()->capEnabled(IrcCap::ECHO_MESSAGE)) { + emit displayMsg(NetworkInternalMessage( + Message::Action, + BufferInfo::StatusBuffer, + "", + verboseMessage, + network()->myNick(), + Message::Flag::Self + )); + } } void CoreUserInputHandler::handleDelkey(const BufferInfo& bufferInfo, const QString& msg) @@ -184,10 +203,12 @@ void CoreUserInputHandler::handleDelkey(const BufferInfo& bufferInfo, const QStr 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.")); + emit displayMsg(NetworkInternalMessage( + Message::Error, + typeByTarget(bufname), + bufname, + tr("Error: QCA provider plugin not found. It is usually provided by the qca-ossl plugin.") + )); return; } @@ -197,39 +218,52 @@ void CoreUserInputHandler::handleDelkey(const BufferInfo& bufferInfo, const QStr parms.prepend(bufferInfo.bufferName()); if (parms.isEmpty()) { - emit displayMsg(Message::Info, - typeByTarget(bufname), - bufname, - tr("[usage] /delkey deletes the encryption key for nick or channel or just /delkey when in a " - "channel or query.")); + emit displayMsg(NetworkInternalMessage( + Message::Info, + typeByTarget(bufname), + bufname, + tr("[usage] /delkey 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)); + emit displayMsg(NetworkInternalMessage( + 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)); + emit displayMsg(NetworkInternalMessage( + 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.")); + emit displayMsg(NetworkInternalMessage( + 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) @@ -238,7 +272,7 @@ void CoreUserInputHandler::doMode(const BufferInfo& bufferInfo, const QChar& add QStringList nickList; if (nicks == "*" && bufferInfo.type() == BufferInfo::ChannelBuffer) { // All users in channel const QList users = network()->ircChannel(bufferInfo.bufferName())->ircUsers(); - foreach (IrcUser* user, users) { + for (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()); @@ -365,10 +399,12 @@ void CoreUserInputHandler::handleKeyx(const BufferInfo& bufferInfo, const QStrin 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.")); + emit displayMsg(NetworkInternalMessage( + Message::Error, + typeByTarget(bufname), + bufname, + tr("Error: QCA provider plugin not found. It is usually provided by the qca-ossl plugin.") + )); return; } @@ -377,17 +413,24 @@ void CoreUserInputHandler::handleKeyx(const BufferInfo& bufferInfo, const QStrin if (parms.count() == 0 && !bufferInfo.bufferName().isEmpty() && bufferInfo.acceptsRegularMessages()) parms.prepend(bufferInfo.bufferName()); else if (parms.count() != 1) { - emit displayMsg(Message::Info, - typeByTarget(bufname), - bufname, - tr("[usage] /keyx [] Initiates a DH1080 key exchange with the target.")); + emit displayMsg(NetworkInternalMessage( + Message::Info, + typeByTarget(bufname), + bufname, + tr("[usage] /keyx [] Initiates a DH1080 key exchange with the target.") + )); return; } QString target = parms.at(0); if (network()->isChannelName(target)) { - emit displayMsg(Message::Info, typeByTarget(bufname), bufname, tr("It is only possible to exchange keys in a query buffer.")); + emit displayMsg(NetworkInternalMessage( + Message::Info, + typeByTarget(bufname), + bufname, + tr("It is only possible to exchange keys in a query buffer.") + )); return; } @@ -397,22 +440,34 @@ void CoreUserInputHandler::handleKeyx(const BufferInfo& bufferInfo, const QStrin QByteArray pubKey = cipher->initKeyExchange(); if (pubKey.isEmpty()) - emit displayMsg(Message::Error, typeByTarget(bufname), bufname, tr("Failed to initiate key exchange with %1.").arg(target)); + emit displayMsg(NetworkInternalMessage( + Message::Error, + typeByTarget(bufname), + bufname, + tr("Failed to initiate key exchange with %1.").arg(target) + )); else { QList params; params << serverEncode(target) << serverEncode("DH1080_INIT ") + pubKey; emit putCmd("NOTICE", params); - emit displayMsg(Message::Info, typeByTarget(bufname), bufname, tr("Initiated key exchange with %1.").arg(target)); + emit displayMsg(NetworkInternalMessage( + Message::Info, + typeByTarget(bufname), + bufname, + tr("Initiated key exchange with %1.").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 (QCA) library. " - "Contact your distributor about a Quassel package with QCA " - "support, or rebuild Quassel with QCA present.")); + emit displayMsg(NetworkInternalMessage( + Message::Error, + typeByTarget(bufname), + bufname, + tr("Error: Setting an encryption key requires Quassel to have been built " + "with support for the Qt Cryptographic Architecture (QCA) library. " + "Contact your distributor about a Quassel package with QCA " + "support, or rebuild Quassel with QCA present.") + )); #endif } @@ -454,10 +509,19 @@ void CoreUserInputHandler::handleMe(const BufferInfo& bufferInfo, const QString& // they need to be split into multiple messages. QStringList messages = msg.split(QChar::LineFeed); - foreach (auto message, messages) { + for (const auto& message : messages) { // Handle each separated message independently coreNetwork()->coreSession()->ctcpParser()->query(coreNetwork(), bufferInfo.bufferName(), "ACTION", message); - emit displayMsg(Message::Action, bufferInfo.type(), bufferInfo.bufferName(), message, network()->myNick(), Message::Self); + if (!network()->capEnabled(IrcCap::ECHO_MESSAGE)) { + emit displayMsg(NetworkInternalMessage( + Message::Action, + bufferInfo.type(), + bufferInfo.bufferName(), + message, + network()->myNick(), + Message::Self + )); + } } } @@ -469,7 +533,12 @@ void CoreUserInputHandler::handleMode(const BufferInfo& bufferInfo, const QStrin if (!params.isEmpty()) { if (params[0] == "-reset" && params.count() == 1) { network()->resetPersistentModes(); - emit displayMsg(Message::Info, BufferInfo::StatusBuffer, "", tr("Your persistent modes have been reset.")); + emit displayMsg(NetworkInternalMessage( + Message::Info, + BufferInfo::StatusBuffer, + "", + tr("Your persistent modes have been reset.") + )); return; } if (!network()->isChannelName(params[0]) && !network()->isMyNick(params[0])) @@ -520,12 +589,21 @@ void CoreUserInputHandler::handleNotice(const BufferInfo& bufferInfo, const QStr // they need to be split into multiple messages. QStringList messages = msg.section(' ', 1).split(QChar::LineFeed); - foreach (auto message, messages) { + for (const auto& message : messages) { // Handle each separated message independently params.clear(); params << serverEncode(bufferName) << channelEncode(bufferInfo.bufferName(), message); emit putCmd("NOTICE", params); - emit displayMsg(Message::Notice, typeByTarget(bufferName), bufferName, message, network()->myNick(), Message::Self); + if (!network()->capEnabled(IrcCap::ECHO_MESSAGE)) { + emit displayMsg(NetworkInternalMessage( + Message::Notice, + typeByTarget(bufferName), + bufferName, + message, + network()->myNick(), + Message::Self + )); + } } } @@ -566,7 +644,7 @@ void CoreUserInputHandler::handlePing(const BufferInfo& bufferInfo, const QStrin param = QTime::currentTime().toString("hh:mm:ss.zzz"); // Take priority so this won't get stuck behind other queued messages. - putCmd("PING", serverEncode(param), QByteArray(), true); + putCmd("PING", serverEncode(param), {}, {}, true); } void CoreUserInputHandler::handlePrint(const BufferInfo& bufferInfo, const QString& msg) @@ -575,7 +653,14 @@ void CoreUserInputHandler::handlePrint(const BufferInfo& bufferInfo, const QStri return; // server buffer QByteArray encMsg = channelEncode(bufferInfo.bufferName(), msg); - emit displayMsg(Message::Info, bufferInfo.type(), bufferInfo.bufferName(), msg, network()->myNick(), Message::Self); + emit displayMsg(NetworkInternalMessage( + Message::Info, + bufferInfo.type(), + bufferInfo.bufferName(), + msg, + network()->myNick(), + Message::Self + )); } // TODO: implement queries @@ -587,19 +672,30 @@ void CoreUserInputHandler::handleQuery(const BufferInfo& bufferInfo, const QStri // they need to be split into multiple messages. QStringList messages = msg.section(' ', 1).split(QChar::LineFeed); - foreach (auto message, messages) { + for (const auto& message : messages) { // Handle each separated message independently if (message.isEmpty()) { - emit displayMsg(Message::Server, - BufferInfo::QueryBuffer, - target, - tr("Starting query with %1").arg(target), - network()->myNick(), - Message::Self); + emit displayMsg(NetworkInternalMessage( + Message::Server, + BufferInfo::QueryBuffer, + target, + tr("Starting query with %1").arg(target), + network()->myNick(), + Message::Self + )); // handleMsg is a no-op if message is empty } else { - emit displayMsg(Message::Plain, BufferInfo::QueryBuffer, target, message, network()->myNick(), Message::Self); + if (!network()->capEnabled(IrcCap::ECHO_MESSAGE)) { + emit displayMsg(NetworkInternalMessage( + Message::Plain, + BufferInfo::QueryBuffer, + target, + message, + network()->myNick(), + Message::Self + )); + } // handleMsg needs the target specified at the beginning of the message handleMsg(bufferInfo, target + " " + message); } @@ -615,7 +711,7 @@ void CoreUserInputHandler::handleQuit(const BufferInfo& bufferInfo, const QStrin void CoreUserInputHandler::issueQuit(const QString& reason, bool forceImmediate) { // If needing an immediate QUIT (e.g. core shutdown), prepend this to the queue - emit putCmd("QUIT", serverEncode(reason), QByteArray(), forceImmediate); + emit putCmd("QUIT", serverEncode(reason), {}, {}, forceImmediate); } void CoreUserInputHandler::handleQuote(const BufferInfo& bufferInfo, const QString& msg) @@ -636,14 +732,23 @@ void CoreUserInputHandler::handleSay(const BufferInfo& bufferInfo, const QString // they need to be split into multiple messages. QStringList messages = msg.split(QChar::LineFeed, QString::SkipEmptyParts); - foreach (auto message, messages) { + for (const auto& message : messages) { // Handle each separated message independently #ifdef HAVE_QCA2 putPrivmsg(bufferInfo.bufferName(), message, encodeFunc, network()->cipher(bufferInfo.bufferName())); #else putPrivmsg(bufferInfo.bufferName(), message, encodeFunc); #endif - emit displayMsg(Message::Plain, bufferInfo.type(), bufferInfo.bufferName(), message, network()->myNick(), Message::Self); + if (!network()->capEnabled(IrcCap::ECHO_MESSAGE)) { + emit displayMsg(NetworkInternalMessage( + Message::Plain, + bufferInfo.type(), + bufferInfo.bufferName(), + message, + network()->myNick(), + Message::Self + )); + } } } @@ -655,10 +760,12 @@ void CoreUserInputHandler::handleSetkey(const BufferInfo& bufferInfo, const QStr 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.")); + emit displayMsg(NetworkInternalMessage( + Message::Error, + typeByTarget(bufname), + bufname, + tr("Error: QCA provider plugin not found. It is usually provided by the qca-ossl plugin.") + )); return; } @@ -667,11 +774,14 @@ void CoreUserInputHandler::handleSetkey(const BufferInfo& bufferInfo, const QStr if (parms.count() == 1 && !bufferInfo.bufferName().isEmpty() && bufferInfo.acceptsRegularMessages()) parms.prepend(bufferInfo.bufferName()); else if (parms.count() != 2) { - emit displayMsg(Message::Info, - typeByTarget(bufname), - bufname, - tr("[usage] /setkey sets the encryption key for nick or channel. " - "/setkey when in a channel or query buffer sets the key for it.")); + emit displayMsg(NetworkInternalMessage( + Message::Info, + typeByTarget(bufname), + bufname, + tr("[usage] /setkey sets the encryption key for nick or channel. " + "/setkey when in a channel or query buffer sets the key for it. " + "Prefix by cbc: or ebc: to explicitly set the encryption mode respectively. Default is CBC.") + )); return; } @@ -679,19 +789,32 @@ void CoreUserInputHandler::handleSetkey(const BufferInfo& bufferInfo, const QStr QByteArray key = parms.at(1).toLocal8Bit(); network()->setCipherKey(target, key); - emit displayMsg(Message::Info, typeByTarget(bufname), bufname, tr("The key for %1 has been set.").arg(target)); + emit displayMsg(NetworkInternalMessage( + Message::Info, + typeByTarget(bufname), + bufname, + tr("The key for %1 has been set.").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 (QCA) library. " - "Contact your distributor about a Quassel package with QCA " - "support, or rebuild Quassel with QCA present.")); + emit displayMsg(NetworkInternalMessage( + Message::Error, + typeByTarget(bufname), + bufname, + tr("Error: Setting an encryption key requires Quassel to have been built " + "with support for the Qt Cryptographic Architecture (QCA) library. " + "Contact your distributor about a Quassel package with QCA " + "support, or rebuild Quassel with QCA present.") + )); #endif } +void CoreUserInputHandler::handleSetname(const BufferInfo& bufferInfo, const QString& msg) +{ + Q_UNUSED(bufferInfo) + emit putCmd("SETNAME", serverEncode(msg)); +} + void CoreUserInputHandler::handleShowkey(const BufferInfo& bufferInfo, const QString& msg) { QString bufname = bufferInfo.bufferName().isNull() ? "" : bufferInfo.bufferName(); @@ -700,10 +823,12 @@ void CoreUserInputHandler::handleShowkey(const BufferInfo& bufferInfo, const QSt 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.")); + emit displayMsg(NetworkInternalMessage( + Message::Error, + typeByTarget(bufname), + bufname, + tr("Error: QCA provider plugin not found. It is usually provided by the qca-ossl plugin.") + )); return; } @@ -713,11 +838,13 @@ void CoreUserInputHandler::handleShowkey(const BufferInfo& bufferInfo, const QSt parms.prepend(bufferInfo.bufferName()); if (parms.isEmpty()) { - emit displayMsg(Message::Info, - typeByTarget(bufname), - bufname, - tr("[usage] /showkey shows the encryption key for nick or channel or just /showkey when in a " - "channel or query.")); + emit displayMsg(NetworkInternalMessage( + Message::Info, + typeByTarget(bufname), + bufname, + tr("[usage] /showkey shows the encryption key for nick or channel or just /showkey when in a " + "channel or query.") + )); return; } @@ -725,24 +852,33 @@ void CoreUserInputHandler::handleShowkey(const BufferInfo& bufferInfo, const QSt QByteArray key = network()->cipherKey(target); if (key.isEmpty()) { - emit displayMsg(Message::Info, typeByTarget(bufname), bufname, tr("No key has been set for %1.").arg(target)); + emit displayMsg(NetworkInternalMessage( + Message::Info, + typeByTarget(bufname), + bufname, + tr("No key has been set for %1.").arg(target) + )); return; } - emit displayMsg(Message::Info, - typeByTarget(bufname), - bufname, - tr("The key for %1 is %2:%3").arg(target, network()->cipherUsesCBC(target) ? "CBC" : "ECB", QString(key))); + emit displayMsg(NetworkInternalMessage( + Message::Info, + typeByTarget(bufname), + bufname, + tr("The key for %1 is %2:%3").arg(target, network()->cipherUsesCBC(target) ? "CBC" : "ECB", QString(key)) + )); #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.")); + emit displayMsg(NetworkInternalMessage( + 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 } @@ -916,7 +1052,7 @@ void CoreUserInputHandler::timerEvent(QTimerEvent* event) // the stored command might be the result of an alias expansion, so we need to split it up again QStringList commands = rawCommand.split(QRegExp("; ?")); - foreach (QString command, commands) { + for (const QString& command : commands) { handleUserInput(bufferInfo, command); } }