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();
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);
}
}
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;
}
// 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;
}
_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
{
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<NetworkId, CoreNetwork *>::iterator netIter = _networks.begin();
CoreNetwork *net = 0;
if (!net->isConnected())
continue;
- net->userInputHandler()->issueAway(msg, false /* no force away */);
+ net->userInputHandler()->issueAway(msg, false /* no force away */, skipFormatting);
}
}
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();
+ });
}