add support for oping a whole channel with /op *
authorMartin T. H. Sandsmark <sandsmark@samfundet.no>
Tue, 24 Apr 2012 00:53:38 +0000 (02:53 +0200)
committerMartin T. H. Sandsmark <martin.sandsmark@kde.org>
Wed, 26 Dec 2012 20:23:16 +0000 (21:23 +0100)
src/core/coreuserinputhandler.cpp

index 930be96..45c71f0 100644 (file)
@@ -436,14 +436,31 @@ void CoreUserInputHandler::handleHalfop(const BufferInfo &bufferInfo, const QStr
     emit putCmd("MODE", serverEncode(params));
 }
 
-
-void CoreUserInputHandler::handleOp(const BufferInfo &bufferInfo, const QString &msg)
-{
-    QStringList nicks = msg.split(' ', QString::SkipEmptyParts);
-    QString m = "+"; for (int i = 0; i < nicks.count(); i++) m += 'o';
+void CoreUserInputHandler::handleOp(const BufferInfo &bufferInfo, const QString &msg) {
+  QStringList nicks;
+  if (msg == "*") {
+    const QList<IrcUser*> users = network()->ircChannel(bufferInfo.bufferName())->ircUsers();
+    foreach(IrcUser *user, users) {
+      if (!network()->ircChannel(bufferInfo.bufferName())->userModes(user).contains("o"))
+       nicks.append(user->nick());
+    }
+  } else { 
+    nicks = msg.split(' ', QString::SkipEmptyParts);
+  }
+  if (nicks.count() == 0) return;
+  
+  bool isNumber;
+  int maxModes = network()->support("MODES").toInt(&isNumber);
+  if (!isNumber || maxModes == 0) maxModes = 1;
+  
+  while (!nicks.isEmpty()) {
+    int amount = qMin(nicks.count(), maxModes);
+    QString m = "+"; for(int i = 0; i < amount; i++) m += 'o';
     QStringList params;
-    params << bufferInfo.bufferName() << m << nicks;
+    params << bufferInfo.bufferName() << m;
+    for(int i = 0; i < amount; i++) params << nicks.takeFirst();
     emit putCmd("MODE", serverEncode(params));
+  }
 }