X-Git-Url: https://git.quassel-irc.org/?p=quassel.git;a=blobdiff_plain;f=src%2Fcore%2Fcoresession.cpp;h=c97c4bf4cf2a8131b57deaa43d8da5a9f84a4edb;hp=43b2234d87ac6c3a404d51ab0643c2d0cedb9eb0;hb=28cee4568aeb1ce3014d11234e40f19e7aeae5bd;hpb=dcd6c362d77ab4cb5ea73b7e54ce944a68aa3f06 diff --git a/src/core/coresession.cpp b/src/core/coresession.cpp index 43b2234d..c97c4bf4 100644 --- a/src/core/coresession.cpp +++ b/src/core/coresession.cpp @@ -105,6 +105,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(); @@ -366,7 +369,8 @@ 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), rawMsg.flags); if(Core::storeMessage(msg)) emit displayMsg(msg); } @@ -390,7 +394,8 @@ 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), rawMsg.flags); messages << msg; } @@ -406,7 +411,8 @@ 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), rawMsg.flags); messages << msg; } @@ -421,6 +427,25 @@ 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); +} Protocol::SessionState CoreSession::sessionState() const { @@ -662,15 +687,16 @@ void CoreSession::clientsDisconnected() if (identity->detachAwayEnabled() && !me->isAway()) { if (!identity->detachAwayReason().isEmpty()) - awayReason = formatCurrentDateTimeInString(identity->detachAwayReason()); + awayReason = identity->detachAwayReason(); net->setAutoAwayActive(true); + // Allow handleAway() to format the current date/time in the string. net->userInputHandler()->handleAway(BufferInfo(), awayReason); } } } -void CoreSession::globalAway(const QString &msg) +void CoreSession::globalAway(const QString &msg, const bool skipFormatting) { QHash::iterator netIter = _networks.begin(); CoreNetwork *net = 0; @@ -681,16 +707,30 @@ void CoreSession::globalAway(const QString &msg) if (!net->isConnected()) continue; - net->userInputHandler()->issueAway(msg, false /* no force away */); + net->userInputHandler()->issueAway(msg, false /* no force away */, 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(); + }); }