summaryrefslogtreecommitdiff
path: root/src/modules/m_deaf.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/modules/m_deaf.cpp')
-rw-r--r--src/modules/m_deaf.cpp115
1 files changed, 76 insertions, 39 deletions
diff --git a/src/modules/m_deaf.cpp b/src/modules/m_deaf.cpp
index e58d130a5..2f7221313 100644
--- a/src/modules/m_deaf.cpp
+++ b/src/modules/m_deaf.cpp
@@ -4,6 +4,7 @@
* Copyright (C) 2006, 2008 Craig Edwards <craigedwards@brainbox.cc>
* Copyright (C) 2007 Robin Burchell <robin+git@viroteck.net>
* Copyright (C) 2006-2007 Dennis Friis <peavey@inspircd.org>
+ * Copyright (C) 2012 satmd <satmd@satmd.dyndns.org>
*
* This file is part of InspIRCd. InspIRCd is free software: you can
* redistribute it and/or modify it under the terms of the GNU General Public
@@ -21,12 +22,11 @@
#include "inspircd.h"
-/** User mode +d - filter out channel messages and channel notices
- */
-class User_d : public ModeHandler
+// User mode +d - filter out channel messages and channel notices
+class DeafMode : public ModeHandler
{
public:
- User_d(Module* Creator) : ModeHandler(Creator, "deaf", 'd', PARAM_NONE, MODETYPE_USER) { }
+ DeafMode(Module* Creator) : ModeHandler(Creator, "deaf", 'd', PARAM_NONE, MODETYPE_USER) { }
ModeAction OnModeChange(User* source, User* dest, Channel* channel, std::string& parameter, bool adding) CXX11_OVERRIDE
{
@@ -41,15 +41,41 @@ class User_d : public ModeHandler
}
};
+// User mode +D - filter out user messages and user notices
+class PrivDeafMode : public ModeHandler
+{
+ public:
+ PrivDeafMode(Module* Creator) : ModeHandler(Creator, "privdeaf", 'D', PARAM_NONE, MODETYPE_USER)
+ {
+ if (!ServerInstance->Config->ConfValue("deaf")->getBool("enableprivdeaf"))
+ DisableAutoRegister();
+ }
+
+ ModeAction OnModeChange(User* source, User* dest, Channel* channel, std::string& parameter, bool adding) CXX11_OVERRIDE
+ {
+ if (adding == dest->IsModeSet(this))
+ return MODEACTION_DENY;
+
+ if (adding)
+ dest->WriteNotice("*** You have enabled usermode +D, private deaf mode. This mode means you WILL NOT receive any messages and notices from any nicks. If you did NOT mean to do this, use /mode " + dest->nick + " -D.");
+
+ dest->SetMode(this, adding);
+ return MODEACTION_ALLOW;
+ }
+};
+
class ModuleDeaf : public Module
{
- User_d m1;
+ DeafMode deafmode;
+ PrivDeafMode privdeafmode;
std::string deaf_bypasschars;
std::string deaf_bypasschars_uline;
+ bool privdeafuline;
public:
ModuleDeaf()
- : m1(this)
+ : deafmode(this)
+ , privdeafmode(this)
{
}
@@ -58,44 +84,55 @@ class ModuleDeaf : public Module
ConfigTag* tag = ServerInstance->Config->ConfValue("deaf");
deaf_bypasschars = tag->getString("bypasschars");
deaf_bypasschars_uline = tag->getString("bypasscharsuline");
+ privdeafuline = tag->getBool("privdeafuline", true);
}
ModResult OnUserPreMessage(User* user, const MessageTarget& target, MessageDetails& details) CXX11_OVERRIDE
{
- if (target.type != MessageTarget::TYPE_CHANNEL)
- return MOD_RES_PASSTHRU;
-
- Channel* chan = target.Get<Channel>();
- bool is_bypasschar = (deaf_bypasschars.find(details.text[0]) != std::string::npos);
- bool is_bypasschar_uline = (deaf_bypasschars_uline.find(details.text[0]) != std::string::npos);
-
- /*
- * If we have no bypasschars_uline in config, and this is a bypasschar (regular)
- * Than it is obviously going to get through +d, no build required
- */
- if (deaf_bypasschars_uline.empty() && is_bypasschar)
- return MOD_RES_PASSTHRU;
-
- const Channel::MemberMap& ulist = chan->GetUsers();
- for (Channel::MemberMap::const_iterator i = ulist.begin(); i != ulist.end(); ++i)
+ if (target.type == MessageTarget::TYPE_CHANNEL)
{
- /* not +d ? */
- if (!i->first->IsModeSet(m1))
- continue; /* deliver message */
- /* matched both U-line only and regular bypasses */
+ Channel* chan = target.Get<Channel>();
+ bool is_bypasschar = (deaf_bypasschars.find(details.text[0]) != std::string::npos);
+ bool is_bypasschar_uline = (deaf_bypasschars_uline.find(details.text[0]) != std::string::npos);
+
+ // If we have no bypasschars_uline in config, and this is a bypasschar (regular)
+ // Then it is obviously going to get through +d, no exemption list required
+ if (deaf_bypasschars_uline.empty() && is_bypasschar)
+ return MOD_RES_PASSTHRU;
+ // If it matches both bypasschar and bypasschar_uline, it will get through.
if (is_bypasschar && is_bypasschar_uline)
- continue; /* deliver message */
-
- bool is_a_uline = i->first->server->IsULine();
- /* matched a U-line only bypass */
- if (is_bypasschar_uline && is_a_uline)
- continue; /* deliver message */
- /* matched a regular bypass */
- if (is_bypasschar && !is_a_uline)
- continue; /* deliver message */
-
- /* don't deliver message! */
- details.exemptions.insert(i->first);
+ return MOD_RES_PASSTHRU;
+
+ const Channel::MemberMap& ulist = chan->GetUsers();
+ for (Channel::MemberMap::const_iterator i = ulist.begin(); i != ulist.end(); ++i)
+ {
+ // not +d
+ if (!i->first->IsModeSet(deafmode))
+ continue;
+
+ bool is_a_uline = i->first->server->IsULine();
+ // matched a U-line only bypass
+ if (is_bypasschar_uline && is_a_uline)
+ continue;
+ // matched a regular bypass
+ if (is_bypasschar && !is_a_uline)
+ continue;
+
+ // don't deliver message!
+ details.exemptions.insert(i->first);
+ }
+ }
+ else if (target.type == MessageTarget::TYPE_USER)
+ {
+ User* targ = target.Get<User>();
+ if (!targ->IsModeSet(privdeafmode))
+ return MOD_RES_PASSTHRU;
+
+ if (!privdeafuline && user->server->IsULine())
+ return MOD_RES_DENY;
+
+ if (!user->HasPrivPermission("users/privdeaf-override"))
+ return MOD_RES_DENY;
}
return MOD_RES_PASSTHRU;
@@ -103,7 +140,7 @@ class ModuleDeaf : public Module
Version GetVersion() CXX11_OVERRIDE
{
- return Version("Provides usermode +d to block channel messages and channel notices", VF_VENDOR);
+ return Version("Provides usermodes +dD to block channel and/or user messages and notices", VF_VENDOR);
}
};