summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--include/modes/cmode_l.h8
-rw-r--r--src/mode.cpp5
-rw-r--r--src/modes/cmode_l.cpp64
3 files changed, 76 insertions, 1 deletions
diff --git a/include/modes/cmode_l.h b/include/modes/cmode_l.h
new file mode 100644
index 000000000..d13bd0459
--- /dev/null
+++ b/include/modes/cmode_l.h
@@ -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);
+};
diff --git a/src/mode.cpp b/src/mode.cpp
index 2a875c06d..e11103fee 100644
--- a/src/mode.cpp
+++ b/src/mode.cpp
@@ -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 */
}
diff --git a/src/modes/cmode_l.cpp b/src/modes/cmode_l.cpp
new file mode 100644
index 000000000..185cbdedb
--- /dev/null
+++ b/src/modes/cmode_l.cpp
@@ -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;
+}