]> git.netwichtig.de Git - user/henk/code/inspircd.git/commitdiff
Enable using m_customprefix to alter core prefix modes.
authorPeter Powell <petpow@saberuk.com>
Fri, 20 Oct 2017 07:01:27 +0000 (08:01 +0100)
committerPeter Powell <petpow@saberuk.com>
Mon, 6 Nov 2017 10:55:56 +0000 (10:55 +0000)
This replaces the devoice module which has now been removed. If you
want users to be able to devoice themselves then you can load the
customprefix module add the following config tag:

    <customprefix name="voice" depriv="yes">

If you wish to keep identical behaviour rather than allowing users
to use "MODE #YourChannel -v TheirNick" then you can load the alias
module and add the following config tag:

    <alias text="DEVOICE" format="#*" replace="MODE $2 -v $nick">

docs/conf/helpop-full.conf.example
docs/conf/helpop.conf.example
docs/conf/modules.conf.example
docs/conf/modules/unrealircd.conf.example
include/mode.h
src/mode.cpp
src/modules/m_customprefix.cpp
src/modules/m_devoice.cpp [deleted file]

index 68e7e51ce4a9af95ce5df68723cc18d14a8609db..883ec9b165f0a272effd4bc80125567923a23931 100644 (file)
@@ -28,7 +28,7 @@ you searched for. Please try again.">
 -------------
 
 PRIVMSG   NOTICE   NICK      JOIN      PART
-CYCLE     KNOCK    MODE      DEVOICE   TOPIC
+CYCLE     KNOCK    MODE      OPER      TOPIC
 KICK      FPART    REMOVE    TBAN      INVITE
 UNINVITE  AWAY     DCCALLOW  SILENCE   ACCEPT
 MKPASSWD  VHOST    TITLE     SETNAME
@@ -39,9 +39,7 @@ ADMIN     MAP      LINKS     LUSERS    TIME
 STATS     VERSION  INFO      MODULES   COMMANDS
 SSLINFO
 
-USER      PASS     PING     PONG       QUIT
-
-OPER">
+USER      PASS     PING     PONG       QUIT">
 
 <helpop key="sslinfo" value="/SSLINFO <nick>
 
@@ -118,10 +116,6 @@ E.g. /RMODE #Chan b m:* will remove all mute extbans.">
 This behaves identically to /REMOVE. /REMOVE is a built-in mIRC command
 which caused trouble for some users.">
 
-<helpop key="devoice" value="/DEVOICE <channel>
-
-Devoices yourself on the specified channel.">
-
 <helpop key="silence" value="/SILENCE - Shows a list of silenced masks
 /SILENCE +<mask> [<flags>] - Add a mask
 /SILENCE -<mask> - Remove a mask
index 295b754d22a4c76be9b27d878405b326e1a8f6a6..68328272ed1c5718cd22c52bea88d03aa3b94a44 100644 (file)
@@ -31,7 +31,7 @@ you searched for. Please try again.">
 -------------
 
 PRIVMSG   NOTICE   NICK      JOIN      PART
-CYCLE     KNOCK    MODE      DEVOICE   TOPIC
+CYCLE     KNOCK    MODE      OPER      TOPIC
 KICK      FPART    REMOVE    TBAN      INVITE
 UNINVITE  AWAY     DCCALLOW  SILENCE   ACCEPT
 MKPASSWD  VHOST    TITLE     SETNAME
@@ -42,9 +42,7 @@ ADMIN     MAP      LINKS     LUSERS    TIME
 STATS     VERSION  INFO      MODULES   COMMANDS
 SSLINFO
 
-USER      PASS     PING     PONG       QUIT
-
-OPER">
+USER      PASS     PING     PONG       QUIT">
 
 <helpop key="coper" value="Oper Commands
 -------------
index 28450c7e9eae50a0f388c23281a42a5893e420fc..5382eb354ca9bc4377389eb2250c3cd1a189ecba 100644 (file)
 #   quitmsg="Throttled" bootwait="10">
 
 #-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#
-# Custom prefixes: Allows for channel prefixes to be added.
+# Custom prefixes: Allows for channel prefixes to be configured.
 #<module name="customprefix">
 #
 # name       The name of the mode, must be unique from other modes.
 #<customprefix name="founder" letter="q" prefix="~" rank="50000" ranktoset="50000">
 #<customprefix name="admin" letter="a" prefix="&amp;" rank="40000" ranktoset="50000">
 #<customprefix name="halfop" letter="h" prefix="%" rank="20000" ranktoset="30000">
