Backport: 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/branches/1_1_stable@7833 e03df62e-2008-0410-955e-edbf42e46eb7
This commit is contained in:
brain 2007-08-26 20:02:00 +00:00
parent 0e3b15b0f1
commit 2e84958e19
2 changed files with 108 additions and 0 deletions

View File

@ -1360,6 +1360,12 @@
# command is issued, use with care.
#<module name="m_clones.so">
#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#
# 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.
#<module name="m_commonchans.so">
#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#
# Conn-Join: Allows you to force users to join one or more channels
# automatically upon connecting to the server.

View File

@ -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 &parameter, 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)