mirror of
https://github.com/inspircd/inspircd.git
synced 2025-03-12 20:19:02 -04:00
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:
parent
0e3b15b0f1
commit
2e84958e19
@ -1360,6 +1360,12 @@
|
|||||||
# command is issued, use with care.
|
# command is issued, use with care.
|
||||||
#<module name="m_clones.so">
|
#<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
|
# Conn-Join: Allows you to force users to join one or more channels
|
||||||
# automatically upon connecting to the server.
|
# automatically upon connecting to the server.
|
||||||
|
102
src/modules/m_commonchans.cpp
Normal file
102
src/modules/m_commonchans.cpp
Normal 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 ¶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)
|
Loading…
x
Reference in New Issue
Block a user