Add halfop support
authorSebastian Goth <seezer@roath.org>
Fri, 17 Feb 2012 00:07:24 +0000 (01:07 +0100)
committerManuel Nickschas <sputnick@quassel-irc.org>
Tue, 22 May 2012 18:31:29 +0000 (20:31 +0200)
Provides /HALFOP, /DEHALFOP and context menus.
Reuses "voiced" icons.

Fixes #1138

src/core/coreuserinputhandler.cpp
src/core/coreuserinputhandler.h
src/uisupport/contextmenuactionprovider.cpp
src/uisupport/networkmodelcontroller.cpp
src/uisupport/networkmodelcontroller.h

index f2c37ee..0f0be89 100644 (file)
@@ -213,6 +213,14 @@ void CoreUserInputHandler::handleDeop(const BufferInfo &bufferInfo, const QStrin
   emit putCmd("MODE", serverEncode(params));
 }
 
   emit putCmd("MODE", serverEncode(params));
 }
 
+void CoreUserInputHandler::handleDehalfop(const BufferInfo &bufferInfo, const QString &msg) {
+  QStringList nicks = msg.split(' ', QString::SkipEmptyParts);
+  QString m = "-"; for(int i = 0; i < nicks.count(); i++) m += 'h';
+  QStringList params;
+  params << bufferInfo.bufferName() << m << nicks;
+  emit putCmd("MODE", serverEncode(params));
+}
+
 void CoreUserInputHandler::handleDevoice(const BufferInfo &bufferInfo, const QString &msg) {
   QStringList nicks = msg.split(' ', QString::SkipEmptyParts);
   QString m = "-"; for(int i = 0; i < nicks.count(); i++) m += 'v';
 void CoreUserInputHandler::handleDevoice(const BufferInfo &bufferInfo, const QString &msg) {
   QStringList nicks = msg.split(' ', QString::SkipEmptyParts);
   QString m = "-"; for(int i = 0; i < nicks.count(); i++) m += 'v';
@@ -370,6 +378,14 @@ void CoreUserInputHandler::handleNotice(const BufferInfo &bufferInfo, const QStr
   emit displayMsg(Message::Notice, bufferName, payload, network()->myNick(), Message::Self);
 }
 
   emit displayMsg(Message::Notice, bufferName, payload, network()->myNick(), Message::Self);
 }
 
+void CoreUserInputHandler::handleHalfop(const BufferInfo &bufferInfo, const QString &msg) {
+  QStringList nicks = msg.split(' ', QString::SkipEmptyParts);
+  QString m = "+"; for(int i = 0; i < nicks.count(); i++) m += 'h';
+  QStringList params;
+  params << bufferInfo.bufferName() << m << nicks;
+  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 = msg.split(' ', QString::SkipEmptyParts);
   QString m = "+"; for(int i = 0; i < nicks.count(); i++) m += 'o';
index 177c35b..9db419b 100644 (file)
@@ -43,6 +43,7 @@ public slots:
   void handleCtcp(const BufferInfo &bufferInfo, const QString &text);
   void handleDelkey(const BufferInfo &bufferInfo, const QString &text);
   void handleDeop(const BufferInfo &bufferInfo, const QString &text);
   void handleCtcp(const BufferInfo &bufferInfo, const QString &text);
   void handleDelkey(const BufferInfo &bufferInfo, const QString &text);
   void handleDeop(const BufferInfo &bufferInfo, const QString &text);
+  void handleDehalfop(const BufferInfo &bufferInfo, const QString &text);
   void handleDevoice(const BufferInfo &bufferInfo, const QString &text);
   void handleInvite(const BufferInfo &bufferInfo, const QString &text);
   void handleJoin(const BufferInfo &bufferInfo, const QString &text);
   void handleDevoice(const BufferInfo &bufferInfo, const QString &text);
   void handleInvite(const BufferInfo &bufferInfo, const QString &text);
   void handleJoin(const BufferInfo &bufferInfo, const QString &text);
@@ -56,6 +57,7 @@ public slots:
   void handleNotice(const BufferInfo &bufferInfo, const QString &text);
   void handleOper(const BufferInfo &bufferInfo, const QString &text);
   void handleOp(const BufferInfo &bufferInfo, const QString &text);
   void handleNotice(const BufferInfo &bufferInfo, const QString &text);
   void handleOper(const BufferInfo &bufferInfo, const QString &text);
   void handleOp(const BufferInfo &bufferInfo, const QString &text);
+  void handleHalfop(const BufferInfo &bufferInfo, const QString &text);
   void handlePart(const BufferInfo &bufferInfo, const QString &text);
   void handlePing(const BufferInfo &bufferInfo, const QString &text);
   void handleQuery(const BufferInfo &bufferInfo, const QString &text);
   void handlePart(const BufferInfo &bufferInfo, const QString &text);
   void handlePing(const BufferInfo &bufferInfo, const QString &text);
   void handleQuery(const BufferInfo &bufferInfo, const QString &text);
index b10b106..0254233 100644 (file)
@@ -77,6 +77,8 @@ ContextMenuActionProvider::ContextMenuActionProvider(QObject *parent) : NetworkM
 
   registerAction(NickOp, SmallIcon("irc-operator"), tr("Give Operator Status"));
   registerAction(NickDeop, SmallIcon("irc-remove-operator"), tr("Take Operator Status"));
 
   registerAction(NickOp, SmallIcon("irc-operator"), tr("Give Operator Status"));
   registerAction(NickDeop, SmallIcon("irc-remove-operator"), tr("Take Operator Status"));
+  registerAction(NickHalfop, SmallIcon("irc-voice"), tr("Give Half-Operator Status"));
+  registerAction(NickDehalfop, SmallIcon("irc-unvoice"), tr("Take Half-Operator Status"));
   registerAction(NickVoice, SmallIcon("irc-voice"), tr("Give Voice"));
   registerAction(NickDevoice, SmallIcon("irc-unvoice"), tr("Take Voice"));
   registerAction(NickKick, SmallIcon("im-kick-user"), tr("Kick From Channel"));
   registerAction(NickVoice, SmallIcon("irc-voice"), tr("Give Voice"));
   registerAction(NickDevoice, SmallIcon("irc-unvoice"), tr("Take Voice"));
   registerAction(NickKick, SmallIcon("im-kick-user"), tr("Kick From Channel"));
@@ -113,6 +115,9 @@ ContextMenuActionProvider::ContextMenuActionProvider(QObject *parent) : NetworkM
   QMenu *nickModeMenu = new QMenu();
   nickModeMenu->addAction(action(NickOp));
   nickModeMenu->addAction(action(NickDeop));
   QMenu *nickModeMenu = new QMenu();
   nickModeMenu->addAction(action(NickOp));
   nickModeMenu->addAction(action(NickDeop));
+  // this is where the halfops will be placed if available
+  nickModeMenu->addAction(action(NickHalfop));
+  nickModeMenu->addAction(action(NickDehalfop));
   nickModeMenu->addAction(action(NickVoice));
   nickModeMenu->addAction(action(NickDevoice));
   nickModeMenu->addSeparator();
   nickModeMenu->addAction(action(NickVoice));
   nickModeMenu->addAction(action(NickDevoice));
   nickModeMenu->addSeparator();
@@ -318,6 +323,16 @@ void ContextMenuActionProvider::addIrcUserActions(QMenu *menu, const QModelIndex
 
     IrcUser *ircUser = qobject_cast<IrcUser *>(index.data(NetworkModel::IrcUserRole).value<QObject *>());
     if(ircUser) {
 
     IrcUser *ircUser = qobject_cast<IrcUser *>(index.data(NetworkModel::IrcUserRole).value<QObject *>());
     if(ircUser) {
+      Network *network = ircUser->network();
+      // only show entries for usermode +h if server supports it
+      if(network && network->prefixModes().contains('h')) {
+        action(NickHalfop)->setVisible(true);
+        action(NickDehalfop)->setVisible(true);
+      }
+      else {
+        action(NickHalfop)->setVisible(false);
+        action(NickDehalfop)->setVisible(false);
+      }
       // ignoreliststuff
       QString bufferName;
       BufferInfo bufferInfo = index.data(NetworkModel::BufferInfoRole).value<BufferInfo>();
       // ignoreliststuff
       QString bufferName;
       BufferInfo bufferInfo = index.data(NetworkModel::BufferInfoRole).value<BufferInfo>();
index 020aaed..ac2ab66 100644 (file)
@@ -402,6 +402,12 @@ void NetworkModelController::handleNickAction(ActionType type, QAction *action)
       case NickDeop:
         Client::userInput(bufferInfo, QString("/DEOP %1").arg(nick));
         break;
       case NickDeop:
         Client::userInput(bufferInfo, QString("/DEOP %1").arg(nick));
         break;
+      case NickHalfop:
+        Client::userInput(bufferInfo, QString("/HALFOP %1").arg(nick));
+        break;
+      case NickDehalfop:
+        Client::userInput(bufferInfo, QString("/DEHALFOP %1").arg(nick));
+        break;
       case NickVoice:
         Client::userInput(bufferInfo, QString("/VOICE %1").arg(nick));
         break;
       case NickVoice:
         Client::userInput(bufferInfo, QString("/VOICE %1").arg(nick));
         break;
index 4db935f..ec27c87 100644 (file)
@@ -85,20 +85,22 @@ public:
     NickDeop = 0x090000,
     NickVoice = 0x0a0000,
     NickDevoice = 0x0b0000,
     NickDeop = 0x090000,
     NickVoice = 0x0a0000,
     NickDevoice = 0x0b0000,
-    NickKick = 0x0c0000,
-    NickBan = 0x0d0000,
-    NickKickBan = 0x0e0000,
-    NickIgnoreUser = 0x0f0000,
-    NickIgnoreHost = 0x100000,
-    NickIgnoreDomain = 0x200000,
-    NickIgnoreCustom = 0x300000,
-    // The next 5 types have stay together
+    NickHalfop = 0x0c0000,
+    NickDehalfop = 0x0d0000,
+    NickKick = 0x0e0000,
+    NickBan = 0x0f0000,
+    NickKickBan = 0x100000,
+    NickIgnoreUser = 0x200000,
+    NickIgnoreHost = 0x300000,
+    NickIgnoreDomain = 0x400000,
+    NickIgnoreCustom = 0x500000,
+    // The next 5 types have to stay together
     // Don't change without reading ContextMenuActionProvider::addIgnoreMenu!
     // Don't change without reading ContextMenuActionProvider::addIgnoreMenu!
-    NickIgnoreToggleEnabled0 = 0x400000,
-    NickIgnoreToggleEnabled1 = 0x500000,
-    NickIgnoreToggleEnabled2 = 0x600000,
-    NickIgnoreToggleEnabled3 = 0x700000,
-    NickIgnoreToggleEnabled4 = 0x800000,
+    NickIgnoreToggleEnabled0 = 0x600000,
+    NickIgnoreToggleEnabled1 = 0x700000,
+    NickIgnoreToggleEnabled2 = 0x800000,
+    NickIgnoreToggleEnabled3 = 0x900000,
+    NickIgnoreToggleEnabled4 = 0xa00000,
 
     // Actions that are handled externally
     // These emit a signal to the action requester, rather than being handled here
 
     // Actions that are handled externally
     // These emit a signal to the action requester, rather than being handled here