aboutsummaryrefslogtreecommitdiff
path: root/src/modules/m_commonchans.cpp
diff options
context:
space:
mode:
authorGravatar Sadie Powell2022-03-27 15:30:41 +0100
committerGravatar Sadie Powell2022-03-27 15:30:41 +0100
commitf06ea52d0ab08db213b2c2fd81a4dee95910af16 (patch)
tree1d91cc063670e5458ac4124ce1705db74734102b /src/modules/m_commonchans.cpp
parentMerge branch 'insp3' into master. (diff)
parentAdd support for matching against geolocation data with WHO. (diff)
Merge branch 'insp3' into master.
Diffstat (limited to 'src/modules/m_commonchans.cpp')
-rw-r--r--src/modules/m_commonchans.cpp25
1 files changed, 21 insertions, 4 deletions
diff --git a/src/modules/m_commonchans.cpp b/src/modules/m_commonchans.cpp
index 067aeb994..a9137598a 100644
--- a/src/modules/m_commonchans.cpp
+++ b/src/modules/m_commonchans.cpp
@@ -31,16 +31,24 @@ class ModuleCommonChans final
private:
SimpleUserMode mode;
+ bool IsExempt(User* source, User* target)
+ {
+ if (!target->IsModeSet(mode) || source->SharesChannelWith(target))
+ return true; // Target doesn't have mode set or shares a common channel.
+
+ if (source->HasPrivPermission("users/ignore-commonchans") || source->server->IsService())
+ return true; // Source is an oper or a service.
+
+ return false;
+ }
+
ModResult HandleMessage(User* user, const MessageTarget& target)
{
if (target.type != MessageTarget::TYPE_USER)
return MOD_RES_PASSTHRU;
User* targetuser = target.Get<User>();
- if (!targetuser->IsModeSet(mode) || user->SharesChannelWith(targetuser))
- return MOD_RES_PASSTHRU;
-
- if (user->HasPrivPermission("users/ignore-commonchans") || user->server->IsService())
+ if (IsExempt(user, targetuser))
return MOD_RES_PASSTHRU;
user->WriteNumeric(Numerics::CannotSendTo(targetuser, "messages", &mode));
@@ -55,6 +63,15 @@ public:
{
}
+ ModResult OnUserPreInvite(User* source, User* dest, Channel* channel, time_t timeout) override
+ {
+ if (IsExempt(source, dest))
+ return MOD_RES_PASSTHRU;
+
+ source->WriteNumeric(Numerics::CannotSendTo(dest, "invites", &mode));
+ return MOD_RES_DENY;
+ }
+
ModResult OnUserPreMessage(User* user, const MessageTarget& target, MessageDetails& details) override
{
return HandleMessage(user, target);