/* $ModDesc: Provides channel mode +L (limit redirection) */
-
-class ModuleRedirect : public Module
+class Redirect : public ModeHandler
{
- Server *Srv;
-
+ Server* Srv;
public:
-
- ModuleRedirect(Server* Me)
- : Module::Module(Me)
- {
- Srv = Me;
- Srv->AddExtendedMode('L',MT_CHANNEL,false,1,0);
- }
-
- virtual int OnExtendedMode(userrec* user, void* target, char modechar, int type, bool mode_on, string_list ¶ms)
+ Redirect(Server* s) : ModeHandler('L', 1, 0, false, MODETYPE_CHANNEL, false), Srv(s) { }
+
+ ModeAction OnModeChange(userrec* source, userrec* dest, chanrec* channel, std::string ¶meter, bool adding)
{
- if ((modechar == 'L') && (type == MT_CHANNEL))
+ if (adding)
{
- if (mode_on)
+ chanrec* c = NULL;
+
+ if (!IsValidChannelName(parameter.c_str()))
{
- std::string ChanToJoin = params[0];
- chanrec *c;
+ WriteServ(source->fd,"403 %s %s :Invalid channel name",source->nick, parameter.c_str());
+ parameter = "";
+ return MODEACTION_DENY;
+ }
- if (!IsValidChannelName(ChanToJoin.c_str()))
+ c = Srv->FindChannel(parameter);
+ if (c)
+ {
+ /* Fix by brain: Dont let a channel be linked to *itself* either */
+ if ((c == channel) || (c->IsModeSet('L')))
{
- WriteServ(user->fd,"403 %s %s :Invalid channel name",user->nick, ChanToJoin.c_str());
- return 0;
+ WriteServ(source->fd,"690 %s :Circular redirection, mode +L to %s not allowed.",source->nick,parameter.c_str());
+ parameter = "";
+ return MODEACTION_DENY;
}
+ }
- c = Srv->FindChannel(ChanToJoin);
- if (c)
- {
- /* Fix by brain: Dont let a channel be linked to *itself* either */
- if ((c == target) || (c->IsCustomModeSet('L')))
- {
- WriteServ(user->fd,"690 %s :Circular redirection, mode +L to %s not allowed.",user->nick,params[0].c_str());
- return 0;
- }
- }
+ channel->SetMode('L', true);
+ channel->SetModeParam('L', parameter.c_str(), true);
+ return MODEACTION_ALLOW;
+ }
+ else
+ {
+ if (channel->IsModeSet('L'))
+ {
+ channel->SetMode('L', false);
+ return MODEACTION_ALLOW;
}
- return 1;
}
- return 0;
+
+ return MODEACTION_DENY;
+
}
+};
+class ModuleRedirect : public Module
+{
+ Server *Srv;
+ Redirect* re;
+
+ public:
+
+ ModuleRedirect(Server* Me)
+ : Module::Module(Me)
+ {
+ Srv = Me;
+ re = new Redirect(Me);
+ Srv->AddMode(re, 'L');
+ }
+
void Implements(char* List)
{
- List[I_On005Numeric] = List[I_OnUserPreJoin] = List[I_OnExtendedMode] = 1;
+ List[I_On005Numeric] = List[I_OnUserPreJoin] = 1;
}
virtual void On005Numeric(std::string &output)
{
if (chan)
{
- if (chan->IsCustomModeSet('L'))
+ if (chan->IsModeSet('L'))
{
if (Srv->CountUsers(chan) >= chan->limit)
{
virtual ~ModuleRedirect()
{
+ DELETE(re);
}
virtual Version GetVersion()