+ if (!IS_LOCAL(user) || target.type != MessageTarget::TYPE_CHANNEL)
+ return MOD_RES_PASSTHRU;
+
+ Channel* chan = target.Get<Channel>();
+ if (chan->IsModeSet(noextmsgmode) && !chan->HasUser(user))
+ {
+ // The noextmsg mode is set and the user is not in the channel.
+ user->WriteNumeric(Numerics::CannotSendTo(chan, "external messages", *noextmsgmode));
+ return MOD_RES_DENY;
+ }
+
+ bool no_chan_priv = chan->GetPrefixValue(user) < VOICE_VALUE;
+ if (no_chan_priv && chan->IsModeSet(moderatedmode))
+ {
+ // The moderated mode is set and the user has no status rank.
+ user->WriteNumeric(Numerics::CannotSendTo(chan, "messages", *moderatedmode));
+ return MOD_RES_DENY;
+ }
+
+ if (no_chan_priv && ServerInstance->Config->RestrictBannedUsers != ServerConfig::BUT_NORMAL && chan->IsBanned(user))
+ {
+ // The user is banned in the channel and restrictbannedusers is enabled.
+ if (ServerInstance->Config->RestrictBannedUsers == ServerConfig::BUT_RESTRICT_NOTIFY)
+ user->WriteNumeric(Numerics::CannotSendTo(chan, "You cannot send messages to this channel whilst banned."));
+ return MOD_RES_DENY;
+ }
+
+ return MOD_RES_PASSTHRU;