X-Git-Url: https://git.quassel-irc.org/?a=blobdiff_plain;f=src%2Fcore%2Fcoresession.cpp;h=df9061d3ee0c8c90babe192f47f16d2bdeba1a75;hb=79aa3994d78860c0b7a623a46ce44dffff988fd9;hp=2ca9627ccd0e0d24f8ac0f55e928b84813eb8873;hpb=dd69349ca91776432a4a53aa4d18dd8ef018cd26;p=quassel.git diff --git a/src/core/coresession.cpp b/src/core/coresession.cpp index 2ca9627c..df9061d3 100644 --- a/src/core/coresession.cpp +++ b/src/core/coresession.cpp @@ -1,5 +1,5 @@ /*************************************************************************** - * Copyright (C) 2005-2016 by the Quassel Project * + * Copyright (C) 2005-2018 by the Quassel Project * * devel@quassel-irc.org * * * * This program is free software; you can redistribute it and/or modify * @@ -77,7 +77,8 @@ CoreSession::CoreSession(UserId uid, bool restoreState, QObject *parent) _ircParser(new IrcParser(this)), scriptEngine(new QScriptEngine(this)), _processMessages(false), - _ignoreListManager(this) + _ignoreListManager(this), + _highlightRuleManager(this) { SignalProxy *p = signalProxy(); p->setHeartBeatInterval(30); @@ -105,6 +106,9 @@ CoreSession::CoreSession(UserId uid, bool restoreState, QObject *parent) p->attachSlot(SIGNAL(changePassword(PeerPtr,QString,QString,QString)), this, SLOT(changePassword(PeerPtr,QString,QString,QString))); p->attachSignal(this, SIGNAL(passwordChanged(PeerPtr,bool))); + p->attachSlot(SIGNAL(kickClient(int)), this, SLOT(kickClient(int))); + p->attachSignal(this, SIGNAL(disconnectFromCore())); + loadSettings(); initScriptEngine(); @@ -128,6 +132,7 @@ CoreSession::CoreSession(UserId uid, bool restoreState, QObject *parent) p->synchronize(networkConfig()); p->synchronize(&_coreInfo); p->synchronize(&_ignoreListManager); + p->synchronize(&_highlightRuleManager); p->synchronize(transferManager()); // Restore session state if (restoreState) @@ -283,6 +288,17 @@ QHash CoreSession::persistentChannels(NetworkId id) const } +QHash CoreSession::bufferCiphers(NetworkId id) const +{ + return Core::bufferCiphers(user(), id); +} + +void CoreSession::setBufferCipher(NetworkId id, const QString &bufferName, const QByteArray &cipher) const +{ + Core::setBufferCipher(user(), id, bufferName, cipher); +} + + // FIXME switch to BufferId void CoreSession::msgFromClient(BufferInfo bufinfo, QString msg) { @@ -314,6 +330,9 @@ void CoreSession::recvMessageFromServer(NetworkId networkId, Message::Type type, if (_ignoreListManager.match(rawMsg, networkName) == IgnoreListManager::HardStrictness) return; + if (_highlightRuleManager.match(rawMsg, currentNetwork->myNick(), currentNetwork->identityPtr()->nicks())) + rawMsg.flags |= Message::Flag::Highlight; + _messageQueue << rawMsg; if (!_processMessages) { _processMessages = true; @@ -366,7 +385,9 @@ void CoreSession::processMessages() Q_ASSERT(!createBuffer); bufferInfo = Core::bufferInfo(user(), rawMsg.networkId, BufferInfo::StatusBuffer, ""); } - Message msg(bufferInfo, rawMsg.type, rawMsg.text, rawMsg.sender, rawMsg.flags); + Message msg(bufferInfo, rawMsg.type, rawMsg.text, rawMsg.sender, senderPrefixes(rawMsg.sender, bufferInfo), + realName(rawMsg.sender, rawMsg.networkId), avatarUrl(rawMsg.sender, rawMsg.networkId), + rawMsg.flags); if(Core::storeMessage(msg)) emit displayMsg(msg); } @@ -390,7 +411,9 @@ void CoreSession::processMessages() } bufferInfoCache[rawMsg.networkId][rawMsg.target] = bufferInfo; } - Message msg(bufferInfo, rawMsg.type, rawMsg.text, rawMsg.sender, rawMsg.flags); + Message msg(bufferInfo, rawMsg.type, rawMsg.text, rawMsg.sender, senderPrefixes(rawMsg.sender, bufferInfo), + realName(rawMsg.sender, rawMsg.networkId), avatarUrl(rawMsg.sender, rawMsg.networkId), + rawMsg.flags); messages << msg; } @@ -406,7 +429,9 @@ void CoreSession::processMessages() // add the StatusBuffer to the Cache in case there are more Messages for the original target bufferInfoCache[rawMsg.networkId][rawMsg.target] = bufferInfo; } - Message msg(bufferInfo, rawMsg.type, rawMsg.text, rawMsg.sender, rawMsg.flags); + Message msg(bufferInfo, rawMsg.type, rawMsg.text, rawMsg.sender, senderPrefixes(rawMsg.sender, bufferInfo), + realName(rawMsg.sender, rawMsg.networkId), avatarUrl(rawMsg.sender, rawMsg.networkId), + rawMsg.flags); messages << msg; } @@ -421,6 +446,52 @@ void CoreSession::processMessages() _messageQueue.clear(); } +QString CoreSession::senderPrefixes(const QString &sender, const BufferInfo &bufferInfo) const +{ + CoreNetwork *currentNetwork = network(bufferInfo.networkId()); + if (!currentNetwork) { + return {}; + } + + if (bufferInfo.type() != BufferInfo::ChannelBuffer) { + return {}; + } + + IrcChannel *currentChannel = currentNetwork->ircChannel(bufferInfo.bufferName()); + if (!currentChannel) { + return {}; + } + + const QString modes = currentChannel->userModes(nickFromMask(sender).toLower()); + return currentNetwork->modesToPrefixes(modes); +} + +QString CoreSession::realName(const QString &sender, NetworkId networkId) const +{ + CoreNetwork *currentNetwork = network(networkId); + if (!currentNetwork) { + return {}; + } + + IrcUser *currentUser = currentNetwork->ircUser(nickFromMask(sender)); + if (!currentUser) { + return {}; + } + + return currentUser->realName(); +} + +QString CoreSession::avatarUrl(const QString &sender, NetworkId networkId) const +{ + Q_UNUSED(sender); + Q_UNUSED(networkId); + // Currently we do not have a way to retrieve this value yet. + // + // This likely will require implementing IRCv3's METADATA spec. + // See https://ircv3.net/irc/ + // And https://blog.irccloud.com/avatars/ + return ""; +} Protocol::SessionState CoreSession::sessionState() const { @@ -478,6 +549,9 @@ void CoreSession::createIdentity(const Identity &identity, const QVariantMap &ad createIdentity(coreIdentity); } +const QString CoreSession::strictSysident() { + return Core::instance()->strictSysIdent(_user); +} void CoreSession::createIdentity(const CoreIdentity &identity) { @@ -686,12 +760,26 @@ void CoreSession::globalAway(const QString &msg, const bool skipFormatting) } } -void CoreSession::changePassword(PeerPtr peer, const QString &userName, const QString &oldPassword, const QString &newPassword) -{ +void CoreSession::changePassword(PeerPtr peer, const QString &userName, const QString &oldPassword, const QString &newPassword) { + Q_UNUSED(peer); + bool success = false; UserId uid = Core::validateUser(userName, oldPassword); if (uid.isValid() && uid == user()) success = Core::changeUserPassword(uid, newPassword); - emit passwordChanged(peer, success); + signalProxy()->restrictTargetPeers(signalProxy()->sourcePeer(), [&]{ + emit passwordChanged(nullptr, success); + }); +} + +void CoreSession::kickClient(int peerId) { + auto peer = signalProxy()->peerById(peerId); + if (peer == nullptr) { + qWarning() << "Invalid peer Id: " << peerId; + return; + } + signalProxy()->restrictTargetPeers(peer, [&]{ + emit disconnectFromCore(); + }); }