added module management commands
[NeonServV5.git] / src / module_commands.c
diff --git a/src/module_commands.c b/src/module_commands.c
new file mode 100644 (file)
index 0000000..2927de2
--- /dev/null
@@ -0,0 +1,86 @@
+/* module_commands.c - NeonServ v5.3
+ * Copyright (C) 2011-2012  Philipp Kreil (pk910)
+ * 
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ * 
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ * 
+ * You should have received a copy of the GNU General Public License 
+ * along with this program. If not, see <http://www.gnu.org/licenses/>. 
+ */
+#include "modcmd.h"
+#include "IRCParser.h"
+#include "modules.h"
+#include "tools.h"
+#include "lang.h"
+
+static const struct default_language_entry msgtab[] = {
+    {"MODULE_LOADED", "Module %s loaded."}, /* {ARGS: "NeonServ"} */
+    {"MODULE_UNLOADED", "Module %s unloaded."}, /* {ARGS: "NeonServ"} */
+    {"MODULE_RELOADED", "Module %s reloaded."}, /* {ARGS: "NeonServ"} */
+    {"MODULE_ERROR", "An error occured when performing this module operation. View error log for more information."},
+    {"MODULE_LIST", "Loaded Modules: %s"},
+    {NULL, NULL}
+};
+
+static CMD_BIND(module_cmd_load);
+static CMD_BIND(module_cmd_unload);
+static CMD_BIND(module_cmd_reload);
+static CMD_BIND(module_cmd_modules);
+
+void register_module_commands() {
+    //Module Commands
+    #define OPER_COMMAND(NAME,FUNCTION,PARAMCOUNT,GACCESS,FLAGS) register_command(0, NAME, 0, FUNCTION, PARAMCOUNT, NULL, GACCESS, FLAGS)
+    //            NAME            FUNCTION            PARAMS  ACCS  FLAGS
+    OPER_COMMAND("loadmod",      module_cmd_load,      1,     1000, CMDFLAG_REQUIRE_AUTH | CMDFLAG_CHECK_AUTH | CMDFLAG_OPLOG);
+    OPER_COMMAND("unloadmod",    module_cmd_unload,    1,     1000, CMDFLAG_REQUIRE_AUTH | CMDFLAG_CHECK_AUTH | CMDFLAG_OPLOG);
+    OPER_COMMAND("reloadmod",    module_cmd_reload,    1,     1000, CMDFLAG_REQUIRE_AUTH | CMDFLAG_CHECK_AUTH | CMDFLAG_OPLOG);
+    OPER_COMMAND("modules",      module_cmd_modules,   0,     1000, CMDFLAG_REQUIRE_AUTH | CMDFLAG_CHECK_AUTH);
+    #undef OPER_COMMAND
+    
+    register_default_language_table(msgtab);
+}
+
+static CMD_BIND(module_cmd_load) {
+    if(ext_load_module(argv[0]))
+        reply(getTextBot(), user, "MODULE_LOADED", argv[0]);
+    else
+        reply(getTextBot(), user, "MODULE_ERROR");
+}
+
+static CMD_BIND(module_cmd_unload) {
+    if(ext_unload_module(argv[0]))
+        reply(getTextBot(), user, "MODULE_UNLOADED", argv[0]);
+    else
+        reply(getTextBot(), user, "MODULE_ERROR");
+}
+
+static CMD_BIND(module_cmd_reload) {
+    if(ext_reload_module(argv[0]))
+        reply(getTextBot(), user, "MODULE_RELOADED", argv[0]);
+    else
+        reply(getTextBot(), user, "MODULE_ERROR");
+}
+
+static CMD_BIND(module_cmd_modules) {
+    char modules[MAXLEN];
+    int modpos = 0;
+    int modcount = 0;
+    struct ModuleInfo *modinfo;
+    for(modinfo = ext_get_modules(NULL); modinfo; modinfo = ext_get_modules(modinfo)) {
+        if(modpos + strlen(modinfo->name) > 450) {
+            reply(getTextBot(), user, "MODULE_LIST", modules);
+            modpos = 0;
+        }
+        modcount++;
+        modpos += sprintf(modules + modpos, (modpos ? ", %s" : "%s"), modinfo->name);
+    }
+    if(!modcount || modpos)
+        reply(getTextBot(), user, "MODULE_LIST", (modpos ? modules : "none"));
+}