*/
const QString CHGHOST = "chghost";
+ /**
+ * Server sending own messages back.
+ *
+ * https://ircv3.net/specs/extensions/echo-message-3.2.html
+ */
+ const QString ECHO_MESSAGE = "echo-message";
+
/**
* Extended join information.
*
AWAY_NOTIFY,
CAP_NOTIFY,
CHGHOST,
+ //ECHO_MESSAGE, // Postponed for message pending UI with batch + labeled-response
EXTENDED_JOIN,
INVITE_NOTIFY,
MESSAGE_TAGS,
// FIXME make this a proper event
coreNetwork()->coreSession()->ctcpParser()->query(coreNetwork(), nick, ctcpTag, message);
- emit displayMsg(NetworkInternalMessage(
- 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)
for (const auto& message : messages) {
// Handle each separated message independently
coreNetwork()->coreSession()->ctcpParser()->query(coreNetwork(), bufferInfo.bufferName(), "ACTION", message);
- emit displayMsg(NetworkInternalMessage(
- 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
+ ));
+ }
}
}
params.clear();
params << serverEncode(bufferName) << channelEncode(bufferInfo.bufferName(), message);
emit putCmd("NOTICE", params);
- emit displayMsg(NetworkInternalMessage(
- 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
+ ));
+ }
}
}
// handleMsg is a no-op if message is empty
}
else {
- emit displayMsg(NetworkInternalMessage(
- 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);
}
#else
putPrivmsg(bufferInfo.bufferName(), message, encodeFunc);
#endif
- emit displayMsg(NetworkInternalMessage(
- 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
+ ));
+ }
}
}
return;
MessageEvent* msgEvent = new MessageEvent(msgType, event->network(), std::move(msg), std::move(sender), std::move(target), msgFlags, event->timestamp());
+ if (event->testFlag(EventManager::Self)) {
+ msgEvent->setFlag(EventManager::Self);
+ }
emit newEvent(msgEvent);
}
ctcpparam,
e->timestamp(),
uuid);
+ if (e->testFlag(EventManager::Self)) {
+ event->setFlag(EventManager::Self);
+ }
emit newEvent(event);
CtcpEvent* flushEvent = new CtcpEvent(EventManager::CtcpEventFlush,
e->network(),
ctcpparam,
e->timestamp(),
uuid);
+ if (e->testFlag(EventManager::Self)) {
+ event->setFlag(EventManager::Self);
+ }
ctcpEvents << event;
}
}
if (e->type() != EventManager::CtcpEvent)
return;
- if (e->testFlag(EventManager::Self)) {
+ // Only stringify outgoing CTCP messages this way
+ if (e->testFlag(EventManager::Self) &&
+ // Only stringify CTCP queries this way
+ e->ctcpType() == CtcpEvent::CtcpType::Query &&
+ // Always handle ACTIONs as if they were sent from network, to properly handle echo-message
+ e->ctcpCmd() != "ACTION") {
displayMsg(e,
Message::Action,
tr("sending CTCP-%1 request to %2").arg(e->ctcpCmd(), e->target()),
//: Optional "unknown" in "Received unknown CTCP-FOO request by bar"
unknown = tr("unknown") + ' ';
displayMsg(e, Message::Server, tr("Received %1CTCP-%2 request by %3").arg(unknown, e->ctcpCmd(), e->prefix()));
- return;
+ } else {
+ // Ignore echo messages for our own answers
+ if (!e->testFlag(EventManager::Self)) {
+ displayMsg(e, Message::Server,
+ tr("Received CTCP-%1 answer from %2: %3").arg(e->ctcpCmd(), nickFromMask(e->prefix()),e->param()));
+ }
}
- displayMsg(e, Message::Server, tr("Received CTCP-%1 answer from %2: %3").arg(e->ctcpCmd(), nickFromMask(e->prefix()), e->param()));
}
void EventStringifier::handleCtcpAction(CtcpEvent* e)
{
- displayMsg(e, Message::Action, e->param(), e->prefix(), e->target());
+ Message::Flag msgFlags = Message::Flag::None;
+ if (e->testFlag(EventManager::Self)) {
+ // Mark the message as Self
+ msgFlags = Message::Self;
+ }
+
+ displayMsg(e, Message::Action, e->param(), e->prefix(), e->target(), msgFlags);
}
void EventStringifier::handleCtcpPing(CtcpEvent* e)