diff options
author | brain <brain@e03df62e-2008-0410-955e-edbf42e46eb7> | 2007-08-26 20:01:15 +0000 |
---|---|---|
committer | brain <brain@e03df62e-2008-0410-955e-edbf42e46eb7> | 2007-08-26 20:01:15 +0000 |
commit | d1d5a31c13effeea4c3265e991b01742e9a53ca5 (patch) | |
tree | 03239d12dbbd142d34336ab56bfd25db97a3fb5a /src/modules/m_commonchans.cpp | |
parent | 76f7cf3ba57276d8b3ac1999b3a78ea4769d17ce (diff) |
Add m_commonchans.so (documented in example conf, no wiki yet) resolves bug #342 feature request by Casey
git-svn-id: http://svn.inspircd.org/repository/trunk/inspircd@7832 e03df62e-2008-0410-955e-edbf42e46eb7
Diffstat (limited to 'src/modules/m_commonchans.cpp')
-rw-r--r-- | src/modules/m_commonchans.cpp | 102 |
1 files changed, 102 insertions, 0 deletions
diff --git a/src/modules/m_commonchans.cpp b/src/modules/m_commonchans.cpp new file mode 100644 index 000000000..b4e274f6c --- /dev/null +++ b/src/modules/m_commonchans.cpp @@ -0,0 +1,102 @@ +/* +------------------------------------+ + * | 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: Adds user mode +c, which if set, users must be on a common channel with you to private message you */ + +/** Handles user mode +c + */ +class PrivacyMode : public ModeHandler +{ + public: + PrivacyMode(InspIRCd* Instance) : ModeHandler(Instance, 'c', 0, 0, false, MODETYPE_USER, false) { } + + ModeAction OnModeChange(userrec* source, userrec* dest, chanrec* channel, std::string ¶meter, bool adding) + { + if (adding) + { + if (!dest->IsModeSet('c')) + { + dest->SetMode('c',true); + return MODEACTION_ALLOW; + } + } + else + { + if (dest->IsModeSet('c')) + { + dest->SetMode('c',false); + return MODEACTION_ALLOW; + } + } + + return MODEACTION_DENY; + } +}; + +class ModulePrivacyMode : public Module +{ + PrivacyMode* pm; + public: + ModulePrivacyMode(InspIRCd* Me) : Module(Me) + { + pm = new PrivacyMode(ServerInstance); + if (!ServerInstance->AddMode(pm, 'c')) + throw ModuleException("Could not add new modes!"); + } + + void Implements(char* List) + { + List[I_OnUserPreMessage] = List[I_OnUserPreNotice] = 1; + } + + virtual ~ModulePrivacyMode() + { + ServerInstance->Modes->DelMode(pm); + DELETE(pm); + } + + virtual Version GetVersion() + { + return Version(1,1,0,0, VF_COMMON|VF_VENDOR, API_VERSION); + } + + virtual int OnUserPreMessage(userrec* user,void* dest,int target_type, std::string &text, char status, CUList &exempt_list) + { + if (target_type == TYPE_USER) + { + userrec* t = (userrec*)dest; + if (!IS_OPER(user) && (t->IsModeSet('c')) && (!ServerInstance->ULine(user->server)) && !user->SharesChannelWith(t)) + { + user->WriteServ("531 %s %s :You are not permitted to send private messages to this user (+c set)", user->nick, t->nick); + return 1; + } + } + return 0; + } + + virtual int OnUserPreNotice(userrec* user,void* dest,int target_type, std::string &text, char status, CUList &exempt_list) + { + return OnUserPreMessage(user, dest, target_type, text, status, exempt_list); + } +}; + + +MODULE_INIT(ModulePrivacyMode) |