public:
SimpleExtItem<BanRedirectList> extItem;
BanRedirect(Module* parent)
- : ModeWatcher(parent, 'b', MODETYPE_CHANNEL)
+ : ModeWatcher(parent, "ban", MODETYPE_CHANNEL)
, ban(parent, "ban")
, extItem("banredirect", parent)
{
}
- bool BeforeMode(User* source, User* dest, Channel* channel, std::string ¶m, bool adding, ModeType type)
+ bool BeforeMode(User* source, User* dest, Channel* channel, std::string ¶m, bool adding)
{
/* nick!ident@host -> nick!ident@host
* nick!ident@host#chan -> nick!ident@host#chan
* nick#chan -> nick!*@*#chan
*/
- if(channel && (type == MODETYPE_CHANNEL) && param.length())
+ if ((channel) && !param.empty())
{
BanRedirectList* redirects;
switch(*curr)
{
case '!':
+ if (current != NICK)
+ break;
mask[current].assign(start_pos, curr);
current = IDENT;
start_pos = curr+1;
break;
case '@':
+ if (current != IDENT)
+ break;
mask[current].assign(start_pos, curr);
current = HOST;
start_pos = curr+1;
break;
case '#':
- /* bug #921: don't barf when redirecting to ## channels */
- if (current != CHAN)
- {
- mask[current].assign(start_pos, curr);
- current = CHAN;
- start_pos = curr;
- }
+ if (current == CHAN)
+ break;
+ mask[current].assign(start_pos, curr);
+ current = CHAN;
+ start_pos = curr;
break;
}
}
void init() CXX11_OVERRIDE
{
- if(!ServerInstance->Modes->AddModeWatcher(&re))
- throw ModuleException("Could not add mode watcher");
-
+ ServerInstance->Modes->AddModeWatcher(&re);
ServerInstance->Modules->AddService(re.extItem);
Implementation list[] = { I_OnUserPreJoin };
ServerInstance->Modules->Attach(list, this, sizeof(list)/sizeof(Implementation));
if(redirects)
{
irc::modestacker modestack(false);
- std::vector<std::string> stackresult;
- std::vector<std::string> mode_junk;
- mode_junk.push_back(chan->name);
for(BanRedirectList::iterator i = redirects->begin(); i != redirects->end(); i++)
{
modestack.Push('b', i->banmask);
}
- while(modestack.GetStackedLine(stackresult))
+ std::vector<std::string> stackresult;
+ stackresult.push_back(chan->name);
+ while (modestack.GetStackedLine(stackresult))
{
- mode_junk.insert(mode_junk.end(), stackresult.begin(), stackresult.end());
- ServerInstance->SendMode(mode_junk, ServerInstance->FakeClient);
- mode_junk.erase(mode_junk.begin() + 1, mode_junk.end());
+ ServerInstance->Modes->Process(stackresult, ServerInstance->FakeClient, ModeParser::MODE_LOCALONLY);
+ stackresult.erase(stackresult.begin() + 1, stackresult.end());
}
}
}