diff options
| author | 2022-03-27 15:30:41 +0100 | |
|---|---|---|
| committer | 2022-03-27 15:30:41 +0100 | |
| commit | f06ea52d0ab08db213b2c2fd81a4dee95910af16 (patch) | |
| tree | 1d91cc063670e5458ac4124ce1705db74734102b /src/modules/m_commonchans.cpp | |
| parent | Merge branch 'insp3' into master. (diff) | |
| parent | Add 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.cpp | 25 |
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); |
