Merge branch 'development'
[NeonServV5.git] / src / module_commands.c
1 /* module_commands.c - NeonServ v5.6
2  * Copyright (C) 2011-2012  Philipp Kreil (pk910)
3  * 
4  * This program is free software: you can redistribute it and/or modify
5  * it under the terms of the GNU General Public License as published by
6  * the Free Software Foundation, either version 3 of the License, or
7  * (at your option) any later version.
8  * 
9  * This program is distributed in the hope that it will be useful,
10  * but WITHOUT ANY WARRANTY; without even the implied warranty of
11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12  * GNU General Public License for more details.
13  * 
14  * You should have received a copy of the GNU General Public License 
15  * along with this program. If not, see <http://www.gnu.org/licenses/>. 
16  */
17 #include "modcmd.h"
18 #include "IRCParser.h"
19 #include "modules.h"
20 #include "tools.h"
21 #include "lang.h"
22
23 static const struct default_language_entry msgtab[] = {
24     {"MODULE_LOADED", "Module %s loaded."}, /* {ARGS: "NeonServ"} */
25     {"MODULE_UNLOADED", "Module %s unloaded."}, /* {ARGS: "NeonServ"} */
26     {"MODULE_RELOADED", "Module %s reloaded."}, /* {ARGS: "NeonServ"} */
27     {"MODULE_ERROR", "An error occured when performing this module operation. View error log for more information."},
28     {"MODULE_LIST", "Loaded Modules: %s"},
29     {NULL, NULL}
30 };
31
32 static CMD_BIND(module_cmd_load);
33 static CMD_BIND(module_cmd_unload);
34 static CMD_BIND(module_cmd_reload);
35 static CMD_BIND(module_cmd_modules);
36
37 void register_module_commands() {
38     //Module Commands
39     #define OPER_COMMAND(NAME,FUNCTION,PARAMCOUNT,GACCESS,FLAGS) register_command(0, NAME, 0, FUNCTION, PARAMCOUNT, NULL, GACCESS, FLAGS)
40     //            NAME            FUNCTION            PARAMS  ACCS  FLAGS
41     OPER_COMMAND("loadmod",      module_cmd_load,      1,     1000, CMDFLAG_REQUIRE_AUTH | CMDFLAG_CHECK_AUTH | CMDFLAG_OPLOG);
42     OPER_COMMAND("unloadmod",    module_cmd_unload,    1,     1000, CMDFLAG_REQUIRE_AUTH | CMDFLAG_CHECK_AUTH | CMDFLAG_OPLOG);
43     OPER_COMMAND("reloadmod",    module_cmd_reload,    1,     1000, CMDFLAG_REQUIRE_AUTH | CMDFLAG_CHECK_AUTH | CMDFLAG_OPLOG);
44     OPER_COMMAND("modules",      module_cmd_modules,   0,     1000, CMDFLAG_REQUIRE_AUTH | CMDFLAG_CHECK_AUTH);
45     #undef OPER_COMMAND
46     
47     register_default_language_table(msgtab);
48 }
49
50 static CMD_BIND(module_cmd_load) {
51     if(ext_load_module(argv[0]))
52         reply(textclient, user, "MODULE_LOADED", argv[0]);
53     else
54         reply(textclient, user, "MODULE_ERROR");
55 }
56
57 static CMD_BIND(module_cmd_unload) {
58     if(ext_unload_module(argv[0]))
59         reply(textclient, user, "MODULE_UNLOADED", argv[0]);
60     else
61         reply(textclient, user, "MODULE_ERROR");
62 }
63
64 static CMD_BIND(module_cmd_reload) {
65     if(ext_reload_module(argv[0]))
66         reply(textclient, user, "MODULE_RELOADED", argv[0]);
67     else
68         reply(textclient, user, "MODULE_ERROR");
69 }
70
71 static CMD_BIND(module_cmd_modules) {
72     char modules[MAXLEN];
73     int modpos = 0;
74     int modcount = 0;
75     struct ModuleInfo *modinfo;
76     for(modinfo = ext_get_modules(NULL); modinfo; modinfo = ext_get_modules(modinfo)) {
77         if(modpos + strlen(modinfo->name) > 450) {
78             reply(textclient, user, "MODULE_LIST", modules);
79             modpos = 0;
80         }
81         modcount++;
82         modpos += sprintf(modules + modpos, (modpos ? ", %s" : "%s"), modinfo->name);
83     }
84     if(!modcount || modpos)
85         reply(textclient, user, "MODULE_LIST", (modpos ? modules : "none"));
86 }