+void CoreSessionEventProcessor::processIrcEventTopic(IrcEvent* e)
+{
+ if (checkParamCount(e, 2)) {
+ IrcUser* ircuser = e->network()->updateNickFromMask(e->prefix());
+
+ if (e->network()->isMe(ircuser)) {
+ // Mark the message as Self
+ e->setFlag(EventManager::Self);
+ }
+
+ IrcChannel* channel = e->network()->ircChannel(e->params().at(0));
+ if (channel)
+ channel->setTopic(e->params().at(1));
+ }
+}
+
+/* ERROR - "ERROR :reason"
+Example: ERROR :Closing Link: nickname[xxx.xxx.xxx.xxx] (Large base64 image paste.)
+See https://tools.ietf.org/html/rfc2812#section-3.7.4 */
+void CoreSessionEventProcessor::processIrcEventError(IrcEvent* e)
+{
+ if (!checkParamCount(e, 1))
+ return;
+
+ if (coreNetwork(e)->disconnectExpected()) {
+ // During QUIT, the server should send an error (often, but not always, "Closing Link"). As
+ // we're expecting it, don't show this to the user.
+ e->setFlag(EventManager::Silent);
+ }
+}
+
+
+// IRCv3 SETNAME - ":nick!user@host SETNAME :realname goes here"
+// Example: :batman!~batman@bat.cave SETNAME :Bruce Wayne <bruce@wayne.enterprises>
+//
+// See https://ircv3.net/specs/extensions/setname
+void CoreSessionEventProcessor::processIrcEventSetname(IrcEvent* e)
+{
+ if (checkParamCount(e, 1)) {
+ IrcUser* ircuser = e->network()->updateNickFromMask(e->prefix());
+ if (!ircuser) {
+ qWarning() << Q_FUNC_INFO << "Unknown IrcUser!";
+ return;
+ }
+
+ QString newname = e->params().at(0);
+ ircuser->setRealName(newname);
+ }
+}
+
+#ifdef HAVE_QCA2
+void CoreSessionEventProcessor::processKeyEvent(KeyEvent* e)
+{
+ if (!Cipher::neededFeaturesAvailable()) {
+ emit newEvent(new MessageEvent(Message::Error,
+ e->network(),
+ tr("Unable to perform key exchange, missing qca-ossl plugin."),
+ e->prefix(),
+ e->target(),
+ Message::None,
+ e->timestamp()));
+ return;
+ }
+ auto* net = qobject_cast<CoreNetwork*>(e->network());
+ Cipher* c = net->cipher(e->target());
+ if (!c) // happens when there is no CoreIrcChannel for the target (i.e. never?)
+ return;
+
+ if (e->exchangeType() == KeyEvent::Init) {
+ QByteArray pubKey = c->parseInitKeyX(e->key());
+ if (pubKey.isEmpty()) {
+ emit newEvent(new MessageEvent(Message::Error,
+ e->network(),
+ tr("Unable to parse the DH1080_INIT. Key exchange failed."),
+ e->prefix(),
+ e->target(),
+ Message::None,
+ e->timestamp()));
+ return;
+ }
+ else {
+ net->setCipherKey(e->target(), c->key());
+ emit newEvent(new MessageEvent(Message::Info,
+ e->network(),
+ tr("Your key is set and messages will be encrypted."),
+ e->prefix(),
+ e->target(),
+ Message::None,
+ e->timestamp()));
+ QList<QByteArray> p;
+ p << net->serverEncode(e->target()) << net->serverEncode("DH1080_FINISH ") + pubKey;
+ net->putCmd("NOTICE", p);
+ }
+ }
+ else {
+ if (c->parseFinishKeyX(e->key())) {
+ net->setCipherKey(e->target(), c->key());
+ emit newEvent(new MessageEvent(Message::Info,
+ e->network(),
+ tr("Your key is set and messages will be encrypted."),
+ e->prefix(),
+ e->target(),
+ Message::None,
+ e->timestamp()));
+ }
+ else {
+ emit newEvent(new MessageEvent(Message::Info,
+ e->network(),
+ tr("Failed to parse DH1080_FINISH. Key exchange failed."),
+ e->prefix(),
+ e->target(),
+ Message::None,
+ e->timestamp()));
+ }
+ }
+}
+#endif