From 98372c3cf2c1455e41c388d822876a4d146ae76d Mon Sep 17 00:00:00 2001 From: Peter Powell Date: Sun, 3 Dec 2017 17:16:28 +0000 Subject: Extract RFC modes from the core to core_channel and core_user. --- src/coremods/core_user/umode_o.cpp | 51 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 51 insertions(+) create mode 100644 src/coremods/core_user/umode_o.cpp (limited to 'src/coremods/core_user/umode_o.cpp') diff --git a/src/coremods/core_user/umode_o.cpp b/src/coremods/core_user/umode_o.cpp new file mode 100644 index 000000000..20668fdaa --- /dev/null +++ b/src/coremods/core_user/umode_o.cpp @@ -0,0 +1,51 @@ +/* + * InspIRCd -- Internet Relay Chat Daemon + * + * Copyright (C) 2007 Dennis Friis + * Copyright (C) 2006 Craig Edwards + * + * 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 "core_user.h" + +ModeUserOperator::ModeUserOperator(Module* Creator) + : ModeHandler(Creator, "oper", 'o', PARAM_NONE, MODETYPE_USER) +{ + oper = true; +} + +ModeAction ModeUserOperator::OnModeChange(User* source, User* dest, Channel*, std::string&, bool adding) +{ + /* Only opers can execute this class at all */ + if (!source->server->IsULine() && !source->IsOper()) + return MODEACTION_DENY; + + /* Not even opers can GIVE the +o mode, only take it away */ + if (adding) + return MODEACTION_DENY; + + /* Set the bitfields. + * Note that oper status is only given in User::Oper() + * NOT here. It is impossible to directly set +o without + * verifying as an oper and getting an opertype assigned + * to your User! + */ + char snomask = IS_LOCAL(dest) ? 'o' : 'O'; + ServerInstance->SNO->WriteToSnoMask(snomask, "User %s de-opered (by %s)", dest->nick.c_str(), source->nick.c_str()); + dest->UnOper(); + + return MODEACTION_ALLOW; +} -- cgit v1.2.3