mirror of
https://github.com/inspircd/inspircd.git
synced 2025-03-21 16:39:02 -04:00
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)
|