Add channelmode +l

git-svn-id: http://svn.inspircd.org/repository/trunk/inspircd@4163 e03df62e-2008-0410-955e-edbf42e46eb7
This commit is contained in:
brain 2006-07-08 14:20:25 +00:00
parent abe417a809
commit 4260fd6227
3 changed files with 76 additions and 1 deletions

8
include/modes/cmode_l.h Normal file
View File

@ -0,0 +1,8 @@
#include "mode.h"
class ModeChannelLimit : public ModeHandler
{
public:
ModeChannelLimit();
ModeAction OnModeChange(userrec* source, userrec* dest, chanrec* channel, std::string &parameter, bool adding);
};

View File

@ -46,6 +46,8 @@ using namespace std;
#include "modes/cmode_i.h"
/* +k (keyed channel) */
#include "modes/cmode_k.h"
/* +l (channel user limit) */
#include "modes/cmode_l.h"
extern int MODCOUNT;
extern std::vector<Module*> modules;
@ -646,6 +648,7 @@ ModeParser::ModeParser()
this->AddMode(new ModeChannelNoExternal, 'n');
this->AddMode(new ModeChannelInviteOnly, 'i');
this->AddMode(new ModeChannelKey, 'k');
/* TODO: Modes +l, +o, +v, +h */
this->AddMode(new ModeChannelLimit, 'l');
/* TODO: Modes +o, +v, +h */
}

64
src/modes/cmode_l.cpp Normal file
View File

@ -0,0 +1,64 @@
#include "inspircd.h"
#include "mode.h"
#include "channels.h"
#include "users.h"
#include "modes/cmode_l.h"
ModeChannelLimit::ModeChannelLimit() : ModeHandler('l', 1, 0, false, MODETYPE_CHANNEL, false)
{
}
ModeAction ModeChannelLimit::OnModeChange(userrec* source, userrec* dest, chanrec* channel, std::string &parameter, bool adding)
{
if (adding)
{
/* Setting a new limit, sanity check */
long limit = atoi(parameter.c_str());
/* Wrap low values at 32768 */
if (limit < 0)
limit = 0x7FFF;
/* If the new limit is the same as the old limit,
* and the old limit isnt 0, disallow */
if ((limit == channel->limit) && (channel->limit > 0))
{
parameter = "";
return MODEACTION_DENY;
}
/* They must have specified an invalid number.
* Dont allow +l 0.
*/
if (!limit)
{
parameter = "";
return MODEACTION_DENY;
}
/* Set new limit */
channel->limit = limit;
channel->modes[CM_LIMIT] = 1;
return MODEACTION_ALLOW;
}
else
{
/* Check if theres a limit here to remove.
* If there isnt, dont allow the -l
*/
if (!channel->limit)
{
parameter = "";
return MODEACTION_DENY;
}
/* Removing old limit, no checks here */
channel->limit = 0;
channel->modes[CM_LIMIT] = 0;
return MODEACTION_ALLOW;
}
return MODEACTION_DENY;
}