class BanRedirect : public ModeWatcher
{
public:
- BanRedirect(InspIRCd* Instance) : ModeWatcher(Instance, 'b', MODETYPE_CHANNEL)
+ SimpleExtItem<BanRedirectList> extItem;
+ BanRedirect(Module* parent) : ModeWatcher('b', MODETYPE_CHANNEL),
+ extItem("banredirect", parent)
{
}
source->WriteNumeric(690, "%s :Target channel %s must exist to be set as a redirect.",source->nick.c_str(),mask[CHAN].c_str());
return false;
}
- else if (c->GetStatus(source) < STATUS_OP)
+ else if (c->GetPrefixValue(source) < OP_VALUE)
{
source->WriteNumeric(690, "%s :You must be opped on %s to set it as a redirect.",source->nick.c_str(), mask[CHAN].c_str());
return false;
if(adding)
{
/* It's a properly valid redirecting ban, and we're adding it */
- if(!channel->GetExt("banredirects", redirects))
+ redirects = extItem.get(channel);
+ if (!redirects)
{
redirects = new BanRedirectList;
- channel->Extend("banredirects", redirects);
+ extItem.set(channel, redirects);
}
/* Here 'param' doesn't have the channel on it yet */
else
{
/* Removing a ban, if there's no extensible there are no redirecting bans and we're fine. */
- if(channel->GetExt("banredirects", redirects))
+ redirects = extItem.get(channel);
+ if (redirects)
{
/* But there were, so we need to remove the matching one if there is one */
if(redirects->empty())
{
- delete redirects;
- channel->Shrink("banredirects");
+ extItem.unset(channel);
}
break;
Module* ExceptionModule;
public:
- ModuleBanRedirect(InspIRCd* Me)
- : Module(Me), re(Me)
+ ModuleBanRedirect()
+ : re(this)
{
nofollow = false;
OnRehash(NULL);
+ Extensible::Register(&re.extItem);
Implementation list[] = { I_OnRehash, I_OnUserPreJoin, I_OnChannelDelete, I_OnCleanup };
- Me->Modules->Attach(list, this, 4);
-
+ ServerInstance->Modules->Attach(list, this, 4);
}
virtual void OnChannelDelete(Channel* chan)
if(target_type == TYPE_CHANNEL)
{
Channel* chan = static_cast<Channel*>(item);
- BanRedirectList* redirects;
+ BanRedirectList* redirects = re.extItem.get(chan);
- if(chan->GetExt("banredirects", redirects))
+ if(redirects)
{
- irc::modestacker modestack(ServerInstance, false);
+ irc::modestacker modestack(false);
StringDeque stackresult;
std::vector<std::string> mode_junk;
mode_junk.push_back(chan->name);
ServerInstance->SendMode(mode_junk, ServerInstance->FakeClient);
mode_junk.erase(mode_junk.begin() + 1, mode_junk.end());
}
-
- delete redirects;
- chan->Shrink("banredirects");
}
}
}
/* Return 1 to prevent the join, 0 to allow it */
if (chan)
{
- BanRedirectList* redirects;
+ BanRedirectList* redirects = re.extItem.get(chan);
- if(chan->GetExt("banredirects", redirects))
+ if (redirects)
{
/* We actually had some ban redirects to check */
user->WriteNumeric(474, "%s %s :Cannot join channel (You are banned)", user->nick.c_str(), chan->name.c_str());
user->WriteNumeric(470, "%s %s %s :You are banned from this channel, so you are automatically transfered to the redirected channel.", user->nick.c_str(), chan->name.c_str(), redir->targetchan.c_str());
nofollow = true;
- Channel::JoinUser(ServerInstance, user, redir->targetchan.c_str(), false, "", false, ServerInstance->Time());
+ Channel::JoinUser(user, redir->targetchan.c_str(), false, "", false, ServerInstance->Time());
nofollow = false;
return MOD_RES_ALLOW;
}
virtual Version GetVersion()
{
- return Version("$Id$", VF_COMMON|VF_VENDOR, API_VERSION);
+ return Version("Allows an extended ban (+b) syntax redirecting banned users to another channel", VF_COMMON|VF_VENDOR, API_VERSION);
}
void Prioritize()