mirror of
https://github.com/inspircd/inspircd.git
synced 2025-03-10 11:09:04 -04:00
Add channelmode +l
git-svn-id: http://svn.inspircd.org/repository/trunk/inspircd@4163 e03df62e-2008-0410-955e-edbf42e46eb7
This commit is contained in:
parent
abe417a809
commit
4260fd6227
8
include/modes/cmode_l.h
Normal file
8
include/modes/cmode_l.h
Normal file
@ -0,0 +1,8 @@
|
||||
#include "mode.h"
|
||||
|
||||
class ModeChannelLimit : public ModeHandler
|
||||
{
|
||||
public:
|
||||
ModeChannelLimit();
|
||||
ModeAction OnModeChange(userrec* source, userrec* dest, chanrec* channel, std::string ¶meter, bool adding);
|
||||
};
|
@ -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
64
src/modes/cmode_l.cpp
Normal 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 ¶meter, 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;
|
||||
}
|
Loading…
x
Reference in New Issue
Block a user