]> git.netwichtig.de Git - user/henk/code/inspircd.git/blob - src/modules/m_nonicks.cpp
Sync helpop chmodes s and p with docs
[user/henk/code/inspircd.git] / src / modules / m_nonicks.cpp
1 /*
2  * InspIRCd -- Internet Relay Chat Daemon
3  *
4  *   Copyright (C) 2019 Matt Schatz <genius3000@g3k.solutions>
5  *   Copyright (C) 2013, 2017-2018 Sadie Powell <sadie@witchery.services>
6  *   Copyright (C) 2012, 2019 Robby <robby@chatbelgie.be>
7  *   Copyright (C) 2012, 2014 Attila Molnar <attilamolnar@hush.com>
8  *   Copyright (C) 2009-2010 Daniel De Graaf <danieldg@inspircd.org>
9  *   Copyright (C) 2009 Uli Schlachter <psychon@inspircd.org>
10  *   Copyright (C) 2008 Robin Burchell <robin+git@viroteck.net>
11  *   Copyright (C) 2007 Dennis Friis <peavey@inspircd.org>
12  *   Copyright (C) 2004 Craig Edwards <brain@inspircd.org>
13  *
14  * This file is part of InspIRCd.  InspIRCd is free software: you can
15  * redistribute it and/or modify it under the terms of the GNU General Public
16  * License as published by the Free Software Foundation, version 2.
17  *
18  * This program is distributed in the hope that it will be useful, but WITHOUT
19  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
20  * FOR A PARTICULAR PURPOSE.  See the GNU General Public License for more
21  * details.
22  *
23  * You should have received a copy of the GNU General Public License
24  * along with this program.  If not, see <http://www.gnu.org/licenses/>.
25  */
26
27
28 #include "inspircd.h"
29 #include "modules/exemption.h"
30
31 class ModuleNoNickChange : public Module
32 {
33         CheckExemption::EventProvider exemptionprov;
34         SimpleChannelModeHandler nn;
35  public:
36         ModuleNoNickChange()
37                 : exemptionprov(this)
38                 , nn(this, "nonick", 'N')
39         {
40         }
41
42         Version GetVersion() CXX11_OVERRIDE
43         {
44                 return Version("Adds channel mode N (nonick) which prevents users from changing their nickname whilst in the channel.", VF_VENDOR);
45         }
46
47         void On005Numeric(std::map<std::string, std::string>& tokens) CXX11_OVERRIDE
48         {
49                 tokens["EXTBAN"].push_back('N');
50         }
51
52         ModResult OnUserPreNick(LocalUser* user, const std::string& newnick) CXX11_OVERRIDE
53         {
54                 for (User::ChanList::iterator i = user->chans.begin(); i != user->chans.end(); i++)
55                 {
56                         Channel* curr = (*i)->chan;
57
58                         ModResult res = CheckExemption::Call(exemptionprov, user, curr, "nonick");
59                         if (res == MOD_RES_ALLOW)
60                                 continue;
61
62                         if (user->HasPrivPermission("channels/ignore-nonicks"))
63                                 continue;
64
65                         bool modeset = curr->IsModeSet(nn);
66                         if (!curr->GetExtBanStatus(user, 'N').check(!modeset))
67                         {
68                                 user->WriteNumeric(ERR_CANTCHANGENICK, InspIRCd::Format("Can't change nickname while on %s (%s)",
69                                         curr->name.c_str(), modeset ? "+N is set" : "you're extbanned"));
70                                 return MOD_RES_DENY;
71                         }
72                 }
73
74                 return MOD_RES_PASSTHRU;
75         }
76 };
77
78 MODULE_INIT(ModuleNoNickChange)