- // We don't update the idle time when a CTCP reply is sent.
- if (details.type == MSG_NOTICE && details.IsCTCP())
- return;
+ 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(ERR_CANNOTSENDTOCHAN, chan->name, "Cannot send to channel (no external messages)");
+ 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(ERR_CANNOTSENDTOCHAN, chan->name, "Cannot send to channel (+m is set)");
+ 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(ERR_CANNOTSENDTOCHAN, chan->name, "Cannot send to channel (you're banned)");
+ return MOD_RES_DENY;
+ }