-#<customprefix name="halfvoice" letter="V" prefix="-" rank="1" ranktoset="20000">
+#
+# You can also override the configuration of prefix modes added by both the core
+# and other modules by adding a customprefix tag with change="yes" specified.
+# <customprefix name="op" change="yes" rank="30000" ranktoset="30000"">
+# <customprefix name="voice" change="yes" rank="10000" ranktoset="10000" depriv="no">
 #
 # Do /RELOADMODULE customprefix after changing the settings of this module.
 
 #<goodchan name="#funtimes">                                          #
 # Glob masks are accepted here also.                                  #
 
-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#
-# Devoice module: Let users devoice themselves using /DEVOICE #chan.
-#<module name="devoice">
-
 #-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#
 # DNS blacklist module: Provides support for looking up IPs on one or #
 # more blacklists.                                                    #
index 10230766199f1bdf3826a6713618dd2f189b7ab5..45a0ac3d6d4033aa172d170dc91af1d9bbe1b259 100644 (file)
 #<badchan name="#gods*" allowopers="yes" reason="Tortoises!">         #
 #<badchan name="#heaven" redirect="#hell" reason="Nice try!">         #
 
-<module name="devoice">
-
 #-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#
 # Filter module: Provides message filtering, similar to SPAMFILTER.
 <module name="filter">
index 30b28a6b09767fdfa16861e5a0c51cbd8df42a69..83b8f31be88cb596d6952f1c5fd317eb8ceffb8e 100644 (file)
@@ -398,6 +398,15 @@ class CoreExport PrefixMode : public ModeHandler
         */
        ModeAction OnModeChange(User* source, User* dest, Channel* channel, std::string& param, bool adding);
 
