From fbed3eca25c7d7260bf12f29055ecc190107c8e6 Mon Sep 17 00:00:00 2001 From: Sadie Powell Date: Sun, 16 Oct 2022 23:13:35 +0100 Subject: Split out channel and user mode +r into a separate module. --- src/modules/m_services.cpp | 94 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 94 insertions(+) create mode 100644 src/modules/m_services.cpp (limited to 'src/modules/m_services.cpp') diff --git a/src/modules/m_services.cpp b/src/modules/m_services.cpp new file mode 100644 index 000000000..6e557334c --- /dev/null +++ b/src/modules/m_services.cpp @@ -0,0 +1,94 @@ +/* + * InspIRCd -- Internet Relay Chat Daemon + * + * Copyright (C) 2022 Sadie Powell + * + * 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 . + */ + + +#include "inspircd.h" +#include "modules/account.h" + +class RegisteredChannel final + : public SimpleChannelMode +{ +public: + RegisteredChannel(Module* Creator) + : SimpleChannelMode(Creator, "c_registered", 'r') + { + if (ServerInstance->Config->ConfValue("services")->getBool("disablemodes")) + DisableAutoRegister(); + } + + ModeAction OnModeChange(User* source, User* dest, Channel* channel, Modes::Change& change) override + { + if (IS_LOCAL(source)) + { + source->WriteNumeric(ERR_NOPRIVILEGES, "Only a server may modify the +r channel mode"); + return MODEACTION_DENY; + } + + return SimpleChannelMode::OnModeChange(source, dest, channel, change); + } +}; + +class RegisteredUser final + : public SimpleUserMode +{ + +public: + RegisteredUser(Module* Creator) + : SimpleUserMode(Creator, "u_registered", 'r') + { + if (ServerInstance->Config->ConfValue("services")->getBool("disablemodes")) + DisableAutoRegister(); + } + + ModeAction OnModeChange(User* source, User* dest, Channel* channel, Modes::Change& change) override + { + if (IS_LOCAL(source)) + { + source->WriteNumeric(ERR_NOPRIVILEGES, "Only a server may modify the +r user mode"); + return MODEACTION_DENY; + } + + return SimpleUserMode::OnModeChange(source, dest, channel, change); + } +}; + +class ModuleServices final + : public Module +{ +private: + Account::API accountapi; + RegisteredChannel chanmode; + RegisteredUser usermode; + +public: + ModuleServices() + : Module(VF_VENDOR, "Provides support for integrating with a services server.") + , accountapi(this) + , chanmode(this) + , usermode(this) + { + } + + void OnUserPostNick(User* user, const std::string& oldnick) override + { + if (user->IsModeSet(usermode) && irc::equals(oldnick, user->nick)) + usermode.RemoveMode(user); + } +}; + +MODULE_INIT(ModuleServices) -- cgit v1.3.1-10-gc9f91