+ if(currentModes.isEmpty())
+ removeModes = QString();
+ else
+ removeModes.remove(QRegExp(QString("[^%1]").arg(currentModes)));
+
+ if(addModes.isEmpty() && removeModes.isEmpty())
+ return;
+
+ if(!addModes.isEmpty())
+ addModes = '+' + addModes;
+ if(!removeModes.isEmpty())
+ removeModes = '-' + removeModes;
+
+ // don't use InputHandler::handleMode() as it keeps track of our persistent mode changes
+ putRawLine(serverEncode(QString("MODE %1 %2%3").arg(me_->nick()).arg(addModes).arg(removeModes)));
+}
+
+void CoreNetwork::updateIssuedModes(const QString &requestedModes) {
+ QString addModes;
+ QString removeModes;
+ bool addMode = true;
+
+ for(int i = 0; i < requestedModes.length(); i++) {
+ if(requestedModes[i] == '+') {
+ addMode = true;
+ continue;
+ }
+ if(requestedModes[i] == '-') {
+ addMode = false;
+ continue;
+ }
+ if(addMode) {
+ addModes += requestedModes[i];
+ } else {
+ removeModes += requestedModes[i];
+ }
+ }
+
+
+ QString addModesOld = _requestedUserModes.section('-', 0, 0);
+ QString removeModesOld = _requestedUserModes.section('-', 1);
+
+ addModes.remove(QRegExp(QString("[%1]").arg(addModesOld))); // deduplicate
+ addModesOld.remove(QRegExp(QString("[%1]").arg(removeModes))); // update
+ addModes += addModesOld;
+
+ removeModes.remove(QRegExp(QString("[%1]").arg(removeModesOld))); // deduplicate
+ removeModesOld.remove(QRegExp(QString("[%1]").arg(addModes))); // update
+ removeModes += removeModesOld;
+
+ _requestedUserModes = QString("%1-%2").arg(addModes).arg(removeModes);
+}
+
+void CoreNetwork::updatePersistentModes(QString addModes, QString removeModes) {
+ QString persistentUserModes = Core::userModes(userId(), networkId());
+
+ QString requestedAdd = _requestedUserModes.section('-', 0, 0);
+ QString requestedRemove = _requestedUserModes.section('-', 1);