diff options
author | w00t <w00t@e03df62e-2008-0410-955e-edbf42e46eb7> | 2007-08-28 00:21:52 +0000 |
---|---|---|
committer | w00t <w00t@e03df62e-2008-0410-955e-edbf42e46eb7> | 2007-08-28 00:21:52 +0000 |
commit | f4173d3a44fa7be263f5797999528fe8f88c77e9 (patch) | |
tree | c3f12fa90bb8f10fdd42c330619a11c68cdc8984 /src | |
parent | 373de28c980309af655816426d9cccae08102fd7 (diff) |
Mode to protect services from /kill and hide channel list in /whois from everyone (opers included) - handy, and perhaps it could be extended to do other misc services related stuff so it doesn't have to be duplicated in m_serv, and _account together
git-svn-id: http://svn.inspircd.org/repository/trunk/inspircd@7934 e03df62e-2008-0410-955e-edbf42e46eb7
Diffstat (limited to 'src')
-rw-r--r-- | src/modules/m_servprotect.cpp | 98 |
1 files changed, 98 insertions, 0 deletions
diff --git a/src/modules/m_servprotect.cpp b/src/modules/m_servprotect.cpp new file mode 100644 index 000000000..d1ea08c73 --- /dev/null +++ b/src/modules/m_servprotect.cpp @@ -0,0 +1,98 @@ +/* +------------------------------------+ + * | Inspire Internet Relay Chat Daemon | + * +------------------------------------+ + * + * InspIRCd: (C) 2002-2007 InspIRCd Development Team + * See: http://www.inspircd.org/wiki/index.php/Credits + * + * This program is free but copyrighted software; see + * the file COPYING for details. + * + * --------------------------------------------------- + */ + +#include "inspircd.h" +#include <stdio.h> +#include <string> +#include "users.h" +#include "channels.h" +#include "modules.h" +#include "configreader.h" + +/* $ModDesc: Provides support for Austhex style +k / UnrealIRCD +S services mode */ + +/** Handles user mode +k + */ +class ServProtectMode : public ModeHandler +{ + public: + ServProtectMode(InspIRCd* Instance) : ModeHandler(Instance, 'k', 0, 0, false, MODETYPE_USER, true) { } + + ModeAction OnModeChange(userrec* source, userrec* dest, chanrec* channel, std::string ¶meter, bool adding) + { + return MODEACTION_DENY; + } + + bool NeedsOper() { return true; } +}; + +class ModuleServProtectMode : public Module +{ + + ServProtectMode* bm; + public: + ModuleServProtectMode(InspIRCd* Me) + : Module(Me) + { + + bm = new ServProtectMode(ServerInstance); + if (!ServerInstance->AddMode(bm, 'k')) + throw ModuleException("Could not add new modes!"); + } + + void Implements(char* List) + { + List[I_OnWhois] = List[I_OnKill] = List[I_OnWhoisLine] = 1; + } + + virtual ~ModuleServProtectMode() + { + ServerInstance->Modes->DelMode(bm); + DELETE(bm); + } + + virtual Version GetVersion() + { + return Version(1,1,0,0,VF_COMMON,API_VERSION); + } + + virtual void OnWhois(userrec* src, userrec* dst) + { + if (dst->IsModeSet('k')) + { + ServerInstance->SendWhoisLine(src, dst, 310, std::string(src->nick)+" "+std::string(dst->nick)+" :is an "+ServerInstance->Config->Network+" Service"); + } + } + + virtual int OnKill(userrec* src, userrec* dst, const std::string &reason) + { + if (src == NULL) + return 0; + + if (dst->IsModeSet('k')) + { + src->WriteServ("485 %s :You are not allowed to kill %s Services!", src->nick, ServerInstance->Config->Network); + ServerInstance->WriteOpers("*** "+std::string(src->nick)+" tried to kill service "+dst->nick+" ("+reason+")"); + return 1; + } + return 0; + } + + virtual int OnWhoisLine(userrec* src, userrec* dst, int &numeric, std::string &text) + { + return ((src != dst) && (numeric == 319) && dst->IsModeSet('k')); + } +}; + + +MODULE_INIT(ModuleServProtectMode) |