X-Git-Url: https://git.netwichtig.de/gitweb/?a=blobdiff_plain;f=src%2Fmodules%2Fm_ircv3_ctctags.cpp;h=e46646703622a700d090ed27837e5301f2b263ee;hb=f6b33a8facd6ca200292786c1061782c41cdd278;hp=70ffb54a81be9dec88ba417326d3ca2d0facb2b1;hpb=09f35749aa7bf7dc20951d85bad60de3d219e4eb;p=user%2Fhenk%2Fcode%2Finspircd.git diff --git a/src/modules/m_ircv3_ctctags.cpp b/src/modules/m_ircv3_ctctags.cpp index 70ffb54a8..e46646703 100644 --- a/src/modules/m_ircv3_ctctags.cpp +++ b/src/modules/m_ircv3_ctctags.cpp @@ -26,8 +26,6 @@ class CommandTagMsg : public Command { private: Cap::Capability& cap; - ChanModeReference moderatedmode; - ChanModeReference noextmsgmode; Events::ModuleEventProvider tagevprov; ClientProtocol::EventProvider msgevprov; @@ -70,32 +68,6 @@ class CommandTagMsg : public Command return CMD_FAILURE; } - if (IS_LOCAL(source)) - { - if (chan->IsModeSet(noextmsgmode) && !chan->HasUser(source)) - { - // The noextmsg mode is set and the source is not in the channel. - source->WriteNumeric(ERR_CANNOTSENDTOCHAN, chan->name, "Cannot send to channel (no external messages)"); - return CMD_FAILURE; - } - - bool no_chan_priv = chan->GetPrefixValue(source) < VOICE_VALUE; - if (no_chan_priv && chan->IsModeSet(moderatedmode)) - { - // The moderated mode is set and the source has no status rank. - source->WriteNumeric(ERR_CANNOTSENDTOCHAN, chan->name, "Cannot send to channel (+m is set)"); - return CMD_FAILURE; - } - - if (no_chan_priv && ServerInstance->Config->RestrictBannedUsers != ServerConfig::BUT_NORMAL && chan->IsBanned(source)) - { - // The source is banned in the channel and restrictbannedusers is enabled. - if (ServerInstance->Config->RestrictBannedUsers == ServerConfig::BUT_RESTRICT_NOTIFY) - source->WriteNumeric(ERR_CANNOTSENDTOCHAN, chan->name, "Cannot send to channel (you're banned)"); - return CMD_FAILURE; - } - } - // Fire the pre-message events. MessageTarget msgtarget(chan, pm ? pm->GetPrefix() : 0); CTCTags::TagMessageDetails msgdetails(parameters.GetTags()); @@ -223,8 +195,6 @@ class CommandTagMsg : public Command CommandTagMsg(Module* Creator, Cap::Capability& Cap) : Command(Creator, "TAGMSG", 1) , cap(Cap) - , moderatedmode(Creator, "moderated") - , noextmsgmode(Creator, "noextmsg") , tagevprov(Creator, "event/tagmsg") , msgevprov(Creator, "TAGMSG") { @@ -307,6 +277,8 @@ class ModuleIRCv3CTCTags Cap::Capability cap; CommandTagMsg cmd; C2CTags c2ctags; + ChanModeReference moderatedmode; + ChanModeReference noextmsgmode; ModResult CopyClientTags(const ClientProtocol::TagMap& tags_in, ClientProtocol::TagMap& tags_out) { @@ -325,6 +297,8 @@ class ModuleIRCv3CTCTags , cap(this, "message-tags") , cmd(this, cap) , c2ctags(this, cap) + , moderatedmode(this, "moderated") + , noextmsgmode(this, "noextmsg") { } @@ -335,6 +309,33 @@ class ModuleIRCv3CTCTags ModResult OnUserPreTagMessage(User* user, const MessageTarget& target, CTCTags::TagMessageDetails& details) CXX11_OVERRIDE { + if (IS_LOCAL(user) && target.type == MessageTarget::TYPE_CHANNEL) + { + Channel* chan = target.Get(); + 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; + } + } + return CopyClientTags(details.tags_in, details.tags_out); }