-/* +------------------------------------+\r * | Inspire Internet Relay Chat Daemon |\r * +------------------------------------+\r *\r * InspIRCd: (C) 2002-2007 InspIRCd Development Team\r * See: http://www.inspircd.org/wiki/index.php/Credits\r *\r * This program is free but copyrighted software; see\r * the file COPYING for details.\r *\r * ---------------------------------------------------\r */\r\r#include "inspircd.h"\r#include "mode.h"\r#include "channels.h"\r#include "users.h"\r#include "modes/cmode_l.h"\r\rModeChannelLimit::ModeChannelLimit(InspIRCd* Instance) : ModeHandler(Instance, 'l', 1, 0, false, MODETYPE_CHANNEL, false)\r{\r}\r\rModePair ModeChannelLimit::ModeSet(userrec* source, userrec* dest, chanrec* channel, const std::string ¶meter)\r{\r if (channel->limit)\r {\r return std::make_pair(true, ConvToStr(channel->limit));\r }\r else\r {\r return std::make_pair(false, parameter);\r }\r}\r\rbool ModeChannelLimit::CheckTimeStamp(time_t theirs, time_t ours, const std::string &their_param, const std::string &our_param, chanrec* channel)\r{\r /* When TS is equal, the higher channel limit wins */\r return (atoi(their_param.c_str()) < atoi(our_param.c_str()));\r}\r\rModeAction ModeChannelLimit::OnModeChange(userrec* source, userrec* dest, chanrec* channel, std::string ¶meter, bool adding)\r{\r if (adding)\r {\r /* Setting a new limit, sanity check */\r long limit = atoi(parameter.c_str());\r\r /* Wrap low values at 32768 */\r if (limit < 0)\r limit = 0x7FFF;\r\r /* If the new limit is the same as the old limit,\r * and the old limit isnt 0, disallow */\r if ((limit == channel->limit) && (channel->limit > 0))\r {\r parameter = "";\r return MODEACTION_DENY;\r }\r\r /* They must have specified an invalid number.\r * Dont allow +l 0.\r */\r if (!limit)\r {\r parameter = "";\r return MODEACTION_DENY;\r }\r\r parameter = ConvToStr(limit);\r\r /* Set new limit */\r channel->limit = limit;\r channel->modes[CM_LIMIT] = 1;\r\r return MODEACTION_ALLOW;\r }\r else\r {\r /* Check if theres a limit here to remove.\r * If there isnt, dont allow the -l\r */\r if (!channel->limit)\r {\r parameter = "";\r return MODEACTION_DENY;\r }\r\r /* Removing old limit, no checks here */\r channel->limit = 0;\r channel->modes[CM_LIMIT] = 0;\r\r return MODEACTION_ALLOW;\r }\r\r return MODEACTION_DENY;\r}\r
\ No newline at end of file
+/* +------------------------------------+
+ * | Inspire Internet Relay Chat Daemon |
+ * +------------------------------------+
+ *
+ * InspIRCd: (C) 2002-2009 InspIRCd Development Team
+ * See: http://wiki.inspircd.org/Credits
+ *
+ * This program is free but copyrighted software; see
+ * the file COPYING for details.
+ *
+ * ---------------------------------------------------
+ */
+
+#include "inspircd.h"
+#include "mode.h"
+#include "channels.h"
+#include "users.h"
+#include "modes/cmode_l.h"
+
+ModeChannelLimit::ModeChannelLimit(InspIRCd* Instance) : ModeHandler(Instance, NULL, 'l', 1, 0, false, MODETYPE_CHANNEL, false)
+{
+}
+
+ModePair ModeChannelLimit::ModeSet(User*, User*, Channel* channel, const std::string ¶meter)
+{
+ std::string climit = channel->GetModeParameter('l');
+ if (!climit.empty())
+ {
+ return std::make_pair(true, climit);
+ }
+ else
+ {
+ return std::make_pair(false, parameter);
+ }
+}
+
+bool ModeChannelLimit::CheckTimeStamp(std::string &their_param, const std::string &our_param, Channel*)
+{
+ /* When TS is equal, the higher channel limit wins */
+ return (atoi(their_param.c_str()) < atoi(our_param.c_str()));
+}
+
+ModeAction ModeChannelLimit::OnModeChange(User*, User*, Channel* 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;
+
+ parameter = ConvToStr(limit);
+
+ /* Set new limit */
+ channel->SetModeParam('l', parameter);
+
+ return MODEACTION_ALLOW;
+ }
+ else
+ {
+ /* Check if theres a limit here to remove.
+ * If there isnt, dont allow the -l
+ */
+ if (channel->GetModeParameter('l').empty())
+ {
+ parameter = "";
+ return MODEACTION_DENY;
+ }
+
+ /* Removing old limit, no checks here */
+ channel->SetModeParam('l', "");
+ return MODEACTION_ALLOW;
+ }
+}