]> git.netwichtig.de Git - user/henk/code/inspircd.git/commitdiff
Add channelmode +l
authorbrain <brain@e03df62e-2008-0410-955e-edbf42e46eb7>
Sat, 8 Jul 2006 14:20:25 +0000 (14:20 +0000)
committerbrain <brain@e03df62e-2008-0410-955e-edbf42e46eb7>
Sat, 8 Jul 2006 14:20:25 +0000 (14:20 +0000)
git-svn-id: http://svn.inspircd.org/repository/trunk/inspircd@4163 e03df62e-2008-0410-955e-edbf42e46eb7

include/modes/cmode_l.h [new file with mode: 0644]
src/mode.cpp
src/modes/cmode_l.cpp [new file with mode: 0644]

diff --git a/include/modes/cmode_l.h b/include/modes/cmode_l.h
new file mode 100644 (file)
index 0000000..d13bd04
--- /dev/null
@@ -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);
+};
index 2a875c06dc95c9a6cd73f894bed5e23531d99561..e11103fee324e5417ca7d8d30ac79cb031087254 100644 (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 */
 }
 
diff --git a/src/modes/cmode_l.cpp b/src/modes/cmode_l.cpp
new file mode 100644 (file)
index 0000000..185cbde
--- /dev/null
@@ -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;
+}