mirror of
https://github.com/inspircd/inspircd.git
synced 2025-03-12 20:19:02 -04:00
git-svn-id: http://svn.inspircd.org/repository/branches/1_1_stable@7833 e03df62e-2008-0410-955e-edbf42e46eb7
103 lines
2.5 KiB
C++
103 lines
2.5 KiB
C++
/* +------------------------------------+
|
|
* | 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)
|