+       /**
+        * Updates the configuration of this prefix.
+        * @param rank The prefix rank of this mode.
+        * @param setrank The prefix rank required to set this mode on channels.
+        * @param unsetrank The prefix rank required to set this unmode on channels.
+        * @param selfrm Whether a client with this prefix can remove it from themself.
+        */
+       void Update(unsigned int rank, unsigned int setrank, unsigned int unsetrank, bool selfrm);
+
        /**
         * Removes this prefix mode from all users on the given channel
         * @param channel The channel which the server wants to remove your mode from
index fd25a9a9ff58b65355c8ac00d7a7f31c82961eaf..98b0f98540449f4543628c7620da7b5d54310014 100644 (file)
@@ -198,6 +198,14 @@ ModeAction PrefixMode::OnModeChange(User* source, User*, Channel* chan, std::str
        return (memb->SetPrefix(this, adding) ? MODEACTION_ALLOW : MODEACTION_DENY);
 }
 
+void PrefixMode::Update(unsigned int rank, unsigned int setrank, unsigned int unsetrank, bool selfrm)
+{
+       prefixrank = rank;
+       ranktoset = setrank;
+       ranktounset = unsetrank;
+       selfremove = selfrm;
+}
+
 ModeAction ParamModeBase::OnModeChange(User* source, User*, Channel* chan, std::string& parameter, bool adding)
 {
        if (adding)
index c8ebde5ccae9de2de5ed22836a6f0a43d88eeddc..61c50ec0cf11b4bfe6e9c6c78842ab8246c8ca68 100644 (file)
@@ -28,10 +28,14 @@ class CustomPrefixMode : public PrefixMode
                : PrefixMode(parent, Name, Letter, 0, Prefix)
                , tag(Tag)
        {
-               prefixrank = tag->getInt("rank", 0, 0, UINT_MAX);
-               ranktoset = tag->getInt("ranktoset", prefixrank, prefixrank, UINT_MAX);
-               ranktounset = tag->getInt("ranktounset", ranktoset, ranktoset, UINT_MAX);
-               selfremove = tag->getBool("depriv", true);
+               long rank = tag->getInt("rank", 0, 0, UINT_MAX);
+               long setrank = tag->getInt("ranktoset", prefixrank, rank, UINT_MAX);
+               long unsetrank = tag->getInt("ranktounset", setrank, setrank, UINT_MAX);
+               bool depriv = tag->getBool("depriv", true);
+               this->Update(rank, setrank, unsetrank, depriv);
+
+               ServerInstance->Logs->Log(MODNAME, LOG_DEBUG, "Created the %s prefix: letter=%c prefix=%c rank=%u ranktoset=%u ranktounset=%i depriv=%d",
+                       name.c_str(), GetModeChar(), GetPrefix(), GetPrefixRank(), GetLevelRequired(true), GetLevelRequired(false), CanSelfRemove());
        }
 };
 
@@ -50,6 +54,27 @@ class ModuleCustomPrefix : public Module
                        if (name.empty())
                                throw ModuleException("<customprefix:name> must be specified at " + tag->getTagLocation());
 
+                       if (tag->getBool("change"))
+                       {
+                               ModeHandler* mh = ServerInstance->Modes->FindMode(name, MODETYPE_CHANNEL);
+                               if (!mh)
+                                       throw ModuleException("<customprefix:change> specified for a non-existent mode at " + tag->getTagLocation());
+
+                               PrefixMode* pm = mh->IsPrefixMode();
+                               if (!pm)
+                                       throw ModuleException("<customprefix:change> specified for a non-prefix mode at " + tag->getTagLocation());
+
+                               long rank = tag->getInt("rank", pm->GetPrefixRank(), 0, UINT_MAX);
+                               long setrank = tag->getInt("ranktoset", pm->GetLevelRequired(true), rank, UINT_MAX);
+                               long unsetrank = tag->getInt("ranktounset", pm->GetLevelRequired(false), setrank, UINT_MAX);
+                               bool depriv = tag->getBool("depriv", pm->CanSelfRemove());
+                               pm->Update(rank, setrank, unsetrank, depriv);
+
+                               ServerInstance->Logs->Log(MODNAME, LOG_DEBUG, "Changed the %s prefix: depriv=%u rank=%u ranktoset=%u ranktounset=%u",
+                                       pm->name.c_str(), pm->CanSelfRemove(), pm->GetPrefixRank(), pm->GetLevelRequired(true), pm->GetLevelRequired(false));
+                               continue;
+                       }
+
                        const std::string letter = tag->getString("letter");
                        if (letter.length() != 1)
                                throw ModuleException("<customprefix:letter> must be set to a mode character at " + tag->getTagLocation());
diff --git a/src/modules/m_devoice.cpp b/src/modules/m_devoice.cpp
deleted file mode 100644 (file)
index 4e4b3a3..0000000
+++ /dev/null
@@ -1,65 +0,0 @@
-/*
- * InspIRCd -- Internet Relay Chat Daemon
- *
- *   Copyright (C) 2007 Dennis Friis <peavey@inspircd.org>
- *   Copyright (C) 2005, 2007 Robin Burchell <robin+git@viroteck.net>
- *   Copyright (C) 2006 Craig Edwards <craigedwards@brainbox.cc>
- *
- * This file is part of InspIRCd.  InspIRCd is free software: you can
- * redistribute it and/or modify it under the terms of the GNU General Public
- * License as published by the Free Software Foundation, version 2.
- *
- * This program is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
- * FOR A PARTICULAR PURPOSE.  See the GNU General Public License for more
- * details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-
-/*
- * DEVOICE module for InspIRCd
- *  Syntax: /DEVOICE <#chan>
- */
-
-#include "inspircd.h"
-
-/** Handle /DEVOICE
- */
-class CommandDevoice : public Command
-{
- public:
-       CommandDevoice(Module* Creator) : Command(Creator,"DEVOICE", 1)
-       {
-               syntax = "<channel>";
-       }
-
-       CmdResult Handle (const std::vector<std::string> &parameters, User *user)
-       {
-               std::vector<std::string> modes;
-               modes.push_back(parameters[0]);
-               modes.push_back("-v");
-               modes.push_back(user->nick);
-
-               ServerInstance->Parser.CallHandler("MODE", modes, ServerInstance->FakeClient);
-               return CMD_SUCCESS;
-       }
-};
-
-class ModuleDeVoice : public Module
-{
-       CommandDevoice cmd;
- public:
-       ModuleDeVoice() : cmd(this)
-       {
-       }
-
-       Version GetVersion() CXX11_OVERRIDE
-       {
-               return Version("Provides voiced users with the ability to devoice themselves.", VF_VENDOR);
-       }
-};
-
-MODULE_INIT(ModuleDeVoice)