summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorpeavey <peavey@e03df62e-2008-0410-955e-edbf42e46eb7>2007-07-29 12:17:45 +0000
committerpeavey <peavey@e03df62e-2008-0410-955e-edbf42e46eb7>2007-07-29 12:17:45 +0000
commit1f178250c7ea3ce5e02b94a3437f98ccaa62d701 (patch)
treec911f497f28d2df5d406b330f389fd916df60118 /src
parent25b3224ddac4a9a0516e641a9f8ae4ae2c7cb39a (diff)
Add /CLOSE which quit off all unregistered client connections. Based on the U4 module.
git-svn-id: http://svn.inspircd.org/repository/trunk/inspircd@7607 e03df62e-2008-0410-955e-edbf42e46eb7
Diffstat (limited to 'src')
-rw-r--r--src/modules/m_close.cpp81
1 files changed, 81 insertions, 0 deletions
diff --git a/src/modules/m_close.cpp b/src/modules/m_close.cpp
new file mode 100644
index 000000000..93328a5a9
--- /dev/null
+++ b/src/modules/m_close.cpp
@@ -0,0 +1,81 @@
+/* +------------------------------------+
+ * | UnrealIRCd v4.0 |
+ * +------------------------------------+
+ *
+ * UnrealIRCd 4.0 (C) 2007 Carsten Valdemar Munk
+ * This program is free but copyrighted software; see
+ * the file COPYING for details.
+ *
+ * ---------------------------------------------------
+ */
+
+#include "inspircd.h"
+#include "users.h"
+#include "channels.h"
+#include "modules.h"
+
+/* $ModDesc: Provides /CLOSE functionality */
+
+/** Handle /CLOSE
+ */
+class cmd_close : public command_t
+{
+ public:
+ /* Command 'close', needs operator */
+ cmd_close (InspIRCd* Instance) : command_t(Instance,"CLOSE", 'o', 0)
+ {
+ this->source = "m_close.so";
+ }
+
+ CmdResult Handle (const char** parameters, int pcnt, userrec *user)
+ {
+ std::map<std::string,int> closed;
+
+ for (std::vector<userrec*>::iterator u = ServerInstance->local_users.begin(); u != ServerInstance->local_users.end(); u++)
+ {
+ if ((*u)->registered != REG_ALL)
+ {
+ userrec::QuitUser(ServerInstance, *u, "Closing all unknown connections per request");
+ std::string key = ConvToStr((*u)->GetIPString())+"."+ConvToStr((*u)->GetPort());
+ closed[key]++;
+ }
+ }
+
+ int total = 0;
+ for (std::map<std::string,int>::iterator ci = closed.begin(); ci != closed.end(); ci++)
+ {
+ user->WriteServ("NOTICE %s :*** Closed %d unknown connection%s from [%s]",user->nick,(*ci).second,((*ci).second>1)?"s":"",(*ci).first.c_str());
+ total += (*ci).second;
+ }
+ if (total)
+ user->WriteServ("NOTICE %s :*** %i unknown connection%s closed",user->nick,total,(total>1)?"s":"");
+ else
+ user->WriteServ("NOTICE %s :*** No unknown connections found",user->nick);
+
+ return CMD_LOCALONLY;
+ }
+};
+
+class ModuleClose : public Module
+{
+ cmd_close* newcommand;
+ public:
+ ModuleClose(InspIRCd* Me)
+ : Module(Me)
+ {
+ // Create a new command
+ newcommand = new cmd_close(ServerInstance);
+ ServerInstance->AddCommand(newcommand);
+ }
+
+ virtual ~ModuleClose()
+ {
+ }
+
+ virtual Version GetVersion()
+ {
+ return Version(1, 1, 0, 0, VF_VENDOR, API_VERSION);
+ }
+};
+
+MODULE_INIT(ModuleClose)