From: brain Date: Sun, 26 Aug 2007 20:01:15 +0000 (+0000) Subject: Add m_commonchans.so (documented in example conf, no wiki yet) resolves bug #342... X-Git-Tag: v2.0.23~4741 X-Git-Url: https://git.netwichtig.de/gitweb/?a=commitdiff_plain;h=d1d5a31c13effeea4c3265e991b01742e9a53ca5;p=user%2Fhenk%2Fcode%2Finspircd.git 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 --- diff --git a/docs/inspircd.conf.example b/docs/inspircd.conf.example index 31d69d84c..33840ac28 100644 --- a/docs/inspircd.conf.example +++ b/docs/inspircd.conf.example @@ -1373,6 +1373,12 @@ # command is issued, use with care. # +#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-# +# Common channels module: Adds user mode +c, which, when set, requires +# that users must share a common channel with you to PRIVMSG or NOTICE +# you. +# + #-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-# # Conn-Join: Allows you to force users to join one or more channels # automatically upon connecting to the server. 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 +#include +#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)