class ModuleDenyChannels : public Module
{
+ ChanModeReference redirectmode;
+
public:
- void init() CXX11_OVERRIDE
+ ModuleDenyChannels()
+ : redirectmode(this, "redirect")
{
- Implementation eventlist[] = { I_OnUserPreJoin, I_OnRehash };
- ServerInstance->Modules->Attach(eventlist, this, sizeof(eventlist)/sizeof(Implementation));
}
- void OnRehash(User* user) CXX11_OVERRIDE
+ void ReadConfig(ConfigStatus& status) CXX11_OVERRIDE
{
/* check for redirect validity and loops/chains */
ConfigTagList tags = ServerInstance->Config->ConfTags("badchan");
if (!ServerInstance->IsChannel(redirect))
{
- if (user)
- user->WriteNotice("Invalid badchan redirect '" + redirect + "'");
+ if (status.srcuser)
+ status.srcuser->WriteNotice("Invalid badchan redirect '" + redirect + "'");
throw ModuleException("Invalid badchan redirect, not a channel");
}
if (InspIRCd::Match(redirect, j->second->getString("name")))
{
bool goodchan = false;
- ConfigTagList goodchans = ServerInstance->Config->ConfTags("badchan");
+ ConfigTagList goodchans = ServerInstance->Config->ConfTags("goodchan");
for (ConfigIter k = goodchans.first; k != goodchans.second; ++k)
{
if (InspIRCd::Match(redirect, k->second->getString("name")))
if (!goodchan)
{
/* <badchan:redirect> is a badchan */
- if (user)
- user->WriteNotice("Badchan " + name + " redirects to badchan " + redirect);
+ if (status.srcuser)
+ status.srcuser->WriteNotice("Badchan " + name + " redirects to badchan " + redirect);
throw ModuleException("Badchan redirect loop");
}
}
{
/* simple way to avoid potential loops: don't redirect to +L channels */
Channel *newchan = ServerInstance->FindChan(redirect);
- if ((!newchan) || (!(newchan->IsModeSet('L'))))
+ if ((!newchan) || (!newchan->IsModeSet(redirectmode)))
{
- user->WriteNumeric(926, "%s %s :Channel %s is forbidden, redirecting to %s: %s",user->nick.c_str(),cname.c_str(),cname.c_str(),redirect.c_str(), reason.c_str());
+ user->WriteNumeric(926, cname, InspIRCd::Format("Channel %s is forbidden, redirecting to %s: %s", cname.c_str(), redirect.c_str(), reason.c_str()));
Channel::JoinUser(user, redirect);
return MOD_RES_DENY;
}
}
- user->WriteNumeric(926, "%s %s :Channel %s is forbidden: %s",user->nick.c_str(),cname.c_str(),cname.c_str(),reason.c_str());
+ user->WriteNumeric(926, cname, InspIRCd::Format("Channel %s is forbidden: %s", cname.c_str(), reason.c_str()));
return MOD_RES_DENY;
}
}