diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/mode.cpp | 8 | ||||
-rw-r--r-- | src/modules/m_customprefix.cpp | 33 | ||||
-rw-r--r-- | src/modules/m_devoice.cpp | 65 |
3 files changed, 37 insertions, 69 deletions
diff --git a/src/mode.cpp b/src/mode.cpp index fd25a9a9f..98b0f9854 100644 --- a/src/mode.cpp +++ b/src/mode.cpp @@ -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) diff --git a/src/modules/m_customprefix.cpp b/src/modules/m_customprefix.cpp index c8ebde5cc..61c50ec0c 100644 --- a/src/modules/m_customprefix.cpp +++ b/src/modules/m_customprefix.cpp @@ -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 index 4e4b3a354..000000000 --- a/src/modules/m_devoice.cpp +++ /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> ¶meters, 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) |